diff options
Diffstat (limited to 'src/util/nscd.c')
-rw-r--r-- | src/util/nscd.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/util/nscd.c b/src/util/nscd.c index b9f2ba88c..2a06394d3 100644 --- a/src/util/nscd.c +++ b/src/util/nscd.c @@ -95,3 +95,132 @@ int flush_nscd_cache(enum nscd_db flush_db) return EOK; } #endif + +/* NSCD config file parse and check */ + +static unsigned int sss_nscd_check_service(char* svc_name) +{ + struct sss_nscd_db { + const char *svc_type_name; + unsigned int nscd_service_flag; + }; + + int i; + unsigned int ret = 0; + struct sss_nscd_db db[] = { + { "passwd", 0x0001 }, + { "group", 0x0010 }, + { "netgroup", 0x0100 }, + { "services", 0x1000 }, + { NULL, 0 } + }; + + if (svc_name == NULL) { + return ret; + } + + for (i = 0; db[i].svc_type_name != NULL; i++) { + if (!strcmp(db[i].svc_type_name, svc_name)) { + + ret = db[i].nscd_service_flag; + break; + } + } + + return ret; +} + +errno_t sss_nscd_parse_conf(const char *conf_path) +{ + FILE *fp; + int ret = EOK; + unsigned int occured = 0; + char *line, *entry, *service, *enabled, *pad; + size_t linelen = 0; + + fp = fopen(conf_path, "r"); + if (fp == NULL) { + DEBUG(SSSDBG_MINOR_FAILURE, ("Couldn't open NSCD configuration " + "file [%s]\n", NSCD_CONF_PATH)); + return ENOENT; + } + + while (getline(&line, &linelen, fp) != -1) { + + entry = NULL; + service = NULL; + enabled = NULL; + + pad = strchr(line, '#'); + if (pad != NULL) { + *pad = '\0'; + } + + if (line[0] == '\n' || line[0] == '\0') continue; + + entry = line; + while (isspace(*entry) && *entry != '\0') { + entry++; + } + + pad = entry; + while (!isspace(*pad) && *pad != '\0') { + pad++; + } + + service = pad; + while (isspace(*service) && *service != '\0') { + service++; + } + + *pad = '\0'; + pad = service; + while (!isspace(*pad) && *pad != '\0') { + pad++; + } + + enabled = pad; + while (isspace(*enabled) && *enabled != '\0') { + enabled++; + } + + *pad = '\0'; + pad = enabled; + while (!isspace(*pad) && *pad != '\0') { + pad++; + } + *pad = '\0'; + + if (entry != NULL && + service != NULL && + enabled != NULL) { + + if (!strcmp(entry, "enable-cache") && + !strcmp(enabled, "yes")) { + + occured |= sss_nscd_check_service(service); + } + } + }; + + ret = ferror(fp); + if (ret) { + DEBUG(SSSDBG_MINOR_FAILURE, ("Reading NSCD configuration file [%s] " + "ended with failure [%d]: %s.\n", + NSCD_CONF_PATH, ret, strerror(ret))); + ret = ENOENT; + goto done; + } + + ret = EOK; + if (occured != 0) { + ret = EEXIST; + goto done; + } + +done: + free(line); + fclose(fp); + + return ret; +} |