Annotation of coherent/f/tmp/install/build0.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * build0.c
                      3:  * 07/11/92
                      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:  * Get an integer value from a given list.
                     86:  * Val_list is a an int array of acceptable int values.
                     87:  * Num_vals is the number of acceptable values in val_list, must be > 0.
                     88:  * If strict is 0, allow user to enter value not in list after a warning.
                     89:  * If default is not -1, display it in brackets and use it if just <enter>
                     90:  * is pressed.
                     91:  * If hex is nonzero, display numeric values in hexadecimal, else decimal.
                     92:  */
                     93: /* VARARGS */
                     94: int
                     95: get_allowed_int(val_list, num_vals, hex, default_val, strict_val, prompt)
                     96: int * val_list;
                     97: int num_vals;
                     98: int hex;
                     99: int default_val;
                    100: int strict_val;
                    101: char *prompt;
                    102: {
                    103:        register char *s;
                    104:        register int i;
                    105:        int user_val;
                    106:        char * fmt_str;
                    107: 
                    108:        /* Display the given prompt string. */
                    109:        printf("%r\n", &prompt);
                    110: 
                    111:        /* Get input from user. */
                    112:        for (;;) {
                    113:                /* Display second prompt line with acceptable values. */
                    114:                if (strict_val)
                    115:                        printf("Valid choices are ");
                    116:                else
                    117:                        printf("Standard choices are ");
                    118: 
                    119:                for (i = 0;  i < num_vals;  i++) {
                    120:                        if (i > 0)
                    121:                                putchar('/');
                    122:                        fmt_str = hex ? "%x" : "%d" ;
                    123:                        printf(fmt_str, val_list[i]);
                    124:                }
                    125: 
                    126:                if (default_val != -1) {
                    127:                        fmt_str = hex ? " [%x]" : " [%d]" ;
                    128:                        printf(fmt_str, default_val);
                    129:                }
                    130:                s = get_line(" : ");
                    131: 
                    132:                if (*s == '\0')
                    133:                        return default_val;
                    134: 
                    135:                fmt_str = hex ? "%x" : "%d" ;
                    136: 
                    137:                if (sscanf(s, fmt_str, & user_val)) {
                    138: 
                    139:                        /* Check the value entered. */
                    140:                        for (i = 0;  i < num_vals;  i++) {
                    141:                                if (user_val == val_list[i])
                    142:                                        return user_val;
                    143:                        }
                    144:                        if (!strict_val &&
                    145:                          yes_no("That is not one of the standard values.  "
                    146:                          "Use anyway? "))
                    147:                                return user_val;
                    148:                }
                    149:        }
                    150: }
                    151: 
                    152: /*
                    153:  * Print the args and get a line from the user to buf[].
                    154:  * Strip the trailing newline and return a pointer to the first non-space.
                    155:  */
                    156: /* VARARGS */
                    157: char *
                    158: get_line(args) char *args;
                    159: {
                    160:        register char *s;
                    161: 
                    162:        printf("%r ", &args);
                    163:        fflush(stdout);
                    164:        fgets(buf, sizeof buf, stdin);
                    165:        buf[strlen(buf) - 1] = '\0';
                    166:        for (s = buf; ; ++s)
                    167:                if (*s != ' ' && *s != '\t')
                    168:                        return s;
                    169: }
                    170: 
                    171: /*
                    172:  * Return:
                    173:  *     1       dir exists and is a directory,
                    174:  *     0       dir does not exist,
                    175:  * or  -1      dir exists but is not a directory.
                    176:  */
                    177: int
                    178: is_dir(dir) register char *dir;
                    179: {
                    180:        struct stat s;
                    181: 
                    182:        if (stat(dir, &s) == -1)
                    183:                return 0;                       /* does not exist */
                    184:        return (s.st_mode & S_IFDIR) ? 1 : -1;  /* directory or nondirectory */
                    185: }
                    186: 
                    187: /*
                    188:  * Print a nonfatal error message.
                    189:  * Make sure the user sees it by waiting until he hits <Enter>.
                    190:  */
                    191: void
                    192: nonfatal(s) char *s;
                    193: {
                    194:        fprintf(stderr, "%s: %r\n", argv0, &s);
                    195:        get_line("\Hit <Enter> to continue...");
                    196: }
                    197: 
                    198: /*
                    199:  * Execute the given command and return its exit status.
                    200:  * The flag tells what to do if the command returns an error status:
                    201:  *     S_IGNORE        ignore it
                    202:  *     S_NONFATAL      report it
                    203:  *     S_FATAL         report it and die
                    204:  */
                    205: int
                    206: sys(command, flag) char *command; int flag;
                    207: {
                    208:        register int status;
                    209: 
                    210:        if (dflag || vflag)
                    211:                printf("%s\n", command);
                    212:        if (dflag)
                    213:                return 0;
                    214:        if ((status = system(command)) != 0) {
                    215:                if (flag == S_NONFATAL)
                    216:                        nonfatal("command \"%s\" failed", command);
                    217:                else if (flag == S_FATAL)
                    218:                        fatal("command \"%s\" failed", command);
                    219:        }
                    220:        sync();
                    221:        return status;
                    222: }
                    223: 
                    224: /*
                    225:  * Print a usage message and die.
                    226:  */
                    227: void
                    228: usage()
                    229: {
                    230:        fprintf(stderr, usagemsg);
                    231:        exit(1);
                    232: }
                    233: 
                    234: /*
                    235:  * Get the answer to a yes/no question.
                    236:  * Return 1 for yes, 0 for no.
                    237:  */
                    238: /* VARARGS */
                    239: int
                    240: yes_no(args) char *args;
                    241: {
                    242:        register char *s;
                    243: 
                    244:        for (;;) {
                    245:                printf("%r", &args);
                    246:                s = get_line(" [y or n]?");
                    247:                if (*s == 'y' || *s == 'Y')
                    248:                        return 1;
                    249:                else if (*s == 'n' || *s == 'N')
                    250:                        return 0;
                    251:        }
                    252: }
                    253: 
                    254: /* 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.