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.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/firejail/util.c b/src/firejail/util.c
index a9e96266c..9ad937f55 100644
--- a/src/firejail/util.c
+++ b/src/firejail/util.c
@@ -492,3 +492,46 @@ const char *gnu_basename(const char *path)
492 return path; 492 return path;
493 return last_slash+1; 493 return last_slash+1;
494} 494}
495
496uid_t pid_get_uid(pid_t pid) {
497 uid_t rv = 0;
498
499 // open status file
500 char *file;
501 if (asprintf(&file, "/proc/%u/status", pid) == -1) {
502 perror("asprintf");
503 exit(1);
504 }
505 FILE *fp = fopen(file, "r");
506 if (!fp) {
507 free(file);
508 fprintf(stderr, "Error: cannot open /proc file\n");
509 exit(1);
510 }
511
512 // extract uid
513 static const int PIDS_BUFLEN = 1024;
514 char buf[PIDS_BUFLEN];
515 while (fgets(buf, PIDS_BUFLEN - 1, fp)) {
516 if (strncmp(buf, "Uid:", 4) == 0) {
517 char *ptr = buf + 5;
518 while (*ptr != '\0' && (*ptr == ' ' || *ptr == '\t')) {
519 ptr++;
520 }
521 if (*ptr == '\0')
522 break;
523
524 rv = atoi(ptr);
525 break; // break regardless!
526 }
527 }
528
529 fclose(fp);
530 free(file);
531
532 if (rv == 0) {
533 fprintf(stderr, "Error: cannot read /proc file\n");
534 exit(1);
535 }
536 return rv;
537}