1 int
  2 main( int  argc,  char   * argv[])  {
  3    int o;
  4    int sock;
  5    while ((o = getopt(argc, argv, "dstS")) != -1{
  6        switch (o) {
  7        case 'S':
  8            do_sleep = 1;
  9            break;
 10        case 'd':
 11            do_debug = 1;
 12            break;
 13        case 's':
 14            do_stdin = 1;
 15            break;
 16        case 't':
 17            do_thread = 1;
 18            break;
 19        }

 20    }

 21
 22    if (do_stdin) {
 23        struct sockets s;
 24        s.local = 1;
 25        s.in = stdin;
 26        s.out = stdout;
 27        if (do_thread) {
 28            pthread_t p;
 29            pthread_create(&p, NULL, roll_dice, (void *&s);
 30        }
 else {
 31            roll_dice(&s);
 32            exit(0);
 33        }

 34    }

 35
 36    sock = socket_setup();
 37    while (1{
 38        struct sockets *= get_sockets(sock);
 39        if (s) {
 40            if (do_thread) {
 41                pthread_t p;
 42                pthread_create(&p, NULL, roll_dice, (void *) s);
 43            }
 else {
 44                roll_dice(s);
 45                exit(0);
 46            }

 47        }

 48    }

 49    return 0;
 50}

 51
 52 int
 53 socket_setup( void {
 54    struct protoent *tcp_proto;
 55    struct sockaddr_in local;
 56    int r, s, one;
 57
 58    tcp_proto = getprotobyname("tcp");
 59    if (!tcp_proto) {
 60        fail("Can't find TCP/IP protocol: %s\n", strerror(errno));
 61    }

 62    s = socket(PF_INET, SOCK_STREAM, tcp_proto->p_proto);
 63    if (s == -1{
 64        fail("socket: %s\n", strerror(errno));
 65    }

 66    one = 1;
 67    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
 68    memset(&local, 0sizeof(struct sockaddr_in));
 69    local.sin_family = AF_INET;
 70    local.sin_port = htons(DICE_PORT);
 71    r = bind(s, (struct sockaddr *&local, sizeof(struct sockaddr_in));
 72    if (r == -1{
 73        fail("bind: %s\n", strerror(errno));
 74    }

 75    r = listen(s, 5);
 76    if (r == -1{
 77        fail("listen: %s\n", strerror(errno));
 78    }

 79    return s;
 80}

 81
 82 struct  sockets  *
 83 get_sockets( int  sock)  {
 84    int conn;
 85    if ((conn = accept(sock, NULL, NULL)) < 0{
 86        warn("accept: %s\n", strerror(errno));
 87        return 0;
 88    }
 else {
 89        struct sockets *s;
 90        s = malloc(sizeof(struct sockets));
 91        if (s == NULL) {
 92            warn("malloc failed.\n");
 93            return 0;
 94        }

 95        s->local = 0;
 96        s->in = fdopen(conn, "r");
 97        s->out = fdopen(conn, "w");
 98        setlinebuf(s->in);
 99        setlinebuf(s->out);
100        return s;
101    }

102}

103