X-Git-Url: http://git.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=udevtrigger.c;h=c5628bdce03147b2420010f6320028ce258433bc;hp=efea6b287c897bbbb817b569eee67fcbf49249b7;hb=070bb98651b7e38d953eeffc5b0435e909e603b9;hpb=ee92d6fa240e28d8031d7204939ffec61090d7e2 diff --git a/udevtrigger.c b/udevtrigger.c index efea6b2..c5628bd 100644 --- a/udevtrigger.c +++ b/udevtrigger.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -135,21 +136,33 @@ static int sysfs_resolve_link(char *devpath, size_t size) return 0; } +static bool device_has_attribute(const char *path, const char *attr, + mode_t mode) +{ + char filename[PATH_SIZE]; + struct stat statbuf; + + strlcpy(filename, path, sizeof(filename)); + strlcat(filename, attr, sizeof(filename)); + + if (stat(filename, &statbuf) < 0) + return false; + + if (!(statbuf.st_mode & mode)) + return false; + + return true; +} static int device_list_insert(const char *path) { - char filename[PATH_SIZE]; char devpath[PATH_SIZE]; struct stat statbuf; dbg("add '%s'" , path); /* we only have a device, if we have an uevent file */ - strlcpy(filename, path, sizeof(filename)); - strlcat(filename, "/uevent", sizeof(filename)); - if (stat(filename, &statbuf) < 0) - return -1; - if (!(statbuf.st_mode & S_IWUSR)) + if (!device_has_attribute(path, "/uevent", S_IWUSR)) return -1; strlcpy(devpath, &path[4], sizeof(devpath));