*/
#include "libbb.h"
-
+/* After libbb.h, since it needs sys/types.h on some systems */
#include <sys/utsname.h> /* uname() */
#include <fnmatch.h>
char *module_load_options;
smallint dep_bb_seen;
smallint wrote_dep_bb_ok;
- int module_count;
+ unsigned module_count;
int module_found_idx;
- int stringbuf_idx;
- char stringbuf[32 * 1024]; /* some modules have lots of stuff */
+ unsigned stringbuf_idx;
+ unsigned stringbuf_size;
+ char *stringbuf; /* some modules have lots of stuff */
/* for example, drivers/media/video/saa7134/saa7134.ko */
+ /* therefore having a fixed biggish buffer is not wise */
};
#define G (*ptr_to_globals)
#define modinfo (G.modinfo )
#define module_found_idx (G.module_found_idx )
#define module_load_options (G.module_load_options)
#define stringbuf_idx (G.stringbuf_idx )
+#define stringbuf_size (G.stringbuf_size )
#define stringbuf (G.stringbuf )
#define INIT_G() do { \
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
} while (0)
+static void append(const char *s)
+{
+ unsigned len = strlen(s);
+ if (stringbuf_idx + len + 15 > stringbuf_size) {
+ stringbuf_size = stringbuf_idx + len + 127;
+ dbg2_error_msg("grow stringbuf to %u", stringbuf_size);
+ stringbuf = xrealloc(stringbuf, stringbuf_size);
+ }
+ memcpy(stringbuf + stringbuf_idx, s, len);
+ stringbuf_idx += len;
+}
static void appendc(char c)
{
- if (stringbuf_idx < sizeof(stringbuf))
- stringbuf[stringbuf_idx++] = c;
+ /* We appendc() only after append(), + 15 trick in append()
+ * makes it unnecessary to check for overflow here */
+ stringbuf[stringbuf_idx++] = c;
}
static void bksp(void)
stringbuf_idx--;
}
-static void append(const char *s)
-{
- size_t len = strlen(s);
- if (stringbuf_idx + len < sizeof(stringbuf)) {
- memcpy(stringbuf + stringbuf_idx, s, len);
- stringbuf_idx += len;
- }
-}
-
static void reset_stringbuf(void)
{
stringbuf_idx = 0;
static char* copy_stringbuf(void)
{
- char *copy = xmalloc(stringbuf_idx);
+ char *copy = xzalloc(stringbuf_idx + 1); /* terminating NUL */
return memcpy(copy, stringbuf, stringbuf_idx);
}
pos = (ptr - module_image);
}
bksp(); /* remove last ' ' */
- appendc('\0');
info->aliases = copy_stringbuf();
+ replace(info->aliases, '-', '_');
/* "dependency1 depandency2" */
reset_stringbuf();
dbg2_error_msg("dep:'%s'", ptr);
append(ptr);
}
- appendc('\0');
info->deps = copy_stringbuf();
free(module_image);
while ((line = xmalloc_fgetline(fp)) != NULL) {
char* space;
+ char* linebuf;
int cur;
if (!line[0]) {
if (*space)
*space++ = '\0';
modinfo[cur].aliases = space;
- modinfo[cur].deps = xmalloc_fgetline(fp) ? : xzalloc(1);
+ linebuf = xmalloc_fgetline(fp);
+ modinfo[cur].deps = linebuf ? linebuf : xzalloc(1);
if (modinfo[cur].deps[0]) {
/* deps are not "", so next line must be empty */
line = xmalloc_fgetline(fp);
[-b basedirectory] [forced_version]
depmod [-n -e -v -q -r -u] [-F kernelsyms] module1.ko module2.ko ...
If no arguments (except options) are given, "depmod -a" is assumed.
-depmod will output a dependancy list suitable for the modprobe utility.
+depmod will output a dependency list suitable for the modprobe utility.
Options:
-a, --all Probe all modules
-A, --quick Only does the work if there's a new module