diff options
Diffstat (limited to 'src/firejail/main.c')
-rw-r--r-- | src/firejail/main.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/firejail/main.c b/src/firejail/main.c index 3f805a7e0..c317aa477 100644 --- a/src/firejail/main.c +++ b/src/firejail/main.c | |||
@@ -130,15 +130,22 @@ unsigned long long start_timestamp; | |||
130 | 130 | ||
131 | static void set_name_file(pid_t pid); | 131 | static void set_name_file(pid_t pid); |
132 | static void delete_name_file(pid_t pid); | 132 | static void delete_name_file(pid_t pid); |
133 | static void delete_profile_file(pid_t pid); | ||
133 | static void delete_x11_file(pid_t pid); | 134 | static void delete_x11_file(pid_t pid); |
134 | 135 | ||
135 | void clear_run_files(pid_t pid) { | 136 | void clear_run_files(pid_t pid) { |
136 | bandwidth_del_run_file(pid); // bandwidth file | 137 | bandwidth_del_run_file(pid); // bandwidth file |
137 | network_del_run_file(pid); // network map file | 138 | network_del_run_file(pid); // network map file |
138 | delete_name_file(pid); | 139 | delete_name_file(pid); |
140 | delete_profile_file(pid); | ||
139 | delete_x11_file(pid); | 141 | delete_x11_file(pid); |
140 | } | 142 | } |
141 | 143 | ||
144 | static void clear_atexit(void) { | ||
145 | EUID_ROOT(); | ||
146 | clear_run_files(getpid()); | ||
147 | } | ||
148 | |||
142 | static void myexit(int rv) { | 149 | static void myexit(int rv) { |
143 | logmsg("exiting..."); | 150 | logmsg("exiting..."); |
144 | if (!arg_command && !arg_quiet) | 151 | if (!arg_command && !arg_quiet) |
@@ -465,6 +472,26 @@ static void run_cmd_and_exit(int i, int argc, char **argv) { | |||
465 | exit(0); | 472 | exit(0); |
466 | } | 473 | } |
467 | #endif | 474 | #endif |
475 | else if (strncmp(argv[i], "--profile.print=", 16) == 0) { | ||
476 | pid_t pid = read_pid(argv[i] + 16); | ||
477 | |||
478 | // print /run/firejail/profile/<PID> file | ||
479 | char *fname; | ||
480 | if (asprintf(&fname, RUN_FIREJAIL_PROFILE_DIR "/%d", pid) == -1) | ||
481 | errExit("asprintf"); | ||
482 | FILE *fp = fopen(fname, "r"); | ||
483 | if (!fp) { | ||
484 | fprintf(stderr, "Error: sandbox %s not found\n", argv[i] + 16); | ||
485 | exit(1); | ||
486 | } | ||
487 | #define MAXBUF 4096 | ||
488 | char buf[MAXBUF]; | ||
489 | if (fgets(buf, MAXBUF, fp)) | ||
490 | printf("%s", buf); | ||
491 | fclose(fp); | ||
492 | exit(0); | ||
493 | |||
494 | } | ||
468 | else if (strncmp(argv[i], "--cpu.print=", 12) == 0) { | 495 | else if (strncmp(argv[i], "--cpu.print=", 12) == 0) { |
469 | // join sandbox by pid or by name | 496 | // join sandbox by pid or by name |
470 | pid_t pid = read_pid(argv[i] + 12); | 497 | pid_t pid = read_pid(argv[i] + 12); |
@@ -738,6 +765,15 @@ static void delete_name_file(pid_t pid) { | |||
738 | free(fname); | 765 | free(fname); |
739 | } | 766 | } |
740 | 767 | ||
768 | static void delete_profile_file(pid_t pid) { | ||
769 | char *fname; | ||
770 | if (asprintf(&fname, "%s/%d", RUN_FIREJAIL_PROFILE_DIR, pid) == -1) | ||
771 | errExit("asprintf"); | ||
772 | int rv = unlink(fname); | ||
773 | (void) rv; | ||
774 | free(fname); | ||
775 | } | ||
776 | |||
741 | void set_x11_file(pid_t pid, int display) { | 777 | void set_x11_file(pid_t pid, int display) { |
742 | char *fname; | 778 | char *fname; |
743 | if (asprintf(&fname, "%s/%d", RUN_FIREJAIL_X11_DIR, pid) == -1) | 779 | if (asprintf(&fname, "%s/%d", RUN_FIREJAIL_X11_DIR, pid) == -1) |
@@ -825,12 +861,14 @@ int main(int argc, char **argv) { | |||
825 | char *custom_profile_dir = NULL; // custom profile directory | 861 | char *custom_profile_dir = NULL; // custom profile directory |
826 | 862 | ||
827 | 863 | ||
864 | atexit(clear_atexit); | ||
865 | |||
828 | // get starting timestamp | 866 | // get starting timestamp |
829 | start_timestamp = getticks(); | 867 | start_timestamp = getticks(); |
830 | 868 | ||
831 | |||
832 | // build /run/firejail directory structure | 869 | // build /run/firejail directory structure |
833 | preproc_build_firejail_dir(); | 870 | preproc_build_firejail_dir(); |
871 | preproc_clean_run(); | ||
834 | 872 | ||
835 | if (check_arg(argc, argv, "--quiet")) | 873 | if (check_arg(argc, argv, "--quiet")) |
836 | arg_quiet = 1; | 874 | arg_quiet = 1; |
@@ -2554,14 +2592,10 @@ int main(int argc, char **argv) { | |||
2554 | close(lockfd); | 2592 | close(lockfd); |
2555 | } | 2593 | } |
2556 | 2594 | ||
2557 | // create name file under /run/firejail | ||
2558 | |||
2559 | |||
2560 | // handle CTRL-C in parent | 2595 | // handle CTRL-C in parent |
2561 | signal (SIGINT, my_handler); | 2596 | signal (SIGINT, my_handler); |
2562 | signal (SIGTERM, my_handler); | 2597 | signal (SIGTERM, my_handler); |
2563 | 2598 | ||
2564 | |||
2565 | // wait for the child to finish | 2599 | // wait for the child to finish |
2566 | EUID_USER(); | 2600 | EUID_USER(); |
2567 | int status = 0; | 2601 | int status = 0; |