xref: /dpdk/lib/eal/unix/eal_filesystem.c (revision ae67895b507bb6af22263c79ba0d5c374b396485)
16e97b5fcSStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
26e97b5fcSStephen Hemminger  * Copyright(c) 2010-2018 Intel Corporation.
36e97b5fcSStephen Hemminger  * Copyright(c) 2012-2014 6WIND S.A.
46e97b5fcSStephen Hemminger  */
56e97b5fcSStephen Hemminger 
66e97b5fcSStephen Hemminger #include <errno.h>
76e97b5fcSStephen Hemminger #include <limits.h>
86e97b5fcSStephen Hemminger #include <stddef.h>
96e97b5fcSStephen Hemminger #include <stdio.h>
106e97b5fcSStephen Hemminger #include <stdlib.h>
116e97b5fcSStephen Hemminger #include <string.h>
126e97b5fcSStephen Hemminger #include <sys/stat.h>
136e97b5fcSStephen Hemminger #include <unistd.h>
146e97b5fcSStephen Hemminger 
156e97b5fcSStephen Hemminger #include <rte_log.h>
166e97b5fcSStephen Hemminger 
176e97b5fcSStephen Hemminger #include "eal_private.h"
186e97b5fcSStephen Hemminger #include "eal_filesystem.h"
196e97b5fcSStephen Hemminger 
eal_create_runtime_dir(void)206e97b5fcSStephen Hemminger int eal_create_runtime_dir(void)
216e97b5fcSStephen Hemminger {
226e97b5fcSStephen Hemminger 	const char *directory;
236e97b5fcSStephen Hemminger 	char run_dir[PATH_MAX];
246e97b5fcSStephen Hemminger 	char tmp[PATH_MAX];
256e97b5fcSStephen Hemminger 	int ret;
266e97b5fcSStephen Hemminger 
276e97b5fcSStephen Hemminger 	/* from RuntimeDirectory= see systemd.exec */
286e97b5fcSStephen Hemminger 	directory = getenv("RUNTIME_DIRECTORY");
296e97b5fcSStephen Hemminger 	if (directory == NULL) {
306e97b5fcSStephen Hemminger 		/*
316e97b5fcSStephen Hemminger 		 * Used standard convention defined in
326e97b5fcSStephen Hemminger 		 * XDG Base Directory Specification and
336e97b5fcSStephen Hemminger 		 * Filesystem Hierarchy Standard.
346e97b5fcSStephen Hemminger 		 */
356e97b5fcSStephen Hemminger 		if (getuid() == 0)
366e97b5fcSStephen Hemminger 			directory = "/var/run";
376e97b5fcSStephen Hemminger 		else
386e97b5fcSStephen Hemminger 			directory = getenv("XDG_RUNTIME_DIR") ? : "/tmp";
396e97b5fcSStephen Hemminger 	}
406e97b5fcSStephen Hemminger 
416e97b5fcSStephen Hemminger 	/* create DPDK subdirectory under runtime dir */
426e97b5fcSStephen Hemminger 	ret = snprintf(tmp, sizeof(tmp), "%s/dpdk", directory);
436e97b5fcSStephen Hemminger 	if (ret < 0 || ret == sizeof(tmp)) {
44*ae67895bSDavid Marchand 		EAL_LOG(ERR, "Error creating DPDK runtime path name");
456e97b5fcSStephen Hemminger 		return -1;
466e97b5fcSStephen Hemminger 	}
476e97b5fcSStephen Hemminger 
486e97b5fcSStephen Hemminger 	/* create prefix-specific subdirectory under DPDK runtime dir */
496e97b5fcSStephen Hemminger 	ret = snprintf(run_dir, sizeof(run_dir), "%s/%s",
506e97b5fcSStephen Hemminger 			tmp, eal_get_hugefile_prefix());
516e97b5fcSStephen Hemminger 	if (ret < 0 || ret == sizeof(run_dir)) {
52*ae67895bSDavid Marchand 		EAL_LOG(ERR, "Error creating prefix-specific runtime path name");
536e97b5fcSStephen Hemminger 		return -1;
546e97b5fcSStephen Hemminger 	}
556e97b5fcSStephen Hemminger 
566e97b5fcSStephen Hemminger 	/* create the path if it doesn't exist. no "mkdir -p" here, so do it
576e97b5fcSStephen Hemminger 	 * step by step.
586e97b5fcSStephen Hemminger 	 */
596e97b5fcSStephen Hemminger 	ret = mkdir(tmp, 0700);
606e97b5fcSStephen Hemminger 	if (ret < 0 && errno != EEXIST) {
61*ae67895bSDavid Marchand 		EAL_LOG(ERR, "Error creating '%s': %s",
626e97b5fcSStephen Hemminger 			tmp, strerror(errno));
636e97b5fcSStephen Hemminger 		return -1;
646e97b5fcSStephen Hemminger 	}
656e97b5fcSStephen Hemminger 
666e97b5fcSStephen Hemminger 	ret = mkdir(run_dir, 0700);
676e97b5fcSStephen Hemminger 	if (ret < 0 && errno != EEXIST) {
68*ae67895bSDavid Marchand 		EAL_LOG(ERR, "Error creating '%s': %s",
696e97b5fcSStephen Hemminger 			run_dir, strerror(errno));
706e97b5fcSStephen Hemminger 		return -1;
716e97b5fcSStephen Hemminger 	}
726e97b5fcSStephen Hemminger 
736e97b5fcSStephen Hemminger 	if (eal_set_runtime_dir(run_dir))
746e97b5fcSStephen Hemminger 		return -1;
756e97b5fcSStephen Hemminger 
766e97b5fcSStephen Hemminger 	return 0;
776e97b5fcSStephen Hemminger }
786e97b5fcSStephen Hemminger 
796e97b5fcSStephen Hemminger /* parse a sysfs (or other) file containing one integer value */
eal_parse_sysfs_value(const char * filename,unsigned long * val)806e97b5fcSStephen Hemminger int eal_parse_sysfs_value(const char *filename, unsigned long *val)
816e97b5fcSStephen Hemminger {
826e97b5fcSStephen Hemminger 	FILE *f;
836e97b5fcSStephen Hemminger 	char buf[BUFSIZ];
846e97b5fcSStephen Hemminger 	char *end = NULL;
856e97b5fcSStephen Hemminger 
866e97b5fcSStephen Hemminger 	if ((f = fopen(filename, "r")) == NULL) {
87*ae67895bSDavid Marchand 		EAL_LOG(ERR, "%s(): cannot open sysfs value %s",
886e97b5fcSStephen Hemminger 			__func__, filename);
896e97b5fcSStephen Hemminger 		return -1;
906e97b5fcSStephen Hemminger 	}
916e97b5fcSStephen Hemminger 
926e97b5fcSStephen Hemminger 	if (fgets(buf, sizeof(buf), f) == NULL) {
93*ae67895bSDavid Marchand 		EAL_LOG(ERR, "%s(): cannot read sysfs value %s",
946e97b5fcSStephen Hemminger 			__func__, filename);
956e97b5fcSStephen Hemminger 		fclose(f);
966e97b5fcSStephen Hemminger 		return -1;
976e97b5fcSStephen Hemminger 	}
986e97b5fcSStephen Hemminger 	*val = strtoul(buf, &end, 0);
996e97b5fcSStephen Hemminger 	if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) {
100*ae67895bSDavid Marchand 		EAL_LOG(ERR, "%s(): cannot parse sysfs value %s",
1016e97b5fcSStephen Hemminger 				__func__, filename);
1026e97b5fcSStephen Hemminger 		fclose(f);
1036e97b5fcSStephen Hemminger 		return -1;
1046e97b5fcSStephen Hemminger 	}
1056e97b5fcSStephen Hemminger 	fclose(f);
1066e97b5fcSStephen Hemminger 	return 0;
1076e97b5fcSStephen Hemminger }
108