diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | busybox.def.h | 4 | ||||
-rw-r--r-- | busybox.spec | 2 | ||||
-rw-r--r-- | examples/busybox.spec | 2 | ||||
-rw-r--r-- | insmod.c | 101 | ||||
-rw-r--r-- | modutils/insmod.c | 101 | ||||
-rw-r--r-- | utility.c | 2 |
7 files changed, 203 insertions, 13 deletions
@@ -84,6 +84,10 @@ ifdef BB_INIT_RC_EXIT_CMD CFLAGS += -DBB_INIT_CMD_IF_RC_SCRIPT_EXITS=${BB_INIT_RC_EXIT_CMD} endif +ifdef BB_INIT_SCRIPT + CFLAGS += -DBB_INIT_SCRIPT=${BB_INIT_SCRIPT} +endif + all: busybox busybox.links busybox: $(OBJECTS) diff --git a/busybox.def.h b/busybox.def.h index 0655d3e..3a64c1a 100644 --- a/busybox.def.h +++ b/busybox.def.h @@ -28,7 +28,7 @@ #define BB_HEAD #define BB_HOSTNAME #define BB_INIT -#define BB_INSMOD +//#define BB_INSMOD #define BB_KILL #define BB_KLOGD //#define BB_LENGTH @@ -60,7 +60,7 @@ #define BB_REBOOT #define BB_RM #define BB_RMDIR -#define BB_RMMOD +//#define BB_RMMOD //#define BB_SFDISK #define BB_SED #define BB_SLEEP diff --git a/busybox.spec b/busybox.spec index a0351a0..a852007 100644 --- a/busybox.spec +++ b/busybox.spec @@ -21,7 +21,7 @@ embedded system. %setup -q -n %{Name}-%{Version} %Build -BB_INIT_RC_EXIT_CMD=\"/bin/sh\" make +BB_INIT_RC_EXIT_CMD=\"/bin/sh\" BB_INIT_SCRIPT=\"/etc/rc.d/init.d/rcS\" make %Install rm -rf $RPM_BUILD_ROOT diff --git a/examples/busybox.spec b/examples/busybox.spec index a0351a0..a852007 100644 --- a/examples/busybox.spec +++ b/examples/busybox.spec @@ -21,7 +21,7 @@ embedded system. %setup -q -n %{Name}-%{Version} %Build -BB_INIT_RC_EXIT_CMD=\"/bin/sh\" make +BB_INIT_RC_EXIT_CMD=\"/bin/sh\" BB_INIT_SCRIPT=\"/etc/rc.d/init.d/rcS\" make %Install rm -rf $RPM_BUILD_ROOT @@ -29,6 +29,16 @@ #include <sys/syscall.h> #include <linux/module.h> +#define _PATH_MODULES "/lib/modules" + +#warning "Danger Will Robinson, Danger!!!" +#warning " " +#warning "insmod is still under construction. Don't use it." +#warning " " +#warning " You have been warned!" +#warning " " + + /* Some firendly syscalls to cheer everyone's day... */ _syscall2(int, init_module, const char *, name, const struct module *, info) @@ -57,6 +67,8 @@ _syscall2(unsigned long, create_module, const char *, name, size_t, size) #endif +static char m_filename[PATH_MAX] = "\0"; +static char m_fullName[PATH_MAX] ="\0"; static const char insmod_usage[] = "insmod [OPTION]... MODULE [symbol=value]...\n\n" "Loads the specified kernel modules into the kernel.\n\n" @@ -65,14 +77,32 @@ static const char insmod_usage[] = "\t-k\tMake module autoclean-able.\n"; +static int findNamedModule(const char *fileName, struct stat* statbuf) +{ + if (m_fullName[0]=='\0') + return( FALSE); + else { + char* tmp = strrchr( fileName, '/'); + if (tmp == NULL) + tmp = (char*)fileName; + else + tmp++; + if (check_wildcard_match(tmp, m_fullName) == TRUE) { + /* Stop searching if we find a match */ + memcpy(m_filename, fileName, strlen(fileName)); + return( FALSE); + } + } + return( TRUE); +} + extern int insmod_main(int argc, char **argv) { int len; - char m_name[PATH_MAX]; - char* tmp; - - + char *tmp; + char m_name[PATH_MAX] ="\0"; + FILE *fp; if (argc<=1) { usage( insmod_usage); @@ -105,9 +135,72 @@ extern int insmod_main(int argc, char **argv) if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') len -= 2; memcpy(m_name, tmp, len); + strcpy(m_fullName, m_name); + strcat(m_fullName, ".o"); + + /* Get a filedesc for the module */ + if ((fp = fopen(*argv, "r")) == NULL) { + /* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */ + if (recursiveAction(_PATH_MODULES, TRUE, FALSE, FALSE, + findNamedModule, findNamedModule) == FALSE) { + if ( m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL)) { + perror("No module by that name found in " _PATH_MODULES "\n"); + exit( FALSE); + } + } + } else + memcpy(m_filename, *argv, strlen(*argv)); + + fprintf(stderr, "m_filename='%s'\n", m_filename); fprintf(stderr, "m_name='%s'\n", m_name); + + /* TODO: do something roughtly like this... */ +#if 0 + + if ((f = obj_load(fp)) == NULL) { + perror("Could not load the module\n"); + exit( FALSE); + } + /* Let the module know about the kernel symbols. */ + add_kernel_symbols(f); + + if (!create_this_module(f, m_name)) { + perror("Could not create the module\n"); + exit( FALSE); + } + + if (!obj_check_undefineds(f, quiet)) { + perror("Undefined symbols in the module\n"); + exit( FALSE); + } + obj_allocate_commons(f); + + /* Perse the module's arguments */ + while (argc-- >0 && *(argv++) != '\0') { + if (!process_module_arguments(f, argc - optind, argv + optind)) { + perror("Undefined symbols in the module\n"); + exit( FALSE); + } + } + + /* Find current size of the module */ + m_size = obj_load_size(f); + + + errno = 0; + m_addr = create_module(m_name, m_size); + switch (errno) { + /* yada yada */ + default: + perror("create_module: %m"); + + } + +#endif + + fclose( fp); exit( TRUE); } diff --git a/modutils/insmod.c b/modutils/insmod.c index 9a0daa7..9cb635f 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -29,6 +29,16 @@ #include <sys/syscall.h> #include <linux/module.h> +#define _PATH_MODULES "/lib/modules" + +#warning "Danger Will Robinson, Danger!!!" +#warning " " +#warning "insmod is still under construction. Don't use it." +#warning " " +#warning " You have been warned!" +#warning " " + + /* Some firendly syscalls to cheer everyone's day... */ _syscall2(int, init_module, const char *, name, const struct module *, info) @@ -57,6 +67,8 @@ _syscall2(unsigned long, create_module, const char *, name, size_t, size) #endif +static char m_filename[PATH_MAX] = "\0"; +static char m_fullName[PATH_MAX] ="\0"; static const char insmod_usage[] = "insmod [OPTION]... MODULE [symbol=value]...\n\n" "Loads the specified kernel modules into the kernel.\n\n" @@ -65,14 +77,32 @@ static const char insmod_usage[] = "\t-k\tMake module autoclean-able.\n"; +static int findNamedModule(const char *fileName, struct stat* statbuf) +{ + if (m_fullName[0]=='\0') + return( FALSE); + else { + char* tmp = strrchr( fileName, '/'); + if (tmp == NULL) + tmp = (char*)fileName; + else + tmp++; + if (check_wildcard_match(tmp, m_fullName) == TRUE) { + /* Stop searching if we find a match */ + memcpy(m_filename, fileName, strlen(fileName)); + return( FALSE); + } + } + return( TRUE); +} + extern int insmod_main(int argc, char **argv) { int len; - char m_name[PATH_MAX]; - char* tmp; - - + char *tmp; + char m_name[PATH_MAX] ="\0"; + FILE *fp; if (argc<=1) { usage( insmod_usage); @@ -105,9 +135,72 @@ extern int insmod_main(int argc, char **argv) if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') len -= 2; memcpy(m_name, tmp, len); + strcpy(m_fullName, m_name); + strcat(m_fullName, ".o"); + + /* Get a filedesc for the module */ + if ((fp = fopen(*argv, "r")) == NULL) { + /* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */ + if (recursiveAction(_PATH_MODULES, TRUE, FALSE, FALSE, + findNamedModule, findNamedModule) == FALSE) { + if ( m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL)) { + perror("No module by that name found in " _PATH_MODULES "\n"); + exit( FALSE); + } + } + } else + memcpy(m_filename, *argv, strlen(*argv)); + + fprintf(stderr, "m_filename='%s'\n", m_filename); fprintf(stderr, "m_name='%s'\n", m_name); + + /* TODO: do something roughtly like this... */ +#if 0 + + if ((f = obj_load(fp)) == NULL) { + perror("Could not load the module\n"); + exit( FALSE); + } + /* Let the module know about the kernel symbols. */ + add_kernel_symbols(f); + + if (!create_this_module(f, m_name)) { + perror("Could not create the module\n"); + exit( FALSE); + } + + if (!obj_check_undefineds(f, quiet)) { + perror("Undefined symbols in the module\n"); + exit( FALSE); + } + obj_allocate_commons(f); + + /* Perse the module's arguments */ + while (argc-- >0 && *(argv++) != '\0') { + if (!process_module_arguments(f, argc - optind, argv + optind)) { + perror("Undefined symbols in the module\n"); + exit( FALSE); + } + } + + /* Find current size of the module */ + m_size = obj_load_size(f); + + + errno = 0; + m_addr = create_module(m_name, m_size); + switch (errno) { + /* yada yada */ + default: + perror("create_module: %m"); + + } + +#endif + + fclose( fp); exit( TRUE); } @@ -378,7 +378,7 @@ int fullRead(int fd, char *buf, int len) #endif -#if defined (BB_CHOWN) || defined (BB_CP) || defined (BB_FIND) || defined (BB_LS) +#if defined (BB_CHOWN) || defined (BB_CP) || defined (BB_FIND) || defined (BB_LS) || defined (BB_INSMOD) /* * Walk down all the directories under the specified * location, and do something (something specified |