aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail/util.c')
-rw-r--r--src/firejail/util.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/firejail/util.c b/src/firejail/util.c
index 47b237911..9af41ffe2 100644
--- a/src/firejail/util.c
+++ b/src/firejail/util.c
@@ -961,6 +961,42 @@ void flush_stdin(void) {
961 } 961 }
962} 962}
963 963
964void create_empty_dir_as_user(const char *dir, mode_t mode) {
965 assert(dir);
966 mode &= 07777;
967 struct stat s;
968
969 if (stat(dir, &s)) {
970 if (arg_debug)
971 printf("Creating empty %s directory\n", dir);
972 pid_t child = fork();
973 if (child < 0)
974 errExit("fork");
975 if (child == 0) {
976 // drop privileges
977 drop_privs(0);
978
979 if (mkdir(dir, mode) == 0) {
980 if (chmod(dir, mode) == -1)
981 {;} // do nothing
982 }
983 else if (errno != EEXIST && arg_debug) {
984 char *str;
985 if (asprintf(&str, "Directory %s not created", dir) == -1)
986 errExit("asprintf");
987 perror(str);
988 }
989#ifdef HAVE_GCOV
990 __gcov_flush();
991#endif
992 _exit(0);
993 }
994 waitpid(child, NULL, 0);
995 if (stat(dir, &s) == 0)
996 fs_logger2("create", dir);
997 }
998}
999
964void create_empty_dir_as_root(const char *dir, mode_t mode) { 1000void create_empty_dir_as_root(const char *dir, mode_t mode) {
965 assert(dir); 1001 assert(dir);
966 mode &= 07777; 1002 mode &= 07777;
@@ -1262,4 +1298,4 @@ void enter_network_namespace(pid_t pid) {
1262 fprintf(stderr, "Error: cannot join the network namespace\n"); 1298 fprintf(stderr, "Error: cannot join the network namespace\n");
1263 exit(1); 1299 exit(1);
1264 } 1300 }
1265} \ No newline at end of file 1301}