X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Flib%2Flibudev-queue.c;h=8dce6c314d5a1109a0221c74385a720310b95b25;hp=7ec22370104830db6fe88b5589b3bad7ad5f5029;hb=e6c1a2bde7609cc703a5fad34c3bc1d15d19bbdc;hpb=a5d8cffad9020247c9ba81a9e0a9b9cee5c4a4d5 diff --git a/udev/lib/libudev-queue.c b/udev/lib/libudev-queue.c index 7ec223701..8dce6c314 100644 --- a/udev/lib/libudev-queue.c +++ b/udev/lib/libudev-queue.c @@ -3,18 +3,10 @@ * * Copyright (C) 2008 Kay Sievers * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. */ #include @@ -92,8 +84,7 @@ unsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queu if (udev_queue == NULL) return -EINVAL; - util_strlcpy(filename, udev_get_sys_path(udev_queue->udev), sizeof(filename)); - util_strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename)); + util_strscpyl(filename, sizeof(filename), udev_get_sys_path(udev_queue->udev), "/kernel/uevent_seqnum", NULL); fd = open(filename, O_RDONLY); if (fd < 0) return 0; @@ -117,8 +108,7 @@ unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) if (udev_queue == NULL) return -EINVAL; - util_strlcpy(filename, udev_get_dev_path(udev_queue->udev), sizeof(filename)); - util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename)); + util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_queue->udev), "/.udev/uevent_seqnum", NULL); fd = open(filename, O_RDONLY); if (fd < 0) return 0; @@ -140,8 +130,7 @@ int udev_queue_get_udev_is_active(struct udev_queue *udev_queue) if (udev_queue == NULL) return 0; - util_strlcpy(filename, udev_get_dev_path(udev_queue->udev), sizeof(filename)); - util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename)); + util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev_queue->udev), "/.udev/uevent_seqnum", NULL); if (stat(filename, &statbuf) == 0) return 1; return 0; @@ -155,8 +144,7 @@ int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue) if (udev_queue == NULL) return -EINVAL; - util_strlcpy(queuename, udev_get_dev_path(udev_queue->udev), sizeof(queuename)); - util_strlcat(queuename, "/.udev/queue", sizeof(queuename)); + util_strscpyl(queuename, sizeof(queuename), udev_get_dev_path(udev_queue->udev), "/.udev/queue", NULL); if (stat(queuename, &statbuf) == 0) { dbg(udev_queue->udev, "queue is not empty\n"); return 0; @@ -186,12 +174,11 @@ int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned lo if (udev_queue == NULL) return -EINVAL; - /* if we have not seen this seqnum, check if it is/was already queued */ - if (seqnum < udev_queue->last_seen_udev_seqnum) { - udev_queue_get_udev_seqnum(udev_queue); - if (seqnum < udev_queue->last_seen_udev_seqnum) + /* did it reach the queue? */ + if (seqnum > udev_queue->last_seen_udev_seqnum) + if (seqnum > udev_queue_get_udev_seqnum(udev_queue)) return 0; - } + /* is it still in the queue? */ snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu", udev_get_dev_path(udev_queue->udev), seqnum); if (lstat(filename, &statbuf) == 0) @@ -209,28 +196,24 @@ struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev if (udev_queue == NULL) return NULL; udev_list_cleanup_entries(udev_queue->udev, &udev_queue->queue_list); - util_strlcpy(path, udev_get_dev_path(udev_queue->udev), sizeof(path)); - util_strlcat(path, "/.udev/queue", sizeof(path)); + util_strscpyl(path, sizeof(path), udev_get_dev_path(udev_queue->udev), "/.udev/queue", NULL); dir = opendir(path); if (dir == NULL) return NULL; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char filename[UTIL_PATH_SIZE]; char syspath[UTIL_PATH_SIZE]; - size_t syslen; + char *s; + size_t l; ssize_t len; if (dent->d_name[0] == '.') continue; - util_strlcpy(filename, path, sizeof(filename)); - util_strlcat(filename, "/", sizeof(filename)); - util_strlcat(filename, dent->d_name, sizeof(filename)); - - syslen = util_strlcpy(syspath, udev_get_sys_path(udev_queue->udev), sizeof(syspath)); - len = readlink(filename, &syspath[syslen], sizeof(syspath)-syslen); - if (len < 0 || len >= (ssize_t)(sizeof(syspath)-syslen)) + s = syspath; + l = util_strpcpyl(&s, sizeof(syspath), udev_get_sys_path(udev_queue->udev), NULL); + len = readlinkat(dirfd(dir), dent->d_name, s, l); + if (len < 0 || (size_t)len >= l) continue; - syspath[syslen + len] = '\0'; + s[len] = '\0'; dbg(udev_queue->udev, "found '%s' [%s]\n", syspath, dent->d_name); udev_list_entry_add(udev_queue->udev, &udev_queue->queue_list, syspath, dent->d_name, 0, 0); } @@ -247,32 +230,28 @@ 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_strlcpy(path, udev_get_dev_path(udev_queue->udev), sizeof(path)); - util_strlcat(path, "/.udev/failed", sizeof(path)); + util_strscpyl(path, sizeof(path), udev_get_dev_path(udev_queue->udev), "/.udev/failed", NULL); dir = opendir(path); if (dir == NULL) return NULL; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { char filename[UTIL_PATH_SIZE]; char syspath[UTIL_PATH_SIZE]; - struct stat statbuf; - size_t syslen; + char *s; + size_t l; ssize_t len; + struct stat statbuf; if (dent->d_name[0] == '.') continue; - util_strlcpy(filename, path, sizeof(filename)); - util_strlcat(filename, "/", sizeof(filename)); - util_strlcat(filename, dent->d_name, sizeof(filename)); - - syslen = util_strlcpy(syspath, udev_get_sys_path(udev_queue->udev), sizeof(syspath)); - len = readlink(filename, &syspath[syslen], sizeof(syspath)-syslen); - if (len < 0 || len >= (ssize_t)(sizeof(syspath)-syslen)) + s = syspath; + l = util_strpcpyl(&s, sizeof(syspath), udev_get_sys_path(udev_queue->udev), NULL); + len = readlinkat(dirfd(dir), dent->d_name, s, l); + if (len < 0 || (size_t)len >= l) continue; - syspath[syslen + len] = '\0'; + s[len] = '\0'; dbg(udev_queue->udev, "found '%s' [%s]\n", syspath, dent->d_name); - util_strlcpy(filename, syspath, sizeof(filename)); - util_strlcat(filename, "/uevent", sizeof(filename)); + 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); @@ -286,17 +265,17 @@ int udev_queue_export_udev_seqnum(struct udev_queue *udev_queue, unsigned long l return -1; } -extern int udev_queue_export_device_queued(struct udev_queue *udev_queue, struct udev_device *udev_device) +int udev_queue_export_device_queued(struct udev_queue *udev_queue, struct udev_device *udev_device) { return -1; } -extern int udev_queue_export_device_finished(struct udev_queue *udev_queue, struct udev_device *udev_device) +int udev_queue_export_device_finished(struct udev_queue *udev_queue, struct udev_device *udev_device) { return -1; } -extern int udev_queue_export_device_failed(struct udev_queue *udev_queue, struct udev_device *udev_device) +int udev_queue_export_device_failed(struct udev_queue *udev_queue, struct udev_device *udev_device) { return -1; }