diff options
| -rw-r--r-- | src/main.c | 25 | 
1 files changed, 21 insertions, 4 deletions
| @@ -58,6 +58,7 @@ static int verbose = DEBUG_LEVEL;  static int foreground = 0;  static int exit_on_no_devices = 0;  static int drop_privileges = 0; +static int udev = 0;  struct device_info {  	uint32_t device_id; @@ -1030,6 +1031,7 @@ static void usage()  	printf("\t-f|--foreground           do not daemonize\n");  	printf("\t-e|--exit-on-no-devices   exit if no device is attached\n");  	printf("\t-d|--drop-privileges      drop privileges after startup\n"); +	printf("\t-u|--udev                 use udev mode of operations\n");  	printf("\n");  } @@ -1041,12 +1043,13 @@ static void parse_opts(int argc, char **argv)  		{"verbose", 0, NULL, 'v'},  		{"exit-on-no-devices", 0, NULL, 'e'},  		{"drop-privileges", 0, NULL, 'd'}, +		{"udev", 0, NULL, 'u'},  		{NULL, 0, NULL, 0}  	};  	int c;  	while (1) { -		c = getopt_long(argc, argv, "hfved", longopts, (int *) 0); +		c = getopt_long(argc, argv, "hfvedu", longopts, (int *) 0);  		if (c == -1) {  			break;  		} @@ -1067,11 +1070,17 @@ static void parse_opts(int argc, char **argv)  		case 'd':  			drop_privileges = 1;  			break; +		case 'u': +			udev = 1; +			break;  		default:  			usage();  			exit(2);  		}  	} + +	if (udev) +		foreground = 0;  }  /** @@ -1173,9 +1182,12 @@ int main(int argc, char **argv)  		fcntl(fileno(lfd), F_GETLK, &lock);  		fclose(lfd);  		if (lock.l_type != F_UNLCK) { -			logmsg(LOG_NOTICE, -				   "another instance is already running. exiting."); -			return -1; +			if (!udev) { +				logmsg(LOG_NOTICE, +				       "another instance is already running. exiting."); +				return -1; +			} +			return 0;  		}  	} @@ -1265,6 +1277,7 @@ int main(int argc, char **argv)  		if (result <= 0) {  			if (result == 0) {  				// cleanup +				int num_children = 0;  				for (i = 0; i < children_capacity; i++) {  					if (children[i]) {  						if (children[i]->dead != 0) { @@ -1277,6 +1290,7 @@ int main(int argc, char **argv)  							children[i] = NULL;  							cnt++;  						} else { +							num_children++;  							cnt = 0;  						}  					} else { @@ -1284,6 +1298,9 @@ int main(int argc, char **argv)  					}  				} +				if (num_children == 0 && udev) +					break; +  				if ((children_capacity > DEFAULT_CHILDREN_CAPACITY)  					&& ((children_capacity - cnt) <=  						DEFAULT_CHILDREN_CAPACITY)) { | 
