From 016ca1f46d5601f3481527ab65d5adaaf0387e73 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Tue, 3 Feb 2015 07:35:41 +0000 Subject: main/busybox: upgrade to 1.23.1 --- ...x-modprobe-r-and-parsing-of-etc-modprobe..patch | 33 ---- main/busybox/APKBUILD | 27 +-- main/busybox/busybox-1.23.0-ash.patch | 34 ---- main/busybox/busybox-1.23.0-modprobe.patch | 203 --------------------- main/busybox/busybox-1.23.0-vi.patch | 49 ----- 5 files changed, 5 insertions(+), 341 deletions(-) delete mode 100644 main/busybox/0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch delete mode 100644 main/busybox/busybox-1.23.0-ash.patch delete mode 100644 main/busybox/busybox-1.23.0-modprobe.patch delete mode 100644 main/busybox/busybox-1.23.0-vi.patch (limited to 'main/busybox') diff --git a/main/busybox/0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch b/main/busybox/0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch deleted file mode 100644 index 8a9bfd28f5..0000000000 --- a/main/busybox/0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch +++ /dev/null @@ -1,33 +0,0 @@ -From d8937cf61895636eb05e373c377b5b1904d51d44 Mon Sep 17 00:00:00 2001 -From: Natanael Copa -Date: Fri, 16 Jan 2015 12:01:48 +0100 -Subject: [PATCH] modprobe: fix modprobe -r and parsing of /etc/modprobe.d - -This fixes a regression introduced with commit 78854520 (modprobe: -revert checking for /, stop doing basename() on modprobe args, -2015-01-01) that broke modprobe options stored in /etc/modprobe.conf and -/etc/modprobe.d/*.conf. - -This also fixes modprobe -r - -Signed-off-by: Natanael Copa ---- - modutils/modprobe.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/modutils/modprobe.c b/modutils/modprobe.c -index ce8b0b8..0e8aa9e 100644 ---- a/modutils/modprobe.c -+++ b/modutils/modprobe.c -@@ -425,7 +425,7 @@ static int do_modprobe(struct module_entry *m) - - rc = 0; - fn = llist_pop(&m->deps); /* we leak it */ -- m2 = get_or_add_modentry(fn); -+ m2 = get_or_add_modentry(bb_get_last_path_component_nostrip(fn)); - - if (option_mask32 & OPT_REMOVE) { - /* modprobe -r */ --- -2.2.2 - diff --git a/main/busybox/APKBUILD b/main/busybox/APKBUILD index 7284d56442..6aa927cfaf 100644 --- a/main/busybox/APKBUILD +++ b/main/busybox/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa pkgname=busybox -pkgver=1.23.0 -pkgrel=4 +pkgver=1.23.1 +pkgrel=0 pkgdesc="Size optimized toolbox of many common UNIX utilities" url=http://busybox.net arch="all" @@ -22,11 +22,6 @@ source="http://busybox.net/downloads/$pkgname-$pkgver.tar.bz2 loginutils-sha512.patch udhcpc-discover-retries.patch - busybox-1.23.0-ash.patch - busybox-1.23.0-modprobe.patch - busybox-1.23.0-vi.patch - 0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch - 0001-ifupdown-pass-interface-device-name-for-ipv6-route-c.patch 0001-ifupdown-use-x-hostname-NAME-with-udhcpc.patch @@ -117,7 +112,7 @@ static() { "$subpkgdir"/bin/busybox.static } -md5sums="6dffeb16044c6022476c64744492106a busybox-1.23.0.tar.bz2 +md5sums="5c94d6301a964cd91619bd4d74605245 busybox-1.23.1.tar.bz2 8485cf1e389e891914cbb8771a6d9bbd bbsuid.c d64b58a30892c558bdbab7f0d0997577 nologin.c 4c0f3b486eaa0674961b7ddcd0c60a9b busybox-1.11.1-bb.patch @@ -125,10 +120,6 @@ b5375210f13fd6e1ca61a565e8fabd35 busybox-uname-is-not-gnu.patch c5a8dbc8696db6da9c4624b0e11d8fba bb-app-location.patch 8c42c9ef0f0419c314c86bcaf7796106 loginutils-sha512.patch 91a7584a562a72ba886936558e576bbd udhcpc-discover-retries.patch -31bbf1c3957a939a4508528055a300ec busybox-1.23.0-ash.patch -345f21ccf074904aa591206fc056285d busybox-1.23.0-modprobe.patch -539be43937fdb198c111b077b0771f3b busybox-1.23.0-vi.patch -1252e8853d1f49041cd1bd3cae65c568 0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch 04eeda8c49d4688e6dec02451f8b6aae 0001-ifupdown-pass-interface-device-name-for-ipv6-route-c.patch e1c183cbe1ca18a0fa0d9597314076c9 0001-ifupdown-use-x-hostname-NAME-with-udhcpc.patch 239dbe5dae5d36bbf73548b2749a22b1 0001-linedit-deluser-use-POSIX-getpwent-instead-of-getpwe.patch @@ -138,7 +129,7 @@ b56d306ccba574da78dff060b7330806 1001-fbsplash-support-console-switching.patch 4fe5f9e973674c7db3d07f295c363a7c 1002-fbsplash-support-image-and-bar-alignment-and-positio.patch 3cff842a3618c84465d7ef5425c8749b busyboxconfig befaac2c59c380e36a452b3f1c1d4a3a glibc.patch" -sha256sums="483ab594dd962ddbb332fd24e36ffdd6e36ac2182fbff055c56e1ca49fda09e4 busybox-1.23.0.tar.bz2 +sha256sums="300f1db0a7ca4ecee8f8d8027aba250b903372e8339b7d9123d37c1e900473bf busybox-1.23.1.tar.bz2 81957f1fe0c386120dad1c8174ccc1fcfeed98c14d229db7d164d4fb4c938b3d bbsuid.c 9bbf0bec82e6d6907474958f3be048c54657fbf49207810b7e4d4d6146f0069d nologin.c 327bb8049e2726351a5c8b6b2cef864f6ce58725d4453983f97092ea73656ccc busybox-1.11.1-bb.patch @@ -146,10 +137,6 @@ a31ce8bcb8b81b20e80ffa407600a530d085806c6471f4e4249fcb3a491b79ef busybox-uname- 576366b4d50f1078da6c0364ef70415de92d97c93c64f4d790b11d7a34cdccd2 bb-app-location.patch 57674b20158c0b266ed028b0c65299f9cbcad7d33d19c9fcc403d3967daba493 loginutils-sha512.patch 90825a443339f1c8c249d05f7b025ce53e374d305f8e113d98d45146b105494d udhcpc-discover-retries.patch -fed81c2c8d2cda7d710e2825c549a0fe42fcb58fd342866729c37e9789d5c9e5 busybox-1.23.0-ash.patch -e59ce711b44bb0fdc7adb5bed648287ce4a3212ac1e4afd94bdf5bd6ae0fb590 busybox-1.23.0-modprobe.patch -24595c896674c282c7ab264355d4a7dfb819e86d12cbdc2e7d101689027cffe1 busybox-1.23.0-vi.patch -93e0548812ac9e8f3ee49fd7830ecbde26b69f6f509a71dbc322e18dd349afb8 0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch 2e9d56335ca39e944b9abd9ecc91d0e47a3fe3434f8b7ec3f526bc8fa0895ada 0001-ifupdown-pass-interface-device-name-for-ipv6-route-c.patch 53563c6dc4db13004d0b37f7bf1748e861b5a5c4244c1d34f102c23b689420c5 0001-ifupdown-use-x-hostname-NAME-with-udhcpc.patch ac2cd5fed91bfaec22ed1f2766396d0feb29b9b96f20b2c12d5d8ac8769afae9 0001-linedit-deluser-use-POSIX-getpwent-instead-of-getpwe.patch @@ -159,7 +146,7 @@ b8b0b16ed67b0159256193b1d2108b8ef9aa8a334ab81e463bb970c71257da9a 1001-fbsplash- e1f3fad8e21dfd72cfcae7ab3ba31d7938e964e0f9ec08b2da0b14d462435424 1002-fbsplash-support-image-and-bar-alignment-and-positio.patch 342bb69c144a1e63d7a7fe4c24578ce5b483c09751ac16bb36d1b88929068141 busyboxconfig c604ef791c31d35a8c5ee4558d21428a46f37a6d762c4a7e29864f4037fc44a0 glibc.patch" -sha512sums="02c8f9dd9e47ad67b417fa58ba952bbdda6e79bad5399fba3d8217803053c2fd045228bd76d56e97d40c98296841dc66e4fa829887c05378a83bdeabafeb7f72 busybox-1.23.0.tar.bz2 +sha512sums="60849c220dde596c4197f16dd844573b24dd46c8544345a2d5a2b1976fa0ac340d22fbc97f5a1437b7de1c04f4e16aa07b3d62bc77eb83b2467582a50ed4b362 busybox-1.23.1.tar.bz2 16b3dd6a8b76b062d51458351fcb44f84b49eb4bf898584c933df90fb2cb3966f9547865a4d7447589bb20b7c203beb04ff7512f76f85d29138d2cff4eb9ee81 bbsuid.c 4e7c291a70e879b74c0fc07c54a73ef50537d8be68fee6b2d409425c07afd2d67f9b6afcd8c33a7971014913cc5de85e45079681c9e77200c6cc2f34acfba6d2 nologin.c eb7cce973bfd53ce3350713437b9e2751becfb8dfb10b14f27c4f812297c403b90f80dc2906179d499e8dffbe6df8aa37ae27625c552162923d59fe35b55b32b busybox-1.11.1-bb.patch @@ -167,10 +154,6 @@ eb7cce973bfd53ce3350713437b9e2751becfb8dfb10b14f27c4f812297c403b90f80dc2906179d4 5c42b05be69c834c9fd5372c6b0d55a6399c74146a94ea09eae7285dd4fa75d1bde38bf7ab73e98638f65eb72db02115453cbdfe85a0085d742940366f617c7d bb-app-location.patch 69af4800fcf765b4ae029daced7ff171b6b04d810c94a987c7ba848e275a27b77b18b38df1b85f4a12c4a47ed42f62e0768260eb1198e2aff1c3cea898b85c61 loginutils-sha512.patch 34415fe69f6b8d42756046aa8e6d9e4f64a3b0ceb9f57c4c988e35870fe975f05d0ac76f1f9a712196e9c59e67aa2a54abf398242009134fb3aca342c25a3646 udhcpc-discover-retries.patch -e70fc7b37f18b14638f3526ae1730bb178c190d6bb6c931beadbc5ef3d883dee9b994624af62641ca75edc50cae0e1259f3d52ffcf0d3cb78ceac90000df8962 busybox-1.23.0-ash.patch -13088f5d2e2b2da8155697d6e1787815a49bc1b353650fa596d99be966c836a967f774725d8258508239f041d5c6f74a55abe407f917a51b2f5b72d75b0c2e5a busybox-1.23.0-modprobe.patch -b9099407a17ab29b30e9aa3cc30f1b0d05115cf14b49fcfb41167a6f2c77eafd7455f07e9b2ccaa5770cfa45e6458c3931d618c1330ed3ec4e8b613575db3d19 busybox-1.23.0-vi.patch -ae82177d70618e19a533408f7e0ac8388e32cbc73fb737ff658a2d8f722819d8a8d3a34fdf5307fa613847164d1f65ea943167fa9ee982b70bcc644fadc9d86a 0001-modprobe-fix-modprobe-r-and-parsing-of-etc-modprobe..patch f2ed7bf994766a20ceecb28bea8c66307b6b66cdd7099408b1f29a529786ce07e55824b21256321708663e00d6fe9428480b0d3e121b67d6ebd8a8a87b1486d1 0001-ifupdown-pass-interface-device-name-for-ipv6-route-c.patch b1a1cc2ada657a3d3364c8c96853575d73784e769cd8768c170c27a3e59abd2beace75dff6d5047c4391725e961d93149f9c3f45ed75fb1c582bf18b818282c9 0001-ifupdown-use-x-hostname-NAME-with-udhcpc.patch 6781b10ca078296b243373d2c3f2bca2507a9df18a6b06d051e9ce84ed31a238aef3b2bb085daf12b145550be68c07c854272bd78a6f77da9197779b9c7cd9e9 0001-linedit-deluser-use-POSIX-getpwent-instead-of-getpwe.patch diff --git a/main/busybox/busybox-1.23.0-ash.patch b/main/busybox/busybox-1.23.0-ash.patch deleted file mode 100644 index fb494aa251..0000000000 --- a/main/busybox/busybox-1.23.0-ash.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- busybox-1.23.0/shell/ash.c -+++ busybox-1.23.0-ash/shell/ash.c -@@ -6746,6 +6746,14 @@ varvalue(char *name, int varflags, int f - len = strlen(p); - if (!(subtype == VSPLUS || subtype == VSLENGTH)) - memtodest(p, len, syntax, quotes); -+#if ENABLE_UNICODE_SUPPORT -+ if (subtype == VSLENGTH && len > 0) { -+ reinit_unicode_for_ash(); -+ if (unicode_status == UNICODE_ON) { -+ len = unicode_strlen(p); -+ } -+ } -+#endif - return len; - } - -@@ -6829,15 +6837,7 @@ evalvar(char *p, int flags, struct strli - varunset(p, var, 0, 0); - - if (subtype == VSLENGTH) { -- ssize_t n = varlen; -- if (n > 0) { -- reinit_unicode_for_ash(); -- if (unicode_status == UNICODE_ON) { -- const char *val = lookupvar(var); -- n = unicode_strlen(val); -- } -- } -- cvtnum(n > 0 ? n : 0); -+ cvtnum(varlen > 0 ? varlen : 0); - goto record; - } - diff --git a/main/busybox/busybox-1.23.0-modprobe.patch b/main/busybox/busybox-1.23.0-modprobe.patch deleted file mode 100644 index 69fa8510b4..0000000000 --- a/main/busybox/busybox-1.23.0-modprobe.patch +++ /dev/null @@ -1,203 +0,0 @@ ---- busybox-1.23.0/modutils/depmod.c -+++ busybox-1.23.0-modprobe/modutils/depmod.c -@@ -51,7 +51,11 @@ static int FAST_FUNC parse_module(const - - info->dnext = info->dprev = info; - info->name = xstrdup(fname + 2); /* skip "./" */ -- info->modname = xstrdup(filename2modname(fname, modname)); -+ info->modname = xstrdup( -+ filename2modname( -+ bb_get_last_path_component_nostrip(fname), -+ modname -+ )); - for (ptr = image; ptr < image + len - 10; ptr++) { - if (strncmp(ptr, "depends=", 8) == 0) { - char *u; -@@ -242,17 +246,18 @@ int depmod_main(int argc UNUSED_PARAM, c - if (!(option_mask32 & OPT_n)) - xfreopen_write("modules.alias", stdout); - for (m = modules; m != NULL; m = m->next) { -+ char modname[MODULE_NAME_LEN]; - const char *fname = bb_basename(m->name); -- int fnlen = strchrnul(fname, '.') - fname; -+ filename2modname(fname, modname); - while (m->aliases) { - /* Last word can well be m->modname instead, - * but depmod from module-init-tools 3.4 - * uses module basename, i.e., no s/-/_/g. - * (pathname and .ko.* are still stripped) - * Mimicking that... */ -- printf("alias %s %.*s\n", -+ printf("alias %s %s\n", - (char*)llist_pop(&m->aliases), -- fnlen, fname); -+ modname); - } - } - #endif -@@ -260,12 +265,13 @@ int depmod_main(int argc UNUSED_PARAM, c - if (!(option_mask32 & OPT_n)) - xfreopen_write("modules.symbols", stdout); - for (m = modules; m != NULL; m = m->next) { -+ char modname[MODULE_NAME_LEN]; - const char *fname = bb_basename(m->name); -- int fnlen = strchrnul(fname, '.') - fname; -+ filename2modname(fname, modname); - while (m->symbols) { -- printf("alias symbol:%s %.*s\n", -+ printf("alias symbol:%s %s\n", - (char*)llist_pop(&m->symbols), -- fnlen, fname); -+ modname); - } - } - #endif ---- busybox-1.23.0/modutils/modprobe.c -+++ busybox-1.23.0-modprobe/modutils/modprobe.c -@@ -229,26 +229,20 @@ static ALWAYS_INLINE struct module_entry - { - return helper_get_module(module, 1); - } --static ALWAYS_INLINE struct module_entry *get_modentry(const char *module) -+/* So far this function always gets a module pathname, never an alias name. -+ * The crucial difference is that pathname needs dirname stripping, -+ * while alias name must NOT do it! -+ * Testcase where dirname stripping is likely to go wrong: "modprobe devname:snd/timer" -+ */ -+static ALWAYS_INLINE struct module_entry *get_modentry(const char *pathname) - { -- return helper_get_module(module, 0); -+ return helper_get_module(bb_get_last_path_component_nostrip(pathname), 0); - } - - static void add_probe(const char *name) - { - struct module_entry *m; - -- /* -- * get_or_add_modentry() strips path from name and works -- * on remaining basename. -- * This would make "rmmod dir/name" and "modprobe dir/name" -- * to work like "rmmod name" and "modprobe name", -- * which is wrong, and can be abused via implicit modprobing: -- * "ifconfig /usbserial up" tries to modprobe netdev-/usbserial. -- */ -- if (strchr(name, '/')) -- bb_error_msg_and_die("malformed module name '%s'", name); -- - m = get_or_add_modentry(name); - if (!(option_mask32 & (OPT_REMOVE | OPT_SHOW_DEPS)) - && (m->flags & MODULE_FLAG_LOADED) -@@ -510,7 +504,7 @@ static void load_modules_dep(void) - colon = last_char_is(tokens[0], ':'); - if (colon == NULL) - continue; -- *colon = 0; -+ *colon = '\0'; - - m = get_modentry(tokens[0]); - if (m == NULL) -@@ -557,7 +551,6 @@ int modprobe_main(int argc UNUSED_PARAM, - - if (opt & OPT_LIST_ONLY) { - int i; -- char name[MODULE_NAME_LEN]; - char *colon, *tokens[2]; - parser_t *p = config_open2(CONFIG_DEFAULT_DEPMOD_FILE, xfopen_for_read); - -@@ -569,10 +562,14 @@ int modprobe_main(int argc UNUSED_PARAM, - if (!colon) - continue; - *colon = '\0'; -- filename2modname(tokens[0], name); - if (!argv[0]) - puts(tokens[0]); - else { -+ char name[MODULE_NAME_LEN]; -+ filename2modname( -+ bb_get_last_path_component_nostrip(tokens[0]), -+ name -+ ); - for (i = 0; argv[i]; i++) { - if (fnmatch(argv[i], name, 0) == 0) { - puts(tokens[0]); ---- busybox-1.23.0/modutils/modprobe-small.c -+++ busybox-1.23.0-modprobe/modutils/modprobe-small.c -@@ -149,9 +149,13 @@ static void replace(char *s, char what, - static char *filename2modname(const char *filename, char *modname) - { - int i; -- char *from; -+ const char *from; - -- from = bb_get_last_path_component_nostrip(filename); -+ // Disabled since otherwise "modprobe dir/name" would work -+ // as if it is "modprobe name". It is unclear why -+ // 'basenamization' was here in the first place. -+ //from = bb_get_last_path_component_nostrip(filename); -+ from = filename; - for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) - modname[i] = (from[i] == '-') ? '_' : from[i]; - modname[i] = '\0'; -@@ -631,6 +635,14 @@ static void process_module(char *name, c - infovec = find_alias(name); - } - -+ if (!infovec) { -+ /* both dirscan and find_alias found nothing */ -+ if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */ -+ bb_error_msg("module '%s' not found", name); -+//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline? -+ goto ret; -+ } -+ - /* There can be more than one module for the given alias. For example, - * "pci:v00008086d00007010sv00000000sd00000000bc01sc01i80" matches - * ata_piix because it has alias "pci:v00008086d00007010sv*sd*bc*sc*i*" -@@ -646,7 +658,8 @@ static void process_module(char *name, c - int r; - char modname[MODULE_NAME_LEN]; - -- filename2modname(info->pathname, modname); -+ filename2modname( -+ bb_get_last_path_component_nostrip(info->pathname), modname); - r = delete_module(modname, O_NONBLOCK | O_EXCL); - dbg1_error_msg("delete_module('%s', O_NONBLOCK | O_EXCL):%d", modname, r); - if (r != 0) { -@@ -669,14 +682,6 @@ static void process_module(char *name, c - */ - } - -- if (!infovec) { -- /* both dirscan and find_alias found nothing */ -- if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or depmod */ -- bb_error_msg("module '%s' not found", name); --//TODO: _and_die()? or should we continue (un)loading modules listed on cmdline? -- goto ret; -- } -- - infoidx = 0; - while ((info = infovec[infoidx++]) != NULL) { - /* Iterate thru dependencies, trying to (un)load them */ ---- busybox-1.23.0/modutils/modutils.c -+++ busybox-1.23.0-modprobe/modutils/modutils.c -@@ -48,13 +48,17 @@ int FAST_FUNC string_to_llist(char *stri - char* FAST_FUNC filename2modname(const char *filename, char *modname) - { - int i; -- char *from; -+ const char *from; - - if (filename == NULL) - return NULL; - if (modname == NULL) - modname = xmalloc(MODULE_NAME_LEN); -- from = bb_get_last_path_component_nostrip(filename); -+ // Disabled since otherwise "modprobe dir/name" would work -+ // as if it is "modprobe name". It is unclear why -+ // 'basenamization' was here in the first place. -+ //from = bb_get_last_path_component_nostrip(filename); -+ from = filename; - for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) - modname[i] = (from[i] == '-') ? '_' : from[i]; - modname[i] = '\0'; diff --git a/main/busybox/busybox-1.23.0-vi.patch b/main/busybox/busybox-1.23.0-vi.patch deleted file mode 100644 index 3a07ab9d9a..0000000000 --- a/main/busybox/busybox-1.23.0-vi.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- busybox-1.23.0/editors/vi.c -+++ busybox-1.23.0-vi/editors/vi.c -@@ -542,9 +542,6 @@ static void cookmode(void); // return to - static int mysleep(int); - static int readit(void); // read (maybe cursor) key from stdin - static int get_one_char(void); // read 1 char from stdin --#if !ENABLE_FEATURE_VI_READONLY --#define file_insert(fn, p, update_ro_status) file_insert(fn, p) --#endif - // file_insert might reallocate text[]! - static int file_insert(const char *, char *, int); - static int file_write(char *, char *, char *); -@@ -1325,7 +1322,7 @@ static void colon(char *buf) - q = next_line(q); - { // dance around potentially-reallocated text[] - uintptr_t ofs = q - text; -- size = file_insert(fn, q, /*update_ro:*/ 0); -+ size = file_insert(fn, q, 0); - q = text + ofs; - } - if (size < 0) -@@ -2905,7 +2902,7 @@ static char *get_input_line(const char * - } - - // might reallocate text[]! --static int file_insert(const char *fn, char *p, int update_ro_status) -+static int file_insert(const char *fn, char *p, int initial) - { - int cnt = -1; - int fd, size; -@@ -2918,7 +2915,8 @@ static int file_insert(const char *fn, c - - fd = open(fn, O_RDONLY); - if (fd < 0) { -- status_line_bold_errno(fn); -+ if (!initial) -+ status_line_bold_errno(fn); - return cnt; - } - -@@ -2946,7 +2944,7 @@ static int file_insert(const char *fn, c - close(fd); - - #if ENABLE_FEATURE_VI_READONLY -- if (update_ro_status -+ if (initial - && ((access(fn, W_OK) < 0) || - /* root will always have access() - * so we check fileperms too */ -- cgit v1.2.3