From b7d4f48d7e85c43f0dd1111619acf79aba535371 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 3 Aug 2009 21:22:37 +0200 Subject: 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 --- src/main.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index ee633b6..de68242 100644 --- a/src/main.c +++ b/src/main.c @@ -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)) { -- cgit v1.1-32-gdbae