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" 1486470930SIngo Molnar 1586470930SIngo Molnar static char bad_path[] = "/bad-path/"; 1686470930SIngo Molnar /* 17*814b3f51SArnaldo Carvalho de Melo * One hack: 1886470930SIngo Molnar */ 1986470930SIngo Molnar static char *get_pathname(void) 2086470930SIngo Molnar { 2186470930SIngo Molnar static char pathname_array[4][PATH_MAX]; 2283a0944fSIngo Molnar static int idx; 2383a0944fSIngo Molnar 2483a0944fSIngo Molnar return pathname_array[3 & ++idx]; 2586470930SIngo Molnar } 2686470930SIngo Molnar 2786470930SIngo Molnar static char *cleanup_path(char *path) 2886470930SIngo Molnar { 2986470930SIngo Molnar /* Clean it up */ 3086470930SIngo Molnar if (!memcmp(path, "./", 2)) { 3186470930SIngo Molnar path += 2; 3286470930SIngo Molnar while (*path == '/') 3386470930SIngo Molnar path++; 3486470930SIngo Molnar } 3586470930SIngo Molnar return path; 3686470930SIngo Molnar } 3786470930SIngo Molnar 3886470930SIngo Molnar char *mkpath(const char *fmt, ...) 3986470930SIngo Molnar { 4086470930SIngo Molnar va_list args; 4186470930SIngo Molnar unsigned len; 4286470930SIngo Molnar char *pathname = get_pathname(); 4386470930SIngo Molnar 4486470930SIngo Molnar va_start(args, fmt); 4586470930SIngo Molnar len = vsnprintf(pathname, PATH_MAX, fmt, args); 4686470930SIngo Molnar va_end(args); 4786470930SIngo Molnar if (len >= PATH_MAX) 4886470930SIngo Molnar return bad_path; 4986470930SIngo Molnar return cleanup_path(pathname); 5086470930SIngo Molnar } 51