X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_utils.c;h=e6580d2c0acdca0404e17b2cddb1eee19ec0ad6d;hb=5ef42682053f57fc031d420f0a2ae3e204421b8d;hp=fe18892de19fa2eeb3332ad526b8b5c533430cd9;hpb=9f8dfa19cfd2b502bf794f39a421cbb7c4cc0404;p=elogind.git diff --git a/udev_utils.c b/udev_utils.c index fe18892de..e6580d2c0 100644 --- a/udev_utils.c +++ b/udev_utils.c @@ -47,26 +47,26 @@ void udev_init_device(struct udevice *udev, const char* devpath, const char *sub strfieldcpy(udev->subsystem, subsystem); if (strcmp(udev->subsystem, "block") == 0) - udev->type = 'b'; + udev->type = BLOCK; else if (strcmp(udev->subsystem, "net") == 0) - udev->type = 'n'; + udev->type = NET; else if (strncmp(udev->devpath, "/block/", 7) == 0) - udev->type = 'b'; + udev->type = BLOCK; else if (strncmp(udev->devpath, "/class/net/", 11) == 0) - udev->type = 'n'; + udev->type = NET; else if (strncmp(udev->devpath, "/class/", 7) == 0) - udev->type = 'c'; + udev->type = CLASS; - udev->mode = default_mode; - strfieldcpy(udev->owner, default_owner); - strfieldcpy(udev->group, default_group); + udev->mode = 0660; + strcpy(udev->owner, "root"); + strcpy(udev->group, "root"); } -int kernel_release_satisfactory(int version, int patchlevel, int sublevel) +int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, unsigned int sublevel) { - static int kversion = 0; - static int kpatchlevel; - static int ksublevel; + static unsigned int kversion = 0; + static unsigned int kpatchlevel; + static unsigned int ksublevel; if (kversion == 0) { struct utsname uts; @@ -112,6 +112,31 @@ int create_path(const char *path) return mkdir(p, 0755); } +/* Reset permissions on the device node, before unlinking it to make sure, + * that permisions of possible hard links will be removed too. + */ +int unlink_secure(const char *filename) +{ + int retval; + + retval = chown(filename, 0, 0); + if (retval) + dbg("chown(%s, 0, 0) failed with error '%s'", filename, strerror(errno)); + + retval = chmod(filename, 0000); + if (retval) + dbg("chmod(%s, 0000) failed with error '%s'", filename, strerror(errno)); + + retval = unlink(filename); + if (errno == ENOENT) + retval = 0; + + if (retval) + dbg("unlink(%s) failed with error '%s'", filename, strerror(errno)); + + return retval; +} + int parse_get_pair(char **orig_string, char **left, char **right) { char *temp; @@ -200,11 +225,11 @@ size_t buf_get_line(const char *buf, size_t buflen, size_t cur) void no_trailing_slash(char *path) { - int len; + size_t len; len = strlen(path); - if (len > 0 && path[len-1] == '/') - path[len-1] = '\0'; + while (len > 0 && path[len-1] == '/') + path[--len] = '\0'; } struct files {