On Wed, Jun 03, 2009 at 09:48:15PM +0200, Gilles Espinasse wrote:
>Do not report always EXITSUCCESS even with 'module not found'
>Fix an old comment s/modprobe.dep/modules.dep
>
>function                                             old     new   delta
>modprobe_main                                        463     484     +21
>count_error                                            -      12     +12
>------------------------------------------------------------------------------
>(add/remove: 1/0 grow/shrink: 1/0 up/down: 33/0)               Total: 33 bytes
>   text    data     bss     dec     hex filename
> 221162    1585    8752  231499   3884b busybox_old
> 221195    1585    8752  231532   3886c busybox_unstripped
>
>Signed-off-by: Gilles Espinasse <[email protected]>
>---
> modutils/modprobe.c |   23 +++++++++++++++++------
> 1 files changed, 17 insertions(+), 6 deletions(-)
>
>diff --git a/modutils/modprobe.c b/modutils/modprobe.c
>index 0339ebb..12f1f99 100644
>--- a/modutils/modprobe.c
>+++ b/modutils/modprobe.c
>@@ -54,6 +54,7 @@ struct globals {
>       int num_unresolved_deps;
>       /* bool. "Did we have 'symbol:FOO' requested on cmdline?" */
>       smallint need_symbols;
>+      smallint modprobe_status; /* to return the proper exit status */

If this is not a bool then you don't need a separate variable, just extend
need_symbols (renaming it to "thing" or "status" or the like).

treat need_symbols as status |= 1 << 0
> };
> #define G (*(struct globals*)&bb_common_bufsiz1)
> #define INIT_G() do { } while (0)
>@@ -203,6 +204,14 @@ static int read_config(const char *path)
>                               config_file_action, NULL, NULL, 1);
> }
> 
>+/* Hold modprobe status */

no, that's most likely not needed.

>+static void count_error(int rc)
>+{
>+      if (rc != 0)
>+              G.modprobe_status = 1;
>+}
>+
>+/* Return a value >=0 or -ENOENT if module not found in modules.dep */
> static int do_modprobe(struct module_entry *m)
> {
>       struct module_entry *m2;
>@@ -242,7 +251,8 @@ static int do_modprobe(struct module_entry *m)
>               free(fn);
>       }
> 
>-//FIXME: what if rc < 0?
>+      /* On 2.6 kernel, rc is alway >=0 (0 or errno),
>+       * on 2.4 kernel, that's EXIT_SUCCESS or EXIT_ERROR */

s/on/On/

>       if (rc > 0 && !(option_mask32 & INSMOD_OPT_SILENT)) {
>               bb_error_msg("failed to %sload module %s: %s",
>                       (option_mask32 & MODPROBE_OPT_REMOVE) ? "un" : "",
>@@ -260,7 +270,7 @@ static void load_modules_dep(void)
>       char *colon, *tokens[2];
>       parser_t *p;
> 
>-      /* Modprobe does not work at all without modprobe.dep,
>+      /* Modprobe does not work at all without modules.dep,
>        * even if the full module name is given. Returning error here
>        * was making us later confuse user with this message:
>        * "module /full/path/to/existing/file/module.ko not found".
>@@ -375,7 +385,8 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
>                        || !(me->flags & MODULE_FLAG_BLACKLISTED)
>                       ) {
>                               rc = do_modprobe(me);
        status |= 1 << (1 + !!do_modprobe(me))
>-//FIXME: what if rc > 0?
>+                              count_error(rc);
>+                              /* if rc > 0, do_modprobe already warn */
>                               if (rc < 0 && !(opt & INSMOD_OPT_SILENT))
>                                       bb_error_msg("module %s not found",
>                                                    me->probed_name);
>@@ -389,12 +400,12 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
>                               DBG("probing %s by realname %s", me->modname, 
> realname);
>                               m2 = get_or_add_modentry(realname);
>                               if (!(m2->flags & MODULE_FLAG_BLACKLISTED))
>-                                      do_modprobe(m2);
>-//FIXME: error check?
>+                                      count_error(do_modprobe(m2));
        status |= 1 << (1 + !!do_modprobe(m2))
>+
>                               free(realname);
>                       } while (me->realnames != NULL);
>               }
>       }
> 
>-      return EXIT_SUCCESS;
>+      return G.modprobe_status;
        return status & 4 == 4; /* for example */

compare sizes.
see?
> }
>-- 
>1.6.0.6
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to