summaryrefslogtreecommitdiffstats
path: root/src/util/nscd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/nscd.c')
-rw-r--r--src/util/nscd.c129
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;
+}