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

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

unix.superglobalmegacorp.com

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