xref: /openbmc/linux/tools/perf/util/path.c (revision 814b3f5127248db90e5d9983668a44eec7b45c02)
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