Example #1
0
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);
Example #2
0
File: dnsx.c Project: fscz/dnsx
////////////////////////////////////////////////////////////////////////////////
////////// 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();
}