static void parse_module(module_info *info, const char *pathname) { char *module_image; char *ptr; size_t len; size_t pos; dbg1_error_msg("parse_module('%s')", pathname); /* Read (possibly compressed) module */ len = 64 * 1024 * 1024; /* 64 Mb at most */ module_image = xmalloc_open_zipped_read_close(pathname, &len); /* module_image == NULL is ok here, find_keyword handles it */ //TODO: optimize redundant module body reads /* "alias1 symbol:sym1 alias2 symbol:sym2" */ reset_stringbuf(); pos = 0; while (1) { ptr = find_keyword(module_image + pos, len - pos, "alias="); if (!ptr) { ptr = find_keyword(module_image + pos, len - pos, "__ksymtab_"); if (!ptr) break; /* DOCME: __ksymtab_gpl and __ksymtab_strings occur * in many modules. What do they mean? */ if (strcmp(ptr, "gpl") == 0 || strcmp(ptr, "strings") == 0) goto skip; dbg2_error_msg("alias:'symbol:%s'", ptr); append("symbol:"); } else { dbg2_error_msg("alias:'%s'", ptr); } append(ptr); appendc(' '); skip: pos = (ptr - module_image); } bksp(); /* remove last ' ' */ info->aliases = copy_stringbuf(); replace(info->aliases, '-', '_'); /* "dependency1 depandency2" */ reset_stringbuf(); ptr = find_keyword(module_image, len, "depends="); if (ptr && *ptr) { replace(ptr, ',', ' '); replace(ptr, '-', '_'); dbg2_error_msg("dep:'%s'", ptr); append(ptr); } info->deps = copy_stringbuf(); free(module_image); }
static void parse_module(module_info *info, const char *pathname) { char *module_image; char *ptr; size_t len; size_t pos; dbg1_error_msg("parse_module('%s')", pathname); /* Read (possibly compressed) module */ len = 64 * 1024 * 1024; /* 64 Mb at most */ module_image = xmalloc_open_zipped_read_close(pathname, &len); /* module_image == NULL is ok here, find_keyword handles it */ //TODO: optimize redundant module body reads /* "alias1 symbol:sym1 alias2 symbol:sym2" */ reset_stringbuf(); pos = 0; while (1) { unsigned start = stringbuf_idx; ptr = find_keyword(module_image + pos, len - pos, "alias="); if (!ptr) { ptr = find_keyword(module_image + pos, len - pos, "__ksymtab_"); if (!ptr) break; /* DOCME: __ksymtab_gpl and __ksymtab_strings occur * in many modules. What do they mean? */ if (strcmp(ptr, "gpl") == 0 || strcmp(ptr, "strings") == 0) goto skip; dbg2_error_msg("alias:'symbol:%s'", ptr); append("symbol:"); } else { dbg2_error_msg("alias:'%s'", ptr); } append(ptr); appendc(' '); /* * Don't add redundant aliases, such as: * libcrc32c.ko symbol:crc32c symbol:crc32c */ if (start) { /* "if we aren't the first alias" */ char *found, *last; stringbuf[stringbuf_idx] = '\0'; last = stringbuf + start; /* * String at last-1 is " symbol:crc32c " * (with both leading and trailing spaces). */ if (strncmp(stringbuf, last, stringbuf_idx - start) == 0) /* First alias matches us */ found = stringbuf; else /* Does any other alias match? */ found = strstr(stringbuf, last-1); if (found < last-1) { /* There is absolutely the same string before us */ dbg2_error_msg("redundant:'%s'", last); stringbuf_idx = start; goto skip; } } skip: pos = (ptr - module_image); } bksp(); /* remove last ' ' */ info->aliases = copy_stringbuf(); replace(info->aliases, '-', '_'); /* "dependency1 depandency2" */ reset_stringbuf(); ptr = find_keyword(module_image, len, "depends="); if (ptr && *ptr) { replace(ptr, ',', ' '); replace(ptr, '-', '_'); dbg2_error_msg("dep:'%s'", ptr); append(ptr); } info->deps = copy_stringbuf(); free(module_image); }