X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=devices%2Fudev-helper.c;h=84b2bef95947cd16ea70ce5d311998f250ff5bd9;hp=f54ca238fd03178d165a169c520c36efa2f6b5e0;hb=167387fd92cc204a38bc0afa75b66889dec3decf;hpb=cabba48dcb96452352d0e6506384c4b2843bdac2 diff --git a/devices/udev-helper.c b/devices/udev-helper.c index f54ca23..84b2bef 100644 --- a/devices/udev-helper.c +++ b/devices/udev-helper.c @@ -16,12 +16,17 @@ #include #include "udev-helper.h" -#define REMOVABLE_SLEEP_DELAY 2 - #include "petitboot-paths.h" +/* Define below to operate without the frontend */ +#undef USE_FAKE_SOCKET + +/* Delay in seconds between polling of removable devices */ +#define REMOVABLE_SLEEP_DELAY 2 + extern struct parser native_parser; extern struct parser yaboot_parser; +extern struct parser kboot_parser; static FILE *logf; static int sock; @@ -29,6 +34,7 @@ static int sock; static struct parser *parsers[] = { &native_parser, &yaboot_parser, + &kboot_parser, NULL }; @@ -44,7 +50,7 @@ static void iterate_parsers(const char *devpath, const char *mountpoint) 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"); } @@ -195,7 +201,7 @@ int remove_device(const char *dev_path) int connect_to_socket() { -#if 1 +#ifndef USE_FAKE_SOCKET int fd; struct sockaddr_un addr; @@ -366,6 +372,8 @@ enum generic_icon_type guess_device_type(void) 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")) @@ -393,6 +401,18 @@ static int is_removable_device(const char *sysfs_path) 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]; @@ -409,6 +429,31 @@ static int found_new_device(const char *dev_path) 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) { @@ -431,7 +476,7 @@ static int poll_device_plug(const char *dev_path, return EXIT_SUCCESS; printf("no... waiting\n"); - sleep(REMOVABLE_SLEEP_DELAY); + detach_and_sleep(REMOVABLE_SLEEP_DELAY); } /* Fall back to bare open() */ @@ -445,7 +490,7 @@ static int poll_device_plug(const char *dev_path, if (fd >= 0) return EXIT_SUCCESS; printf("no... waiting\n"); - sleep(REMOVABLE_SLEEP_DELAY); + detach_and_sleep(REMOVABLE_SLEEP_DELAY); } } @@ -463,7 +508,7 @@ static int poll_device_unplug(const char *dev_path, int optical) 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() */ @@ -476,7 +521,7 @@ static int poll_device_unplug(const char *dev_path, int optical) if (fd < 0) return EXIT_SUCCESS; printf("no... waiting\n"); - sleep(REMOVABLE_SLEEP_DELAY); + detach_and_sleep(REMOVABLE_SLEEP_DELAY); } } @@ -499,7 +544,7 @@ static int poll_removable_device(const char *sysfs_path, /* Unmount it repeatedly, if needs be */ while (mounted && !unmount_device(dev_path)) ; - sleep(1); + detach_and_sleep(1); } } @@ -508,9 +553,6 @@ int main(int argc, char **argv) char *dev_path, *action; int rc; - /*if (fork()) - return EXIT_SUCCESS; - */ action = getenv("ACTION"); logf = stdout; @@ -543,6 +585,9 @@ int main(int argc, char **argv) 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)) @@ -564,3 +609,19 @@ int main(int argc, char **argv) } 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; +} +