mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-07-30 22:56:33 +00:00
busybox 1.21.0: update mdev patch and add ntfs volume patch
Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar> Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
parent
f8a6a1b94a
commit
32a2f502c6
@ -68,20 +68,24 @@
|
|||||||
} FIX_ALIASING;
|
} FIX_ALIASING;
|
||||||
#define G (*(struct globals*)&bb_common_bufsiz1)
|
#define G (*(struct globals*)&bb_common_bufsiz1)
|
||||||
#define INIT_G() do { \
|
#define INIT_G() do { \
|
||||||
@@ -270,13 +298,6 @@ struct globals {
|
@@ -267,15 +295,8 @@ struct globals {
|
||||||
/* We use additional 64+ bytes in make_device() */
|
/* Prevent infinite loops in /sys symlinks */
|
||||||
#define SCRATCH_SIZE 80
|
#define MAX_SYSFS_DEPTH 3
|
||||||
|
|
||||||
|
-/* We use additional 64+ bytes in make_device() */
|
||||||
|
-#define SCRATCH_SIZE 80
|
||||||
|
-
|
||||||
-#if 0
|
-#if 0
|
||||||
-# define dbg(...) bb_error_msg(__VA_ARGS__)
|
-# define dbg(...) bb_error_msg(__VA_ARGS__)
|
||||||
-#else
|
-#else
|
||||||
-# define dbg(...) ((void)0)
|
-# define dbg(...) ((void)0)
|
||||||
-#endif
|
-#endif
|
||||||
-
|
-
|
||||||
-
|
+/* We use additional bytes in make_device() */
|
||||||
|
+#define SCRATCH_SIZE 128
|
||||||
|
|
||||||
#if ENABLE_FEATURE_MDEV_CONF
|
#if ENABLE_FEATURE_MDEV_CONF
|
||||||
|
|
||||||
static void make_default_cur_rule(void)
|
|
||||||
@@ -288,14 +309,65 @@ static void make_default_cur_rule(void)
|
@@ -288,14 +309,65 @@ static void make_default_cur_rule(void)
|
||||||
|
|
||||||
static void clean_up_cur_rule(void)
|
static void clean_up_cur_rule(void)
|
||||||
@ -233,37 +237,91 @@
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
# define next_rule() (&G.cur_rule)
|
# define next_rule() (&G.cur_rule)
|
||||||
@@ -479,9 +569,6 @@ static void make_device(char *device_nam
|
@@ -468,7 +558,7 @@ static char *build_alias(char *alias, co
|
||||||
|
|
||||||
|
/* mknod in /dev based on a path like "/sys/block/hda/hda1"
|
||||||
|
* NB1: path parameter needs to have SCRATCH_SIZE scratch bytes
|
||||||
|
- * after NUL, but we promise to not mangle (IOW: to restore if needed)
|
||||||
|
+ * after NUL, but we promise to not mangle (IOW: to restore NUL if needed)
|
||||||
|
* path string.
|
||||||
|
* NB2: "mdev -s" may call us many times, do not leak memory/fds!
|
||||||
|
*
|
||||||
|
@@ -478,9 +568,7 @@ static char *build_alias(char *alias, co
|
||||||
|
static void make_device(char *device_name, char *path, int operation)
|
||||||
{
|
{
|
||||||
int major, minor, type, len;
|
int major, minor, type, len;
|
||||||
|
-
|
||||||
- if (G.verbose)
|
- if (G.verbose)
|
||||||
- bb_error_msg("device: %s, %s", device_name, path);
|
- bb_error_msg("device: %s, %s", device_name, path);
|
||||||
-
|
+ char *path_end = path + strlen(path);
|
||||||
|
|
||||||
/* Try to read major/minor string. Note that the kernel puts \n after
|
/* 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
|
* 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.
|
@@ -489,29 +577,51 @@ static void make_device(char *device_nam
|
||||||
@@ -500,8 +587,7 @@ static void make_device(char *device_nam
|
*/
|
||||||
|
major = -1;
|
||||||
|
if (operation == OP_add) {
|
||||||
|
- char *dev_maj_min = path + strlen(path);
|
||||||
|
-
|
||||||
|
- strcpy(dev_maj_min, "/dev");
|
||||||
|
- len = open_read_close(path, dev_maj_min + 1, 64);
|
||||||
|
- *dev_maj_min = '\0';
|
||||||
|
+ strcpy(path_end, "/dev");
|
||||||
|
+ len = open_read_close(path, path_end + 1, SCRATCH_SIZE - 1);
|
||||||
|
+ *path_end = '\0';
|
||||||
|
if (len < 1) {
|
||||||
|
if (!ENABLE_FEATURE_MDEV_EXEC)
|
||||||
|
return;
|
||||||
/* no "dev" file, but we can still run scripts
|
/* no "dev" file, but we can still run scripts
|
||||||
* based on device name */
|
* 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)
|
- if (G.verbose)
|
||||||
- bb_error_msg("maj,min: %u,%u", major, minor);
|
- bb_error_msg("maj,min: %u,%u", major, minor);
|
||||||
|
+ } else if (sscanf(path_end + 1, "%u:%u", &major, &minor) == 2) {
|
||||||
+ dbg1("dev %u,%u", major, minor);
|
+ dbg1("dev %u,%u", major, minor);
|
||||||
} else {
|
} else {
|
||||||
major = -1;
|
major = -1;
|
||||||
}
|
}
|
||||||
@@ -511,7 +597,8 @@ static void make_device(char *device_nam
|
}
|
||||||
/* Determine device name, type, major and minor */
|
/* else: for delete, -1 still deletes the node, but < -1 suppresses that */
|
||||||
if (!device_name)
|
|
||||||
device_name = (char*) bb_basename(path);
|
- /* Determine device name, type, major and minor */
|
||||||
|
- if (!device_name)
|
||||||
|
- device_name = (char*) bb_basename(path);
|
||||||
- /* http://kernel.org/doc/pending/hotplug.txt says that only
|
- /* http://kernel.org/doc/pending/hotplug.txt says that only
|
||||||
|
+ /* Determine device name */
|
||||||
|
+ if (!device_name) {
|
||||||
|
+ /*
|
||||||
|
+ * There was no $DEVNAME envvar (for example, mdev -s never has).
|
||||||
|
+ * But it is very useful: it contains the *path*, not only basename,
|
||||||
|
+ * Thankfully, uevent file has it.
|
||||||
|
+ * Example of .../sound/card0/controlC0/uevent file on Linux-3.7.7:
|
||||||
|
+ * MAJOR=116
|
||||||
|
+ * MINOR=7
|
||||||
|
+ * DEVNAME=snd/controlC0
|
||||||
|
+ */
|
||||||
|
+ strcpy(path_end, "/uevent");
|
||||||
|
+ len = open_read_close(path, path_end + 1, SCRATCH_SIZE - 1);
|
||||||
|
+ if (len < 0)
|
||||||
|
+ len = 0;
|
||||||
|
+ *path_end = '\0';
|
||||||
|
+ path_end[1 + len] = '\0';
|
||||||
|
+ device_name = strstr(path_end + 1, "\nDEVNAME=");
|
||||||
|
+ if (device_name) {
|
||||||
|
+ device_name += sizeof("\nDEVNAME=")-1;
|
||||||
|
+ strchrnul(device_name, '\n')[0] = '\0';
|
||||||
|
+ } else {
|
||||||
|
+ /* Fall back to just basename */
|
||||||
|
+ device_name = (char*) bb_basename(path);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ /* Determine device type */
|
||||||
+ /*
|
+ /*
|
||||||
+ * http://kernel.org/doc/pending/hotplug.txt says that only
|
+ * http://kernel.org/doc/pending/hotplug.txt says that only
|
||||||
* "/sys/block/..." is for block devices. "/sys/bus" etc is not.
|
* "/sys/block/..." is for block devices. "/sys/bus" etc is not.
|
||||||
* But since 2.6.25 block devices are also in /sys/class/block.
|
* 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.
|
||||||
@@ -537,6 +624,8 @@ static void make_device(char *device_nam
|
@@ -537,6 +647,8 @@ static void make_device(char *device_nam
|
||||||
rule = next_rule();
|
rule = next_rule();
|
||||||
|
|
||||||
#if ENABLE_FEATURE_MDEV_CONF
|
#if ENABLE_FEATURE_MDEV_CONF
|
||||||
@ -272,7 +330,7 @@
|
|||||||
if (rule->maj >= 0) { /* @maj,min rule */
|
if (rule->maj >= 0) { /* @maj,min rule */
|
||||||
if (major != rule->maj)
|
if (major != rule->maj)
|
||||||
continue;
|
continue;
|
||||||
@@ -547,7 +636,7 @@ static void make_device(char *device_nam
|
@@ -547,7 +659,7 @@ static void make_device(char *device_nam
|
||||||
}
|
}
|
||||||
if (rule->envvar) { /* $envvar=regex rule */
|
if (rule->envvar) { /* $envvar=regex rule */
|
||||||
str_to_match = getenv(rule->envvar);
|
str_to_match = getenv(rule->envvar);
|
||||||
@ -281,7 +339,7 @@
|
|||||||
if (!str_to_match)
|
if (!str_to_match)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -555,7 +644,7 @@ static void make_device(char *device_nam
|
@@ -555,7 +667,7 @@ static void make_device(char *device_nam
|
||||||
|
|
||||||
if (rule->regex_compiled) {
|
if (rule->regex_compiled) {
|
||||||
int regex_match = regexec(&rule->match, str_to_match, ARRAY_SIZE(off), off, 0);
|
int regex_match = regexec(&rule->match, str_to_match, ARRAY_SIZE(off), off, 0);
|
||||||
@ -290,7 +348,7 @@
|
|||||||
//bb_error_msg("matches:");
|
//bb_error_msg("matches:");
|
||||||
//for (int i = 0; i < ARRAY_SIZE(off); i++) {
|
//for (int i = 0; i < ARRAY_SIZE(off); i++) {
|
||||||
// if (off[i].rm_so < 0) continue;
|
// if (off[i].rm_so < 0) continue;
|
||||||
@@ -574,9 +663,8 @@ static void make_device(char *device_nam
|
@@ -574,9 +686,8 @@ static void make_device(char *device_nam
|
||||||
}
|
}
|
||||||
/* else: it's final implicit "match-all" rule */
|
/* else: it's final implicit "match-all" rule */
|
||||||
rule_matches:
|
rule_matches:
|
||||||
@ -301,7 +359,7 @@
|
|||||||
/* Build alias name */
|
/* Build alias name */
|
||||||
alias = NULL;
|
alias = NULL;
|
||||||
if (ENABLE_FEATURE_MDEV_RENAME && rule->ren_mov) {
|
if (ENABLE_FEATURE_MDEV_RENAME && rule->ren_mov) {
|
||||||
@@ -619,34 +707,30 @@ static void make_device(char *device_nam
|
@@ -619,34 +730,30 @@ static void make_device(char *device_nam
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -344,7 +402,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (operation == OP_add && major >= 0) {
|
if (operation == OP_add && major >= 0) {
|
||||||
@@ -656,8 +740,17 @@ static void make_device(char *device_nam
|
@@ -656,8 +763,17 @@ static void make_device(char *device_nam
|
||||||
mkdir_recursive(node_name);
|
mkdir_recursive(node_name);
|
||||||
*slash = '/';
|
*slash = '/';
|
||||||
}
|
}
|
||||||
@ -364,7 +422,7 @@
|
|||||||
if (mknod(node_name, rule->mode | type, makedev(major, minor)) && errno != EEXIST)
|
if (mknod(node_name, rule->mode | type, makedev(major, minor)) && errno != EEXIST)
|
||||||
bb_perror_msg("can't create '%s'", node_name);
|
bb_perror_msg("can't create '%s'", node_name);
|
||||||
if (ENABLE_FEATURE_MDEV_CONF) {
|
if (ENABLE_FEATURE_MDEV_CONF) {
|
||||||
@@ -671,8 +764,7 @@ static void make_device(char *device_nam
|
@@ -671,8 +787,7 @@ static void make_device(char *device_nam
|
||||||
//TODO: on devtmpfs, device_name already exists and symlink() fails.
|
//TODO: on devtmpfs, device_name already exists and symlink() fails.
|
||||||
//End result is that instead of symlink, we have two nodes.
|
//End result is that instead of symlink, we have two nodes.
|
||||||
//What should be done?
|
//What should be done?
|
||||||
@ -374,7 +432,7 @@
|
|||||||
symlink(node_name, device_name);
|
symlink(node_name, device_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -681,27 +773,21 @@ static void make_device(char *device_nam
|
@@ -681,27 +796,21 @@ static void make_device(char *device_nam
|
||||||
if (ENABLE_FEATURE_MDEV_EXEC && command) {
|
if (ENABLE_FEATURE_MDEV_EXEC && command) {
|
||||||
/* setenv will leak memory, use putenv/unsetenv/free */
|
/* setenv will leak memory, use putenv/unsetenv/free */
|
||||||
char *s = xasprintf("%s=%s", "MDEV", node_name);
|
char *s = xasprintf("%s=%s", "MDEV", node_name);
|
||||||
@ -405,7 +463,7 @@
|
|||||||
unlink(node_name);
|
unlink(node_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -746,9 +832,16 @@ static int FAST_FUNC dirAction(const cha
|
@@ -746,9 +855,16 @@ static int FAST_FUNC dirAction(const cha
|
||||||
* under /sys/class/ */
|
* under /sys/class/ */
|
||||||
if (1 == depth) {
|
if (1 == depth) {
|
||||||
free(G.subsystem);
|
free(G.subsystem);
|
||||||
@ -423,7 +481,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
|
return (depth >= MAX_SYSFS_DEPTH ? SKIP : TRUE);
|
||||||
@@ -813,12 +906,107 @@ static void load_firmware(const char *fi
|
@@ -813,12 +929,107 @@ static void load_firmware(const char *fi
|
||||||
full_write(loading_fd, "-1", 2);
|
full_write(loading_fd, "-1", 2);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@ -531,7 +589,7 @@
|
|||||||
int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int mdev_main(int argc UNUSED_PARAM, char **argv)
|
int mdev_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
@@ -840,8 +1028,8 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
@@ -840,8 +1051,8 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
||||||
xchdir("/dev");
|
xchdir("/dev");
|
||||||
|
|
||||||
if (argv[1] && strcmp(argv[1], "-s") == 0) {
|
if (argv[1] && strcmp(argv[1], "-s") == 0) {
|
||||||
@ -542,7 +600,7 @@
|
|||||||
*/
|
*/
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
@@ -853,6 +1041,8 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
@@ -853,6 +1064,8 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
||||||
G.root_major = major(st.st_dev);
|
G.root_major = major(st.st_dev);
|
||||||
G.root_minor = minor(st.st_dev);
|
G.root_minor = minor(st.st_dev);
|
||||||
|
|
||||||
@ -551,7 +609,7 @@
|
|||||||
/* ACTION_FOLLOWLINKS is needed since in newer kernels
|
/* ACTION_FOLLOWLINKS is needed since in newer kernels
|
||||||
* /sys/block/loop* (for example) are symlinks to dirs,
|
* /sys/block/loop* (for example) are symlinks to dirs,
|
||||||
* not real directories.
|
* not real directories.
|
||||||
@@ -878,11 +1068,13 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
@@ -878,11 +1091,13 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
||||||
char *action;
|
char *action;
|
||||||
char *env_devname;
|
char *env_devname;
|
||||||
char *env_devpath;
|
char *env_devpath;
|
||||||
@ -566,7 +624,7 @@
|
|||||||
* DEVPATH is like "/block/sda" or "/class/input/mice"
|
* DEVPATH is like "/block/sda" or "/class/input/mice"
|
||||||
*/
|
*/
|
||||||
action = getenv("ACTION");
|
action = getenv("ACTION");
|
||||||
@@ -893,39 +1085,20 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
@@ -893,39 +1108,20 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
||||||
if (!action || !env_devpath /*|| !G.subsystem*/)
|
if (!action || !env_devpath /*|| !G.subsystem*/)
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
fw = getenv("FIRMWARE");
|
fw = getenv("FIRMWARE");
|
||||||
@ -618,7 +676,7 @@
|
|||||||
|
|
||||||
snprintf(temp, PATH_MAX, "/sys%s", env_devpath);
|
snprintf(temp, PATH_MAX, "/sys%s", env_devpath);
|
||||||
if (op == OP_remove) {
|
if (op == OP_remove) {
|
||||||
@@ -935,16 +1108,18 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
@@ -935,16 +1131,18 @@ int mdev_main(int argc UNUSED_PARAM, cha
|
||||||
if (!fw)
|
if (!fw)
|
||||||
make_device(env_devname, temp, op);
|
make_device(env_devname, temp, op);
|
||||||
}
|
}
|
||||||
|
11
package/busybox/1.21.0/busybox-1.21.0-ntfs.patch
Normal file
11
package/busybox/1.21.0/busybox-1.21.0-ntfs.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- busybox-1.21.0/util-linux/volume_id/ntfs.c
|
||||||
|
+++ busybox-1.21.0-ntfs/util-linux/volume_id/ntfs.c
|
||||||
|
@@ -150,7 +150,7 @@ int FAST_FUNC volume_id_probe_ntfs(struc
|
||||||
|
|
||||||
|
attr = (struct file_attribute*) &buf[attr_off];
|
||||||
|
attr_type = le32_to_cpu(attr->type);
|
||||||
|
- attr_len = le16_to_cpu(attr->len);
|
||||||
|
+ attr_len = le32_to_cpu(attr->len);
|
||||||
|
val_off = le16_to_cpu(attr->value_offset);
|
||||||
|
val_len = le32_to_cpu(attr->value_len);
|
||||||
|
attr_off += attr_len;
|
Loading…
x
Reference in New Issue
Block a user