diff options
-rw-r--r-- | src/main.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -57,6 +57,7 @@ static int fsock = -1; static int verbose = DEBUG_LEVEL; static int foreground = 0; static int exit_on_no_devices = 0; +static int preserve_privileges = 0; struct device_info { uint32_t device_id; @@ -1009,9 +1010,11 @@ static int daemonize() static void usage() { printf("usage: usbmuxd [options]\n"); - printf("\t-h|--help print this message.\n"); - printf("\t-v|--verbose be verbose\n"); - printf("\t-f|--foreground do not daemonize\n"); + printf("\t-h|--help print this message\n"); + printf("\t-v|--verbose be verbose (use twice or more to increase)\n"); + printf("\t-f|--foreground do not daemonize\n"); + printf("\t-e|--exit-on-no-devices exit if no device is attached\n"); + printf("\t-p|--preserve-privileges do not drop privileges\n"); printf("\n"); } @@ -1022,12 +1025,13 @@ static void parse_opts(int argc, char **argv) {"foreground", 0, NULL, 'f'}, {"verbose", 0, NULL, 'v'}, {"exit-on-no-devices", 0, NULL, 'e'}, + {"preserve-privileges", 0, NULL, 'p'}, {NULL, 0, NULL, 0} }; int c; while (1) { - c = getopt_long(argc, argv, "hfve", longopts, (int *) 0); + c = getopt_long(argc, argv, "hfvep", longopts, (int *) 0); if (c == -1) { break; } @@ -1045,6 +1049,9 @@ static void parse_opts(int argc, char **argv) case 'e': exit_on_no_devices = 1; break; + case 'p': + preserve_privileges = 1; + break; default: usage(); exit(2); @@ -1198,7 +1205,7 @@ int main(int argc, char **argv) } } // drop elevated privileges - if (getuid() == 0 || geteuid() == 0) { + if (!preserve_privileges && (getuid() == 0 || geteuid() == 0)) { struct passwd *pw = getpwnam("nobody"); if (pw) { setuid(pw->pw_uid); |