UserFile userfile_popen(uid_t uid, const char *command, const char *type) { int handle; if (uid == geteuid()) { handle = do_popen(command, type); if (handle < 0) return NULL; return userfile_make_handle(USERFILE_LOCAL, handle); } return NULL; }
void LightProcess::runShadow() { std::string buf; pollfd pfd[1]; pfd[0].fd = m_afdt_fd; pfd[0].events = POLLIN; try { while (true) { int ret = poll(pfd, 1, -1); if (ret < 0 && errno == EINTR) { continue; } if (pfd[0].revents & POLLHUP) { // no more command can come in Logger::Error("Lost parent, LightProcess exiting"); break; } if (pfd[0].revents & POLLIN) { lwp_read(m_afdt_fd, buf); if (buf == "exit") { Logger::Verbose("LightProcess exiting upon request"); break; } else if (buf == "popen") { do_popen(m_afdt_fd); } else if (buf == "pclose") { do_pclose(m_afdt_fd); } else if (buf == "proc_open") { do_proc_open(m_afdt_fd); } else if (buf == "waitpid") { do_waitpid(m_afdt_fd); } else if (buf == "change_user") { do_change_user(m_afdt_fd); } else if (buf[0]) { Logger::Info("LightProcess got invalid command: %.20s", buf.c_str()); } } } } catch (const std::exception& e) { Logger::Error("LightProcess exiting due to exception: %s", e.what()); } catch (...) { Logger::Error("LightProcess exiting due to unknown exception"); } ::close(m_afdt_fd); _Exit(0); }
void LightProcess::runShadow(int fdin, int fdout) { FILE *fin = fdopen(fdin, "r"); FILE *fout = fdopen(fdout, "w"); char buf[BUFFER_SIZE]; pollfd pfd[1]; pfd[0].fd = fdin; pfd[0].events = POLLIN; while (true) { int ret = poll(pfd, 1, -1); if (ret < 0 && errno == EINTR) { continue; } if (pfd[0].revents & POLLIN) { if (!fgets(buf, BUFFER_SIZE, fin)) buf[0] = '\0'; if (strncmp(buf, "exit", 4) == 0) { Logger::Info("LightProcess exiting upon request"); break; } else if (strncmp(buf, "popen", 5) == 0) { do_popen(fin, fout, m_afdt_fd); } else if (strncmp(buf, "pclose", 6) == 0) { do_pclose(fin, fout); } else if (strncmp(buf, "proc_open", 9) == 0) { do_proc_open(fin, fout, m_afdt_fd); } else if (strncmp(buf, "waitpid", 7) == 0) { do_waitpid(fin, fout); } else if (strncmp(buf, "change_user", 11) == 0) { do_change_user(fin, fout); } else if (buf[0]) { Logger::Info("LightProcess got invalid command: %.20s", buf); } } else if (pfd[0].revents & POLLHUP) { // no more command can come in Logger::Error("Lost parent, LightProcess exiting"); break; } } fclose(fin); fclose(fout); ::close(m_afdt_fd); remove(m_afdtFilename.c_str()); _Exit(0); }
void LightProcess::runShadow(int fdin, int fdout) { FILE *fin = fdopen(fdin, "r"); FILE *fout = fdopen(fdout, "w"); char buf[BUFFER_SIZE]; pollfd pfd[1]; pfd[0].fd = fdin; pfd[0].events = POLLIN; while (true) { poll(pfd, 1, -1); if (pfd[0].revents & POLLHUP) { // no more command can come in break; } else if (pfd[0].revents & POLLIN) { if (!fgets(buf, BUFFER_SIZE, fin)) buf[0] = '\0'; if (strncmp(buf, "exit", 4) == 0) { break; } else if (strncmp(buf, "popen", 5) == 0) { do_popen(fin, fout, m_afdt_fd); } else if (strncmp(buf, "pclose", 6) == 0) { do_pclose(fin, fout); } else if (strncmp(buf, "proc_open", 9) == 0) { do_proc_open(fin, fout, m_afdt_fd); } else if (strncmp(buf, "waitpid", 7) == 0) { do_waitpid(fin, fout); } else if (strncmp(buf, "change_user", 11) == 0) { do_change_user(fin, fout); } } } fclose(fin); fclose(fout); ::close(m_afdt_fd); remove(m_afdtFilename.c_str()); exit(0); }