X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=libudev%2Flibudev-queue.c;h=73e7fb23aa95ac53a0246ba35da1f0d7210d05c5;hb=5a6583ecb4f3ee398be52c5d6ae3633f8a55b98b;hp=f3cb5ab4986594b4a3e53e93a02508d2858f4160;hpb=0c5c48040ac0f4c97f73fb3ac5493cc2d84a963b;p=elogind.git diff --git a/libudev/libudev-queue.c b/libudev/libudev-queue.c index f3cb5ab49..73e7fb23a 100644 --- a/libudev/libudev-queue.c +++ b/libudev/libudev-queue.c @@ -28,9 +28,9 @@ * SECTION:libudev-queue * @short_description: access to currently active events * - * The udev daemon processes event asynchronously. All events which do not have - * interdependencies are run in parallel. This exports the current state of the - * event processing queue, and the currently event sequence numbers from the kernel + * The udev daemon processes events asynchronously. All events which do not have + * interdependencies run in parallel. This exports the current state of the + * event processing queue, and the current event sequence numbers from the kernel * and the udev daemon. */ @@ -55,7 +55,7 @@ struct udev_queue { * * Returns: the udev queue context, or #NULL on error. **/ -struct udev_queue *udev_queue_new(struct udev *udev) +UDEV_EXPORT struct udev_queue *udev_queue_new(struct udev *udev) { struct udev_queue *udev_queue; @@ -80,7 +80,7 @@ struct udev_queue *udev_queue_new(struct udev *udev) * * Returns: the same udev queue context. **/ -struct udev_queue *udev_queue_ref(struct udev_queue *udev_queue) +UDEV_EXPORT struct udev_queue *udev_queue_ref(struct udev_queue *udev_queue) { if (udev_queue == NULL) return NULL; @@ -95,7 +95,7 @@ struct udev_queue *udev_queue_ref(struct udev_queue *udev_queue) * Drop a reference of a udev queue context. If the refcount reaches zero, * the resources of the queue context will be released. **/ -void udev_queue_unref(struct udev_queue *udev_queue) +UDEV_EXPORT void udev_queue_unref(struct udev_queue *udev_queue) { if (udev_queue == NULL) return; @@ -115,7 +115,7 @@ void udev_queue_unref(struct udev_queue *udev_queue) * * Returns: the udev library context. **/ -struct udev *udev_queue_get_udev(struct udev_queue *udev_queue) +UDEV_EXPORT struct udev *udev_queue_get_udev(struct udev_queue *udev_queue) { if (udev_queue == NULL) return NULL; @@ -149,7 +149,7 @@ unsigned long long int udev_get_kernel_seqnum(struct udev *udev) * * Returns: the current kernel event sequence number. **/ -unsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queue) +UDEV_EXPORT unsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queue) { unsigned long long int seqnum; @@ -214,7 +214,7 @@ static FILE *open_queue_file(struct udev_queue *udev_queue, unsigned long long i char filename[UTIL_PATH_SIZE]; FILE *queue_file; - util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_queue->udev), "/.udev/queue.bin", NULL); + util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev_queue->udev), "/queue.bin", NULL); queue_file = fopen(filename, "re"); if (queue_file == NULL) return NULL; @@ -234,7 +234,7 @@ static FILE *open_queue_file(struct udev_queue *udev_queue, unsigned long long i * * Returns: the last known udev event sequence number. **/ -unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) +UDEV_EXPORT unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) { unsigned long long int seqnum_udev; FILE *queue_file; @@ -243,7 +243,7 @@ unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) if (queue_file == NULL) return 0; - while (1) { + for (;;) { unsigned long long int seqnum; ssize_t devpath_len; @@ -266,7 +266,7 @@ unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) * * Returns: a flag indicating if udev is active. **/ -int udev_queue_get_udev_is_active(struct udev_queue *udev_queue) +UDEV_EXPORT int udev_queue_get_udev_is_active(struct udev_queue *udev_queue) { unsigned long long int seqnum_start; FILE *queue_file; @@ -285,7 +285,7 @@ int udev_queue_get_udev_is_active(struct udev_queue *udev_queue) * * Returns: a flag indicating if udev is currently handling events. **/ -int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue) +UDEV_EXPORT int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue) { unsigned long long int seqnum_kernel; unsigned long long int seqnum_udev = 0; @@ -299,7 +299,7 @@ int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue) if (queue_file == NULL) return 1; - while (1) { + for (;;) { unsigned long long int seqnum; ssize_t devpath_len; @@ -343,12 +343,12 @@ out: * @start: first event sequence number * @end: last event sequence number * - * Returns: if any of the sequence numbers in the given range is currently active. + * Returns: a flag indicating if any of the sequence numbers in the given range is currently active. **/ -int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, +UDEV_EXPORT int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, unsigned long long int start, unsigned long long int end) { - unsigned long long int seqnum = 0; + unsigned long long int seqnum; ssize_t devpath_len; int unfinished; FILE *queue_file; @@ -368,20 +368,33 @@ int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, fclose(queue_file); return -EOVERFLOW; } - unfinished = (end - start) + 1; - while (unfinished > 0) { + /* + * we might start with 0, and handle the initial seqnum + * only when we find an entry in the queue file + **/ + unfinished = end - start; + + do { if (udev_queue_read_seqnum(queue_file, &seqnum) < 0) break; devpath_len = udev_queue_skip_devpath(queue_file); if (devpath_len < 0) break; + /* + * we might start with an empty or re-build queue file, where + * the initial seqnum is not recorded as finished + */ + if (start == seqnum && devpath_len > 0) + unfinished++; + if (devpath_len == 0) { if (seqnum >= start && seqnum <= end) unfinished--; } - } + } while (unfinished > 0); + fclose(queue_file); return (unfinished == 0); @@ -392,9 +405,9 @@ int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, * @udev_queue: udev queue context * @seqnum: sequence number * - * Returns: a flag indicating if the given sequence number is handled. + * Returns: a flag indicating if the given sequence number is currently active. **/ -int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned long long int seqnum) +UDEV_EXPORT int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned long long int seqnum) { if (!udev_queue_get_seqnum_sequence_is_finished(udev_queue, seqnum, seqnum)) return 0; @@ -409,7 +422,7 @@ int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned lo * * Returns: the first entry of the list of queued events. **/ -struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev_queue) +UDEV_EXPORT struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev_queue) { unsigned long long int seqnum; FILE *queue_file; @@ -422,7 +435,7 @@ struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev if (queue_file == NULL) return NULL; - while (1) { + for (;;) { char syspath[UTIL_PATH_SIZE]; char *s; size_t l; @@ -441,7 +454,7 @@ struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev break; if (len > 0) { - udev_list_entry_add(udev_queue->udev, &udev_queue->queue_list, syspath, seqnum_str, 0, 0); + udev_list_entry_add(udev_queue->udev, &udev_queue->queue_list, syspath, seqnum_str, 0); } else { udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_queue->queue_list)) { if (strcmp(seqnum_str, udev_list_entry_get_value(list_entry)) == 0) { @@ -462,7 +475,7 @@ struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev * * Returns: the first entry of the list of recorded failed events. **/ -struct udev_list_entry *udev_queue_get_failed_list_entry(struct udev_queue *udev_queue) +UDEV_EXPORT struct udev_list_entry *udev_queue_get_failed_list_entry(struct udev_queue *udev_queue) { char path[UTIL_PATH_SIZE]; DIR *dir; @@ -471,7 +484,7 @@ struct udev_list_entry *udev_queue_get_failed_list_entry(struct udev_queue *udev if (udev_queue == NULL) return NULL; udev_list_cleanup_entries(udev_queue->udev, &udev_queue->failed_list); - util_strscpyl(path, sizeof(path), udev_get_dev_path(udev_queue->udev), "/.udev/failed", NULL); + util_strscpyl(path, sizeof(path), udev_get_run_path(udev_queue->udev), "/failed", NULL); dir = opendir(path); if (dir == NULL) return NULL; @@ -495,7 +508,7 @@ struct udev_list_entry *udev_queue_get_failed_list_entry(struct udev_queue *udev util_strscpyl(filename, sizeof(filename), syspath, "/uevent", NULL); if (stat(filename, &statbuf) != 0) continue; - udev_list_entry_add(udev_queue->udev, &udev_queue->failed_list, syspath, NULL, 0, 0); + udev_list_entry_add(udev_queue->udev, &udev_queue->failed_list, syspath, NULL, 0); } closedir(dir); return udev_list_get_entry(&udev_queue->failed_list);