extern struct parser native_parser;
extern struct parser yaboot_parser;
+extern struct parser kboot_parser;
static FILE *logf;
static int sock;
static struct parser *parsers[] = {
&native_parser,
&yaboot_parser,
+ &kboot_parser,
NULL
};
log("\ttrying parser '%s'\n", parsers[i]->name);
/* just use a dummy device path for now */
if (parsers[i]->parse(devpath, mountpoint))
- return;
+ /*return*/;
}
log("\tno boot_options found\n");
}
const char *bus = getenv("ID_BUS");
if (type && streq(type, "cd"))
return ICON_TYPE_OPTICAL;
+ if (!bus)
+ return ICON_TYPE_UNKNOWN;
if (streq(bus, "usb"))
return ICON_TYPE_USB;
if (streq(bus, "ata") || streq(bus, "scsi"))
return strtol(buf, NULL, 10);
}
+static int is_ignored_device(const char *devname)
+{
+ static const char *ignored_devices[] = { "/dev/ram", NULL };
+ const char **dev;
+
+ for (dev = ignored_devices; *dev; dev++)
+ if (!strncmp(devname, *dev, strlen(*dev)))
+ return 1;
+
+ return 0;
+}
+
static int found_new_device(const char *dev_path)
{
char mountpoint[PATH_MAX];
return EXIT_SUCCESS;
}
+static void detach_and_sleep(int sec)
+{
+ static int forked = 0;
+ int rc = 0;
+
+ if (sec <= 0)
+ return;
+
+ if (!forked) {
+ log("running in background...");
+ rc = fork();
+ forked = 1;
+ }
+
+ if (rc == 0) {
+ sleep(sec);
+
+ } else if (rc == -1) {
+ perror("fork()");
+ exit(EXIT_FAILURE);
+ } else {
+ exit(EXIT_SUCCESS);
+ }
+}
+
static int poll_device_plug(const char *dev_path,
int *optical)
{
return EXIT_SUCCESS;
printf("no... waiting\n");
- sleep(REMOVABLE_SLEEP_DELAY);
+ detach_and_sleep(REMOVABLE_SLEEP_DELAY);
}
/* Fall back to bare open() */
if (fd >= 0)
return EXIT_SUCCESS;
printf("no... waiting\n");
- sleep(REMOVABLE_SLEEP_DELAY);
+ detach_and_sleep(REMOVABLE_SLEEP_DELAY);
}
}
if (rc != CDS_DISC_OK)
return EXIT_SUCCESS;
printf("no... waiting\n");
- sleep(REMOVABLE_SLEEP_DELAY);
+ detach_and_sleep(REMOVABLE_SLEEP_DELAY);
}
/* Fall back to bare open() */
if (fd < 0)
return EXIT_SUCCESS;
printf("no... waiting\n");
- sleep(REMOVABLE_SLEEP_DELAY);
+ detach_and_sleep(REMOVABLE_SLEEP_DELAY);
}
}
/* Unmount it repeatedly, if needs be */
while (mounted && !unmount_device(dev_path))
;
- sleep(1);
+ detach_and_sleep(1);
}
}
char *dev_path, *action;
int rc;
- /*if (fork())
- return EXIT_SUCCESS;
- */
action = getenv("ACTION");
logf = stdout;
return EXIT_FAILURE;
}
+ if (is_ignored_device(dev_path))
+ return EXIT_SUCCESS;
+
if (streq(action, "add")) {
char *sysfs_path = getenv("DEVPATH");
if (sysfs_path && is_removable_device(sysfs_path))
}
return rc;
}
+
+/* convenience function for parsers */
+char *join_paths(const char *a, const char *b)
+{
+ char *full_path;
+
+ full_path = malloc(strlen(a) + strlen(b) + 2);
+
+ strcpy(full_path, a);
+ if (b[0] != '/')
+ strcat(full_path, "/");
+ strcat(full_path, b);
+
+ return full_path;
+}
+