Author: richard
Date: Fri Apr 3 11:46:01 2009
New Revision: 5136
URL: http://svn.slimdevices.com/jive?rev=5136&view=rev
Log:
r5...@harrypotter (orig r5135): richard | 2009-04-03 19:45:14 +0100
r5...@harrypotter (orig r5129): felix | 2009-04-03 17:50:57 +0100
Bug: 11466
Description: Update busybox to latest version (1.13.3), adapt defconfig and
patches, fix wlan script. Add zcip instead of zeroconf.
r5...@harrypotter (orig r5130): felix | 2009-04-03 17:54:45 +0100
Bug: 11466
Description: Update busybox to latest version (1.13.3), adapt defconfig and
patches, fix wlan script. Add zcip instead of zeroconf.
Added:
7.4/branches/pango/squeezeos/poky/meta-squeezeos/packages/busybox/busybox-1.13.3/busybox_mdev_subdir.patch
Modified:
7.4/branches/pango/ (props changed)
Propchange: 7.4/branches/pango/
------------------------------------------------------------------------------
--- svk:merge (original)
+++ svk:merge Fri Apr 3 11:46:01 2009
@@ -3,8 +3,8 @@
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.1/trunk:2920
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.2/trunk:2921
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.3/private-branches/jive-refresh:3653
-bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.3/trunk:5110
-bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.4/trunk:5120
+bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.3/trunk:5130
+bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.4/trunk:5135
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/7.0:2013
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/SN:1083
bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/scrolling:1378
Added:
7.4/branches/pango/squeezeos/poky/meta-squeezeos/packages/busybox/busybox-1.13.3/busybox_mdev_subdir.patch
URL:
http://svn.slimdevices.com/jive/7.4/branches/pango/squeezeos/poky/meta-squeezeos/packages/busybox/busybox-1.13.3/busybox_mdev_subdir.patch?rev=5136&view=auto
==============================================================================
---
7.4/branches/pango/squeezeos/poky/meta-squeezeos/packages/busybox/busybox-1.13.3/busybox_mdev_subdir.patch
(added)
+++
7.4/branches/pango/squeezeos/poky/meta-squeezeos/packages/busybox/busybox-1.13.3/busybox_mdev_subdir.patch
Fri Apr 3 11:46:01 2009
@@ -1,0 +1,677 @@
+Index: busybox_1_7_stable/util-linux/mdev.c
+===================================================================
+--- busybox_1_7_stable/util-linux/mdev.c (revision 2550)
++++ busybox_1_7_stable/util-linux/mdev.c (revision 2551)
+@@ -19,310 +19,266 @@
+ #define root_major (G.root_major)
+ #define root_minor (G.root_minor)
+
+-/* Prevent infinite loops in /sys symlinks */
+-#define MAX_SYSFS_DEPTH 3
++#define MAX_SYSFS_DEPTH 3 /* prevent infinite loops in /sys symlinks */
+
+-/* We use additional 64+ bytes in make_device() */
+-#define SCRATCH_SIZE 80
+-
+-#if ENABLE_FEATURE_MDEV_RENAME
+-/* Builds an alias path.
+- * This function potentionally reallocates the alias parameter.
+- */
+-static char *build_alias(char *alias, const char *device_name)
++static void mdev_symlink(char *m_target, char *m_link)
+ {
+- char *dest;
+-
+- /* ">bar/": rename to bar/device_name */
+- /* ">bar[/]baz": rename to bar[/]baz */
+- dest = strrchr(alias, '/');
+- if (dest) { /* ">bar/[baz]" ? */
+- *dest = '\0'; /* mkdir bar */
+- bb_make_directory(alias, 0755, FILEUTILS_RECUR);
+- *dest = '/';
+- if (dest[1] == '\0') { /* ">bar/" => ">bar/device_name" */
+- dest = alias;
+- alias = concat_path_file(alias, device_name);
+- free(dest);
+- }
+- }
+-
+- return alias;
++ if (!m_target || !m_link) return;
++ if (symlink(m_target, m_link) && errno != EEXIST)
++ bb_perror_msg_and_die("symlink %s", m_link);
+ }
+-#endif
+
+ /* mknod in /dev based on a path like "/sys/block/hda/hda1" */
+-/* NB: "mdev -s" may call us many times, do not leak memory/fds! */
+ static void make_device(char *path, int delete)
+ {
+- const char *device_name;
+- int major, minor, type, len;
+- int mode = 0660;
+-#if ENABLE_FEATURE_MDEV_CONF
+- struct bb_uidgid_t ugid = { 0, 0 };
+- parser_t *parser;
+- char *tokens[5];
+-#endif
+-#if ENABLE_FEATURE_MDEV_EXEC
++ const char *device_name;
++ char *device_path = NULL;
++ int major, minor, type, len, mk_dir=0;
++ mode_t mode = 0660, mode_path = 0660;
++ uid_t uid = 0;
++ gid_t gid = 0;
++ char *temp = path + strlen(path);
+ char *command = NULL;
+-#endif
+-#if ENABLE_FEATURE_MDEV_RENAME
+- char *alias = NULL;
+- char aliaslink = aliaslink; /* for compiler */
+-#endif
+- char *dev_maj_min = path + strlen(path);
+-
+- /* Force the configuration file settings exactly. */
+- umask(0);
+
+ /* 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
+- * because sscanf() will stop at the first nondigit, which \n is.
+- * We also depend on path having writeable space after it.
+- */
+- major = -1;
++ * because sscanf() will stop at the first nondigit, which \n is. We
++ * also depend on path having writeable space after it. */
++
+ if (!delete) {
+- strcpy(dev_maj_min, "/dev");
+- len = open_read_close(path, dev_maj_min + 1, 64);
+- *dev_maj_min++ = '\0';
+- if (len < 1) {
+- if (!ENABLE_FEATURE_MDEV_EXEC)
+- return;
+- /* no "dev" file, so just try to run script */
+- *dev_maj_min = '\0';
+- } else if (sscanf(dev_maj_min, "%u:%u", &major, &minor) != 2) {
+- major = -1;
+- }
++ strcat(path, "/dev");
++ len = open_read_close(path, temp + 1, 64);
++ *temp++ = 0;
++ if (len < 1) return;
+ }
+
+ /* Determine device name, type, major and minor */
+- device_name = bb_basename(path);
+- /* 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. */
+- type = S_IFCHR;
+- if (strstr(path, "/block/"))
+- type = S_IFBLK;
+-
+-#if ENABLE_FEATURE_MDEV_CONF
+- parser = config_open2("/etc/mdev.conf", fopen_for_read);
+-
+- /* If we have config file, look up user settings */
+- while (config_read(parser, tokens, 4, 3, "# \t", PARSE_NORMAL)) {
+- regmatch_t off[1 + 9*ENABLE_FEATURE_MDEV_RENAME_REGEXP];
+- char *val;
+-
+- /* Fields: regex uid:gid mode [alias] [cmd] */
+-
+- /* 1st field: @<numeric maj,min>... */
+- if (tokens[0][0] == '@') {
+- /* @major,minor[-last] */
+- /* (useful when name is ambiguous:
+- * "/sys/class/usb/lp0" and
+- * "/sys/class/printer/lp0") */
+- int cmaj, cmin0, cmin1, sc;
+- if (major < 0)
+- continue; /* no dev, no match */
+- sc = sscanf(tokens[0], "@%u,%u-%u", &cmaj, &cmin0,
&cmin1);
+- if (sc < 1 || major != cmaj
+- || (sc == 2 && minor != cmin0)
+- || (sc == 3 && (minor < cmin0 || minor > cmin1))
+- ) {
+- continue; /* no match */
+- }
+- } else { /* ... or regex to match device name */
+- regex_t match;
+- int result;
+
+- /* Is this it? */
+- xregcomp(&match, tokens[0], REG_EXTENDED);
+- result = regexec(&match, device_name, ARRAY_SIZE(off),
off, 0);
+- regfree(&match);
++ device_name = bb_basename(path);
++ type = (path[5]=='b') ? S_IFBLK : S_IFCHR;
+
+- //bb_error_msg("matches:");
+- //for (int i = 0; i < ARRAY_SIZE(off); i++) {
+- // if (off[i].rm_so < 0) continue;
+- // bb_error_msg("match %d: '%.*s'\n", i,
+- // (int)(off[i].rm_eo - off[i].rm_so),
+- // device_name + off[i].rm_so);
+- //}
++ /* If we have a config file, look up permissions for this device */
+
++ if (ENABLE_FEATURE_MDEV_CONF) {
++ char *line, *tok_tmp, *tok_line=NULL, **tok = NULL;
++ FILE *file;
++ int i;
++
++ file = fopen_or_warn("/etc/mdev.conf", "r");
++ if (file < 0)
++ goto end_parse;
++
++ while ((line = xmalloc_fgetline(file)) != NULL) {
++ char *regex = NULL;
++ regex_t match;
++ regmatch_t off[2];
++ int result, tok_len = 1;
++ char *tok_id[2], *tok_id_tmp;
++ char *s;
++
++ tok_line = strdupa(line);
++ if (tok_line[0] == '#' || strlen(tok_line)==0) continue;
++
++ for (i=0; i<strlen(tok_line); i++) {
++ if (isspace(tok_line[i]) &&
!isspace(tok_line[i+1]))
++ tok_len++;
++ }
++ tok = (char **) xrealloc(tok, tok_len * sizeof(char *));
++
++ for (i=0; (tok_tmp=strtok(tok_line, " \t")); i++) {
++ tok[i] = tok_tmp;
++ tok_line = NULL;
++ }
++
++ if (!strcmp(tok[1], "->")) {
++ mdev_symlink(tok[2], tok[0]);
++ continue;
++ }
++
++ /* Regex to match this device */
++ regex = tok[0];
++ xregcomp(&match, regex, REG_EXTENDED);
++ result = regexec(&match, device_name, 2, off, 0);
++ regfree(&match);
++
+ /* If not this device, skip rest of line */
+- /* (regexec returns whole pattern as "range" 0) */
+- if (result || off[0].rm_so
+- || ((int)off[0].rm_eo != (int)strlen(device_name))
+- ) {
++ if (result || off[0].rm_so || off[0].rm_eo !=
strlen(device_name)) {
+ continue;
+ }
+- }
+
+- /* This line matches: stop parsing the file
+- * after parsing the rest of fields */
++ /* use substring for device name */
++ if (off[1].rm_so != -1) {
++ int sub_len = off[1].rm_eo - off[1].rm_so;
++ char *tmp = alloca(sub_len + 1);
++ strncpy(tmp, device_name + off[1].rm_so,
sub_len);
++ tmp[sub_len] = '\0';
++ device_name = tmp;
++ }
++
++ for (i=0; (tok_id_tmp=strtok(tok[1], ":")); i++) {
++ if (tok_id_tmp) tok_id[i] = tok_id_tmp;
++ tok[1] = NULL;
++ }
++
++ /* uid:gid */
++ uid = strtoul(tok_id[0], &s, 10);
++ if (tok_id[0] == s) {
++ struct passwd *pass;
++ pass = getpwnam(tok_id[0]);
++ if (!pass) continue;
++ uid = pass->pw_uid;
++ }
++
++ gid = strtoul(tok_id[1], &s, 10);
++ if (tok_id[1] == s) {
++ struct group *grp;
++ grp = getgrnam(tok_id[1]);
++ if (!grp) continue;
++ gid = grp->gr_gid;
++ }
+
+- /* 2nd field: uid:gid - device ownership */
+- parse_chown_usergroup_or_die(&ugid, tokens[1]);
++ /* mode */
++ mode = (mode_t)strtoul(tok[2], &s, 8);
+
+- /* 3rd field: mode - device permissions */
+- mode = strtoul(tokens[2], NULL, 8);
++ if (tok_len > 3) {
++#if ENABLE_FEATURE_MDEV_EXEC
++ const char *s2 = "@$*";
++ char *cmd_tmp;
++ unsigned int cmd = 0;
++#endif
++ /* mk_dir */
++ if (!strcmp(tok[3], ">>")) {
++ int path_len;
++
++ mk_dir = 1;
++ device_path = strdupa(tok[4]);
++ path_len = strlen(device_path);
++ if (device_path[path_len-1] != '/')
++ strcat(device_path, "/");
+
+- val = tokens[3];
+- /* 4th field (opt): >alias */
+-#if ENABLE_FEATURE_MDEV_RENAME
+- if (!val)
+- break;
+- aliaslink = *val;
+- if (aliaslink == '>' || aliaslink == '=') {
+- char *s;
+-#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
+- char *p;
+- unsigned i, n;
+-#endif
+- char *a = val;
+- s = strchrnul(val, ' ');
+- val = (s[0] && s[1]) ? s+1 : NULL;
+- s[0] = '\0';
+-#if ENABLE_FEATURE_MDEV_RENAME_REGEXP
+- /* substitute %1..9 with off[1..9], if any */
+- n = 0;
+- s = a;
+- while (*s)
+- if (*s++ == '%')
+- n++;
+-
+- p = alias = xzalloc(strlen(a) + n *
strlen(device_name));
+- s = a + 1;
+- while (*s) {
+- *p = *s;
+- if ('%' == *s) {
+- i = (s[1] - '0');
+- if (i <= 9 && off[i].rm_so >= 0) {
+- n = off[i].rm_eo - off[i].rm_so;
+- strncpy(p, device_name +
off[i].rm_so, n);
+- p += n - 1;
+- s++;
++ mode_path = (mode_t)strtoul(tok[5], &s,
8);
++ }
++#if ENABLE_FEATURE_MDEV_EXEC
++ else {
++ if ((cmd_tmp = strpbrk(tok[3],
s2))!=NULL) {
++ int cmd_len = strlen(cmd_tmp)
== 1 ? 1 : 0;
++
++ cmd = *cmd_tmp;
++
++ if (cmd_len == 1) {
++ command =
strdupa(tok[4]);
++ } else {
++ command =
strdupa(strrchr(tok[3], cmd_tmp[0])+1);
++ }
++
++ for (i=4+cmd_len; i<tok_len;
i++) {
++ strcat(strcat(command,
" "), tok[i]);
++ }
++ }
++
++ }
++
++ if (tok_len > 6) {
++ if ((cmd_tmp = strpbrk(tok[6],
s2))!=NULL) {
++ int cmd_len = strlen(cmd_tmp)
== 1 ? 1 : 0;
++
++ cmd = *cmd_tmp;
++
++ if (cmd_len == 1) {
++ command =
xstrdup(tok[7]);
++ } else {
++ command =
xstrdup(strrchr(tok[6], cmd_tmp[0])+1);
++ }
++
++ for (i=7+cmd_len; i<tok_len;
i++) {
++ strcat(strcat(command,
" "), tok[i]);
++ }
+ }
+ }
+- p++;
+- s++;
+- }
+-#else
+- alias = xstrdup(a + 1);
++ switch (cmd) {
++ case '@':
++ if (delete) command = NULL;
++ break;
++ case '$':
++ if (!delete) command = NULL;
++ break;
++ case '*':
++ default :
++ break;
++ }
+ #endif
+- }
+-#endif /* ENABLE_FEATURE_MDEV_RENAME */
+-
+-#if ENABLE_FEATURE_MDEV_EXEC
+- /* The rest (opt): command to run */
+- if (!val)
+- break;
+- {
+- const char *s = "@$*";
+- const char *s2 = strchr(s, *val);
+-
+- if (!s2)
+- bb_error_msg_and_die("bad line %u",
parser->lineno);
+-
+- /* Correlate the position in the "@$*" with the delete
+- * step so that we get the proper behavior:
+- * @cmd: run on create
+- * $cmd: run on delete
+- * *cmd: run on both
+- */
+- if ((s2 - s + 1) /*1/2/3*/ & /*1/2*/ (1 + delete)) {
+- command = xstrdup(val + 1);
+ }
+- }
+-#endif
+- /* end of field parsing */
+- break; /* we found matching line, stop */
+- } /* end of "while line is read from /etc/mdev.conf" */
+-
+- config_close(parser);
+-#endif /* ENABLE_FEATURE_MDEV_CONF */
+-
+- if (!delete && major >= 0) {
+-
+- if (ENABLE_FEATURE_MDEV_RENAME)
+- unlink(device_name);
++ }
++ fclose(file);
++ end_parse: /* nothing */ ;
++ }
+
++ umask(0);
++ if (!delete) {
++ if (mk_dir) {
++ if (mkdir(device_path, mode_path) && errno != EEXIST)
++ bb_perror_msg_and_die("mkdir %s", device_path);
++ device_name = strcat(device_path, device_name);
++ }
++ 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", device_name);
+
+ if (major == root_major && minor == root_minor)
+ symlink(device_name, "root");
+
+-#if ENABLE_FEATURE_MDEV_CONF
+- chown(device_name, ugid.uid, ugid.gid);
+-
+-#if ENABLE_FEATURE_MDEV_RENAME
+- if (alias) {
+- alias = build_alias(alias, device_name);
+-
+- /* move the device, and optionally
+- * make a symlink to moved device node */
+- if (rename(device_name, alias) == 0 && aliaslink == '>')
+- symlink(alias, device_name);
+-
+- free(alias);
+- }
+-#endif
+-#endif
++ if (ENABLE_FEATURE_MDEV_CONF) chown(device_name, uid, gid);
+ }
+
+-#if ENABLE_FEATURE_MDEV_EXEC
+ if (command) {
+- /* setenv will leak memory, use putenv/unsetenv/free */
++ /* setenv will leak memory, so use putenv */
+ char *s = xasprintf("MDEV=%s", device_name);
+ putenv(s);
+ if (system(command) == -1)
+- bb_perror_msg_and_die("can't run '%s'", command);
++ bb_perror_msg_and_die("cannot run %s", command);
+ s[4] = '\0';
+ unsetenv(s);
+ free(s);
+- free(command);
+ }
+-#endif
+
+ if (delete) {
++ if (device_path) {
++ char *tmp_path;
++
++ tmp_path = strdupa(device_path);
++ device_name = strcat(tmp_path, device_name);
++ }
++
+ unlink(device_name);
+- /* At creation time, device might have been moved
+- * and a symlink might have been created. Undo that. */
+-#if ENABLE_FEATURE_MDEV_RENAME
+- if (alias) {
+- alias = build_alias(alias, device_name);
+- unlink(alias);
+- free(alias);
++
++ if (device_path) {
++ if (rmdir(device_path) && errno != ENOTEMPTY)
++ bb_perror_msg_and_die("rmdir %s", device_path);
+ }
+-#endif
+ }
++
+ }
+
+ /* File callback for /sys/ traversal */
+-static int FAST_FUNC fileAction(const char *fileName,
+- struct stat *statbuf UNUSED_PARAM,
+- void *userData,
+- int depth UNUSED_PARAM)
++static int fileAction(const char *fileName, struct stat *statbuf,
++ void *userData, int depth)
+ {
+- size_t len = strlen(fileName) - 4; /* can't underflow */
++ size_t len = strlen(fileName) - 4;
+ char *scratch = userData;
+
+- /* len check is for paranoid reasons */
+- if (strcmp(fileName + len, "/dev") != 0 || len >= PATH_MAX)
++ if (strcmp(fileName + len, "/dev"))
+ return FALSE;
+
+ strcpy(scratch, fileName);
+- scratch[len] = '\0';
++ scratch[len] = 0;
+ make_device(scratch, 0);
+
+ return TRUE;
+ }
+
+ /* Directory callback for /sys/ traversal */
+-static int FAST_FUNC dirAction(const char *fileName UNUSED_PARAM,
+- struct stat *statbuf UNUSED_PARAM,
+- void *userData UNUSED_PARAM,
+- int depth)
++static int dirAction(const char *fileName, struct stat *statbuf,
++ void *userData, int depth)
+ {
+ return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
+ }
+@@ -343,6 +299,12 @@
+ int cnt;
+ int firmware_fd, loading_fd, data_fd;
+
++ /* check for $FIRMWARE from kernel */
++ /* XXX: dont bother: open(NULL) works same as open("no-such-file")
++ * if (!firmware)
++ * return;
++ */
++
+ /* check for /lib/firmware/$FIRMWARE */
+ xchdir("/lib/firmware");
+ firmware_fd = xopen(firmware, O_RDONLY);
+@@ -354,15 +316,16 @@
+ xchdir(sysfs_path);
+ for (cnt = 0; cnt < 30; ++cnt) {
+ loading_fd = open("loading", O_WRONLY);
+- if (loading_fd != -1)
+- goto loading;
+- sleep(1);
++ if (loading_fd == -1)
++ sleep(1);
++ else
++ break;
+ }
+- goto out;
++ if (loading_fd == -1)
++ goto out;
+
+- loading:
+ /* tell kernel we're loading by `echo 1 > /sys/$DEVPATH/loading` */
+- if (full_write(loading_fd, "1", 1) != 1)
++ if (write(loading_fd, "1", 1) != 1)
+ goto out;
+
+ /* load firmware by `cat /lib/firmware/$FIRMWARE > /sys/$DEVPATH/data */
+@@ -373,9 +336,9 @@
+
+ /* tell kernel result by `echo [0|-1] > /sys/$DEVPATH/loading` */
+ if (cnt > 0)
+- full_write(loading_fd, "0", 1);
++ write(loading_fd, "0", 1);
+ else
+- full_write(loading_fd, "-1", 2);
++ write(loading_fd, "-1", 2);
+
+ out:
+ if (ENABLE_FEATURE_CLEAN_UP) {
+@@ -385,103 +348,51 @@
+ }
+ }
+
+-int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+-int mdev_main(int argc UNUSED_PARAM, char **argv)
++int mdev_main(int argc, char *argv[]);
++int mdev_main(int argc, char *argv[])
+ {
+- RESERVE_CONFIG_BUFFER(temp, PATH_MAX + SCRATCH_SIZE);
+-
+- /* We can be called as hotplug helper */
+- /* Kernel cannot provide suitable stdio fds for us, do it ourself */
+-#if 1
+- bb_sanitize_stdio();
+-#else
+- /* Debug code */
+- /* Replace LOGFILE by other file or device name if you need */
+-#define LOGFILE "/dev/console"
+- /* Just making sure fd 0 is not closed,
+- * we don't really intend to read from it */
+- xmove_fd(xopen("/", O_RDONLY), STDIN_FILENO);
+- xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDOUT_FILENO);
+- xmove_fd(xopen(LOGFILE, O_WRONLY|O_APPEND), STDERR_FILENO);
+-#endif
++ char *action;
++ char *env_path;
++ RESERVE_CONFIG_BUFFER(temp,PATH_MAX);
+
+ xchdir("/dev");
+
+- if (argv[1] && !strcmp(argv[1], "-s")) {
+- /* Scan:
+- * mdev -s
+- */
++ /* Scan */
++
++ if (argc == 2 && !strcmp(argv[1],"-s")) {
+ struct stat st;
+
+ xstat("/", &st);
+ root_major = major(st.st_dev);
+ root_minor = minor(st.st_dev);
+
+- /* ACTION_FOLLOWLINKS is needed since in newer kernels
+- * /sys/block/loop* (for example) are symlinks to dirs,
+- * not real directories.
+- * (kernel's CONFIG_SYSFS_DEPRECATED makes them real dirs,
+- * but we can't enforce that on users) */
+ recursive_action("/sys/block",
+ ACTION_RECURSE | ACTION_FOLLOWLINKS,
+ fileAction, dirAction, temp, 0);
++
+ recursive_action("/sys/class",
+ ACTION_RECURSE | ACTION_FOLLOWLINKS,
+ fileAction, dirAction, temp, 0);
++
++ /* Hotplug */
++
+ } else {
+- char *seq;
+- char *action;
+- char *env_path;
+- char seqbuf[sizeof(int)*3 + 2];
+- int seqlen = seqlen; /* for compiler */
+-
+- /* Hotplug:
+- * env ACTION=... DEVPATH=... [SEQNUM=...] mdev
+- * ACTION can be "add" or "remove"
+- * DEVPATH is like "/block/sda" or "/class/input/mice"
+- */
+ action = getenv("ACTION");
+ env_path = getenv("DEVPATH");
+ if (!action || !env_path)
+ bb_show_usage();
+
+- seq = getenv("SEQNUM");
+- if (seq) {
+- int timeout = 2000 / 32;
+- do {
+- seqlen = open_read_close("mdev.seq", seqbuf,
sizeof(seqbuf-1));
+- if (seqlen < 0)
+- break;
+- seqbuf[seqlen] = '\0';
+- if (seqbuf[0] == '\n' /* seed file? */
+- || strcmp(seq, seqbuf) == 0 /* correct idx? */
+- ) {
+- break;
+- }
+- usleep(32*1000);
+- } while (--timeout);
+- }
+-
+- snprintf(temp, PATH_MAX, "/sys%s", env_path);
++ sprintf(temp, "/sys%s", env_path);
+ if (!strcmp(action, "remove"))
+ make_device(temp, 1);
+ else if (!strcmp(action, "add")) {
+ make_device(temp, 0);
+
+- if (ENABLE_FEATURE_MDEV_LOAD_FIRMWARE) {
+- char *fw = getenv("FIRMWARE");
+- if (fw)
+- load_firmware(fw, temp);
+- }
+- }
+-
+- if (seq && seqlen >= 0) {
+- xopen_xwrite_close("mdev.seq", utoa(xatou(seq) + 1));
++ if (ENABLE_FEATURE_MDEV_LOAD_FIRMWARE)
++ load_firmware(getenv("FIRMWARE"), temp);
+ }
+ }
+
+- if (ENABLE_FEATURE_CLEAN_UP)
+- RELEASE_CONFIG_BUFFER(temp);
+-
++ if (ENABLE_FEATURE_CLEAN_UP) RELEASE_CONFIG_BUFFER(temp);
+ return 0;
+ }
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/jive-checkins