Annotation of 3BSD/cmd/net/mach.c, revision 1.1.1.1

1.1       root        1: /*
                      2:    This file is meant to handle all the machine
                      3:    dependencies in the network code.
                      4:    Everything is conditionally compiled.
                      5: 
                      6:    It can be uses w/o network stuff to simulate
                      7:    v7 for other programs, too.
                      8: */
                      9: # include <stdio.h>
                     10: # include "mach.h"
                     11: 
                     12: char shomedir[100];
                     13: 
                     14: # ifndef CC
                     15: submit(a) {}
                     16: # endif
                     17: 
                     18: # ifdef FUID
                     19: setgid() {};
                     20: # endif
                     21: 
                     22: /* 
                     23:    Set the owner uid/gid of a file.
                     24:    On v7, this is done by the chown command
                     25:    with three args - (file, uid, gid).
                     26:    On Vanilla V6 this is done using the
                     27:    top byte of the second parameter as the gid byte.
                     28:    On Berkeley Funny uids on V6, no gid is specified.
                     29: */
                     30: mchown(sfn,uid,gid)
                     31:        char *sfn;
                     32:        int uid;
                     33:        int gid;
                     34: {
                     35: # ifndef V6
                     36:        chown(sfn,uid,gid);
                     37: # else
                     38: # ifndef FUID
                     39:                uid = uidmask(uid);
                     40:                uid = ((gid&0377) << 8) | (uid & 0377);
                     41: # endif
                     42:        chown(sfn,uid);
                     43: # endif
                     44: }
                     45:        
                     46: 
                     47: char vaxtovax;
                     48: long fixuplong(a)
                     49:        long a; {
                     50: # ifdef ISVAX
                     51:        register char *p,c1,c2;
                     52:        char c3,c4;
                     53:        if(!vaxtovax){
                     54:                p = (char*) &a;
                     55:                c1 = *p++;
                     56:                c2 = *p++;
                     57:                c3 = *p++;
                     58:                c4 = *p++;
                     59:                p = (char*) &a;
                     60:                *p++ = c3;
                     61:                *p++ = c4;
                     62:                *p++ = c1;
                     63:                *p++ = c2;
                     64:                }
                     65: # endif
                     66:        return(a);
                     67:        }
                     68: /*
                     69:        SnFromuid(uid)
                     70: 
                     71:        The login name corresponding to uid.
                     72:        Reads the password file.
                     73:        Successive calls overwrite the static string returned.
                     74:        Returns NULL if error.
                     75: */
                     76: char *SnFromUid(uid)
                     77:        register int uid;
                     78: {
                     79:        register struct passwd *pwd;
                     80:        static int ouid = -1;
                     81:        static char oresult[20] = "";
                     82:        uid = uidmask(uid);
                     83:        if(uid == ouid)
                     84:                return(oresult);
                     85: # ifdef HPASSWD
                     86:        if(getname(uid,oresult) == 0){
                     87:                ouid = uid;
                     88:                return(oresult);
                     89:        }
                     90: # endif
                     91:        pwd = getpwuid(uid);
                     92:        if(pwd != NULL){
                     93:                strcpy(oresult,pwd->pw_name);
                     94:                ouid = uid;
                     95:                return(oresult);
                     96:        }
                     97:        return(NULL);
                     98: }
                     99: 
                    100: /* handle the regular unix and local mods difference for user id's */
                    101: /* this call returns the 1 word uid = to what getuid will return */
                    102: guid(uid,gid){
                    103:        uid = uidmask(uid);
                    104: # ifdef FUID
                    105:        return((uid & 0377) | (gid << 8));
                    106: # else
                    107:        return(uid);
                    108: # endif
                    109:        }
                    110: 
                    111: # ifdef OLDTTY
                    112: isatty(i){
                    113:        return(ttyn(i) != 'x');
                    114:        }
                    115: char *ttyname(i){              /* return NULL if not TTY */
                    116:        char c;
                    117:        static char ttystr[] = "/dev/ttyx";
                    118:        c = ttyn(i);
                    119:        ttystr[8] = c;
                    120:        return(c == 'x' ? NULL : ttystr);
                    121:        }
                    122: # endif
                    123: 
                    124: # ifdef CCTTY
                    125: # undef ttyname()
                    126: myttyname(i){          /* return NULL for non tty */
                    127:        static char s[15],*p;
                    128:        p = ttyname(i);
                    129:        if(p == NULL)return(NULL);
                    130:        strcpy(s,"/dev/");
                    131:        strcat(s,p);
                    132:        return(s);
                    133:        }
                    134: # define ttyname(S) myttyname(S)
                    135: # endif
                    136: 
                    137: /* get passwd from passwdf */
                    138: getpwdf(pwd)
                    139:   struct passwd *pwd; {
                    140: # ifdef PASSWDF
                    141: # ifndef TESTING
                    142:        register char *p, *q;
                    143:        char buf1[BUFSIZ], found;
                    144:        FILE *pw;
                    145:        pwd->pw_passwd[0] = 0;
                    146:        pw = fopen("/etc/passwdf","r");
                    147:        if(pw == NULL) return;
                    148:        found = 0;
                    149:        while(fgets(buf1,BUFSIZ,pw) != NULL){
                    150:                for(p=buf1; *p && *p != ':'; p++);
                    151:                *p = 0;
                    152:                if(strcmp(buf1,pwd->pw_name) == 0){
                    153:                        found = 1;
                    154:                        break;
                    155:                        }
                    156:                }
                    157:        fclose(pw);
                    158:        if(!found)return;
                    159:        q = ++p;
                    160:        for(;*p && *p != ':';p++);
                    161:        *p = 0;
                    162:        strcpy(pwd->pw_passwd,q);
                    163:        /*
                    164:        debug("user %s passwd %s %s",pwd->pw_name,pwd->pw_passwd);
                    165:        */
                    166: # endif
                    167: # endif
                    168:        }
                    169: /*
                    170:    these are all the v7 routines not available on the v6 machines
                    171: */
                    172: 
                    173: # ifdef V6
                    174: 
                    175: char **environ;                        /* global environment pointer */
                    176: 
                    177: ioctl(a,b,c){
                    178:        return(0);              /* always succeeds */
                    179:        }
                    180: long atol(s)
                    181:   register char *s; {
                    182:        long i = 0;
                    183:        while('0' <= *s && *s <= '9')
                    184:                i = i * 10 + (*s++ - '0');
                    185:        return(i);
                    186:        }
                    187: long gettime(){
                    188:        long tt;
                    189:        time(&tt);
                    190:        return(tt);
                    191:        }
                    192: long getsize(str)
                    193:   struct stat *str; {
                    194:        long wk;
                    195:        wk = ((long)(str->st_size0 & 0377)) << 16;
                    196:        wk += (long)((unsigned)str->st_size1);
                    197:        return(wk);
                    198:        }
                    199: /*
                    200:        getenv("HOME")
                    201: 
                    202:        always returns home directory.
                    203:        returns NULL if there is error.
                    204: */
                    205: char *getenv(){
                    206:        register char *shdir = NULL;
                    207:        register struct passwd *pwd;
                    208:        register int it;
                    209:        if(shomedir[0] != 0)return(shomedir);
                    210:        it = ttyn(2);
                    211: # ifdef OLDTTY
                    212:        if(it == 'x')it = ttyn(1);
                    213:        if(it == 'x')it = ttyn(0);
                    214:        if(it != 'x' && hget(it) == 0)shdir = hgethome();
                    215: # endif
                    216: # ifdef CCTTY
                    217:        if(it == -1)it = ttyn(1);
                    218:        if(it == -1)it = ttyn(0);
                    219:        if(it != -1 && hget(it) == 0)shdir = hgethome();
                    220: # endif
                    221:        if(shdir == NULL){
                    222:                pwd = PwdCurrent();
                    223:                if(pwd != NULL)shdir = pwd->pw_dir;
                    224:                }
                    225:        if(shdir != NULL)strcpy(shomedir,shdir);
                    226:        return(shdir);
                    227:        }
                    228: 
                    229: /* doesn't handle split passwd files */
                    230: struct passwd *
                    231: getpwuid(uid)
                    232: register uid;
                    233: {
                    234:        register struct passwd *p;
                    235:        struct passwd *getpwent();
                    236: 
                    237:        uid = uidmask(uid);
                    238:        setpwent();
                    239:        while( (p = getpwent()) && guid(p->pw_uid,p->pw_gid) != uid );
                    240:        endpwent();
                    241:        return(p);
                    242: }
                    243: 
                    244: static char PASSWD[]   = "/etc/passwd";
                    245: static char EMPTY[] = "";
                    246: static FILE *pwf = NULL;
                    247: static char line[BUFSIZ+1];
                    248: static struct passwd passwd;
                    249: 
                    250: setpwent()
                    251: {
                    252:        if( pwf == NULL )
                    253:                pwf = fopen( PASSWD, "r" );
                    254:        else
                    255:                rewind( pwf );
                    256: }
                    257: 
                    258: endpwent()
                    259: {
                    260:        if( pwf != NULL ){
                    261:                fclose( pwf );
                    262:                pwf = NULL;
                    263:        }
                    264: }
                    265: 
                    266: static char *
                    267: pwskip(p)
                    268: register char *p;
                    269: {
                    270:        while( *p && *p != ':' )
                    271:                ++p;
                    272:        if( *p ) *p++ = 0;
                    273:        return(p);
                    274: }
                    275: 
                    276: struct passwd *
                    277: getpwent()
                    278: {
                    279:        register char *p;
                    280: 
                    281:        if (pwf == NULL) {
                    282:                if( (pwf = fopen( PASSWD, "r" )) == NULL )
                    283:                        return(0);
                    284:        }
                    285:        p = fgets(line, BUFSIZ, pwf);
                    286:        if (p==NULL)
                    287:                return(0);
                    288:        passwd.pw_name = p;
                    289:        p = pwskip(p);
                    290:        passwd.pw_passwd = p;
                    291:        p = pwskip(p);
                    292:        passwd.pw_uid = atoi(p);
                    293:        passwd.pw_uid = uidmask(passwd.pw_uid);
                    294:        p = pwskip(p);
                    295:        passwd.pw_gid = atoi(p);
                    296:        passwd.pw_quota = 0;
                    297:        passwd.pw_comment = EMPTY;
                    298:        p = pwskip(p);
                    299:        passwd.pw_gecos = p;
                    300:        p = pwskip(p);
                    301:        passwd.pw_dir = p;
                    302:        p = pwskip(p);
                    303:        passwd.pw_shell = p;
                    304:        while(*p && *p != '\n') p++;
                    305:        *p = '\0';
                    306:        return(&passwd);
                    307: }
                    308: 
                    309: struct passwd *
                    310: getpwnam(name)
                    311: char *name;
                    312: {
                    313:        register struct passwd *p;
                    314:        struct passwd *getpwent();
                    315: 
                    316:        setpwent();
                    317:        while( (p = getpwent()) && strcmp(name,p->pw_name) );
                    318:        endpwent();
                    319:        return(p);
                    320: }
                    321: /*
                    322:        getlogin()
                    323: 
                    324:        Return current user name by looking at /etc/utmp.
                    325:        Returns NULL if not found.
                    326: */
                    327: char *getlogin()
                    328: {
                    329:        struct utmp utmpstr;
                    330:        static char snSave[10];
                    331:        register char *sttyname,*s;
                    332:        register FILE *fp;
                    333: 
                    334:        sttyname = ttyname(2);
                    335:        if(sttyname == NULL)sttyname = ttyname(1);
                    336:        if(sttyname == NULL)sttyname = ttyname(0);
                    337:        if(sttyname == NULL)return(NULL);
                    338: 
                    339:        fp = fopen("/etc/utmp","r");
                    340:        if(fp == NULL)return(NULL);
                    341: 
                    342:        snSave[0] = 0;
                    343:        while(fread(&utmpstr,1,sizeof utmpstr,fp) == sizeof utmpstr){
                    344: # ifdef OLDTTY
                    345:                if(utmpstr.ut_tty == sttyname[8]){
                    346: # else
                    347:                if(strcmp(utmpstr.ut_line,sttyname+5) == 0){
                    348: # endif
                    349:                        utmpstr.ut_tty = 0;
                    350:                        strcpy(snSave,utmpstr.ut_name);
                    351:                }
                    352:        }
                    353: 
                    354:        fclose(fp);
                    355:        s = snSave;
                    356:        while(*s != 0 && *s != ' ')s++;
                    357:        *s = 0;
                    358:        if(snSave[0] == 0)return(NULL);
                    359:        return(snSave);
                    360: }
                    361: /*
                    362:  * Unix routine to do an "fopen" on file descriptor
                    363:  * The mode has to be repeated because you can't query its
                    364:  * status
                    365:  */
                    366: 
                    367: FILE *
                    368: fdopen(fd, mode)
                    369: register char *mode;
                    370: {
                    371:        extern int errno;
                    372:        register FILE *iop;
                    373:        extern FILE *_lastbuf;
                    374: 
                    375:        for (iop = _iob; iop->_flag&(_IOREAD|_IOWRT); iop++)
                    376:                if (iop >= _lastbuf)
                    377:                        return(NULL);
                    378:        iop->_cnt = 0;
                    379:        iop->_file = fd;
                    380:        if (*mode != 'r') {
                    381:                iop->_flag |= _IOWRT;
                    382:                if (*mode == 'a')
                    383:                        lseek(fd, 0L, 2);
                    384:        } else
                    385:                iop->_flag |= _IOREAD;
                    386:        return(iop);
                    387: }
                    388: system(s)
                    389: char *s;
                    390: {
                    391:        int status, pid, w;
                    392:        register int (*istat)(), (*qstat)();
                    393: 
                    394:        while((pid = fork()) == -1)sleep(2);
                    395:        if (pid == 0) {
                    396:                execl("/bin/sh", "sh", "-c", s, 0);
                    397:                _exit(127);
                    398:        }
                    399:        istat = signal(SIGINT, SIG_IGN);
                    400:        qstat = signal(SIGQUIT, SIG_IGN);
                    401:        while ((w = wait(&status)) != pid && w != -1)
                    402:                ;
                    403:        if (w == -1)
                    404:                status = -1;
                    405:        signal(SIGINT, istat);
                    406:        signal(SIGQUIT, qstat);
                    407:        return(status);
                    408: }
                    409: 
                    410: char *
                    411: getpass(prompt)
                    412: char *prompt;
                    413: {
                    414:        struct sgttyb ttyb;
                    415:        int flags;
                    416:        register char *p;
                    417:        register c;
                    418:        FILE *fi = NULL;
                    419:        static char pbuf[9];
                    420:        int (*signal())();
                    421:        int (*sig)();
                    422: 
                    423:        /*      modified because Cory needs super-user to stty /dev/tty */
                    424: # ifndef CORY
                    425:        if ((fi = fopen("/dev/tty", "r")) == NULL)
                    426:                fi = stdin;
                    427:        else
                    428:                setbuf(fi, (char *)NULL);
                    429:        gtty(fileno(fi), &ttyb);
                    430: # else
                    431:        if(gtty(0,&ttyb) >= 0)fi = stdin;
                    432:        else if(gtty(2,&ttyb) >= 0)fi = stderr;
                    433:        else {
                    434:                pbuf[0] = 0;
                    435:                return(pbuf);
                    436:                }
                    437: # endif
                    438:        sig = signal(SIGINT, SIG_IGN);
                    439:        flags = ttyb.sg_flags;
                    440:        ttyb.sg_flags &= ~ECHO;
                    441:        if(stty(fileno(fi), &ttyb) < 0) perror("stty:");
                    442:        fprintf(stderr, prompt);
                    443:        for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
                    444:                if (p < &pbuf[8])
                    445:                        *p++ = c;
                    446:        }
                    447:        *p = '\0';
                    448:        fprintf(stderr, "\n");
                    449:        ttyb.sg_flags = flags;
                    450:        stty(fileno(fi), &ttyb);
                    451:        signal(SIGINT, sig);
                    452: # ifndef CORY
                    453:        if (fi != stdin)
                    454:                fclose(fi);
                    455: # endif
                    456:        return(pbuf);
                    457: }
                    458: /* end of non-vax v7 routines */
                    459: # endif

unix.superglobalmegacorp.com

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