diff options
author | Bastien Nocera | 2009-08-03 21:22:37 +0200 |
---|---|---|
committer | Nikias Bassen | 2009-08-03 21:22:37 +0200 |
commit | b7d4f48d7e85c43f0dd1111619acf79aba535371 (patch) | |
tree | 5ad019d11c072ef537e1d3980f35b5cef7f9dc7a | |
parent | 544f0420cd265194cd0c610f74ef928a60358e68 (diff) | |
download | usbmuxd-b7d4f48d7e85c43f0dd1111619acf79aba535371.tar.gz usbmuxd-b7d4f48d7e85c43f0dd1111619acf79aba535371.tar.bz2 |
Add udev mode of operation
When starting up, force background operation when in udev mode and
don't error out when already running.
When disconnecting, check if there are any devices left-over, and
exit if not.
Signed-off-by: Nikias Bassen <nikias@gmx.li>
-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)) { |