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