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); | 
