X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudev-rules.c;h=bc224040d215bce342aefb8a9840efe9a17c276e;hb=335e316a716e72a7aa8e56f266b6c8d7ad4f70a6;hp=3ca209a89131552f9258844c74ebf6165258924f;hpb=8e2470d68ef093d39907cc67dcee377b36ba77be;p=elogind.git diff --git a/udev/udev-rules.c b/udev/udev-rules.c index 3ca209a89..bc224040d 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "udev.h" @@ -748,7 +749,7 @@ static int import_program_into_properties(struct udev_device *dev, const char *p char *line; envp = udev_device_get_properties_envp(dev); - if (util_run_program(udev, program, envp, result, sizeof(result), &reslen) != 0) + if (util_run_program(udev, program, envp, result, sizeof(result), &reslen, NULL) != 0) return -1; line = result; @@ -814,6 +815,8 @@ static int wait_for_file(struct udev_device *dev, const char *file, int timeout) dbg(udev, "will wait %i sec for '%s'\n", timeout, file); while (--loop) { + const struct timespec duration = { 0, 1000 * 1000 * 1000 / WAIT_LOOP_PER_SECOND }; + /* lookup file */ if (stat(file, &stats) == 0) { info(udev, "file '%s' appeared after %i loops\n", file, (timeout * WAIT_LOOP_PER_SECOND) - loop-1); @@ -825,7 +828,7 @@ static int wait_for_file(struct udev_device *dev, const char *file, int timeout) return -2; } info(udev, "wait for '%s' for %i mseconds\n", file, 1000 / WAIT_LOOP_PER_SECOND); - usleep(1000 * 1000 / WAIT_LOOP_PER_SECOND); + nanosleep(&duration, NULL); } info(udev, "waiting for '%s' failed\n", file); return -1; @@ -875,7 +878,7 @@ static int get_key(struct udev *udev, char **line, char **key, enum operation_ty char *temp; linepos = *line; - if (linepos == NULL && linepos[0] == '\0') + if (linepos == NULL || linepos[0] == '\0') return -1; /* skip whitespace */ @@ -1578,7 +1581,7 @@ static int parse_file(struct udev_rules *rules, const char *filename, unsigned s first_token = rules->token_cur; - while(fgets(line, sizeof(line), f) != NULL) { + while (fgets(line, sizeof(line), f) != NULL) { char *key; size_t len; @@ -1600,6 +1603,8 @@ static int parse_file(struct udev_rules *rules, const char *filename, unsigned s while (line[len-2] == '\\') { if (fgets(&line[len-2], (sizeof(line)-len)+2, f) == NULL) break; + if (strlen(&line[len-2]) < 2) + break; line_nr++; len = strlen(line); } @@ -1798,7 +1803,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) if (stat(filename, &statbuf) == 0 && statbuf.st_size > 0) parse_file(rules, filename, filename_off); else - info(udev, "can not read '%s'\n", filename); + err(udev, "can not read '%s'\n", filename); udev_list_entry_delete(file_loop); } @@ -2201,7 +2206,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event program, &rules->buf[rule->rule.filename_off], rule->rule.filename_line); - if (util_run_program(event->udev, program, envp, result, sizeof(result), NULL) != 0) { + if (util_run_program(event->udev, program, envp, result, sizeof(result), NULL, NULL) != 0) { if (cur->key.op != OP_NOMATCH) goto nomatch; } else {