aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail/main.c')
-rw-r--r--src/firejail/main.c44
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
131static void set_name_file(pid_t pid); 131static void set_name_file(pid_t pid);
132static void delete_name_file(pid_t pid); 132static void delete_name_file(pid_t pid);
133static void delete_profile_file(pid_t pid);
133static void delete_x11_file(pid_t pid); 134static void delete_x11_file(pid_t pid);
134 135
135void clear_run_files(pid_t pid) { 136void 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
144static void clear_atexit(void) {
145 EUID_ROOT();
146 clear_run_files(getpid());
147}
148
142static void myexit(int rv) { 149static 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
768static 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
741void set_x11_file(pid_t pid, int display) { 777void 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;