int main(int argc, char *argv[]) {
    suppress_zombies();

    struct sockaddr_in server_addr = create_server_addr(PORT);
    int listen_fd = create_listened_socket(server_addr);

    print_starting_message(server_addr);

    while (1) {
        struct sockaddr_in client_addr;
        socklen_t len = sizeof(client_addr);
        int connection_fd = safe_accept(listen_fd, (struct sockaddr *) &client_addr, &len);

        pid_t pid;
        if ((pid = fork()) == 0) {
            /* child */
            close(listen_fd);
            server_main(connection_fd);
            close(connection_fd);
            exit(EXIT_SUCCESS);
        }
        /* parent */
        close(connection_fd);
    }
}
Example #2
0
int main()
{
    int sd = safe_socket_tcp();
    int sum;
    char *all_ips[MAX_BUFFER];
    char all_ips_len = 0;

    struct sockaddr_in adress;
    adress.sin_family = AF_INET;
    adress.sin_port = htons(PORT);
    adress.sin_addr.s_addr = INADDR_ANY; // bind to all ips

    safe_bind(sd, &adress);
    safe_listen(sd, 2);

    while (true)
    {
        struct sockaddr_in client_address;
        char *ip;
        int cd = safe_accept(sd, &client_address), i, cont = 0;

        printf("Received connection\n");

        // found ip
        ip = inet_ntoa(client_address.sin_addr);
        for (i = 0; i < all_ips_len; i++)
        {
            if (strcmp(all_ips[i], ip) == 0)
            {
                cont = 1;
                break;
            }
        }
        if (cont == 1)
        {
            printf("Rejected connection\n");
            safe_close(cd);
            continue;
        }

        // add to sum
        int client_number;
        read_int(cd, &client_number);
        sum += client_number;

        // add to ips pool
        printf("Got connection from %s\n", ip);
        char *put_ip = strdup(ip);
        all_ips[all_ips_len++] = put_ip;

        safe_close(cd);
    }

    safe_close(sd);

    return 0;
}
Example #3
0
int redir_accept2(struct redir_t *redir, int idx) {
  int status;
  int new_socket;
  struct sockaddr_in address;
  struct sockaddr_in baddress;
  socklen_t addrlen;
  char buffer[128];

  addrlen = sizeof(struct sockaddr_in);

  if ((new_socket = safe_accept(redir->fd[idx], 
				(struct sockaddr *)&address, 
				&addrlen)) < 0) {
    if (errno != ECONNABORTED)
      log_err(errno, "accept()");
    
    return 0;
  }

#if(_debug_)
  log_dbg("new redir socket %d from %s", new_socket, 
	  inet_ntoa(address.sin_addr));
#endif
  
  addrlen = sizeof(struct sockaddr_in);

  if (getsockname(new_socket, (struct sockaddr *)&baddress, 
		  &addrlen) < 0) {
    log_warn(errno, "getsockname() failed!");
  }

  if (ndelay_on(new_socket) < 0) {
    log_err(errno, "could not set ndelay");
  }
  
  if (idx == 1 && _options.uamui) {
    
    if ((status = redir_fork(new_socket, new_socket)) < 0) {
      log_err(errno, "fork() returned -1!");
      close(new_socket);
      return 0;
    }
    
    if (status > 0) { /* Parent */
      close(new_socket);
      return 0; 
    }
    
    safe_snprintf(buffer,sizeof(buffer),"%s",
		  inet_ntoa(address.sin_addr));
    setenv("TCPREMOTEIP",buffer,1);
    setenv("REMOTE_ADDR",buffer,1);
    safe_snprintf(buffer,sizeof(buffer),"%d",ntohs(address.sin_port));
    setenv("TCPREMOTEPORT",buffer,1);
    setenv("REMOTE_PORT",buffer,1);
    
    char *binqqargs[2] = { _options.uamui, 0 } ;
    
    execv(*binqqargs, binqqargs);

    exit(-1);
    
  } else {

    redir_request *req = get_request();
    
    req->parent = redir;

    log_dbg("redir_main() for %s", inet_ntoa(address.sin_addr));

    req->last_active = mainclock_tick();
    memcpy(&req->conn.peer, &address, sizeof (struct sockaddr_in));
    memcpy(&req->baddr, &baddress, sizeof (struct sockaddr_in));

    req->uiidx = idx;
    req->socket_fd = new_socket;

    conn_set_readhandler(&req->conn, redir_conn_read, req);
    conn_set_donehandler(&req->conn, redir_conn_finish, req);
    
    switch (redir_main(redir, new_socket, new_socket,
		       &address, &baddress, idx, req)) {
    case 1:
      log_dbg("redir queued %s socket_fd=%d conn.fd=%d", 
	      inet_ntoa(address.sin_addr),
	      req->socket_fd, req->conn.sock);
      req->state |= REDIR_SOCKET_FD;
      net_select_addfd(&sctx, req->socket_fd, SELECT_READ);
      return 1;
    case 0: 
      log_dbg("redir completed %s", inet_ntoa(address.sin_addr));
      redir_conn_finish(&req->conn, req);
      return 0;
    default:
      log_dbg("redir completed %s", inet_ntoa(address.sin_addr));
      redir_conn_finish(&req->conn, req);
      return -1;
    }
  }

  return 0;
}