*
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-
#include "modutils.h"
#ifdef __UCLIBC__
# define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
#endif
-/*
- a libbb candidate from ice age!
-*/
-llist_t FAST_FUNC *llist_find(llist_t *first, const char *str)
-{
- while (first != NULL) {
- if (strcmp(first->data, str) == 0)
- return first;
- first = first->link;
- }
- return NULL;
-}
-
void FAST_FUNC replace(char *s, char what, char with)
{
while (*s) {
}
}
-char * FAST_FUNC replace_underscores(char *s)
+char* FAST_FUNC replace_underscores(char *s)
{
replace(s, '-', '_');
return s;
return len;
}
-char * FAST_FUNC filename2modname(const char *filename, char *modname)
+char* FAST_FUNC filename2modname(const char *filename, char *modname)
{
int i;
char *from;
from = bb_get_last_path_component_nostrip(filename);
for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++)
modname[i] = (from[i] == '-') ? '_' : from[i];
- modname[i] = 0;
+ modname[i] = '\0';
return modname;
}
-const char * FAST_FUNC moderror(int err)
-{
- switch (err) {
- case -1:
- return "no such module";
- case ENOEXEC:
- return "invalid module format";
- case ENOENT:
- return "unknown symbol in module, or unknown parameter";
- case ESRCH:
- return "module has wrong symbol version";
- case ENOSYS:
- return "kernel does not support requested operation";
- default:
- return strerror(err);
- }
-}
-
char * FAST_FUNC parse_cmdline_module_options(char **argv)
{
char *options;
return options;
}
+/* Return:
+ * 0 on success,
+ * -errno on open/read error,
+ * errno on init_module() error
+ */
int FAST_FUNC bb_init_module(const char *filename, const char *options)
{
- size_t len = MAXINT(ssize_t);
+ size_t len;
char *image;
- int rc = ENOENT;
+ int rc;
if (!options)
options = "";
+//TODO: audit bb_init_module_24 to match error code convention
#if ENABLE_FEATURE_2_4_MODULES
if (get_linux_version_code() < KERNEL_VERSION(2,6,0))
return bb_init_module_24(filename, options);
#endif
/* Use the 2.6 way */
+ len = INT_MAX - 4095;
+ errno = ENOMEM; /* may be changed by e.g. open errors below */
image = xmalloc_open_zipped_read_close(filename, &len);
- if (image) {
- rc = 0;
- if (init_module(image, len, options) != 0)
- rc = errno;
- free(image);
- }
+ if (!image)
+ return -errno;
+ errno = 0;
+ init_module(image, len, options);
+ rc = errno;
+ free(image);
return rc;
}
int FAST_FUNC bb_delete_module(const char *module, unsigned int flags)
{
- return delete_module(module, flags);
+ errno = 0;
+ delete_module(module, flags);
+ return errno;
+}
+
+const char* FAST_FUNC moderror(int err)
+{
+ switch (err) {
+ case -1: /* btw: it's -EPERM */
+ return "no such module";
+ case ENOEXEC:
+ return "invalid module format";
+ case ENOENT:
+ return "unknown symbol in module, or unknown parameter";
+ case ESRCH:
+ return "module has wrong symbol version";
+ case ENOSYS:
+ return "kernel does not support requested operation";
+ }
+ if (err < 0) /* should always be */
+ err = -err;
+ return strerror(err);
}