X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=util-linux%2Fmdev.c;h=f9f067dfe37c434153e81fd13e036a0617cdd964;hb=83bb98f7597c4871e46abf48c36c8f57a528d11f;hp=da4930f279c954917fef4a7c0b241557ac0bc0a4;hpb=9213a9e0f2d8fd638ecd02e2628d96dd5c7d233e;p=oweals%2Fbusybox.git diff --git a/util-linux/mdev.c b/util-linux/mdev.c index da4930f27..f9f067dfe 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c @@ -6,7 +6,7 @@ * Copyright 2005 Rob Landley * Copyright 2005 Frank Sorenson * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPL version 2, see file LICENSE in this tarball for details. */ #include "busybox.h" @@ -25,7 +25,7 @@ struct mdev_globals static void make_device(char *path, int delete) { char *device_name; - int major, minor, type, len, fd; + int major, minor, type, len; int mode = 0660; uid_t uid = 0; gid_t gid = 0; @@ -39,10 +39,8 @@ static void make_device(char *path, int delete) if (!delete) { strcat(path, "/dev"); - fd = open(path, O_RDONLY); - len = read(fd, temp + 1, 64); + len = open_read_close(path, temp + 1, 64); *temp++ = 0; - close(fd); if (len < 1) return; } @@ -55,119 +53,126 @@ static void make_device(char *path, int delete) if (ENABLE_FEATURE_MDEV_CONF) { char *conf, *pos, *end; + int line, fd; /* mmap the config file */ - if (-1 != (fd=open("/etc/mdev.conf",O_RDONLY))) { - len = lseek(fd, 0, SEEK_END); - conf = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); - if (conf) { - int line = 0; - - /* Loop through lines in mmaped file*/ - for (pos=conf; pos-confpw_uid; + } + s++; + /* parse GID */ + gid = strtoul(s, &s2, 10); + if (end2 != s2) { + struct group *grp; + grp = getgrnam(strndupa(s, end2-s)); + if (!grp) break; + gid = grp->gr_gid; + } + } + if (field == 2) { + /* mode */ - /* Three fields: regex, uid:gid, mode */ - for (field=0; field < (3 + ENABLE_FEATURE_MDEV_EXEC); - field++) - { - /* Skip whitespace */ - while (pospw_uid; - } - s++; - /* parse GID */ - gid = strtoul(s, &s2, 10); - if (end2 != s2) { - struct group *grp; - grp = getgrnam(strndupa(s, end2-s)); - if (!grp) break; - gid = grp->gr_gid; - } - } else if (field == 2) { - /* mode */ - - mode = strtoul(pos, &pos, 8); - if (pos != end2) break; - } else if (ENABLE_FEATURE_MDEV_EXEC && field == 3) { - // Command to run - char *s = "@$*", *s2; - if (!(s2 = strchr(s, *pos++))) { - // Force error - field = 1; - break; - } - if ((s2-s+1) & (1< 2) break; - if (field) bb_error_msg_and_die("Bad line %d",line); + /* Did everything parse happily? */ - /* Next line */ - pos = ++end; - } - munmap(conf, len); - } - close(fd); + if (field > 2) break; + if (field) bb_error_msg_and_die("bad line %d",line); + + /* Next line */ + pos = ++end; } + munmap(conf, len); + end_parse: /* nothing */ ; } umask(0); if (!delete) { if (sscanf(temp, "%d:%d", &major, &minor) != 2) return; if (mknod(device_name, mode | type, makedev(major, minor)) && errno != EEXIST) - bb_perror_msg_and_die("mknod %s failed", device_name); + bb_perror_msg_and_die("mknod %s", device_name); if (major == bbg.root_major && minor == bbg.root_minor) symlink(device_name, "root"); @@ -178,14 +183,14 @@ static void make_device(char *path, int delete) int rc; char *s; - s=xasprintf("MDEV=%s",device_name); + s = xasprintf("MDEV=%s", device_name); putenv(s); rc = system(command); - s[4]=0; + s[4] = 0; putenv(s); free(s); free(command); - if (rc == -1) bb_perror_msg_and_die("Couldn't run %s", command); + if (rc == -1) bb_perror_msg_and_die("cannot run %s", command); } if (delete) unlink(device_name); } @@ -199,7 +204,8 @@ static void find_dev(char *path) size_t len = strlen(path); struct dirent *entry; - if ((dir = opendir(path)) == NULL) + dir = opendir(path); + if (dir == NULL) return; while ((entry = readdir(dir)) != NULL) { @@ -224,6 +230,7 @@ static void find_dev(char *path) closedir(dir); } +int mdev_main(int argc, char *argv[]); int mdev_main(int argc, char *argv[]) { char *action; @@ -237,9 +244,9 @@ int mdev_main(int argc, char *argv[]) if (argc == 2 && !strcmp(argv[1],"-s")) { struct stat st; - stat("/", &st); // If this fails, we have bigger problems. - bbg.root_major=major(st.st_dev); - bbg.root_minor=minor(st.st_dev); + xstat("/", &st); + bbg.root_major = major(st.st_dev); + bbg.root_minor = minor(st.st_dev); strcpy(temp,"/sys/block"); find_dev(temp); strcpy(temp,"/sys/class"); @@ -250,7 +257,7 @@ int mdev_main(int argc, char *argv[]) } else { action = getenv("ACTION"); env_path = getenv("DEVPATH"); - if (!action || !env_path) + if (!action || !env_path) bb_show_usage(); sprintf(temp, "/sys%s", env_path);