static void procserver(void) { pwlog = pwlog_setup(); memset(pw_cfg_vector, 0, sizeof pw_cfg_vector); config_parse(configname); int listen_sockfd = socket_or_die(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_sockaddr = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, /*bind() to all local interface*/ .sin_port = htons(PW_SERVER_PORT_NUM) }; fd_set readset; FD_ZERO(&readset); FD_SET(listen_sockfd, &readset); bind_or_die(listen_sockfd, (struct sockaddr *)&server_sockaddr, sizeof server_sockaddr); listen_or_die(listen_sockfd, PW_SERVER_MAX_BACKLOG); /*Write to the environment variable PROCNANNYSERVERINFO*/ pwlog_write(pwlog, &((struct pw_pid_info){ .type = INFO_STARTUP}), NULL);
//////////////////////////////////////////////////////////////////////////////// ////////// MAIN ////////// int main(int argc, char **argv) { int opt; int daemonize = 0; int do_chroot = 0; char nameserver_file[250] = {DEFAULT_NAMESERVER_FILE}; char server_ip[250] = {DEFAULT_SERVER_IP}; int server_port = DEFAULT_SERVER_PORT; char chroot_dir[PATH_MAX] = {DEFAULT_CHROOT}; char* tsocks_dummy = NULL; char tsocks_conf[PATH_MAX]; while ((opt = getopt(argc, argv, "VhdcC:b:f:p:P:t:")) != EOF) { switch (opt) { case 't': strncpy(tsocks_conf, optarg, sizeof(tsocks_conf)-1); tsocks_dummy = tsocks_conf; break; // daemonize case 'd': daemonize = 1; break; // DON'T chroot case 'c': do_chroot = 1; break; // Chroot directory case 'C': strncpy(chroot_dir, optarg, sizeof(chroot_dir)-1); break; // config file case 'f': strncpy(nameserver_file, optarg, sizeof(nameserver_file)-1); break; // IP case 'b': strncpy(server_ip, optarg, sizeof(server_ip)-1); break; // PORT case 'p': server_port = atoi(optarg); if (server_port < 1) server_port = DEFAULT_SERVER_PORT; break; // print version and exit case 'V': printf("dnsx version %s\n", DNSX_VERSION); exit(0); // help case 'h': default: printf("%s", HELP_STR); exit(0); break; } } srand(time(NULL)); // This should use OpenSSL in the future // be root or die if ( (server_port == DEFAULT_SERVER_PORT || do_chroot == 1) && getuid() != 0 ) { printf("dnsx must run as root to bind to port 53 and chroot(2)\n"); exit(1); } load_nameservers_or_die(nameserver_file); // maybe become a daemon if (daemonize) { daemonize_or_die(); } // configure tsocks configure_tsocks(tsocks_dummy); // maybe chroot if (do_chroot) { chroot_or_die(chroot_dir); } // bind to udp port 53 bind_or_die(server_ip, server_port); drop_priviliges(); // go into main loop printf("starting server at: %s:%d\n", server_ip, server_port); server_loop(); }