diff options
Diffstat (limited to 'src/firejail/util.c')
-rw-r--r-- | src/firejail/util.c | 43 |
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 | |||
496 | uid_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 | } | ||