+ /* skip blacklisted subsystems */
+ subsystem = get_subsystem(main_argv[1]);
+ if (!subsystem) {
+ dbg("no subsystem?");
+ goto exit;
+ }
+ i = 0;
+ while (subsystem_blacklist[i][0] != '\0') {
+ if (strcmp(subsystem, subsystem_blacklist[i]) == 0) {
+ dbg("don't care about '%s' devices", subsystem);
+ goto exit;
+ }
+ i++;
+ }
+
+ /* initialize udev database */
+ retval = udevdb_init(UDEVDB_DEFAULT);
+ if (retval != 0) {
+ dbg("unable to initialize database");
+ goto exit;
+ }
+
+ /* set up a default signal handler for now */
+ act.sa_handler = sig_handler;
+ sigemptyset (&act.sa_mask);
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGINT, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
+
+ if (strcmp(action, "add") == 0) {
+ namedev_init();
+ retval = udev_add_device(devpath, subsystem, 0);
+ } else {
+ if (strcmp(action, "remove") == 0) {
+ retval = udev_remove_device(devpath, subsystem);
+ } else {
+ dbg("unknown action '%s'", action);
+ retval = -EINVAL;
+ }
+ }
+
+ udevdb_exit();
+
+exit:
+ if (retval > 0)
+ retval = 0;
+
+ return -retval;