gboolean mlInitModuleConfig(void) { GHashTableIter iter; gpointer key = NULL, value = NULL; GHashTable *cmdline = readvars_parse_file("/proc/cmdline"); if (cmdline == NULL) { return _writeModulesConf(MODULES_CONF); } g_hash_table_iter_init(&iter, cmdline); while (g_hash_table_iter_next(&iter, &key, &value)) { gchar *k = (gchar *) key; gchar *v = (gchar *) value; if (v == NULL) { continue; } else if (!strcasecmp(k, "blacklist")) { gchar *tmpmod = g_strdup(v); blacklist = g_slist_append(blacklist, tmpmod); } else if (!strstr(k, ".")) { gchar **fields = g_strsplit(k, ".", 0); if (g_strv_length(fields) == 2 && _isValidModule(fields[0])) { GString *tmp = g_string_new(fields[1]); g_string_append_printf(tmp, "=%s", v); _addOption(fields[0], tmp->str); g_string_free(tmp, TRUE); } g_strfreev(fields); } } g_hash_table_destroy(cmdline); return _writeModulesConf(MODULES_CONF); }
gboolean mlInitModuleConfig(void) { gint i = 0, j = 0; gchar *cmdline = NULL; gchar **options = NULL; GError *readErr = NULL; /* read module options out of /proc/cmdline and into a structure */ if (!g_file_get_contents("/proc/cmdline", &cmdline, NULL, &readErr)) { logMessage(ERROR, "unable to read /proc/cmdline: %s", readErr->message); g_error_free(readErr); return _writeModulesConf(MODULES_CONF); } cmdline = g_strchomp(cmdline); options = g_strsplit(cmdline, " ", 0); g_free(cmdline); if (options == NULL) { return _writeModulesConf(MODULES_CONF); } while (options[i] != NULL) { gchar *tmpmod = NULL; gchar **fields = NULL; gchar **blmods = NULL; if (g_strstr_len(options[i], -1, "=") == NULL) { i++; continue; } if (!strncmp(options[i], "blacklist=", 10) || !strncmp(options[i], "rdblacklist=", 12)) { if ((fields = g_strsplit(options[i], "=", 0)) != NULL) { if (g_strv_length(fields) <= 1) { g_strfreev(fields); continue; } if ((blmods = g_strsplit(fields[1], ",", 0)) != NULL) { for (j=0; j < g_strv_length(blmods); j++) { if (blmods[j] != NULL && g_strcmp0(blmods[j], "")) { tmpmod = g_strdup(blmods[j]); blacklist = g_slist_append(blacklist, tmpmod); } } g_strfreev(blmods); } } } else if ((fields = g_strsplit(options[i], ".", 0)) != NULL) { if (g_strv_length(fields) == 2) { if (_isValidModule(fields[0])) { _addOption(fields[0], fields[1]); } } } if (fields != NULL) { g_strfreev(fields); } i++; } if (options != NULL) { g_strfreev(options); } return _writeModulesConf(MODULES_CONF); }