diff options
Diffstat (limited to 'src/firejail/util.c')
-rw-r--r-- | src/firejail/util.c | 38 |
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 | ||
964 | void 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 | |||
964 | void create_empty_dir_as_root(const char *dir, mode_t mode) { | 1000 | void 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 | } |