186470930SIngo Molnar /* 286470930SIngo Molnar * I'm tired of doing "vsnprintf()" etc just to open a 386470930SIngo Molnar * file, so here's a "return static buffer with printf" 486470930SIngo Molnar * interface for paths. 586470930SIngo Molnar * 686470930SIngo Molnar * It's obviously not thread-safe. Sue me. But it's quite 786470930SIngo Molnar * useful for doing things like 886470930SIngo Molnar * 986470930SIngo Molnar * f = open(mkpath("%s/%s.perf", base, name), O_RDONLY); 1086470930SIngo Molnar * 1186470930SIngo Molnar * which is what it's designed for. 1286470930SIngo Molnar */ 1386470930SIngo Molnar #include "cache.h" 14*175729fcSArnaldo Carvalho de Melo #include "util.h" 15*175729fcSArnaldo Carvalho de Melo #include <limits.h> 1686470930SIngo Molnar 1786470930SIngo Molnar static char bad_path[] = "/bad-path/"; 1886470930SIngo Molnar /* 19814b3f51SArnaldo Carvalho de Melo * One hack: 2086470930SIngo Molnar */ 2186470930SIngo Molnar static char *get_pathname(void) 2286470930SIngo Molnar { 2386470930SIngo Molnar static char pathname_array[4][PATH_MAX]; 2483a0944fSIngo Molnar static int idx; 2583a0944fSIngo Molnar 2683a0944fSIngo Molnar return pathname_array[3 & ++idx]; 2786470930SIngo Molnar } 2886470930SIngo Molnar 2986470930SIngo Molnar static char *cleanup_path(char *path) 3086470930SIngo Molnar { 3186470930SIngo Molnar /* Clean it up */ 3286470930SIngo Molnar if (!memcmp(path, "./", 2)) { 3386470930SIngo Molnar path += 2; 3486470930SIngo Molnar while (*path == '/') 3586470930SIngo Molnar path++; 3686470930SIngo Molnar } 3786470930SIngo Molnar return path; 3886470930SIngo Molnar } 3986470930SIngo Molnar 4086470930SIngo Molnar char *mkpath(const char *fmt, ...) 4186470930SIngo Molnar { 4286470930SIngo Molnar va_list args; 4386470930SIngo Molnar unsigned len; 4486470930SIngo Molnar char *pathname = get_pathname(); 4586470930SIngo Molnar 4686470930SIngo Molnar va_start(args, fmt); 4786470930SIngo Molnar len = vsnprintf(pathname, PATH_MAX, fmt, args); 4886470930SIngo Molnar va_end(args); 4986470930SIngo Molnar if (len >= PATH_MAX) 5086470930SIngo Molnar return bad_path; 5186470930SIngo Molnar return cleanup_path(pathname); 5286470930SIngo Molnar } 53