int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) { struct lookup_context *ctxt; if (!(*context = ctxt = malloc(sizeof(struct lookup_context)))) { crit(MODPREFIX "malloc: %m"); return 1; } if (argc < 1) { crit(MODPREFIX "No map name"); return 1; } ctxt->mapname = argv[0]; if (ctxt->mapname[0] != '/') { crit(MODPREFIX "program map %s is not an absolute pathname", ctxt->mapname); return 1; } if (access(ctxt->mapname, X_OK)) { crit(MODPREFIX "program map %s missing or not executable", ctxt->mapname); return 1; } if (!mapfmt) mapfmt = MAPFMT_DEFAULT; return !(ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1)); }
int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) { struct lookup_context *ctxt; if (!(*context = ctxt = malloc(sizeof(struct lookup_context)))) { crit(MODPREFIX "%m"); return 1; } if (argc < 1) { crit(MODPREFIX "No map name"); return 1; } ctxt->mapname = argv[0]; /* * nis_local_directory () returns a pointer to a static buffer. * We don't need to copy or free it. */ ctxt->domainname = nis_local_directory(); if (!mapfmt) mapfmt = MAPFMT_DEFAULT; return !(ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1)); }
int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) { struct lookup_context *ctxt; struct stat st; if (!(*context = ctxt = malloc(sizeof(struct lookup_context)))) { crit(MODPREFIX "malloc: %m"); return 1; } if (argc < 1) { crit(MODPREFIX "No map name"); return 1; } ctxt->mapname = argv[0]; if (ctxt->mapname[0] != '/') { crit(MODPREFIX "file map %s is not an absolute pathname", ctxt->mapname); return 1; } if (access(ctxt->mapname, R_OK)) { crit(MODPREFIX "file map %s missing or not readable", ctxt->mapname); return 1; } if (stat(ctxt->mapname, &st)) { crit(MODPREFIX "file map %s, could not stat", ctxt->mapname); return 1; } ctxt->mtime = st.st_mtime; if (!mapfmt) mapfmt = MAPFMT_DEFAULT; cache_init(); return !(ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1)); }
int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) { struct lookup_context *ctxt; char buf[MAX_ERR_BUF]; char dlbuf[PATH_MAX]; char *estr; void *dh; size_t size; *context = NULL; ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { estr = strerror_r(errno, buf, MAX_ERR_BUF); logerr(MODPREFIX "malloc: %s", estr); return 1; } if (argc < 1) { free(ctxt); logerr(MODPREFIX "No map name"); return 1; } ctxt->mapname = argv[0]; if (!mapfmt) mapfmt = MAPFMT_DEFAULT; size = snprintf(dlbuf, sizeof(dlbuf), "%s/%s.so", SSS_LIB_DIR, SSS_SO_NAME); if (size >= sizeof(dlbuf)) { free(ctxt); logmsg(MODPREFIX "sss library path too long"); return 1; } dh = dlopen(dlbuf, RTLD_LAZY); if (!dh) { logerr(MODPREFIX "failed to open %s: %s", dlbuf, dlerror()); free(ctxt); return 1; } ctxt->dlhandle = dh; ctxt->setautomntent = (setautomntent_t) dlsym(dh, "_sss_setautomntent"); if (!ctxt->setautomntent) goto lib_names_fail; ctxt->getautomntent_r = (getautomntent_t) dlsym(dh, "_sss_getautomntent_r"); if (!ctxt->getautomntent_r) goto lib_names_fail; ctxt->getautomntbyname_r = (getautomntbyname_t) dlsym(dh, "_sss_getautomntbyname_r"); if (!ctxt->getautomntbyname_r) goto lib_names_fail; ctxt->endautomntent = (endautomntent_t) dlsym(dh, "_sss_endautomntent"); if (!ctxt->setautomntent) goto lib_names_fail; ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { logmsg(MODPREFIX "failed to open parse context"); dlclose(dh); free(ctxt); return 1; } *context = ctxt; return 0; lib_names_fail: if ((estr = dlerror()) == NULL) logmsg(MODPREFIX "failed to locate sss library entry points"); else logerr(MODPREFIX "dlsym: %s", estr); dlclose(dh); free(ctxt); return 1; }