diff options
-rw-r--r-- | archival/tar.c | 19 | ||||
-rw-r--r-- | examples/mdev.conf | 10 | ||||
-rw-r--r-- | examples/mdev_fat.conf | 9 | ||||
-rw-r--r-- | util-linux/mdev.c | 51 |
4 files changed, 40 insertions, 49 deletions
diff --git a/archival/tar.c b/archival/tar.c index cf972c24c..a64d6510f 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -60,8 +60,8 @@ #if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2 /* Do not pass gzip flag to writeTarFile() */ -#define writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude, gzip) \ - writeTarFile(tar_fd, verboseFlag, dereferenceFlag, include, exclude) +#define writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude, gzip) \ + writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude) #endif @@ -598,7 +598,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip) /* gcc 4.2.1 inlines it, making code bigger */ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, - int dereferenceFlag, const llist_t *include, + int recurseFlags, const llist_t *include, const llist_t *exclude, int gzip) { int errorFlag = FALSE; @@ -621,8 +621,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, /* Read the directory/files and iterate over them one at a time */ while (include) { - if (!recursive_action(include->data, ACTION_RECURSE | - (dereferenceFlag ? ACTION_FOLLOWLINKS : 0), + if (!recursive_action(include->data, recurseFlags, writeFileToTarball, writeFileToTarball, &tbInfo, 0) ) { errorFlag = TRUE; @@ -662,7 +661,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag, } #else int writeTarFile(int tar_fd, int verboseFlag, - int dereferenceFlag, const llist_t *include, + int recurseFlags, const llist_t *include, const llist_t *exclude, int gzip); #endif /* FEATURE_TAR_CREATE */ @@ -749,6 +748,7 @@ static llist_t *append_file_list_to_list(llist_t *list) // o no-same-owner // p same-permissions // k keep-old +// no-recursion // numeric-owner // no-same-permissions // overwrite @@ -768,6 +768,7 @@ enum { IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) #if ENABLE_FEATURE_TAR_LONG_OPTIONS + OPTBIT_NORECURSION, IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) OPTBIT_NUMERIC_OWNER, OPTBIT_NOPRESERVE_PERM, @@ -791,6 +792,7 @@ enum { OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m + OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions @@ -835,6 +837,7 @@ static const char tar_longopts[] ALIGN1 = # if ENABLE_FEATURE_TAR_NOPRESERVE_TIME "touch\0" No_argument "m" # endif + "no-recursion\0" No_argument "\xfa" # if ENABLE_FEATURE_TAR_TO_COMMAND "to-command\0" Required_argument "\xfb" # endif @@ -1050,7 +1053,9 @@ int tar_main(int argc UNUSED_PARAM, char **argv) zipMode = 2; #endif /* NB: writeTarFile() closes tar_handle->src_fd */ - return writeTarFile(tar_handle->src_fd, verboseFlag, opt & OPT_DEREFERENCE, + return writeTarFile(tar_handle->src_fd, verboseFlag, + (opt & OPT_DEREFERENCE ? ACTION_FOLLOWLINKS : 0) + | (opt & OPT_NORECURSION ? 0 : ACTION_RECURSE), tar_handle->accept, tar_handle->reject, zipMode); } diff --git a/examples/mdev.conf b/examples/mdev.conf index cdbb4fcfe..51795694d 100644 --- a/examples/mdev.conf +++ b/examples/mdev.conf @@ -7,8 +7,14 @@ # instead of the default 0:0 660. # # Syntax: -# %s %d:%d %s -# devicename_regex user:group mode +# [-]devicename_regex user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] +# [-]$ENVVAR=regex user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] +# [-]@maj,min[-min2] user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] +# +# [-]: do not stop on this match, continue reading mdev.conf +# =: move, >: move and create a symlink +# !: do not create device node +# @|$|*: run@cmd if $ACTION=add, $cmd if $ACTION=remove, *cmd in all cases null 0:0 666 zero 0:0 666 diff --git a/examples/mdev_fat.conf b/examples/mdev_fat.conf index df329b4b5..ceba3a797 100644 --- a/examples/mdev_fat.conf +++ b/examples/mdev_fat.conf @@ -7,10 +7,14 @@ # instead of the default 0:0 660. # # Syntax: -# [-]devicename_regex user:group mode [>|=path] [@|$|*cmd args...] +# [-]devicename_regex user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] +# [-]$ENVVAR=regex user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] +# [-]@maj,min[-min2] user:group mode [=path]|[>path]|[!] [@|$|*cmd args...] # +# [-]: do not stop on this match, continue reading mdev.conf # =: move, >: move and create a symlink -# @|$|*: run $cmd on delete, @cmd on create, *cmd on both +# !: do not create device node +# @|$|*: run cmd if $ACTION=remove, @cmd if $ACTION=add, *cmd in all cases # support module loading on hotplug $MODALIAS=.* root:root 660 @modprobe "$MODALIAS" @@ -49,7 +53,6 @@ sr[0-9]* root:cdrom 660 @ln -sf $MDEV cdrom fd[0-9]* root:floppy 660 # net devices --net/.* root:root 600 @nameif tun[0-9]* root:root 600 =net/ tap[0-9]* root:root 600 =net/ diff --git a/util-linux/mdev.c b/util-linux/mdev.c index 17355bf62..84e72e2e6 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c @@ -236,7 +236,6 @@ enum { OP_add, OP_remove }; struct rule { bool keep_matching; bool regex_compiled; - bool regex_has_slash; mode_t mode; int maj, min0, min1; struct bb_uidgid_t ugid; @@ -340,7 +339,6 @@ static void parse_next_rule(void) } xregcomp(&G.cur_rule.match, val, REG_EXTENDED); G.cur_rule.regex_compiled = 1; - G.cur_rule.regex_has_slash = (strchr(val, '/') != NULL); } /* 2nd field: uid:gid - device ownership */ @@ -467,11 +465,10 @@ static char *build_alias(char *alias, const char *device_name) */ static void make_device(char *device_name, char *path, int operation) { - char *subsystem_slash_devname; int major, minor, type, len; if (G.verbose) - bb_error_msg("make_device: %s, %s, op:%d", device_name, path, operation); + bb_error_msg("device: %s, %s", device_name, path); /* Try to read major/minor string. Note that the kernel puts \n after * the data, so we don't need to worry about null terminating the string @@ -479,7 +476,7 @@ static void make_device(char *device_name, char *path, int operation) * We also depend on path having writeable space after it. */ major = -1; - if (operation != OP_remove) { + if (operation == OP_add) { char *dev_maj_min = path + strlen(path); strcpy(dev_maj_min, "/dev"); @@ -490,7 +487,10 @@ static void make_device(char *device_name, char *path, int operation) return; /* no "dev" file, but we can still run scripts * based on device name */ - } else if (sscanf(++dev_maj_min, "%u:%u", &major, &minor) != 2) { + } else if (sscanf(++dev_maj_min, "%u:%u", &major, &minor) == 2) { + if (G.verbose) + bb_error_msg("maj,min: %u,%u", major, minor); + } else { major = -1; } } @@ -502,29 +502,12 @@ static void make_device(char *device_name, char *path, int operation) /* http://kernel.org/doc/pending/hotplug.txt says that only * "/sys/block/..." is for block devices. "/sys/bus" etc is not. * But since 2.6.25 block devices are also in /sys/class/block. - * We use strstr("/block/") to forestall future surprises. */ + * We use strstr("/block/") to forestall future surprises. + */ type = S_IFCHR; if (strstr(path, "/block/") || (G.subsystem && strncmp(G.subsystem, "block", 5) == 0)) type = S_IFBLK; - /* Make path point to "subsystem/device_name" */ - subsystem_slash_devname = NULL; - /* Check for coldplug invocations first */ - if (strncmp(path, "/sys/block/", 11) == 0) /* legacy case */ - path += sizeof("/sys/") - 1; - else if (strncmp(path, "/sys/class/", 11) == 0) - path += sizeof("/sys/class/") - 1; - else { - /* Example of a hotplug invocation: - * SUBSYSTEM="block" - * DEVPATH="/sys" + "/devices/virtual/mtd/mtd3/mtdblock3" - * ("/sys" is added by mdev_main) - * - path does not contain subsystem - */ - subsystem_slash_devname = concat_path_file(G.subsystem, device_name); - path = subsystem_slash_devname; - } - #if ENABLE_FEATURE_MDEV_CONF G.rule_idx = 0; /* restart from the beginning (think mdev -s) */ #endif @@ -537,7 +520,7 @@ static void make_device(char *device_name, char *path, int operation) char *node_name; const struct rule *rule; - str_to_match = ""; + str_to_match = device_name; rule = next_rule(); @@ -555,12 +538,8 @@ static void make_device(char *device_name, char *path, int operation) dbg("getenv('%s'):'%s'", rule->envvar, str_to_match); if (!str_to_match) continue; - } else { -//TODO: $DEVNAME can have slashes too, -// we should stop abusing '/' as a special syntax in our regex'es - /* regex to match [subsystem/]device_name */ - str_to_match = (rule->regex_has_slash ? path : device_name); } + /* else: str_to_match = device_name */ if (rule->regex_compiled) { int regex_match = regexec(&rule->match, str_to_match, ARRAY_SIZE(off), off, 0); @@ -669,12 +648,12 @@ static void make_device(char *device_name, char *path, int operation) bb_error_msg("mknod: %s (%d,%d) %o", node_name, major, minor, rule->mode | type); if (mknod(node_name, rule->mode | type, makedev(major, minor)) && errno != EEXIST) bb_perror_msg("can't create '%s'", node_name); - if (major == G.root_major && minor == G.root_minor) - symlink(node_name, "root"); if (ENABLE_FEATURE_MDEV_CONF) { chmod(node_name, rule->mode); chown(node_name, rule->ugid.uid, rule->ugid.gid); } + if (major == G.root_major && minor == G.root_minor) + symlink(node_name, "root"); if (ENABLE_FEATURE_MDEV_RENAME && alias) { if (aliaslink == '>') { //TODO: on devtmpfs, device_name already exists and symlink() fails. @@ -723,8 +702,6 @@ static void make_device(char *device_name, char *path, int operation) if (!ENABLE_FEATURE_MDEV_CONF || !rule->keep_matching) break; } /* for (;;) */ - - free(subsystem_slash_devname); } /* File callback for /sys/ traversal */ @@ -890,13 +867,13 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) * DEVPATH is like "/block/sda" or "/class/input/mice" */ action = getenv("ACTION"); + op = index_in_strings(keywords, action); env_devname = getenv("DEVNAME"); /* can be NULL */ env_devpath = getenv("DEVPATH"); G.subsystem = getenv("SUBSYSTEM"); if (!action || !env_devpath /*|| !G.subsystem*/) bb_show_usage(); fw = getenv("FIRMWARE"); - op = index_in_strings(keywords, action); /* If it exists, does /dev/mdev.seq match $SEQNUM? * If it does not match, earlier mdev is running * in parallel, and we need to wait */ @@ -927,7 +904,7 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) if (logfd >= 0) { xmove_fd(logfd, STDERR_FILENO); G.verbose = 1; - bb_error_msg("pid: %u seq: %s action: %s", getpid(), seq, action); + bb_error_msg("seq: %s action: %s", seq, action); } } |