summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c25
1 files 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)) {