[BACK]Return to main.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / arogue7

Annotation of early-roguelike/arogue7/main.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * main.c  -  setup code
                      3:  *
                      4:  * Advanced Rogue
                      5:  * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
                      6:  * All rights reserved.
                      7:  *
                      8:  * Based on "Rogue: Exploring the Dungeons of Doom"
                      9:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     10:  * All rights reserved.
                     11:  *
                     12:  * See the file LICENSE.TXT for full copyright and licensing information.
                     13:  */
                     14:
                     15: #include "curses.h"
                     16: #include <stdlib.h>
                     17: #include <string.h>
                     18: #include <signal.h>
                     19: #include <errno.h>
                     20: #ifdef BSD
                     21: #include <sys/time.h>
                     22: #else
                     23: #include <time.h>
                     24: #endif
                     25: #include "mach_dep.h"
                     26: #include "network.h"
                     27: #include "rogue.h"
                     28: #ifdef PC7300
                     29: #include "sys/window.h"
                     30: #include <ctype.h>
                     31: extern struct uwdata wdata, oldwin;
                     32: extern char oldtext[WTXTNUM][WTXTLEN];
                     33: #endif
                     34:
                     35: void open_records(void);
                     36: bool too_much(void);
                     37: bool author(void);
                     38: void chmsg(char *fmt, int arg);
                     39: #ifdef MAXPROCESSES
                     40: int loadav(void);
                     41: #endif
                     42: #ifdef MAXUSERS
                     43: int ucount(void);
                     44: #endif
                     45: bool holiday(void);
                     46:
                     47: int
                     48: main(int argc, char *argv[], char *envp[])
                     49: {
                     50:     register char *env;
                     51: #ifdef PC7300
                     52:     int hardwindow;    /* Do we have a hardware window? */
                     53: #endif
                     54:
                     55:     md_init();
                     56:
                     57:     /*
                     58:      * get home and options from environment
                     59:      */
                     60:
                     61:     strncpy(home, md_gethomedir(), LINELEN);
                     62:
                     63:     /* Get default save file */
                     64:     strcpy(file_name, home);
                     65:     strcat(file_name, "arogue77.sav");
                     66:
                     67:     /* Get default score file */
                     68: #ifdef SCOREFILE
                     69:     strncpy(score_file, SCOREFILE, LINELEN);
                     70:     score_file[LINELEN-1] = '\0';
                     71: #else
                     72:     strcpy(score_file, md_getroguedir());
                     73:
                     74:     if (*score_file)
                     75:         strcat(score_file,"/");
                     76:
                     77:     strcat(score_file,"arogue77.scr");
                     78: #endif
                     79:
                     80: #ifdef SAVEDIR
                     81:     /* Check for common save location */
                     82:     if (argc >= 3 && strcmp(argv[1], "-n") == 0)
                     83:     {
                     84:         strncpy(whoami, argv[2], 79);
                     85:         whoami[79] = '\0';
                     86:         use_savedir = TRUE;
                     87:         if (LINELEN <= snprintf(file_name, LINELEN, "%s/%d-%s.ar7sav", SAVEDIR,
                     88:                      md_getuid(), whoami))
                     89:         {
                     90:             strcpy(file_name, "xrogue.sav");
                     91:             use_savedir = FALSE;
                     92:         }
                     93:     }
                     94: #endif
                     95:
                     96:     if ((env = getenv("ROGUEOPTS")) != NULL)
                     97:        parse_opts(env);
                     98:
                     99:     if (whoami[0] == '\0')
                    100:         strucpy(whoami, md_getusername(), strlen(md_getusername()));
                    101:
                    102:     open_records();
                    103:
                    104:     /*
                    105:      * check for print-score option
                    106:      */
                    107:     if (argc == 2 && strcmp(argv[1], "-s") == 0)
                    108:     {
                    109:        waswizard = TRUE;
                    110:        score(0, SCOREIT, 0);
                    111:        exit(0);
                    112:     }
                    113:
                    114: #ifdef NUMNET
                    115:     /*
                    116:      * Check for a network update
                    117:      */
                    118:     if (argc == 2 && strcmp(argv[1], "-u") == 0) {
                    119:        unsigned long netread();
                    120:        int errcheck, errors = 0;
                    121:        unsigned long amount;
                    122:        short monster;
                    123:
                    124:        /* Read in the amount and monster values to pass to score */
                    125:        amount = netread(&errcheck, sizeof(unsigned long), stdin);
                    126:        if (errcheck) errors++;
                    127:
                    128:        monster = (short) netread(&errcheck, sizeof(short), stdin);
                    129:        if (errcheck) errors++;
                    130:
                    131:        /* Now do the update if there were no errors */
                    132:        if (errors) exit(1);
                    133:        else {
                    134:            score(amount, UPDATE, monster);
                    135:            exit(0);
                    136:        }
                    137:     }
                    138: #endif
                    139:
                    140: #ifdef WIZARD
                    141:     /*
                    142:      * Check to see if he is a wizard
                    143:      */
                    144:     if (argc >= 2 && argv[1][0] == '\0')
                    145:        if (strcmp(PASSWD, md_crypt(md_getpass("Wizard's password: "), "mT")) == 0)
                    146:        {
                    147:            wizard = TRUE;
                    148:            argv++;
                    149:            argc--;
                    150:        }
                    151: #endif
                    152:
                    153:     if (!wizard && !author() && !holiday()) {
                    154:        printf("Sorry, %s, but you can't play during working hours.\n", whoami);
                    155:        printf("Try again later.\n");
                    156:        exit(1);
                    157:     }
                    158:     if (!wizard && !author() && too_much()) {
                    159:        printf("Sorry, %s, but the system is too loaded now.\n", whoami);
                    160:        printf("Try again later.\n");
                    161:        exit(1);
                    162:     }
                    163:
                    164: #if NICE
                    165:     if (!wizard)
                    166:         nice(19);      /* nice the max amount */
                    167: #endif
                    168:
                    169:     if (use_savedir)
                    170:     {
                    171:         if (!restore(file_name, envp))
                    172:             exit(1);
                    173:     }
                    174:     else
                    175:     {
                    176:         md_normaluser();
                    177:     }
                    178:     if (argc == 2)
                    179:        if (!restore(argv[1], envp)) /* Note: restore will never return */
                    180:            exit(1);
                    181:     dnum = (wizard && getenv("SEED") != NULL ?
                    182:        atoi(getenv("SEED")) :
                    183:        md_random_seed());
                    184:     if (wizard)
                    185:        printf("Hello %s, welcome to dungeon #%d\n", whoami, dnum);
                    186:     else
                    187:        printf("Hello %s, just a moment while I dig the dungeon...\n", whoami);
                    188:     fflush(stdout);
                    189:     seed = dnum;
                    190:     md_srand(seed);
                    191:
                    192: #ifdef PC7300
                    193:     /* Store static window parameters */
                    194:     hardwindow = ioctl(0, WIOCGETD, &wdata);
                    195:     if (hardwindow >= 0) {     /* We have a hardware window */
                    196:        extern char **environ;
                    197:
                    198:        /* Make sure our window is the right size */
                    199:        oldwin = wdata;
                    200:        if ((wdata.uw_height / wdata.uw_vs) < 23 ||
                    201:            (wdata.uw_width / wdata.uw_hs) < 75) {
                    202:            wdata.uw_width = 80 * wdata.uw_hs;
                    203:            wdata.uw_height = 24 * wdata.uw_vs;
                    204:            wdata.uw_x = 0;
                    205:            wdata.uw_y = wdata.uw_vs;
                    206:            wdata.uw_uflags = NBORDER;
                    207:
                    208:            /* Make the change */
                    209:            if (ioctl(1, WIOCSETD, &wdata) >= 0 && environ) {
                    210:                char **eptr, *tptr, *nptr, *newenv, *lptr = 0, *cptr = 0;
                    211:                int i, nlines = -1, ncols = -1, nlindig = 0, ncoldig = 0;
                    212:                struct utdata labelbuf;
                    213:
                    214:                /* Save and change window-associated text */
                    215:                for (i=0; i<WTXTNUM; i++) {
                    216:                    labelbuf.ut_num = i;
                    217:                    ioctl(1, WIOCGETTEXT, &labelbuf);
                    218:                    strncpy(oldtext[i], labelbuf.ut_text, WTXTLEN - 1);
                    219:                    if (*labelbuf.ut_text) {
                    220:                        *labelbuf.ut_text = '\0';
                    221:                        ioctl(1, WIOCSETTEXT, &labelbuf);
                    222:                    }
                    223:                }
                    224:
                    225:                labelbuf.ut_num = WTXTLABEL;
                    226:                strcpy(labelbuf.ut_text, "Advanced Rogue");
                    227:                ioctl(1, WIOCSETTEXT, &labelbuf);
                    228:
                    229:                /* We have to change the TERMCAP entry */
                    230:                eptr = environ;
                    231:                while (*eptr) {
                    232:                    if (strncmp(*eptr, "TERMCAP=", 8) == 0) break;
                    233:                    else eptr++;
                    234:                }
                    235:
                    236:                /* We found a TERMCAP entry */
                    237:                if (*eptr) {
                    238:                    /* Search for li# and co# */
                    239:                    tptr = *eptr;
                    240:                    while (*tptr) {
                    241:                        switch (*tptr) {
                    242:                            case 'l':
                    243:                                if (nlines == -1 &&
                    244:                                    strncmp(tptr, "li#", 3) == 0) {
                    245:                                    tptr += 3;
                    246:                                    lptr = tptr;
                    247:                                    lines = atoi(tptr);
                    248:                                    while (isdigit(*tptr)) {
                    249:                                        nlindig++;;
                    250:                                        tptr++;
                    251:                                    }
                    252:                                }
                    253:                                else tptr++;
                    254:                                break;
                    255:                            case 'c':
                    256:                                if (ncols == -1 &&
                    257:                                    strncmp(tptr, "co#", 3) == 0) {
                    258:                                    tptr += 3;
                    259:                                    cptr = tptr;
                    260:                                    cols = atoi(tptr);
                    261:                                    while (isdigit(*tptr)) {
                    262:                                        ncoldig++;
                    263:                                        tptr++;
                    264:                                    }
                    265:                                }
                    266:                                else tptr++;
                    267:                                break;
                    268:                            default:
                    269:                                tptr++;
                    270:                        }
                    271:                    }
                    272:
                    273:                    /* Change the entry */
                    274:                    if (ncoldig != 2 || nlindig != 2) {
                    275:                        int length;
                    276:
                    277:                        /* Add in difference in num lengths plus NULL */
                    278:                        length = strlen(*eptr) - ncoldig - nlindig + 5;
                    279:
                    280:                        if (ncoldig == 0) length += 4; /* For :co# */
                    281:                        if (nlindig == 0) length += 4; /* For :li# */
                    282:
                    283:                        newenv = malloc(length);
                    284:                        tptr = *eptr;
                    285:                        nptr = newenv;
                    286:
                    287:                        if (nlindig == 0 || ncoldig == 0) {
                    288:                            /* Copy up to the first : */
                    289:                            while (*tptr && *tptr != ':') *nptr++ = *tptr++;
                    290:
                    291:                            /* Do we have to add a field? */
                    292:                            if (nlindig == 0) {
                    293:                                strcpy(nptr, ":li#24");
                    294:                                nptr += 6;
                    295:                            }
                    296:                            if (ncoldig == 0) {
                    297:                                strcpy(nptr, ":co#80");
                    298:                                nptr += 6;
                    299:                            }
                    300:                        }
                    301:                        while (*tptr) {
                    302:                            if (tptr == lptr) {
                    303:                                strcpy(nptr, "24");
                    304:                                nptr += 2;
                    305:                                tptr += nlindig;
                    306:                            }
                    307:                            else if (tptr == cptr) {
                    308:                                strcpy(nptr, "80");
                    309:                                nptr += 2;
                    310:                                tptr += ncoldig;
                    311:                            }
                    312:                            else *nptr++ = *tptr++;
                    313:                        }
                    314:
                    315:                        *nptr = '\0';
                    316:
                    317:                        /* Replace the old one */
                    318:                        free(*eptr);
                    319:                        *eptr = newenv;
                    320:                    }
                    321:                    else {
                    322:                        /* Just overwrite the old numbers */
                    323:                        *lptr++ = '2';
                    324:                        *lptr = '4';
                    325:                        *cptr++ = '8';
                    326:                        *cptr = '0';
                    327:                    }
                    328:                }
                    329:            }
                    330:        }
                    331:     }
                    332: #endif
                    333:     init_things();                     /* Set up probabilities of things */
                    334:     init_colors();                     /* Set up colors of potions */
                    335:     init_stones();                     /* Set up stone settings of rings */
                    336:     init_materials();                  /* Set up materials of wands */
                    337:     initscr();                         /* Start up cursor package */
                    338:     init_names();                      /* Set up names of scrolls */
                    339:     init_misc();                       /* Set up miscellaneous magic */
                    340:     init_foods();                      /* set up the food table */
                    341:
                    342:     cols = COLS;
                    343:     lines = LINES;
                    344:     if (cols > 85) cols = 85;
                    345:     if (lines > 24) lines = 24;
                    346:     if (lines < 23 || cols < 75) { /* give player a break if larger font used */
                    347:        printf("\nERROR: screen size too small for rogue\n");
                    348:        byebye(0);
                    349:     }
                    350:
                    351:     /*
                    352:      * Now that we have cols and lines, we can update our window
                    353:      * structure for non-hardware windows.
                    354:      */
                    355: #ifdef PC7300
                    356:     if (hardwindow < 0) {
                    357:        wdata.uw_x = 0;
                    358:        wdata.uw_y = 0;
                    359:        wdata.uw_width = COLS;
                    360:        wdata.uw_height = LINES;
                    361:        wdata.uw_uflags = 0;
                    362:        wdata.uw_hs = 1;
                    363:        wdata.uw_vs = 1;
                    364:        wdata.uw_baseline = 0;
                    365:     }
                    366: #endif
                    367:     setup();
                    368:     /*
                    369:      * Set up windows
                    370:      */
                    371:     cw = newwin(lines, cols, 0, 0);
                    372:     mw = newwin(lines, cols, 0, 0);
                    373:     hw = newwin(lines, cols, 0, 0);
                    374:     msgw = newwin(4, cols, 0, 0);
                    375:     keypad(cw,TRUE);
                    376:     keypad(msgw,TRUE);
                    377:
                    378:     init_player();                     /* Roll up the rogue */
                    379:     waswizard = wizard;
                    380:
                    381: #ifdef WIZARD
                    382:     /* A super wizard doesn't have to get equipped */
                    383:     if (wizard && strcmp(getenv("SUPER"),"YES") == 0) {
                    384:        level = 1;
                    385:        new_level(NORMLEV);
                    386:     }
                    387:     else
                    388: #endif
                    389:     new_level(STARTLEV);               /* Draw current level */
                    390:     /*
                    391:      * Start up daemons and fuses
                    392:      */
                    393:     start_daemon(doctor, &player, AFTER);
                    394:     fuse(swander, NULL, WANDERTIME, AFTER);
                    395:     if (player.t_ctype == C_MAGICIAN || player.t_ctype == C_RANGER)
                    396:            fuse(spell_recovery, NULL, SPELLTIME, AFTER);
                    397:     if (player.t_ctype == C_DRUID || player.t_ctype == C_RANGER)
                    398:            fuse(chant_recovery, NULL, SPELLTIME, AFTER);
                    399:     if (player.t_ctype == C_CLERIC || player.t_ctype == C_PALADIN)
                    400:            fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
                    401:     start_daemon(stomach, NULL, AFTER);
                    402:     if (player.t_ctype == C_THIEF      ||
                    403:        player.t_ctype == C_ASSASIN     ||
                    404:        player.t_ctype == C_MONK)
                    405:            start_daemon(trap_look, NULL, AFTER);
                    406:
                    407:     /* Does this character have any special knowledge? */
                    408:     switch (player.t_ctype) {
                    409:        case C_ASSASIN:
                    410:            /* Assassins automatically recognize poison */
                    411:            p_know[P_POISON] = TRUE;
                    412:     }
                    413:
                    414:     /* Choose a quest item */
                    415:     quest_item = rnd(MAXRELIC);
                    416:     draw(cw);
                    417:     msg("You have been quested to retrieve the %s....",
                    418:        rel_magic[quest_item].mi_name);
                    419:     mpos = 0;
                    420:     playit();
                    421: }
                    422:
                    423: /*
                    424:  * endit:
                    425:  *     Exit the program abnormally.
                    426:  */
                    427:
                    428: void
                    429: endit(int sig)
                    430: {
                    431:     fatal("Ok, if you want to exit that badly, I'll have to allow it\n");
                    432: }
                    433:
                    434: /*
                    435:  * fatal:
                    436:  *     Exit the program, printing a message.
                    437:  */
                    438:
                    439: void
                    440: fatal(char *s)
                    441: {
                    442:     clear();
                    443:     move(lines-2, 0);
                    444:     printw("%s", s);
                    445:     draw(stdscr);
                    446:     endwin();
                    447: #ifdef PC7300
                    448:     endhardwin();
                    449: #endif
                    450:     printf("\n");      /* So the curser doesn't stop at the end of the line */
                    451:     exit(0);
                    452: }
                    453:
                    454: /*
                    455:  * rnd:
                    456:  *     Pick a very random number.
                    457:  */
                    458: int
                    459: rnd(int range)
                    460: {
                    461:     return(range <= 0 ? 0 : md_rand() % range);
                    462: }
                    463:
                    464: /*
                    465:  * roll:
                    466:  *     roll a number of dice
                    467:  */
                    468:
                    469: int
                    470: roll(int number, int sides)
                    471: {
                    472:     register int dtotal = 0;
                    473:
                    474:     while(number--)
                    475:        dtotal += rnd(sides)+1;
                    476:     return dtotal;
                    477: }
                    478: # ifdef SIGTSTP
                    479: /*
                    480:  * handle stop and start signals
                    481:  */
                    482: void
                    483: tstp(int sig)
                    484: {
                    485:     mvcur(0, cols - 1, lines - 1, 0);
                    486:     endwin();
                    487:     fflush(stdout);
                    488:     kill(0, SIGTSTP);
                    489:     signal(SIGTSTP, tstp);
                    490:     raw();
                    491:     noecho();
                    492:     keypad(cw,1);
                    493:     keypad(msgw,1);
                    494:     clearok(curscr, TRUE);
                    495:     touchwin(cw);
                    496:     draw(cw);
                    497:     md_flushinp();
                    498: }
                    499: # endif
                    500:
                    501: void
                    502: setup(void)
                    503: {
                    504: #ifdef CHECKTIME
                    505:     int  checkout();
                    506:
                    507:     if (!author()) {
                    508:        signal(SIGALRM, checkout);
                    509:        alarm(CHECKTIME * 60);
                    510:     }
                    511: #endif
                    512: /*
                    513: #ifndef DUMP
                    514:     signal(SIGILL, bugkill);
                    515: #ifdef SIGTRAP
                    516:     signal(SIGTRAP, bugkill);
                    517: #endif
                    518: #ifdef SIGIOT
                    519:     signal(SIGIOT, bugkill);
                    520: #endif
                    521: #ifdef SIGEMT
                    522:     signal(SIGEMT, bugkill);
                    523: #endif
                    524:     signal(SIGFPE, bugkill);
                    525: #ifdef SIGBUS
                    526:     signal(SIGBUS, bugkill);
                    527: #endif
                    528:     signal(SIGSEGV, bugkill);
                    529: #ifdef SIGSYS
                    530:     signal(SIGSYS, bugkill);
                    531: #endif
                    532: #ifdef SIGPIPE
                    533:     signal(SIGPIPE, bugkill);
                    534: #endif
                    535: #endif
                    536: */
                    537: #ifdef SIGTSTP
                    538:     signal(SIGTSTP, tstp);
                    539: #endif
                    540:
                    541: #ifdef SIGHUP
                    542:     signal(SIGHUP, auto_save);
                    543: #endif
                    544:     signal(SIGTERM, auto_save);
                    545:     signal(SIGINT, quit);
                    546: #ifdef SIGQUIT
                    547:     signal(SIGQUIT, endit);
                    548: #endif
                    549:     raw();                             /* Cbreak mode */
                    550:     noecho();                          /* Echo off */
                    551:     nonl();
                    552: }
                    553:
                    554: void
                    555: reopen_score(void)
                    556: {
                    557:     if (scoreboard != NULL)
                    558:         fclose(scoreboard);
                    559:     scoreboard = fopen(score_file, "r+");
                    560:     if (scoreboard == NULL && errno == ENOENT)
                    561:         scoreboard = fopen(score_file, "w+");
                    562: }
                    563:
                    564: void
                    565: open_records(void)
                    566: {
                    567:     if (scoreboard == NULL)
                    568:         reopen_score();
                    569: #ifdef LOGFILE
                    570:     if (logfile == NULL)
                    571:         logfile = fopen(LOGFILE, "a");
                    572: #endif
                    573:     return;
                    574: }
                    575:
                    576: /*
                    577:  * playit:
                    578:  *     The main loop of the program.  Loop until the game is over,
                    579:  * refreshing things and looking at the proper times.
                    580:  */
                    581:
                    582: void
                    583: playit(void)
                    584: {
                    585:     register char *opts;
                    586:
                    587:
                    588:     /*
                    589:      * parse environment declaration of options
                    590:      */
                    591:     if ((opts = getenv("ROGUEOPTS")) != NULL)
                    592:        parse_opts(opts);
                    593:
                    594:
                    595:     player.t_oldpos = hero;
                    596:     oldrp = roomin(&hero);
                    597:     after = TRUE;
                    598:     command();                 /* Command execution */
                    599:     endit(0);
                    600: }
                    601:
                    602: /*
                    603:  * see if the system is being used too much for this game
                    604:  */
                    605: bool
                    606: too_much(void)
                    607: {
                    608: #if MAXPROCESSES
                    609:        if (loadav() > MAXPROCESSES)
                    610:                return(TRUE);
                    611: #endif
                    612: #if MAXUSERS
                    613:        if (ucount() > MAXUSERS)
                    614:                return(TRUE);
                    615: #endif
                    616:        return(FALSE);
                    617: }
                    618:
                    619: /*
                    620:  * author:
                    621:  *     See if a user is an author of the program
                    622:  */
                    623: bool
                    624: author(void)
                    625: {
                    626:        switch (md_getuid()) {
                    627: #if AUTHOR
                    628:                case AUTHOR:
                    629: #endif
                    630:                case 0: /* always OK for root to play */
                    631:                        return TRUE;
                    632:                default:
                    633:                        return FALSE;
                    634:        }
                    635: }
                    636:
                    637:
                    638: #if CHECKTIME
                    639: static int num_checks = 0;     /* times we've gone over in checkout() */
                    640:
                    641: checkout()
                    642: {
                    643:        static char *msgs[] = {
                    644:        "The system is too loaded for games. Please leave in %d minutes",
                    645:        "Please save your game.  You have %d minutes",
                    646:        "This is your last chance. You had better leave in %d minutes",
                    647:        };
                    648:        int checktime;
                    649:
                    650:        signal(SIGALRM, checkout);
                    651:        if (!holiday() && !author()) {
                    652:            msg("Game time is over. Your game is being saved.\n\n");
                    653:            auto_save();                /* NO RETURN */
                    654:        }
                    655:        if (too_much()) {
                    656:            if (num_checks >= 3)
                    657:                fatal("You didn't listen, so now you are DEAD !!\n");
                    658:            checktime = CHECKTIME / (num_checks + 1);
                    659:            chmsg(msgs[num_checks++], checktime);
                    660:            alarm(checktime * 60);
                    661:        }
                    662:        else {
                    663:            if (num_checks) {
                    664:                chmsg("The load has dropped. You have a reprieve.");
                    665:                num_checks = 0;
                    666:            }
                    667:            alarm(CHECKTIME * 60);
                    668:        }
                    669: }
                    670:
                    671: /*
                    672:  * checkout()'s version of msg.  If we are in the middle of a shell, do a
                    673:  * printf instead of a msg to avoid the refresh.
                    674:  */
                    675: void
                    676: chmsg(char *fmt, int arg)
                    677: {
                    678:        if (in_shell) {
                    679:                printf(fmt, arg);
                    680:                putchar('\n');
                    681:                fflush(stdout);
                    682:        }
                    683:        else
                    684:                msg(fmt, arg);
                    685: }
                    686: #endif
                    687:
                    688: #ifdef MAXPROCESSES
                    689:
                    690: #include <fcntl.h>
                    691:
                    692: int
                    693: loadav(void)
                    694: {
                    695:        char *sarcmd = "sar -v | cut -c17-20 | tail -2";
                    696:        char *gettycmd = "grep getty /etc/inittab | wc -l";
                    697:        char sysbuffer[BUFSIZ];
                    698:        char tempfile[50];
                    699:        char inbuf[BUFSIZ];
                    700:        int fd, nprocess, ngetty;
                    701:
                    702:        sprintf(tempfile, "/tmp/rg%d", getpid());
                    703:        sprintf(sysbuffer, "%s > %s", sarcmd, tempfile);
                    704:        if (system(sysbuffer) != 0) {
                    705:            debug ("system() call failed");
                    706:            return (MAXPROCESSES - 1);
                    707:        }
                    708:        if ((fd = open(tempfile, O_RDONLY)) == -1) {
                    709:            debug ("open() call failed");
                    710:            return (MAXPROCESSES - 1);
                    711:        }
                    712:        if (read(fd, inbuf, BUFSIZ) == -1) {
                    713:            debug ("read() call failed");
                    714:            return (MAXPROCESSES - 1);
                    715:        }
                    716:        close(fd);
                    717:        sscanf(inbuf, "%d", &nprocess);
                    718:        sprintf(sysbuffer, "%s > %s", gettycmd, tempfile);
                    719:        if (system(sysbuffer) != 0) {
                    720:            debug ("system() call failed");
                    721:            return (MAXPROCESSES - 1);
                    722:        }
                    723:        if ((fd = open(tempfile, O_RDONLY)) == -1) {
                    724:            debug ("open() call failed");
                    725:            return (MAXPROCESSES - 1);
                    726:        }
                    727:        if (read(fd, inbuf, BUFSIZ) == -1) {
                    728:            debug ("read() call failed");
                    729:            return (MAXPROCESSES - 1);
                    730:        }
                    731:        close(fd);
                    732:        sscanf(inbuf, "%d", &ngetty);
                    733:        unlink(tempfile);
                    734:        return(nprocess - ngetty);
                    735: }
                    736: #endif
                    737:
                    738: #ifdef MAXUSERS
                    739: /*
                    740:  * ucount:
                    741:  *     Count the number of people on the system
                    742:  */
                    743: #include <sys/types.h>
                    744: #include <utmp.h>
                    745: struct utmp buf;
                    746:
                    747: int
                    748: ucount(void)
                    749: {
                    750:        reg struct utmp *up;
                    751:        reg FILE *utmp;
                    752:        reg int count;
                    753:
                    754:        if ((utmp = fopen(UTMP, "r")) == NULL)
                    755:            return 0;
                    756:
                    757:        up = &buf;
                    758:        count = 0;
                    759:        while (fread(up, 1, sizeof (*up), utmp) > 0)
                    760: #ifdef BSD
                    761:                if (buf.ut_line[0] == 't')      /* On a tty */
                    762: #else
                    763:                if (buf.ut_type == USER_PROCESS)
                    764: #endif
                    765:                        count++;
                    766:        fclose(utmp);
                    767:        return count;
                    768: }
                    769: #endif
                    770:
                    771: /*
                    772:  * holiday:
                    773:  *     Returns TRUE when it is a good time to play rogue
                    774:  */
                    775: bool
                    776: holiday(void)
                    777: {
                    778: #ifdef CHECKTIME
                    779:        long now;
                    780:        struct tm *localtime();
                    781:        reg struct tm *ntime;
                    782:
                    783:
                    784:        time(&now);                     /* get the current time */
                    785:        ntime = localtime(&now);
                    786:        if(ntime->tm_wday == 0 || ntime->tm_wday == 6)
                    787:                return TRUE;            /* OK on Sat & Sun */
                    788:        if(ntime->tm_hour < 8 || ntime->tm_hour >= 18)
                    789:                return TRUE;            /* OK before 8AM & after 6PM */
                    790:        if(ntime->tm_yday <= 7 || ntime->tm_yday >= 350)
                    791:                return TRUE;            /* OK during Christmas */
                    792:        return FALSE;                   /* All other times are bad */
                    793: #else
                    794:        return TRUE;
                    795: #endif
                    796: }

CVSweb