Annotation of 43BSDTahoe/games/hunt/hunt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: static char sccsid[] = "@(#)hunt.c     5.3 (Berkeley) 6/27/88";
        !            20: #endif /* not lint */
        !            21: 
        !            22: /*
        !            23:  *  Hunt
        !            24:  *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
        !            25:  *  San Francisco, California
        !            26:  */
        !            27: 
        !            28: # include      <errno.h>
        !            29: # include      <curses.h>
        !            30: # include      "hunt.h"
        !            31: # include      <signal.h>
        !            32: # include      <ctype.h>
        !            33: # include      <sys/stat.h>
        !            34: 
        !            35: FLAG   Last_player = FALSE;
        !            36: # ifdef MONITOR
        !            37: FLAG   Am_monitor = FALSE;
        !            38: # endif MONITOR
        !            39: FLAG   Query_driver = FALSE;
        !            40: 
        !            41: char   Buf[BUFSIZ];
        !            42: 
        !            43: int    Master_pid;
        !            44: int    Socket;
        !            45: # ifdef INTERNET
        !            46: char   *Sock_host;
        !            47: # endif INTERNET
        !            48: 
        !            49: SOCKET Daemon;
        !            50: # ifdef        INTERNET
        !            51: # define       DAEMON_SIZE     (sizeof Daemon)
        !            52: # else INTERNET
        !            53: # define       DAEMON_SIZE     (sizeof Daemon - 1)
        !            54: # endif        INTERNET
        !            55: 
        !            56: char   map_key[256];                   /* what to map keys to */
        !            57: 
        !            58: static char    name[NAMELEN];
        !            59: 
        !            60: extern int     cur_row, cur_col, _putchar();
        !            61: extern char    *tgoto();
        !            62: 
        !            63: /*
        !            64:  * main:
        !            65:  *     Main program for local process
        !            66:  */
        !            67: main(ac, av)
        !            68: int    ac;
        !            69: char   **av;
        !            70: {
        !            71:        char            *term;
        !            72:        extern int      errno;
        !            73:        extern int      Otto_mode;
        !            74:        int             dumpit(), intr(), sigterm(), sigemt(), tstp();
        !            75: 
        !            76:        for (ac--, av++; ac > 0 && av[0][0] == '-'; ac--, av++) {
        !            77:                switch (av[0][1]) {
        !            78: 
        !            79:                case 'l':       /* rsh compatibility */
        !            80:                case 'n':
        !            81:                        if (ac <= 1)
        !            82:                                goto usage;
        !            83:                        ac--, av++;
        !            84:                        (void) strcpy(name, av[0]);
        !            85:                        break;
        !            86:                case 'o':
        !            87: # ifndef OTTO
        !            88:                        fputs("The -o flag is reserved for future use.\n",
        !            89:                                stderr);
        !            90:                        goto usage;
        !            91: # else OTTO
        !            92:                        Otto_mode = TRUE;
        !            93:                        break;
        !            94: # endif OTTO
        !            95: # ifdef MONITOR
        !            96:                case 'm':
        !            97:                        Am_monitor = TRUE;
        !            98:                        break;
        !            99: # endif MONITOR
        !           100: # ifdef INTERNET
        !           101:                case 'q':       /* query whether hunt is running */
        !           102:                        Query_driver = TRUE;
        !           103:                        break;
        !           104:                case 'h':
        !           105:                        if (ac <= 1)
        !           106:                                goto usage;
        !           107:                        ac--, av++;
        !           108:                        Sock_host = av[0];
        !           109:                        break;
        !           110: # endif INTERNET
        !           111:                default:
        !           112:                usage:
        !           113: # ifdef INTERNET
        !           114: #  ifdef MONITOR
        !           115: #   define     USAGE   "usage: hunt [-q] [-n name] [-h host] [-m]\n"
        !           116: #  else MONITOR
        !           117: #   define     USAGE   "usage: hunt [-q] [-n name] [-h host]\n"
        !           118: #  endif MONITOR
        !           119: # else INTERNET
        !           120: #  ifdef MONITOR
        !           121: #   define     USAGE   "usage: hunt [-n name] [-m]\n"
        !           122: #  else MONITOR
        !           123: #   define     USAGE   "usage: hunt [-n name]\n"
        !           124: #  endif MONITOR
        !           125: # endif INTERNET
        !           126:                        fputs(USAGE, stderr);
        !           127: # undef USAGE
        !           128:                        exit(1);
        !           129:                }
        !           130:        }
        !           131: # ifdef INTERNET
        !           132:        if (ac > 1)
        !           133:                goto usage;
        !           134:        else if (ac > 0)
        !           135:                Sock_host = av[0];
        !           136: # else INTERNET
        !           137:        if (ac > 0)
        !           138:                goto usage;
        !           139: # endif INTERNET       
        !           140: 
        !           141: # ifdef INTERNET
        !           142:        if (Query_driver) {
        !           143:                find_driver(FALSE);
        !           144:                if (Daemon.sin_port != 0) {
        !           145:                        struct  hostent *hp;
        !           146: 
        !           147:                        hp = gethostbyaddr(&Daemon.sin_addr,
        !           148:                                sizeof Daemon.sin_addr, AF_INET);
        !           149:                        fprintf(stderr, "HUNT!! found on %s\n", hp != NULL
        !           150:                                ? hp->h_name : inet_ntoa(Daemon.sin_addr));
        !           151:                }
        !           152:                exit(Daemon.sin_port == 0);
        !           153:        }
        !           154: # endif INTERNET
        !           155: # ifdef OTTO
        !           156:        if (Otto_mode)
        !           157:                (void) strcpy(name, "otto");
        !           158:        else
        !           159: # endif OTTO
        !           160:        env_init();
        !           161: 
        !           162:        (void) fflush(stdout);
        !           163:        if (!isatty(0) || (term = getenv("TERM")) == NULL) {
        !           164:                fprintf(stderr, "no terminal type\n");
        !           165:                exit(1);
        !           166:        }
        !           167:        _tty_ch = 0;
        !           168:        gettmode();
        !           169:        setterm(term);
        !           170:        noecho();
        !           171:        cbreak();
        !           172:        _puts(TI);
        !           173:        _puts(VS);
        !           174:        clear_screen();
        !           175:        (void) signal(SIGINT, intr);
        !           176:        (void) signal(SIGTERM, sigterm);
        !           177:        (void) signal(SIGEMT, sigemt);
        !           178:        (void) signal(SIGQUIT, dumpit);
        !           179:        (void) signal(SIGPIPE, SIG_IGN);
        !           180:        (void) signal(SIGTSTP, tstp);
        !           181: 
        !           182:        do {
        !           183: # ifdef        INTERNET
        !           184:                find_driver(TRUE);
        !           185: 
        !           186:                do {
        !           187:                        int     msg;
        !           188: 
        !           189: # ifndef OLDIPC
        !           190:                        Socket = socket(SOCK_FAMILY, SOCK_STREAM, 0);
        !           191: # else OLDIPC
        !           192:                        Socket = socket(SOCK_STREAM, 0, 0, 0);
        !           193: # endif OLDIPC
        !           194:                        if (Socket < 0) {
        !           195:                                perror("socket");
        !           196:                                exit(1);
        !           197:                        }
        !           198: # ifndef OLDIPC
        !           199:                        msg = 1;
        !           200:                        if (setsockopt(Socket, SOL_SOCKET, SO_USELOOPBACK,
        !           201:                            &msg, sizeof msg) < 0)
        !           202:                                perror("setsockopt loopback");
        !           203: # endif OLDIPC
        !           204:                        errno = 0;
        !           205:                        if (connect(Socket, (struct sockaddr *) &Daemon,
        !           206:                            DAEMON_SIZE) < 0) {
        !           207:                                if (errno != ECONNREFUSED) {
        !           208:                                        perror("connect");
        !           209:                                        leave(1, "connect");
        !           210:                                }
        !           211:                        }
        !           212:                        else
        !           213:                                break;
        !           214:                        sleep(1);
        !           215:                } while (close(Socket) == 0);
        !           216: # else INTERNET
        !           217:                /*
        !           218:                 * set up a socket
        !           219:                 */
        !           220: 
        !           221:                if ((Socket = socket(SOCK_FAMILY, SOCK_STREAM, 0)) < 0) {
        !           222:                        perror("socket");
        !           223:                        exit(1);
        !           224:                }
        !           225: 
        !           226:                /*
        !           227:                 * attempt to connect the socket to a name; if it fails that
        !           228:                 * usually means that the driver isn't running, so we start
        !           229:                 * up the driver.
        !           230:                 */
        !           231: 
        !           232:                Daemon.sun_family = SOCK_FAMILY;
        !           233:                (void) strcpy(Daemon.sun_path, Sock_name);
        !           234:                if (connect(Socket, &Daemon, DAEMON_SIZE) < 0) {
        !           235:                        if (errno != ENOENT) {
        !           236:                                perror("connect");
        !           237:                                leave(1, "connect2");
        !           238:                        }
        !           239:                        start_driver();
        !           240: 
        !           241:                        do {
        !           242:                                (void) close(Socket);
        !           243:                                if ((Socket = socket(SOCK_FAMILY, SOCK_STREAM, 0)) < 0) {
        !           244:                                        perror("socket");
        !           245:                                        exit(1);
        !           246:                                }
        !           247:                                sleep(2);
        !           248:                        } while (connect(Socket, &Daemon, DAEMON_SIZE) < 0);
        !           249:                }
        !           250: # endif INTERNET
        !           251: 
        !           252:                do_connect(name);
        !           253:                playit();
        !           254:        } while (!quit());
        !           255:        leave(0, NULL);
        !           256:        /* NOTREACHED */
        !           257: }
        !           258: 
        !           259: # ifdef INTERNET
        !           260: # ifdef BROADCAST
        !           261: broadcast_vec(s, vector)
        !           262:        int                     s;              /* socket */
        !           263:        struct  sockaddr        **vector;
        !           264: {
        !           265:        char                    if_buf[BUFSIZ];
        !           266:        struct  ifconf          ifc;
        !           267:        struct  ifreq           *ifr;
        !           268:        int                     n;
        !           269:        int                     vec_cnt;
        !           270: 
        !           271:        *vector = NULL;
        !           272:        ifc.ifc_len = sizeof if_buf;
        !           273:        ifc.ifc_buf = if_buf;
        !           274:        if (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0)
        !           275:                return 0;
        !           276:        vec_cnt = 0;
        !           277:        n = ifc.ifc_len / sizeof (struct ifreq);
        !           278:        *vector = (struct sockaddr *) malloc(n * sizeof (struct sockaddr));
        !           279:        for (ifr = ifc.ifc_req; n > 0; n--, ifr++)
        !           280:                if (ioctl(s, SIOCGIFBRDADDR, ifr) >= 0)
        !           281:                        bcopy(&ifr->ifr_addr, &(*vector)[vec_cnt++],
        !           282:                                                sizeof (struct sockaddr));
        !           283:        return vec_cnt;
        !           284: }
        !           285: # endif BROADCAST
        !           286: 
        !           287: find_driver(do_startup)
        !           288: FLAG   do_startup;
        !           289: {
        !           290:        int                     msg;
        !           291:        static SOCKET           test;
        !           292:        int                     test_socket;
        !           293:        int                     namelen;
        !           294:        char                    local_name[80];
        !           295:        static                  initial = TRUE;
        !           296:        static struct in_addr   local_address;
        !           297:        register struct hostent *hp;
        !           298:        int                     (*oldsigalrm)(), sigalrm();
        !           299:        extern int              errno;
        !           300: # ifdef BROADCAST
        !           301:        static  int             brdc;
        !           302:        static  SOCKET          *brdv;
        !           303:        int                     i;
        !           304: # endif BROADCAST
        !           305: 
        !           306:        if (Sock_host != NULL) {
        !           307:                if (!initial)
        !           308:                        return;         /* Daemon address already valid */
        !           309:                initial = FALSE;
        !           310:                if ((hp = gethostbyname(Sock_host)) == NULL) {
        !           311:                        leave(1, "Unknown host");
        !           312:                        /* NOTREACHED */
        !           313:                }
        !           314:                Daemon.sin_family = SOCK_FAMILY;
        !           315:                Daemon.sin_port = htons(Sock_port);
        !           316:                Daemon.sin_addr = *((struct in_addr *) hp->h_addr);
        !           317:                if (!Query_driver)
        !           318:                        return;
        !           319:        }
        !           320: 
        !           321: 
        !           322:        if (initial) {                  /* do one time initialization */
        !           323: # ifndef BROADCAST
        !           324:                sethostent(1);          /* don't bother to close host file */
        !           325: # endif BROADCAST
        !           326:                if (gethostname(local_name, sizeof local_name) < 0) {
        !           327:                        leave(1, "Sorry, I have no name.");
        !           328:                        /* NOTREACHED */
        !           329:                }
        !           330:                if ((hp = gethostbyname(local_name)) == NULL) {
        !           331:                        leave(1, "Can't find myself.");
        !           332:                        /* NOTREACHED */
        !           333:                }
        !           334:                local_address = * ((struct in_addr *) hp->h_addr);
        !           335: 
        !           336:                test.sin_family = SOCK_FAMILY;
        !           337:                test.sin_addr = local_address;
        !           338:                test.sin_port = htons(Test_port);
        !           339:        }
        !           340: 
        !           341: # ifndef OLDIPC
        !           342:        test_socket = socket(SOCK_FAMILY, SOCK_DGRAM, 0);
        !           343: # else OLDIPC
        !           344:        test_socket = socket(SOCK_DGRAM, 0, 0, 0);
        !           345: # endif OLCIPC
        !           346:        if (test_socket < 0) {
        !           347:                perror("socket");
        !           348:                leave(1, "socket system call failed");
        !           349:                /* NOTREACHED */
        !           350:        }
        !           351: 
        !           352:        msg = 1;
        !           353:        if (Query_driver && Sock_host != NULL) {
        !           354:                test.sin_family = SOCK_FAMILY;
        !           355:                test.sin_addr = Daemon.sin_addr;
        !           356:                test.sin_port = htons(Test_port);
        !           357: # ifndef OLDIPC
        !           358:                (void) sendto(test_socket, (char *) &msg, sizeof msg, 0,
        !           359:                    (struct sockaddr *) &test, DAEMON_SIZE);
        !           360: # else OLDIPC
        !           361:                (void) send(test_socket, (struct sockaddr *) &test,
        !           362:                        (char *) &msg, sizeof msg);
        !           363: # endif OLDIPC
        !           364:                goto get_response;
        !           365:        }
        !           366: 
        !           367:        if (!initial) {
        !           368:                /* favor host of previous session by broadcasting to it first */
        !           369:                test.sin_addr = Daemon.sin_addr;
        !           370:                test.sin_port = htons(Test_port);
        !           371:                (void) sendto(test_socket, (char *) &msg, sizeof msg, 0,
        !           372:                    (struct sockaddr *) &test, DAEMON_SIZE);
        !           373:        }
        !           374: 
        !           375: 
        !           376: # ifdef BROADCAST
        !           377:        if (initial)
        !           378:                brdc = broadcast_vec(test_socket, &brdv);
        !           379: 
        !           380:        if (brdc <= 0) {
        !           381:                Daemon.sin_family = SOCK_FAMILY;
        !           382:                Daemon.sin_addr = local_address;
        !           383:                Daemon.sin_port = htons(Sock_port);
        !           384:                initial = FALSE;
        !           385:                return;
        !           386:        }
        !           387: 
        !           388:        if (setsockopt(test_socket, SOL_SOCKET, SO_BROADCAST,
        !           389:            (int) &msg, sizeof msg) < 0) {
        !           390:                perror("setsockopt broadcast");
        !           391:                leave(1, "setsockopt broadcast");
        !           392:                /* NOTREACHED */
        !           393:        }
        !           394: 
        !           395:        /* send broadcast packets on all interfaces */
        !           396:        for (i = 0; i < brdc; i++) {
        !           397:                bcopy(&brdv[i], &test, sizeof (SOCKET));
        !           398:                test.sin_port = htons(Test_port);
        !           399:                if (sendto(test_socket, (char *) &msg, sizeof msg, 0,
        !           400:                    (struct sockaddr *) &test, DAEMON_SIZE) < 0) {
        !           401:                        perror("sendto");
        !           402:                        leave(1, "sendto");
        !           403:                        /* NOTREACHED */
        !           404:                }
        !           405:        }
        !           406: # else BROADCAST
        !           407:        /* loop thru all hosts on local net and send msg to them. */
        !           408:        sethostent(0);          /* rewind host file */
        !           409:        while (hp = gethostent()) {
        !           410:                if (inet_netof(test.sin_addr)
        !           411:                == inet_netof(* ((struct in_addr *) hp->h_addr))) {
        !           412:                        test.sin_addr = * ((struct in_addr *) hp->h_addr);
        !           413: # ifndef OLDIPC
        !           414:                        (void) sendto(test_socket, (char *) &msg, sizeof msg, 0,
        !           415:                            (struct sockaddr *) &test, DAEMON_SIZE);
        !           416: # else OLDIPC
        !           417:                        (void) send(test_socket, (struct sockaddr *) &test,
        !           418:                                (char *) &msg, sizeof msg);
        !           419: # endif OLDIPC
        !           420:                }
        !           421:        }
        !           422: # endif BROADCAST
        !           423: 
        !           424: get_response:
        !           425:        namelen = DAEMON_SIZE;
        !           426:        oldsigalrm = signal(SIGALRM, sigalrm);
        !           427:        errno = 0;
        !           428:        (void) alarm(1);
        !           429: # ifndef OLDIPC
        !           430:        if (recvfrom(test_socket, (char *) &msg, sizeof msg, 0,
        !           431:            (struct sockaddr *) &Daemon, &namelen) < 0)
        !           432: # else OLDIPC
        !           433:        if (receive(test_socket, (struct sockaddr *) &Daemon, &msg,
        !           434:            sizeof msg) < 0)
        !           435: # endif OLDIPC
        !           436:        {
        !           437:                if (errno != EINTR) {
        !           438:                        perror("recvfrom");
        !           439:                        leave(1, "recvfrom");
        !           440:                        /* NOTREACHED */
        !           441:                }
        !           442:                (void) alarm(0);
        !           443:                (void) signal(SIGALRM, oldsigalrm);
        !           444:                Daemon.sin_family = SOCK_FAMILY;
        !           445:                Daemon.sin_port = htons(Sock_port);
        !           446:                Daemon.sin_addr = local_address;
        !           447:                if (!do_startup)
        !           448:                        Daemon.sin_port = 0;
        !           449:                else
        !           450:                        start_driver();
        !           451:        }
        !           452:        else {
        !           453:                (void) alarm(0);
        !           454:                (void) signal(SIGALRM, oldsigalrm);
        !           455:                Daemon.sin_port = htons(Sock_port);
        !           456:        }
        !           457:        (void) close(test_socket);
        !           458:        initial = FALSE;
        !           459: }
        !           460: # endif INTERNET
        !           461: 
        !           462: start_driver()
        !           463: {
        !           464:        register int    procid;
        !           465: 
        !           466: # ifdef MONITOR
        !           467:        if (Am_monitor) {
        !           468:                leave(1, "No one playing.");
        !           469:                /* NOTREACHED */
        !           470:        }
        !           471: # endif MONITOR
        !           472: 
        !           473: # ifdef INTERNET
        !           474:        if (Sock_host != NULL) {
        !           475:                sleep(3);
        !           476:                return 0;
        !           477:        }
        !           478: # endif INTERNET
        !           479: 
        !           480:        mvcur(cur_row, cur_col, 23, 0);
        !           481:        cur_row = 23;
        !           482:        cur_col = 0;
        !           483:        put_str("Starting...");
        !           484:        fflush(stdout);
        !           485:        procid = vfork();
        !           486:        if (procid == -1) {
        !           487:                perror("fork");
        !           488:                leave(1, "fork failed.");
        !           489:        }
        !           490:        if (procid == 0) {
        !           491:                (void) signal(SIGINT, SIG_IGN);
        !           492:                (void) close(Socket);
        !           493:                execl(Driver, "HUNT", NULL);
        !           494:                /* only get here if exec failed */
        !           495:                kill(getppid(), SIGEMT);        /* tell mom */
        !           496:                _exit(1);
        !           497:        }
        !           498:        mvcur(cur_row, cur_col, 23, 0);
        !           499:        cur_row = 23;
        !           500:        cur_col = 0;
        !           501:        put_str("Connecting...");
        !           502:        fflush(stdout);
        !           503:        return 0;
        !           504: }
        !           505: 
        !           506: /*
        !           507:  * bad_con:
        !           508:  *     We had a bad connection.  For the moment we assume that this
        !           509:  *     means the game is full.
        !           510:  */
        !           511: bad_con()
        !           512: {
        !           513:        leave(1, "The game is full.  Sorry.");
        !           514:        /* NOTREACHED */
        !           515: }
        !           516: 
        !           517: /*
        !           518:  * dumpit:
        !           519:  *     Handle a core dump signal by not dumping core, just leaving,
        !           520:  *     so we end up with a core dump from the driver
        !           521:  */
        !           522: dumpit()
        !           523: {
        !           524:        (void) kill(Master_pid, SIGQUIT);
        !           525:        (void) chdir("coredump");
        !           526:        abort();
        !           527: }
        !           528: 
        !           529: /*
        !           530:  * sigterm:
        !           531:  *     Handle a terminate signal
        !           532:  */
        !           533: sigterm()
        !           534: {
        !           535:        leave(0, NULL);
        !           536:        /* NOTREACHED */
        !           537: }
        !           538: 
        !           539: 
        !           540: /*
        !           541:  * sigemt:
        !           542:  *     Handle a emt signal - shouldn't happen on vaxes(?)
        !           543:  */
        !           544: sigemt()
        !           545: {
        !           546:        leave(1, "Unable to start driver.  Try again.");
        !           547:        /* NOTREACHED */
        !           548: }
        !           549: 
        !           550: # ifdef INTERNET
        !           551: /*
        !           552:  * sigalrm:
        !           553:  *     Handle an alarm signal
        !           554:  */
        !           555: sigalrm()
        !           556: {
        !           557:        return;
        !           558: }
        !           559: # endif INTERNET
        !           560: 
        !           561: /*
        !           562:  * rmnl:
        !           563:  *     Remove a '\n' at the end of a string if there is one
        !           564:  */
        !           565: rmnl(s)
        !           566: char   *s;
        !           567: {
        !           568:        register char   *cp;
        !           569:        char            *rindex();
        !           570: 
        !           571:        cp = rindex(s, '\n');
        !           572:        if (cp != NULL)
        !           573:                *cp = '\0';
        !           574: }
        !           575: 
        !           576: /*
        !           577:  * intr:
        !           578:  *     Handle a interrupt signal
        !           579:  */
        !           580: intr()
        !           581: {
        !           582:        register int    ch;
        !           583:        register int    explained;
        !           584:        register int    y, x;
        !           585: 
        !           586:        (void) signal(SIGINT, SIG_IGN);
        !           587:        y = cur_row;
        !           588:        x = cur_col;
        !           589:        mvcur(cur_row, cur_col, 23, 0);
        !           590:        cur_row = 23;
        !           591:        cur_col = 0;
        !           592:        put_str("Really quit? ");
        !           593:        clear_eol();
        !           594:        fflush(stdout);
        !           595:        explained = FALSE;
        !           596:        for (;;) {
        !           597:                ch = getchar();
        !           598:                if (isupper(ch))
        !           599:                        ch = tolower(ch);
        !           600:                if (ch == 'y') {
        !           601:                        (void) write(Socket, "q", 1);
        !           602:                        (void) close(Socket);
        !           603:                        leave(0, NULL);
        !           604:                }
        !           605:                else if (ch == 'n') {
        !           606:                        (void) signal(SIGINT, intr);
        !           607:                        mvcur(cur_row, cur_col, y, x);
        !           608:                        cur_row = y;
        !           609:                        cur_col = x;
        !           610:                        fflush(stdout);
        !           611:                        return;
        !           612:                }
        !           613:                if (!explained) {
        !           614:                        put_str("(Y or N) ");
        !           615:                        fflush(stdout);
        !           616:                        explained = TRUE;
        !           617:                }
        !           618:                (void) putchar(CTRL('G'));
        !           619:                (void) fflush(stdout);
        !           620:        }
        !           621: }
        !           622: 
        !           623: /*
        !           624:  * leave:
        !           625:  *     Leave the game somewhat gracefully, restoring all current
        !           626:  *     tty stats.
        !           627:  */
        !           628: leave(eval, mesg)
        !           629: int    eval;
        !           630: char   *mesg;
        !           631: {
        !           632:        mvcur(cur_row, cur_col, 23, 0);
        !           633:        if (mesg == NULL)
        !           634:                clear_eol();
        !           635:        else {
        !           636:                put_str(mesg);
        !           637:                clear_eol();
        !           638:                putchar('\n');
        !           639:                fflush(stdout);         /* flush in case VE changes pages */
        !           640:        } 
        !           641:        resetty();
        !           642:        _puts(VE);
        !           643:        _puts(TE);
        !           644:        exit(eval);
        !           645: }
        !           646: 
        !           647: /*
        !           648:  * tstp:
        !           649:  *     Handle stop and start signals
        !           650:  */
        !           651: tstp()
        !           652: {
        !           653:        static struct sgttyb    tty;
        !           654:        int     y, x;
        !           655: 
        !           656:        tty = _tty;
        !           657:        y = cur_row;
        !           658:        x = cur_col;
        !           659:        mvcur(cur_row, cur_col, 23, 0);
        !           660:        cur_row = 23;
        !           661:        cur_col = 0;
        !           662:        _puts(VE);
        !           663:        _puts(TE);
        !           664:        (void) fflush(stdout);
        !           665:        resetty();
        !           666:        (void) kill(getpid(), SIGSTOP);
        !           667:        (void) signal(SIGTSTP, tstp);
        !           668:        _tty = tty;
        !           669:        (void) stty(_tty_ch, &_tty);
        !           670:        _puts(TI);
        !           671:        _puts(VS);
        !           672:        cur_row = y;
        !           673:        cur_col = x;
        !           674:        _puts(tgoto(CM, cur_row, cur_col));
        !           675:        redraw_screen();
        !           676:        fflush(stdout);
        !           677: }
        !           678: 
        !           679: env_init()
        !           680: {
        !           681:        register int    i;
        !           682:        char    *envp, *envname, *s, *index();
        !           683: 
        !           684:        for (i = 0; i < 256; i++)
        !           685:                map_key[i] = (char) i;
        !           686: 
        !           687:        envname = NULL;
        !           688:        if ((envp = getenv("HUNT")) != NULL) {
        !           689:                while ((s = index(envp, '=')) != NULL) {
        !           690:                        if (strncmp(envp, "name=", s - envp + 1) == 0) {
        !           691:                                envname = s + 1;
        !           692:                                if ((s = index(envp, ',')) == NULL) {
        !           693:                                        *envp = '\0';
        !           694:                                        break;
        !           695:                                }
        !           696:                                *s = '\0';
        !           697:                                envp = s + 1;
        !           698:                        }                       /* must be last option */
        !           699:                        else if (strncmp(envp, "mapkey=", s - envp + 1) == 0) {
        !           700:                                for (s = s + 1; *s != '\0'; s += 2) {
        !           701:                                        map_key[(unsigned int) *s] = *(s + 1);
        !           702:                                        if (*(s + 1) == '\0') {
        !           703:                                                break;
        !           704:                                        }
        !           705:                                }
        !           706:                                *envp = '\0';
        !           707:                                break;
        !           708:                        } else {
        !           709:                                *s = '\0';
        !           710:                                printf("unknown option %s\n", envp);
        !           711:                                if ((s = index(envp, ',')) == NULL) {
        !           712:                                        *envp = '\0';
        !           713:                                        break;
        !           714:                                }
        !           715:                                envp = s + 1;
        !           716:                        }
        !           717:                }
        !           718:                if (*envp != '\0')
        !           719:                        if (envname == NULL)
        !           720:                                envname = envp;
        !           721:                        else
        !           722:                                printf("unknown option %s\n", envp);
        !           723:        }
        !           724:        if (envname != NULL) {
        !           725:                (void) strcpy(name, envname);
        !           726:                printf("Entering as '%s'\n", envname);
        !           727:        }
        !           728:        else if (name[0] == '\0') {
        !           729:                printf("Enter your code name: ");
        !           730:                if (fgets(name, sizeof name, stdin) == NULL)
        !           731:                        exit(1);
        !           732:        }
        !           733:        rmnl(name);
        !           734: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.