at v4.9-rc2 1.0 kB view raw
1/* 2 * I'm tired of doing "vsnprintf()" etc just to open a 3 * file, so here's a "return static buffer with printf" 4 * interface for paths. 5 * 6 * It's obviously not thread-safe. Sue me. But it's quite 7 * useful for doing things like 8 * 9 * f = open(mkpath("%s/%s.perf", base, name), O_RDONLY); 10 * 11 * which is what it's designed for. 12 */ 13#include "cache.h" 14#include "util.h" 15#include <limits.h> 16 17static char bad_path[] = "/bad-path/"; 18/* 19 * One hack: 20 */ 21static char *get_pathname(void) 22{ 23 static char pathname_array[4][PATH_MAX]; 24 static int idx; 25 26 return pathname_array[3 & ++idx]; 27} 28 29static char *cleanup_path(char *path) 30{ 31 /* Clean it up */ 32 if (!memcmp(path, "./", 2)) { 33 path += 2; 34 while (*path == '/') 35 path++; 36 } 37 return path; 38} 39 40char *mkpath(const char *fmt, ...) 41{ 42 va_list args; 43 unsigned len; 44 char *pathname = get_pathname(); 45 46 va_start(args, fmt); 47 len = vsnprintf(pathname, PATH_MAX, fmt, args); 48 va_end(args); 49 if (len >= PATH_MAX) 50 return bad_path; 51 return cleanup_path(pathname); 52}