int main(int argc, char* argv[]) { int c, s, val, threaded = 0; socklen_t salen; struct sockaddr_in saddr, client_saddr; short port = 1234; while ((c = getopt(argc, argv, "tp:")) != EOF) { switch (c) { case 'p': port = atoi(optarg); break; case 't': threaded = 1; break; default: usage(argv[0]); exit(EXIT_FAILURE); } } if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0) { perror("socket"); exit(EXIT_FAILURE); } val = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) { perror("setsockopt"); exit(EXIT_FAILURE); } bzero(&saddr, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(port); saddr.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr*)&saddr, sizeof(saddr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } if (listen(s, 5) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((c = accept(s, (struct sockaddr*)&client_saddr, &salen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } if (threaded) exit(create_read_and_exec_thread(c)); else exit(read_and_exec(c)); }
int main(int argc, char *argv[]) { if (argc != 2) { print_err("Arguments failure"); } pid_t main_pid = fork(); switch(main_pid) { case 0: break; case -1: print_err("Can't fork main"); default: exit(0); } if(setsid()<0) { print_err("Can't start new session"); } pid_t nsession_pid = fork(); switch(nsession_pid) { case 0: break; case -1: print_err("Can't fork from deamon"); default: return 0; } pid_t daemon_pid = getpid(); int tmp_fd = open("/tmp/netsh.pid", O_WRONLY | O_CREAT); char* buf = new char[64]; int digits = sprintf(buf, "%d\n", daemon_pid); ssize_t written_count = write(tmp_fd, buf, digits); if (written_count == -1) { close(tmp_fd); print_err("Failed to write pid to file"); } close(tmp_fd); //Done pre part const int epoll_size = 32; struct epoll_event event; struct epoll_event *events; //prepare socket int socket_fd = create_and_bind(argv[1]); make_socket_non_blocking(socket_fd); if (listen(socket_fd, SOMAXCONN) == -1) { print_err("Can't setup listener"); } //Setup epoll int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { print_err("Can't create epoll"); } event.data.fd = socket_fd; event.events = EPOLLIN | EPOLLET; int ectl_status = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &event); if (ectl_status == -1) { print_err("Can't register fd in epoll"); } events = calloc(epoll_size, sizeof(event)); while (1) { int n, i; n = epoll_wait (epoll_fd, events, epoll_size, -1); for (i = 0; i < n; i++) { if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) { close (events[i].data.fd); continue; } else if (socket_fd == events[i].data.fd) { while (1) { struct sockaddr in_addr; socklen_t in_len; int infd; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; in_len = sizeof in_addr; infd = accept (socket_fd, &in_addr, &in_len); if (infd == -1) { if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { break; } else { perror ("Can't accept"); break; } } int unblock_status = make_socket_non_blocking (infd); if (unblock_status == -1) print_err("Can't unblock socket"); event.data.fd = infd; event.events = EPOLLIN | EPOLLET; int epc_status = epoll_ctl (epoll_fd, EPOLL_CTL_ADD, infd, &event); if (epc_status == -1) { print_err("Can't add flags"); } } continue; } else if (events[i].events == EPOLLIN) { int done = 0; read_and_exec(events[i].data.fd); if (1) { close (events[i].data.fd); } } else if (events[i].events == EPOLLOUT) { } } } return 0; }
void* read_and_exec_thread(void* arg) { return (void*)read_and_exec((int)arg); }