static void free_one_dll (struct inferior_list_entry *inf) { struct dll_info *dll = get_dll (inf); if (dll->name != NULL) free (dll->name); free (dll); }
std::wstring render_message(const int truncate_message, DWORD dwLang = 0) const { std::vector<std::wstring> args; std::wstring ret; std::wstring file; if (!get_dll(file)) { return file; } strEx::splitList dlls = strEx::splitEx(file, _T(";")); for (strEx::splitList::const_iterator cit = dlls.begin(); cit != dlls.end(); ++cit) { //std::wstring msg = error::format::message::from_module((*cit), eventID(), _sz); std::wstring msg; try { HMODULE hDLL = LoadLibraryEx((*cit).c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES); if (hDLL == NULL) { msg = _T("failed to load: ") + (*cit) + _T(", reason: ") + strEx::itos(GetLastError()); continue; } if (dwLang == 0) dwLang = MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT); boost::tuple<DWORD,std::wstring> formated_data = safe_format(hDLL, dwLang); if (formated_data.get<0>() != 0) { FreeLibrary(hDLL); if (formated_data.get<0>() == 15100) { // Invalid MUI file (wrong language) msg = _T(""); continue; } if (formated_data.get<0>() == 317) { // Missing message msg = _T(""); continue; } msg = _T("failed to lookup error code: ") + strEx::itos(eventID()) + _T(" from DLL: ") + (*cit) + _T("( reason: ") + strEx::itos(formated_data.get<0>()) + _T(")"); continue; } FreeLibrary(hDLL); msg = formated_data.get<1>(); } catch (...) { msg = _T("Unknown exception getting message"); } strEx::replace(msg, _T("\n"), _T(" ")); strEx::replace(msg, _T("\t"), _T(" ")); std::string::size_type pos = msg.find_last_not_of(_T("\n\t ")); if (pos != std::string::npos) { msg = msg.substr(0,pos); } if (!msg.empty()) { if (!ret.empty()) ret += _T(", "); ret += msg; } } if (truncate_message > 0 && ret.length() > truncate_message) ret = ret.substr(0, truncate_message); return ret; }
voidProc GetProc(const char *name) { voidProc p=(voidProc)GetProcAddress(get_dll(),name); if (!p) { bomb(GetLastError()); } return p; }
int main(int argc, char **argv) { int fd; char *socket_path = "/var/run/nscd/socket"; char *config_path = "/etc/nsswitch.conf"; char *pid_path = 0; bool daemonize = false; int c; init_program_invocation_name(argv[0]); while((c = getopt(argc, argv, "c:s:p:d")) != -1) switch(c) { case 'c': config_path = optarg; break; case 's': socket_path = optarg; break; case 'p': pid_path = optarg; break; case 'd': daemonize = true; break; default: return 1; } yyin = fopen(config_path, "r"); if(!yyin) die(); errno = 0; if(yyparse()) { if(errno) die(); return 1; } link_t *entry_l, *service_l; entry_l = list_head(&parsed_output); while(entry_l) { struct entry *entry = list_ref(entry_l, struct entry, link); struct service *service; char *buf, *fnname; service_l = list_head(&entry->services); while(service_l) { service = list_ref(service_l, struct service, link); if(entry->database == DB_PASSWD) { void *dll, *fn; struct mod_passwd *mod; mod = malloc(sizeof(*mod)); if(!mod) die(); dll = get_dll(service->service); mod->nss_getpwnam_r = (nss_getpwnam_r)get_fn(dll, "getpwnam", service->service); mod->nss_getpwuid_r = (nss_getpwuid_r)get_fn(dll, "getpwuid", service->service); memcpy(mod->on_status, service->on_status, sizeof(mod->on_status)); list_push_back(&passwd_mods, &mod->link); } else if(entry->database == DB_GROUP) { void *dll, *fn; struct mod_group *mod; mod = malloc(sizeof(*mod)); if(!mod) die(); dll = get_dll(service->service); mod->nss_getgrnam_r = (nss_getgrnam_r)get_fn(dll, "getgrnam", service->service); mod->nss_getgrgid_r = (nss_getgrgid_r)get_fn(dll, "getgrgid", service->service); mod->initgroups_dyn_function = (initgroups_dyn_function)get_fn(dll, "initgroups", service->service); dlclose(dll); memcpy(mod->on_status, service->on_status, sizeof(mod->on_status)); list_push_back(&group_mods, &mod->link); } service_l = list_next(service_l); free(service->service); free(service); } entry_l = list_next(entry_l); free(entry); } fd = socket(PF_UNIX, SOCK_STREAM, 0); if(fd < 0) die(); struct sockaddr_un addr = { .sun_family = AF_UNIX }; strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)); if(bind(fd, (struct sockaddr*)&addr, sizeof addr) < 0) { int tmp_fd; if(errno != EADDRINUSE) die(); tmp_fd = socket(PF_UNIX, SOCK_STREAM, 0); if(tmp_fd < 0) die(); if(connect(tmp_fd, (struct sockaddr*)&addr, sizeof addr) >= 0) { errno = EADDRINUSE; die(); } else if(errno != ECONNREFUSED) die(); close(tmp_fd); unlink(addr.sun_path); if(bind(fd, (struct sockaddr*)&addr, sizeof addr) < 0) die(); } if(listen(fd, 100) < 0) die(); locale_t l = newlocale(LC_ALL_MASK, "C", (locale_t)0); if(!l) die(); openlog("musl-nscd", 0 #ifdef LOG_PERROR | LOG_PERROR #endif , LOG_DAEMON); if(daemonize) { int null_fd = 0; if((null_fd = open("/dev/null", O_RDWR)) < 0) { syslog(LOG_ERR, "%s", strerror(errno)); return 1; } if(dup2(null_fd, 0) < 0 || dup2(null_fd, 1) < 0 || dup2(null_fd, 2) < 0) { syslog(LOG_ERR, "%s", strerror(errno)); return 1; } if(null_fd > 2) close(null_fd); switch(fork()) { case 0: break; case -1: syslog(LOG_ERR, "%s", strerror(errno)); return 1; default: return 0; } if(setsid() < 0) die(); switch(fork()) { case 0: break; case -1: syslog(LOG_ERR, "%s", strerror(errno)); return 1; default: return 0; } } if(pid_path) { FILE *f = fopen(pid_path, "w"); if(!f) { syslog(LOG_ERR, "%s", strerror(errno)); return 1; } fprintf(f, "%ju\n", (uintmax_t)getpid()); fclose(f); } chdir("/"); socket_handle(fd, -1, l, 0); }