int nodeup_postmove(int argc, char *argv[]) { int c, i; struct module_t *mod; const char *krev; struct utsname utsbuf; /* We're really just skipping over options here */ while ((c=getopt(argc, argv, "r:f")) != -1) { switch (c) { case 'r': break; case 'f': break; default: log_print(LOG_ERROR, "Unrecognized flag: %c\n", (char) optopt); return -1; } } if (uname(&utsbuf) != 0) { log_print(LOG_ERROR, "Failed to get kernel revision: %s\n", strerror(errno)); return -1; } krev = utsbuf.release; for (i=optind; i < argc; i++) { mod = module_get(krev, argv[i]); if (!mod || !mod->map) continue; log_print(LOG_INFO, "Loading module %s\n", argv[i]); if (modprobe(mod, 0)) log_print(LOG_ERROR, " Insmod failed: %s\n", mod_strerror(errno)); } return 0; }
// do_insmod.cmt static int do_insmod(int argc, char *argv[]) { struct kmod_ctx *ctx; struct kmod_module *mod; const char *filename; char *opts = NULL; size_t optslen = 0; int i, err; const char *null_config = NULL; printf("begin to parse para\n"); for (;;) { int c, idx = 0; c = getopt_long(argc, argv, cmdopts_s, cmdopts, &idx); printf("c = %d\n", c); if (c == -1) break; switch (c) { case 'p': case 's': case 'f': /* ignored, for compatibility only */ break; case 'h': help(); return EXIT_SUCCESS; case 'V': puts(PACKAGE " version " VERSION); return EXIT_SUCCESS; case '?': return EXIT_FAILURE; default: printf("no this para\n"); ERR("unexpected getopt_long() value '%c'.\n", c); return EXIT_FAILURE; } } if (optind >= argc) { ERR("missing filename.\n"); return EXIT_FAILURE; } filename = argv[optind]; if (strcmp(filename, "-") == 0) { ERR("this tool does not support loading from stdin!\n"); return EXIT_FAILURE; } for (i = optind + 1; i < argc; i++) { size_t len = strlen(argv[i]); void *tmp = realloc(opts, optslen + len + 2); if (tmp == NULL) { ERR("out of memory\n"); free(opts); return EXIT_FAILURE; } opts = tmp; if (optslen > 0) { opts[optslen] = ' '; optslen++; } memcpy(opts + optslen, argv[i], len); optslen += len; opts[optslen] = '\0'; } ctx = kmod_new(NULL, &null_config); if (!ctx) { ERR("kmod_new() failed!\n"); free(opts); return EXIT_FAILURE; } err = kmod_module_new_from_path(ctx, filename, &mod); if (err < 0) { ERR("could not load module %s: %s\n", filename, strerror(-err)); goto end; } err = kmod_module_insert_module(mod, 0, opts); if (err < 0) { ERR("could not insert module %s: %s\n", filename, mod_strerror(-err)); } kmod_module_unref(mod); end: kmod_unref(ctx); free(opts); return err >= 0 ? EXIT_SUCCESS : EXIT_FAILURE; }