Annotation of coherent/d/etc/build/build0.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * build0.c
                      3:  * 10/22/90
                      4:  * Routines common to build and install.
                      5:  */
                      6: 
                      7: #include <stdio.h>
                      8: #include <sys/stat.h>
                      9: #include "build0.h"
                     10: 
                     11: /* Globals. */
                     12: int    abortmsg;                       /* print abort message  */
                     13: char   *argv0;                         /* for error messages   */
                     14: char   buf[NBUF];                      /* input buffer         */
                     15: char   cmd[NBUF];                      /* command buffer       */
                     16: int    dflag;                          /* debug                */
                     17: char   *usagemsg;                      /* usage message        */
                     18: int    vflag;                          /* verbose              */
                     19: 
                     20: /*
                     21:  * Clear the IBM AT console screen.
                     22:  * Prompt for <Enter> if the flag is true or if dflag.
                     23:  */
                     24: void
                     25: cls(flag) register int flag;
                     26: {
                     27:        if (flag || dflag)
                     28:                get_line("\Hit <Enter> to continue...");
                     29:        putchar(0x1B);          /* ESC */
                     30:        putchar('[');
                     31:        putchar('2');
                     32:        putchar('J');
                     33:        fflush(stdout);
                     34: }
                     35: 
                     36: /*
                     37:  * Return 1 if file exists, 0 if not.
                     38:  */
                     39: int
                     40: exists(file) register char *file;
                     41: {
                     42:        register int fd;
                     43: 
                     44:        if ((fd = open(file, 0)) < 0)
                     45:                return 0;
                     46:        close(fd);
                     47:        return 1;
                     48: }
                     49: 
                     50: /*
                     51:  * Print a fatal error message.
                     52:  * Print "Installation aborted..." message if invoked from build or install.
                     53:  */
                     54: void
                     55: fatal(s) char *s;
                     56: {
                     57:        fprintf(stderr, "%s: %r\n", argv0, &s);
                     58:        if (abortmsg)
                     59:                fprintf(stderr, "Installation aborted before completion.\n");
                     60:        exit(1);
                     61: }
                     62: 
                     63: /*
                     64:  * Get an integer value in the given range.
                     65:  */
                     66: /* VARARGS */
                     67: int
                     68: get_int(min, max, prompt) int min, max; char *prompt;
                     69: {
                     70:        register char *s;
                     71:        register int i;
                     72: 
                     73:        s = get_line("%r", &prompt);
                     74:        for (;;) {
                     75:                if (*s >= '0' && *s <= '9') {
                     76:                        i = atoi(s);
                     77:                        if (i >= min && i <= max)
                     78:                                return i;
                     79:                }
                     80:                get_line("Enter a value between %d and %d:", min, max);
                     81:        }
                     82: }
                     83: 
                     84: /*
                     85:  * Print the args and get a line from the user to buf[].
                     86:  * Strip the trailing newline and return a pointer to the first non-space.
                     87:  */
                     88: /* VARARGS */
                     89: char *
                     90: get_line(args) char *args;
                     91: {
                     92:        register char *s;
                     93: 
                     94:        printf("%r ", &args);
                     95:        fflush(stdout);
                     96:        fgets(buf, sizeof buf, stdin);
                     97:        buf[strlen(buf) - 1] = '\0';
                     98:        for (s = buf; ; ++s)
                     99:                if (*s != ' ' && *s != '\t')
                    100:                        return s;
                    101: }
                    102: 
                    103: /*
                    104:  * Return:
                    105:  *     1       dir exists and is a directory,
                    106:  *     0       dir does not exist,
                    107:  * or  -1      dir exists but is not a directory.
                    108:  */
                    109: int
                    110: is_dir(dir) register char *dir;
                    111: {
                    112:        struct stat s;
                    113: 
                    114:        if (stat(dir, &s) == -1)
                    115:                return 0;                       /* does not exist */
                    116:        return (s.st_mode & S_IFDIR) ? 1 : -1;  /* directory or nondirectory */
                    117: }
                    118: 
                    119: /*
                    120:  * Print a nonfatal error message.
                    121:  * Make sure the user sees it by waiting until he hits <Enter>.
                    122:  */
                    123: void
                    124: nonfatal(s) char *s;
                    125: {
                    126:        fprintf(stderr, "%s: %r\n", argv0, &s);
                    127:        get_line("\Hit <Enter> to continue...");
                    128: }
                    129: 
                    130: /*
                    131:  * Execute the given command and return its exit status.
                    132:  * The flag tells what to do if the command returns an error status:
                    133:  *     S_IGNORE        ignore it
                    134:  *     S_NONFATAL      report it
                    135:  *     S_FATAL         report it and die
                    136:  */
                    137: int
                    138: sys(command, flag) char *command; int flag;
                    139: {
                    140:        register int status;
                    141: 
                    142:        if (dflag || vflag)
                    143:                printf("%s\n", command);
                    144:        if (dflag)
                    145:                return 0;
                    146:        if ((status = system(command)) != 0) {
                    147:                if (flag == S_NONFATAL)
                    148:                        nonfatal("command \"%s\" failed", command);
                    149:                else if (flag == S_FATAL)
                    150:                        fatal("command \"%s\" failed", command);
                    151:        }
                    152:        sync();
                    153:        return status;
                    154: }
                    155: 
                    156: /*
                    157:  * Print a usage message and die.
                    158:  */
                    159: void
                    160: usage()
                    161: {
                    162:        fprintf(stderr, usagemsg);
                    163:        exit(1);
                    164: }
                    165: 
                    166: /*
                    167:  * Get the answer to a yes/no question.
                    168:  * Return 1 for yes, 0 for no.
                    169:  */
                    170: /* VARARGS */
                    171: int
                    172: yes_no(args) char *args;
                    173: {
                    174:        register char *s;
                    175: 
                    176:        for (;;) {
                    177:                printf("%r", &args);
                    178:                s = get_line(" [y or n]?");
                    179:                if (*s == 'y')
                    180:                        return 1;
                    181:                else if (*s == 'n')
                    182:                        return 0;
                    183:        }
                    184: }
                    185: 
                    186: /* end of build0.c */

unix.superglobalmegacorp.com

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