int main(int argc, const char *argv[]) { const char *modname; /* module name */ char *mod_filename; /* module filename: /usr/lib/ipmasqadm/MOD.so */ void *dlp; int (*mod_main) (int, const char *[]); progname = argv[0]; if (argc<2) usage(stderr, 1); modname = argv[1]; mod_filename=malloc(strlen(LIBDIR)+strlen(modname)+1+3+1); if (!mod_filename) { perror("malloc()"); return 1; } sprintf(mod_filename, LIBDIR "/%s.so", modname); /* * Open module file */ dlp=dlopen(mod_filename, RTLD_NOW); if (!dlp) { fprintf(stderr, "dlopen(): %s\n", dlerror()); return 1; } /* * Fetch entry address (masqmod_main) */ mod_main=dlsym(dlp, MASQ_MOD_MAIN); if (!mod_main) { fprintf(stderr, "dlsym(\"%s\"): %s\n", "masqmod_main", dlerror()); return 1; } --argc; ++argv; /* * Here we go ... */ return mod_main(argc, argv); }
static int __init mod_init(void) { printk("=== insmod module ===\n"); mod_main(); return 0; }