static void gegl_module_db_module_initialize (const GeglDatafileData *file_data, gpointer user_data) { GeglModuleDB *db = GEGL_MODULE_DB (user_data); GeglModule *module; gboolean load_inhibit; if (! valid_module_name (file_data->filename)) return; /* don't load if we already know about it */ if (gegl_module_db_module_find_by_path (db, file_data->filename)) return; load_inhibit = is_in_inhibit_list (file_data->filename, db->load_inhibit); module = gegl_module_new (file_data->filename, load_inhibit, db->verbose); g_signal_connect (module, "modified", G_CALLBACK (gegl_module_db_module_modified), db); db->modules = g_list_append (db->modules, module); g_signal_emit (db, db_signals[ADD], 0, module); }
/* * Extracts given chains from a policy file. * * Returns the number of policy entries which were found for the specified * service and facility, or -1 if a system error occurred or a syntax * error was encountered. */ static int openpam_parse_chain(pam_handle_t *pamh, const char *service, pam_facility_t facility, FILE *f, const char *filename, openpam_style_t style) { pam_chain_t *this, **next; pam_facility_t fclt; pam_control_t ctlf; char *name, *servicename, *modulename; int count, lineno, ret, serrno; char **wordv, *word; int i, wordc; count = 0; this = NULL; name = NULL; lineno = 0; wordc = 0; wordv = NULL; while ((wordv = openpam_readlinev(f, &lineno, &wordc)) != NULL) { /* blank line? */ if (wordc == 0) { FREEV(wordc, wordv); continue; } i = 0; /* check service name if necessary */ if (style == pam_conf_style && strcmp(wordv[i++], service) != 0) { FREEV(wordc, wordv); continue; } /* check facility name */ if ((word = wordv[i++]) == NULL || (fclt = parse_facility_name(word)) == (pam_facility_t)-1) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid facility", filename, lineno); errno = EINVAL; goto fail; } if (facility != fclt && facility != PAM_FACILITY_ANY) { FREEV(wordc, wordv); continue; } /* check for "include" */ if ((word = wordv[i++]) != NULL && strcmp(word, "include") == 0) { if ((servicename = wordv[i++]) == NULL || !valid_service_name(servicename)) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid service name", filename, lineno); errno = EINVAL; goto fail; } if (wordv[i] != NULL) { openpam_log(PAM_LOG_ERROR, "%s(%d): garbage at end of line", filename, lineno); errno = EINVAL; goto fail; } ret = openpam_load_chain(pamh, servicename, fclt); FREEV(wordc, wordv); if (ret < 0) { /* * Bogus errno, but this ensures that the * outer loop does not just ignore the * error and keep searching. */ if (errno == ENOENT) errno = EINVAL; goto fail; } continue; } /* get control flag */ if (word == NULL || /* same word we compared to "include" */ (ctlf = parse_control_flag(word)) == (pam_control_t)-1) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid control flag", filename, lineno); errno = EINVAL; goto fail; } /* get module name */ if ((modulename = wordv[i++]) == NULL || !valid_module_name(modulename)) { openpam_log(PAM_LOG_ERROR, "%s(%d): missing or invalid module name", filename, lineno); errno = EINVAL; goto fail; } /* allocate new entry */ if ((this = calloc(1, sizeof *this)) == NULL) goto syserr; this->flag = ctlf; /* load module */ if ((this->module = openpam_load_module(modulename)) == NULL) { if (errno == ENOENT) errno = ENOEXEC; goto fail; } /* * The remaining items in wordv are the module's * arguments. We could set this->optv = wordv + i, but * then free(this->optv) wouldn't work. Instead, we free * the words we've already consumed, shift the rest up, * and clear the tail end of the array. */ this->optc = wordc - i; for (i = 0; i < wordc - this->optc; ++i) { FREE(wordv[i]); } for (i = 0; i < this->optc; ++i) { wordv[i] = wordv[wordc - this->optc + i]; wordv[wordc - this->optc + i] = NULL; } this->optv = wordv; wordv = NULL; wordc = 0; /* hook it up */ for (next = &pamh->chains[fclt]; *next != NULL; next = &(*next)->next) /* nothing */ ; *next = this; this = NULL; ++count; } /* * The loop ended because openpam_readword() returned NULL, which * can happen for four different reasons: an I/O error (ferror(f) * is true), a memory allocation failure (ferror(f) is false, * feof(f) is false, errno is non-zero), the file ended with an * unterminated quote or backslash escape (ferror(f) is false, * feof(f) is true, errno is non-zero), or the end of the file was * reached without error (ferror(f) is false, feof(f) is true, * errno is zero). */ if (ferror(f) || errno != 0) goto syserr; if (!feof(f)) goto fail; fclose(f); return (count); syserr: serrno = errno; openpam_log(PAM_LOG_ERROR, "%s: %m", filename); errno = serrno; /* fall through */ fail: serrno = errno; if (this && this->optc && this->optv) FREEV(this->optc, this->optv); FREE(this); FREEV(wordc, wordv); FREE(wordv); FREE(name); fclose(f); errno = serrno; return (-1); }