Annotation of 43BSD/contrib/nntp/rrn/util.c, revision 1.1.1.1

1.1       root        1: /* $Header: util.c,v 4.3.1.2 85/05/15 14:44:27 lwall Exp $
                      2:  *
                      3:  * $Log:       util.c,v $
                      4:  * Revision 4.3.1.2  85/05/15  14:44:27  lwall
                      5:  * Last arg of execl changed from 0 to Nullch [(char*)0].
                      6:  * 
                      7:  * Revision 4.3.1.1  85/05/10  11:41:30  lwall
                      8:  * Branch for patches.
                      9:  * 
                     10:  * Revision 4.3  85/05/01  11:51:44  lwall
                     11:  * Baseline for release with 4.3bsd.
                     12:  * 
                     13:  */
                     14: 
                     15: #include "EXTERN.h"
                     16: #include "common.h"
                     17: #include "final.h"
                     18: #include "ndir.h"
                     19: #include "INTERN.h"
                     20: #include "util.h"
                     21: 
                     22: void
                     23: util_init()
                     24: {
                     25:     ;
                     26: }
                     27:     
                     28: /* fork and exec a shell command */
                     29: 
                     30: int
                     31: doshell(shl,s)
                     32: char *s, *shl;
                     33: {
                     34:     int status, pid, w;
                     35:     register int (*istat)(), (*qstat)();
                     36:     int (*signal())();
                     37:     char *shell;
                     38: 
                     39: #ifdef SIGTSTP
                     40:     sigset(SIGTSTP,SIG_DFL);
                     41:     sigset(SIGCONT,SIG_DFL);
                     42: #endif
                     43:     if (shl != Nullch)
                     44:        shell = shl;
                     45:     else if ((shell = getenv("SHELL")) == Nullch || !*shell)
                     46:        shell = PREFSHELL;
                     47:     if ((pid = fork()) == 0) {
                     48:        if (*s) {
                     49:            if (execl(shell, shell, "-c", s, Nullch) < 0)
                     50:                perror("execl");
                     51:        }
                     52:        else {
                     53:            if (execl(shell, shell, Nullch, Nullch, Nullch) < 0)
                     54:                perror("execl");
                     55:        }
                     56:        _exit(127);
                     57:     }
                     58: #ifndef lint
                     59:     istat = signal(SIGINT, SIG_IGN);
                     60:     qstat = signal(SIGQUIT, SIG_IGN);
                     61: #else
                     62:     istat = Null(int (*)());
                     63:     qstat = Null(int (*)());
                     64: #endif lint
                     65:     waiting = TRUE;
                     66:     while ((w = wait(&status)) != pid && w != -1)
                     67:        ;
                     68:     if (w == -1)
                     69:        status = -1;
                     70:     waiting = FALSE;
                     71:     signal(SIGINT, istat);
                     72:     signal(SIGQUIT, qstat);
                     73: #ifdef SIGTSTP
                     74:     sigset(SIGTSTP,stop_catcher);
                     75:     sigset(SIGCONT,cont_catcher);
                     76: #endif
                     77:     return status;
                     78: }
                     79: 
                     80: static char nomem[] = "rn: out of memory!\n";
                     81: 
                     82: /* paranoid version of malloc */
                     83: 
                     84: char *
                     85: safemalloc(size)
                     86: MEM_SIZE size;
                     87: {
                     88:     char *ptr;
                     89:     char *malloc();
                     90: 
                     91:     ptr = malloc(size?size:1); /* malloc(0) is NASTY on our system */
                     92:     if (ptr != Nullch)
                     93:        return ptr;
                     94:     else {
                     95:        fputs(nomem,stdout) FLUSH;
                     96:        sig_catcher(0);
                     97:     }
                     98:     /*NOTREACHED*/
                     99: }
                    100: 
                    101: /* paranoid version of realloc */
                    102: 
                    103: char *
                    104: saferealloc(where,size)
                    105: char *where;
                    106: MEM_SIZE size;
                    107: {
                    108:     char *ptr;
                    109:     char *realloc();
                    110: 
                    111:     ptr = realloc(where,size?size:1);  /* realloc(0) is NASTY on our system */
                    112:     if (ptr != Nullch)
                    113:        return ptr;
                    114:     else {
                    115:        fputs(nomem,stdout) FLUSH;
                    116:        sig_catcher(0);
                    117:     }
                    118:     /*NOTREACHED*/
                    119: }
                    120: 
                    121: /* safe version of string copy */
                    122: 
                    123: char *
                    124: safecpy(to,from,len)
                    125: char *to;
                    126: register char *from;
                    127: register int len;
                    128: {
                    129:     register char *dest = to;
                    130: 
                    131:     if (from != Nullch) 
                    132:        for (len--; len && (*dest++ = *from++); len--) ;
                    133:     *dest = '\0';
                    134:     return to;
                    135: }
                    136: 
                    137: /* safe version of string concatenate, with \n deletion and space padding */
                    138: 
                    139: char *
                    140: safecat(to,from,len)
                    141: char *to;
                    142: register char *from;
                    143: register int len;
                    144: {
                    145:     register char *dest = to;
                    146: 
                    147:     len--;                             /* leave room for null */
                    148:     if (*dest) {
                    149:        while (len && *dest++) len--;
                    150:        if (len) {
                    151:            len--;
                    152:            *(dest-1) = ' ';
                    153:        }
                    154:     }
                    155:     if (from != Nullch)
                    156:        while (len && (*dest++ = *from++)) len--;
                    157:     if (len)
                    158:        dest--;
                    159:     if (*(dest-1) == '\n')
                    160:        dest--;
                    161:     *dest = '\0';
                    162:     return to;
                    163: }
                    164: 
                    165: /* copy a string up to some (non-backslashed) delimiter, if any */
                    166: 
                    167: char *
                    168: cpytill(to,from,delim)
                    169: register char *to, *from;
                    170: register int delim;
                    171: {
                    172:     for (; *from; from++,to++) {
                    173:        if (*from == '\\' && from[1] == delim)
                    174:            from++;
                    175:        else if (*from == delim)
                    176:            break;
                    177:        *to = *from;
                    178:     }
                    179:     *to = '\0';
                    180:     return from;
                    181: }
                    182: 
                    183: /* return ptr to little string in big string, NULL if not found */
                    184: 
                    185: char *
                    186: instr(big, little)
                    187: char *big, *little;
                    188: 
                    189: {
                    190:     register char *t, *s, *x;
                    191: 
                    192:     for (t = big; *t; t++) {
                    193:        for (x=t,s=little; *s; x++,s++) {
                    194:            if (!*x)
                    195:                return Nullch;
                    196:            if (*s != *x)
                    197:                break;
                    198:        }
                    199:        if (!*s)
                    200:            return t;
                    201:     }
                    202:     return Nullch;
                    203: }
                    204: 
                    205: /* effective access */
                    206: 
                    207: #ifdef SETUIDGID
                    208: int
                    209: eaccess(filename, mod)
                    210: char *filename;
                    211: int mod;
                    212: {
                    213:     int protection, euid;
                    214:     
                    215:     mod &= 7;                          /* remove extraneous garbage */
                    216:     if (stat(filename, &filestat) < 0)
                    217:        return -1;
                    218:     euid = geteuid();
                    219:     if (euid == ROOTID)
                    220:        return 0;
                    221:     protection = 7 & (filestat.st_mode >>
                    222:       (filestat.st_uid == euid ? 6 :
                    223:         (filestat.st_gid == getegid() ? 3 : 0)
                    224:       ));
                    225:     if ((mod & protection) == mod)
                    226:        return 0;
                    227:     errno = EACCES;
                    228:     return -1;
                    229: }
                    230: #endif
                    231: 
                    232: /*
                    233:  * Get working directory
                    234:  */
                    235: 
                    236: #ifdef GETWD
                    237: #define        dot     "."
                    238: #define        dotdot  ".."
                    239: 
                    240: static char    *name;
                    241: 
                    242: static DIR     *dirp;
                    243: static int     off;
                    244: static struct  stat    d, dd;
                    245: static struct  direct  *dir;
                    246: 
                    247: char *
                    248: getwd(np)
                    249: char *np;
                    250: {
                    251:        long rdev, rino;
                    252: 
                    253:        *np++ = '/';
                    254:        *np = 0;
                    255:        name = np;
                    256:        off = -1;
                    257:        stat("/", &d);
                    258:        rdev = d.st_dev;
                    259:        rino = d.st_ino;
                    260:        for (;;) {
                    261:                stat(dot, &d);
                    262:                if (d.st_ino==rino && d.st_dev==rdev)
                    263:                        goto done;
                    264:                if ((dirp = opendir(dotdot)) == Null(DIR *))
                    265:                        prexit("getwd: cannot open ..\n");
                    266:                stat(dotdot, &dd);
                    267:                chdir(dotdot);
                    268:                if(d.st_dev == dd.st_dev) {
                    269:                        if(d.st_ino == dd.st_ino)
                    270:                                goto done;
                    271:                        do
                    272:                                if ((dir = readdir(dirp)) == Null(struct direct *))
                    273:                                        prexit("getwd: read error in ..\n");
                    274:                        while (dir->d_ino != d.st_ino);
                    275:                }
                    276:                else do {
                    277:                                if ((dir = readdir(dirp)) == Null(struct direct *))
                    278:                                        prexit("getwd: read error in ..\n");
                    279:                                stat(dir->d_name, &dd);
                    280:                        } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
                    281:                cat();
                    282:                closedir(dirp);
                    283:        }
                    284: done:
                    285:        name--;
                    286:        if (chdir(name) < 0) {
                    287:                printf("getwd: can't cd back to %s\n",name) FLUSH;
                    288:                sig_catcher(0);
                    289:        }
                    290:        return (name);
                    291: }
                    292: 
                    293: void
                    294: cat()
                    295: {
                    296:        register i, j;
                    297: 
                    298:        i = -1;
                    299:        while (dir->d_name[++i] != 0);
                    300:        if ((off+i+2) > 1024-1)
                    301:                return;
                    302:        for(j=off+1; j>=0; --j)
                    303:                name[j+i+1] = name[j];
                    304:        if (off >= 0)
                    305:                name[i] = '/';
                    306:        off=i+off+1;
                    307:        name[off] = 0;
                    308:        for(--i; i>=0; --i)
                    309:                name[i] = dir->d_name[i];
                    310: }
                    311: 
                    312: void
                    313: prexit(cp)
                    314: char *cp;
                    315: {
                    316:        write(2, cp, strlen(cp));
                    317:        sig_catcher(0);
                    318: }
                    319: #else
                    320: char *
                    321: getwd(np)                      /* shorter but slower */
                    322: char *np;
                    323: {
                    324:     FILE *popen();
                    325:     FILE *pipefp = popen("/bin/pwd","r");
                    326: 
                    327:     if (pipefd == Nullfp) {
                    328:        printf("Can't run /bin/pwd\n") FLUSH;
                    329:        finalize(1);
                    330:     }
                    331:     fgets(np,512,pipefp);
                    332:     np[strlen(np)-1] = '\0';   /* wipe out newline */
                    333:     pclose(pipefp);
                    334:     return np;
                    335: }
                    336: #endif
                    337: 
                    338: /* just like fgets but will make bigger buffer as necessary */
                    339: 
                    340: char *
                    341: get_a_line(original_buffer,buffer_length,fp)
                    342: char *original_buffer;
                    343: register int buffer_length;
                    344: FILE *fp;
                    345: {
                    346:     register int bufix = 0;
                    347:     register int nextch;
                    348:     register char *some_buffer_or_other = original_buffer;
                    349: 
                    350:     do {
                    351:        if (bufix >= buffer_length) {
                    352:            buffer_length *= 2;
                    353:            if (some_buffer_or_other == original_buffer) {
                    354:                                        /* currently static? */
                    355:                some_buffer_or_other = safemalloc((MEM_SIZE)buffer_length+1);
                    356:                strncpy(some_buffer_or_other,original_buffer,buffer_length/2);
                    357:                                        /* so we must copy it */
                    358:            }
                    359:            else {                      /* just grow in place, if possible */
                    360:                some_buffer_or_other = saferealloc(some_buffer_or_other,
                    361:                    (MEM_SIZE)buffer_length+1);
                    362:            }
                    363:        }
                    364:        if ((nextch = getc(fp)) == EOF)
                    365:            return Nullch;
                    366:        some_buffer_or_other[bufix++] = (char) nextch;
                    367:     } while (nextch && nextch != '\n');
                    368:     some_buffer_or_other[bufix] = '\0';
                    369:     len_last_line_got = bufix;
                    370:     return some_buffer_or_other;
                    371: }
                    372: 
                    373: /* copy a string to a safe spot */
                    374: 
                    375: char *
                    376: savestr(str)
                    377: char *str;
                    378: {
                    379:     register char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
                    380: 
                    381:     strcpy(newaddr,str);
                    382:     return newaddr;
                    383: }
                    384: 
                    385: int
                    386: makedir(dirname,nametype)
                    387: register char *dirname;
                    388: int nametype;
                    389: {
                    390: #ifdef MAKEDIR
                    391:     register char *end;
                    392:     register char *s;
                    393:     char tmpbuf[1024];
                    394:     register char *tbptr = tmpbuf+5;
                    395: 
                    396:     for (end = dirname; *end; end++) ; /* find the end */
                    397:     if (nametype == MD_FILE) {         /* not to create last component? */
                    398:        for (--end; end != dirname && *end != '/'; --end) ;
                    399:        if (*end != '/')
                    400:            return 0;                   /* nothing to make */
                    401:        *end = '\0';                    /* isolate file name */
                    402:     }
                    403:     strcpy(tmpbuf,"mkdir");
                    404: 
                    405:     s = end;
                    406:     for (;;) {
                    407:        if (stat(dirname,&filestat) >= 0) {
                    408:                                        /* does this much exist? */
                    409:            *s = '/';                   /* mark this as existing */
                    410:            break;
                    411:        }
                    412:        s = rindex(dirname,'/');        /* shorten name */
                    413:        if (!s)                         /* relative path! */
                    414:            break;                      /* hope they know what they are doing */
                    415:        *s = '\0';                      /* mark as not existing */
                    416:     }
                    417:     
                    418:     for (s=dirname; s <= end; s++) {   /* this is grody but efficient */
                    419:        if (!*s) {                      /* something to make? */
                    420:            sprintf(tbptr," %s",dirname);
                    421:            tbptr += strlen(tbptr);     /* make it, sort of */
                    422:            *s = '/';                   /* mark it made */
                    423:        }
                    424:     }
                    425:     if (nametype == MD_DIR)            /* don't need final slash unless */
                    426:        *end = '\0';                    /*  a filename follows the dir name */
                    427: 
                    428:     return (tbptr==tmpbuf+5 ? 0 : doshell(sh,tmpbuf));
                    429:                                        /* exercise our faith */
                    430: #else
                    431:     sprintf(cmd_buf,"%s %s %d", filexp(DIRMAKER), dirname, nametype);
                    432:     return doshell(sh,cmd_buf);
                    433: #endif
                    434: }
                    435: 
                    436: #ifdef SETENV
                    437: static bool firstsetenv = TRUE;
                    438: extern char **environ;
                    439: 
                    440: void
                    441: setenv(nam,val)
                    442: char *nam, *val;
                    443: {
                    444:     register int i=envix(nam);         /* where does it go? */
                    445: 
                    446:     if (!environ[i]) {                 /* does not exist yet */
                    447:        if (firstsetenv) {              /* need we copy environment? */
                    448:            int j;
                    449: #ifndef lint
                    450:            char **tmpenv = (char**)    /* point our wand at memory */
                    451:                safemalloc((MEM_SIZE) (i+2) * sizeof(char*));
                    452: #else
                    453:            char **tmpenv = Null(char **);
                    454: #endif lint
                    455:     
                    456:            firstsetenv = FALSE;
                    457:            for (j=0; j<i; j++)         /* copy environment */
                    458:                tmpenv[j] = environ[j];
                    459:            environ = tmpenv;           /* tell exec where it is now */
                    460:        }
                    461: #ifndef lint
                    462:        else
                    463:            environ = (char**) saferealloc((char*) environ,
                    464:                (MEM_SIZE) (i+2) * sizeof(char*));
                    465:                                        /* just expand it a bit */
                    466: #endif lint
                    467:        environ[i+1] = Nullch;  /* make sure it's null terminated */
                    468:     }
                    469:     environ[i] = safemalloc((MEM_SIZE) strlen(nam) + strlen(val) + 2);
                    470:                                        /* this may or may not be in */
                    471:                                        /* the old environ structure */
                    472:     sprintf(environ[i],"%s=%s",nam,val);/* all that work just for this */
                    473: }
                    474: 
                    475: int
                    476: envix(nam)
                    477: char *nam;
                    478: {
                    479:     register int i, len = strlen(nam);
                    480: 
                    481:     for (i = 0; environ[i]; i++) {
                    482:        if (strnEQ(environ[i],nam,len) && environ[i][len] == '=')
                    483:            break;                      /* strnEQ must come first to avoid */
                    484:     }                                  /* potential SEGV's */
                    485:     return i;
                    486: }
                    487: #endif
                    488: 
                    489: void
                    490: notincl(feature)
                    491: char *feature;
                    492: {
                    493:     printf("\nNo room for feature \"%s\" on this machine.\n",feature) FLUSH;
                    494: }
                    495: 
                    496: char *
                    497: getval(nam,def)
                    498: char *nam,*def;
                    499: {
                    500:     char *val;
                    501: 
                    502:     if ((val = getenv(nam)) == Nullch || !*val)
                    503:        val = def;
                    504:     return val;
                    505: }
                    506: 
                    507: /* grow a static string to at least a certain length */
                    508: 
                    509: void
                    510: growstr(strptr,curlen,newlen)
                    511: char **strptr;
                    512: int *curlen;
                    513: int newlen;
                    514: {
                    515:     if (newlen > *curlen) {            /* need more room? */
                    516:        if (*curlen)
                    517:            *strptr = saferealloc(*strptr,(MEM_SIZE)newlen);
                    518:        else
                    519:            *strptr = safemalloc((MEM_SIZE)newlen);
                    520:        *curlen = newlen;
                    521:     }
                    522: }
                    523: 
                    524: void
                    525: setdef(buffer,dflt)
                    526: char *buffer,*dflt;
                    527: {
                    528: #ifdef STRICTCR
                    529:     if (*buffer == ' ')
                    530: #else
                    531:     if (*buffer == ' ' || *buffer == '\n')
                    532: #endif
                    533:     {
                    534:        if (*dflt == '^' && isupper(dflt[1]))
                    535:            *buffer = Ctl(dflt[1]);
                    536:        else
                    537:            *buffer = *dflt;
                    538:     }
                    539: }

unix.superglobalmegacorp.com

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