X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev%2Fudevadm-trigger.c;h=e7940ef92d608a6274690e75f6d8cb1571645c69;hp=6d01040e01cbf7ddd552bfaae08adb7856f0ffde;hb=a4354f9385fa6854360729678491da64be996f03;hpb=ecc9ec579feb4b7cc86bcf7caed3cb841faf3c9e diff --git a/udev/udevadm-trigger.c b/udev/udevadm-trigger.c index 6d01040e0..e7940ef92 100644 --- a/udev/udevadm-trigger.c +++ b/udev/udevadm-trigger.c @@ -47,7 +47,7 @@ static struct sockaddr_un saddr; static socklen_t saddrlen; /* devices that should run last cause of their dependencies */ -static int delay_device(const char *devpath) +static int delay_device(const char *syspath) { static const char *delay_device_list[] = { "*/md*", @@ -57,51 +57,48 @@ static int delay_device(const char *devpath) int i; for (i = 0; delay_device_list[i] != NULL; i++) - if (fnmatch(delay_device_list[i], devpath, 0) == 0) + if (fnmatch(delay_device_list[i], syspath, 0) == 0) return 1; return 0; } static int device_list_insert(struct udev *udev, const char *path) { - char filename[PATH_SIZE]; - char devpath[PATH_SIZE]; + char filename[UTIL_PATH_SIZE]; struct stat statbuf; dbg(udev, "add '%s'\n" , path); /* we only have a device, if we have an uevent file */ - strlcpy(filename, path, sizeof(filename)); - strlcat(filename, "/uevent", sizeof(filename)); + util_strlcpy(filename, path, sizeof(filename)); + util_strlcat(filename, "/uevent", sizeof(filename)); if (stat(filename, &statbuf) < 0) return -1; if (!(statbuf.st_mode & S_IWUSR)) return -1; - strlcpy(devpath, &path[strlen(udev_get_sys_path(udev))], sizeof(devpath)); - /* resolve possible link to real target */ - if (lstat(path, &statbuf) < 0) + util_strlcpy(filename, path, sizeof(filename)); + if (lstat(filename, &statbuf) < 0) return -1; if (S_ISLNK(statbuf.st_mode)) - if (sysfs_resolve_link(udev, devpath, sizeof(devpath)) != 0) + if (util_resolve_sys_link(udev, filename, sizeof(filename)) != 0) return -1; - name_list_add(udev, &device_list, devpath, 1); + name_list_add(udev, &device_list, filename, 1); return 0; } -static void trigger_uevent(struct udev *udev, const char *devpath, const char *action) +static void trigger_uevent(struct udev *udev, const char *syspath, const char *action) { - char filename[PATH_SIZE]; + char filename[UTIL_PATH_SIZE]; int fd; - strlcpy(filename, udev_get_sys_path(udev), sizeof(filename)); - strlcat(filename, devpath, sizeof(filename)); - strlcat(filename, "/uevent", sizeof(filename)); + util_strlcpy(filename, syspath, sizeof(filename)); + util_strlcat(filename, "/uevent", sizeof(filename)); if (verbose) - printf("%s\n", devpath); + printf("%s\n", syspath); if (dry_run) return; @@ -118,17 +115,18 @@ static void trigger_uevent(struct udev *udev, const char *devpath, const char *a close(fd); } -static int pass_to_socket(struct udev *udev, const char *devpath, const char *action, const char *env) +static int pass_to_socket(struct udev *udev, const char *syspath, const char *action, const char *env) { struct udevice *udevice; struct name_entry *name_loop; char buf[4096]; size_t bufpos = 0; ssize_t count; - char path[PATH_SIZE]; + char path[UTIL_PATH_SIZE]; int fd; - char link_target[PATH_SIZE]; + char link_target[UTIL_PATH_SIZE]; int len; + const char *devpath = &syspath[strlen(udev_get_sys_path(udev))]; int err = 0; if (verbose) @@ -156,9 +154,9 @@ static int pass_to_socket(struct udev *udev, const char *devpath, const char *ac bufpos++; /* add subsystem */ - strlcpy(path, udev_get_sys_path(udev), sizeof(path)); - strlcat(path, devpath, sizeof(path)); - strlcat(path, "/subsystem", sizeof(path)); + util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); + util_strlcat(path, devpath, sizeof(path)); + util_strlcat(path, "/subsystem", sizeof(path)); len = readlink(path, link_target, sizeof(link_target)); if (len > 0) { char *pos; @@ -174,10 +172,10 @@ static int pass_to_socket(struct udev *udev, const char *devpath, const char *ac /* add symlinks and node name */ path[0] = '\0'; list_for_each_entry(name_loop, &udevice->symlink_list, node) { - strlcat(path, udev_get_dev_path(udev), sizeof(path)); - strlcat(path, "/", sizeof(path)); - strlcat(path, name_loop->name, sizeof(path)); - strlcat(path, " ", sizeof(path)); + util_strlcat(path, udev_get_dev_path(udev), sizeof(path)); + util_strlcat(path, "/", sizeof(path)); + util_strlcat(path, name_loop->name, sizeof(path)); + util_strlcat(path, " ", sizeof(path)); } util_remove_trailing_chars(path, ' '); if (path[0] != '\0') { @@ -185,17 +183,16 @@ static int pass_to_socket(struct udev *udev, const char *devpath, const char *ac bufpos++; } if (udevice->name[0] != '\0') { - strlcpy(path, udev_get_dev_path(udev), sizeof(path)); - strlcat(path, "/", sizeof(path)); - strlcat(path, udevice->name, sizeof(path)); + util_strlcpy(path, udev_get_dev_path(udev), sizeof(path)); + util_strlcat(path, "/", sizeof(path)); + util_strlcat(path, udevice->name, sizeof(path)); bufpos += snprintf(&buf[bufpos], sizeof(buf)-1, "DEVNAME=%s", path); bufpos++; } /* add keys from device "uevent" file */ - strlcpy(path, udev_get_sys_path(udev), sizeof(path)); - strlcat(path, devpath, sizeof(path)); - strlcat(path, "/uevent", sizeof(path)); + util_strlcpy(path, syspath, sizeof(path)); + util_strlcat(path, "/uevent", sizeof(path)); fd = open(path, O_RDONLY); if (fd >= 0) { char value[4096]; @@ -214,7 +211,7 @@ static int pass_to_socket(struct udev *udev, const char *devpath, const char *ac if (next == NULL) break; next[0] = '\0'; - bufpos += strlcpy(&buf[bufpos], key, sizeof(buf) - bufpos-1); + bufpos += util_strlcpy(&buf[bufpos], key, sizeof(buf) - bufpos-1); bufpos++; key = &next[1]; } @@ -223,7 +220,7 @@ static int pass_to_socket(struct udev *udev, const char *devpath, const char *ac /* add keys from database */ list_for_each_entry(name_loop, &udevice->env_list, node) { - bufpos += strlcpy(&buf[bufpos], name_loop->name, sizeof(buf) - bufpos-1); + bufpos += util_strlcpy(&buf[bufpos], name_loop->name, sizeof(buf) - bufpos-1); bufpos++; } if (bufpos > sizeof(buf)) @@ -285,11 +282,11 @@ static int subsystem_filtered(const char *subsystem) static int attr_match(const char *path, const char *attr_value) { - char attr[NAME_SIZE]; - char file[PATH_SIZE]; + char attr[UTIL_NAME_SIZE]; + char file[UTIL_PATH_SIZE]; char *match_value; - strlcpy(attr, attr_value, sizeof(attr)); + util_strlcpy(attr, attr_value, sizeof(attr)); /* separate attr and match value */ match_value = strchr(attr, '='); @@ -298,13 +295,13 @@ static int attr_match(const char *path, const char *attr_value) match_value = &match_value[1]; } - strlcpy(file, path, sizeof(file)); - strlcat(file, "/", sizeof(file)); - strlcat(file, attr, sizeof(file)); + util_strlcpy(file, path, sizeof(file)); + util_strlcat(file, "/", sizeof(file)); + util_strlcat(file, attr, sizeof(file)); if (match_value != NULL) { /* match file content */ - char value[NAME_SIZE]; + char value[UTIL_NAME_SIZE]; int fd; ssize_t size; @@ -357,7 +354,7 @@ enum scan_type { static void scan_subsystem(struct udev *udev, const char *subsys, enum scan_type scan) { - char base[PATH_SIZE]; + char base[UTIL_PATH_SIZE]; DIR *dir; struct dirent *dent; const char *subdir; @@ -369,14 +366,14 @@ static void scan_subsystem(struct udev *udev, const char *subsys, enum scan_type else return; - strlcpy(base, udev_get_sys_path(udev), sizeof(base)); - strlcat(base, "/", sizeof(base)); - strlcat(base, subsys, sizeof(base)); + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/", sizeof(base)); + util_strlcat(base, subsys, sizeof(base)); dir = opendir(base); if (dir != NULL) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char dirname[PATH_SIZE]; + char dirname[UTIL_PATH_SIZE]; DIR *dir2; struct dirent *dent2; @@ -387,9 +384,9 @@ static void scan_subsystem(struct udev *udev, const char *subsys, enum scan_type if (subsystem_filtered(dent->d_name)) continue; - strlcpy(dirname, base, sizeof(dirname)); - strlcat(dirname, "/", sizeof(dirname)); - strlcat(dirname, dent->d_name, sizeof(dirname)); + util_strlcpy(dirname, base, sizeof(dirname)); + util_strlcat(dirname, "/", sizeof(dirname)); + util_strlcat(dirname, dent->d_name, sizeof(dirname)); if (scan == SCAN_SUBSYSTEM) { if (attr_filtered(dirname)) @@ -400,20 +397,20 @@ static void scan_subsystem(struct udev *udev, const char *subsys, enum scan_type continue; } - strlcat(dirname, subdir, sizeof(dirname)); + util_strlcat(dirname, subdir, sizeof(dirname)); /* look for devices/drivers */ dir2 = opendir(dirname); if (dir2 != NULL) { for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { - char dirname2[PATH_SIZE]; + char dirname2[UTIL_PATH_SIZE]; if (dent2->d_name[0] == '.') continue; - strlcpy(dirname2, dirname, sizeof(dirname2)); - strlcat(dirname2, "/", sizeof(dirname2)); - strlcat(dirname2, dent2->d_name, sizeof(dirname2)); + util_strlcpy(dirname2, dirname, sizeof(dirname2)); + util_strlcat(dirname2, "/", sizeof(dirname2)); + util_strlcat(dirname2, dent2->d_name, sizeof(dirname2)); if (attr_filtered(dirname2)) continue; device_list_insert(udev, dirname2); @@ -427,29 +424,29 @@ static void scan_subsystem(struct udev *udev, const char *subsys, enum scan_type static void scan_block(struct udev *udev) { - char base[PATH_SIZE]; + char base[UTIL_PATH_SIZE]; DIR *dir; struct dirent *dent; if (subsystem_filtered("block")) return; - strlcpy(base, udev_get_sys_path(udev), sizeof(base)); - strlcat(base, "/block", sizeof(base)); + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/block", sizeof(base)); dir = opendir(base); if (dir != NULL) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char dirname[PATH_SIZE]; + char dirname[UTIL_PATH_SIZE]; DIR *dir2; struct dirent *dent2; if (dent->d_name[0] == '.') continue; - strlcpy(dirname, base, sizeof(dirname)); - strlcat(dirname, "/", sizeof(dirname)); - strlcat(dirname, dent->d_name, sizeof(dirname)); + util_strlcpy(dirname, base, sizeof(dirname)); + util_strlcat(dirname, "/", sizeof(dirname)); + util_strlcat(dirname, dent->d_name, sizeof(dirname)); if (attr_filtered(dirname)) continue; if (device_list_insert(udev, dirname) != 0) @@ -459,7 +456,7 @@ static void scan_block(struct udev *udev) dir2 = opendir(dirname); if (dir2 != NULL) { for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { - char dirname2[PATH_SIZE]; + char dirname2[UTIL_PATH_SIZE]; if (dent2->d_name[0] == '.') continue; @@ -467,9 +464,9 @@ static void scan_block(struct udev *udev) if (!strcmp(dent2->d_name,"device")) continue; - strlcpy(dirname2, dirname, sizeof(dirname2)); - strlcat(dirname2, "/", sizeof(dirname2)); - strlcat(dirname2, dent2->d_name, sizeof(dirname2)); + util_strlcpy(dirname2, dirname, sizeof(dirname2)); + util_strlcat(dirname2, "/", sizeof(dirname2)); + util_strlcat(dirname2, dent2->d_name, sizeof(dirname2)); if (attr_filtered(dirname2)) continue; device_list_insert(udev, dirname2); @@ -483,17 +480,17 @@ static void scan_block(struct udev *udev) static void scan_class(struct udev *udev) { - char base[PATH_SIZE]; + char base[UTIL_PATH_SIZE]; DIR *dir; struct dirent *dent; - strlcpy(base, udev_get_sys_path(udev), sizeof(base)); - strlcat(base, "/class", sizeof(base)); + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/class", sizeof(base)); dir = opendir(base); if (dir != NULL) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char dirname[PATH_SIZE]; + char dirname[UTIL_PATH_SIZE]; DIR *dir2; struct dirent *dent2; @@ -503,13 +500,13 @@ static void scan_class(struct udev *udev) if (subsystem_filtered(dent->d_name)) continue; - strlcpy(dirname, base, sizeof(dirname)); - strlcat(dirname, "/", sizeof(dirname)); - strlcat(dirname, dent->d_name, sizeof(dirname)); + util_strlcpy(dirname, base, sizeof(dirname)); + util_strlcat(dirname, "/", sizeof(dirname)); + util_strlcat(dirname, dent->d_name, sizeof(dirname)); dir2 = opendir(dirname); if (dir2 != NULL) { for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { - char dirname2[PATH_SIZE]; + char dirname2[UTIL_PATH_SIZE]; if (dent2->d_name[0] == '.') continue; @@ -517,9 +514,9 @@ static void scan_class(struct udev *udev) if (!strcmp(dent2->d_name, "device")) continue; - strlcpy(dirname2, dirname, sizeof(dirname2)); - strlcat(dirname2, "/", sizeof(dirname2)); - strlcat(dirname2, dent2->d_name, sizeof(dirname2)); + util_strlcpy(dirname2, dirname, sizeof(dirname2)); + util_strlcat(dirname2, "/", sizeof(dirname2)); + util_strlcat(dirname2, dent2->d_name, sizeof(dirname2)); if (attr_filtered(dirname2)) continue; device_list_insert(udev, dirname2); @@ -533,26 +530,26 @@ static void scan_class(struct udev *udev) static void scan_failed(struct udev *udev) { - char base[PATH_SIZE]; + char base[UTIL_PATH_SIZE]; DIR *dir; struct dirent *dent; - strlcpy(base, udev_get_dev_path(udev), sizeof(base)); - strlcat(base, "/.udev/failed", sizeof(base)); + util_strlcpy(base, udev_get_dev_path(udev), sizeof(base)); + util_strlcat(base, "/.udev/failed", sizeof(base)); dir = opendir(base); if (dir != NULL) { for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - char device[PATH_SIZE]; + char device[UTIL_PATH_SIZE]; size_t start; if (dent->d_name[0] == '.') continue; - start = strlcpy(device, udev_get_sys_path(udev), sizeof(device)); + start = util_strlcpy(device, udev_get_sys_path(udev), sizeof(device)); if(start >= sizeof(device)) start = sizeof(device) - 1; - strlcat(device, dent->d_name, sizeof(device)); + util_strlcat(device, dent->d_name, sizeof(device)); util_path_decode(&device[start]); device_list_insert(udev, device); } @@ -651,15 +648,15 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[]) saddr.sun_family = AF_LOCAL; if (sockpath[0] == '@') { /* abstract namespace socket requested */ - strlcpy(&saddr.sun_path[1], &sockpath[1], sizeof(saddr.sun_path)-1); + util_strlcpy(&saddr.sun_path[1], &sockpath[1], sizeof(saddr.sun_path)-1); saddrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]); } else if (stat(sockpath, &stats) == 0 && S_ISSOCK(stats.st_mode)) { /* existing socket file */ - strlcpy(saddr.sun_path, sockpath, sizeof(saddr.sun_path)); + util_strlcpy(saddr.sun_path, sockpath, sizeof(saddr.sun_path)); saddrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path); } else { /* no socket file, assume abstract namespace socket */ - strlcpy(&saddr.sun_path[1], sockpath, sizeof(saddr.sun_path)-1); + util_strlcpy(&saddr.sun_path[1], sockpath, sizeof(saddr.sun_path)-1); saddrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]); } } else if (env != NULL) { @@ -671,12 +668,12 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[]) scan_failed(udev); exec_list(udev, action, env); } else { - char base[PATH_SIZE]; + char base[UTIL_PATH_SIZE]; struct stat statbuf; /* if we have /sys/subsystem, forget all the old stuff */ - strlcpy(base, udev_get_sys_path(udev), sizeof(base)); - strlcat(base, "/subsystem", sizeof(base)); + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/subsystem", sizeof(base)); if (stat(base, &statbuf) == 0) { scan_subsystem(udev, "subsystem", SCAN_SUBSYSTEM); exec_list(udev, action, env); @@ -689,8 +686,8 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[]) scan_class(udev); /* scan "block" if it isn't a "class" */ - strlcpy(base, udev_get_sys_path(udev), sizeof(base)); - strlcat(base, "/class/block", sizeof(base)); + util_strlcpy(base, udev_get_sys_path(udev), sizeof(base)); + util_strlcat(base, "/class/block", sizeof(base)); if (stat(base, &statbuf) != 0) scan_block(udev); exec_list(udev, action, env);