Annotation of 3BSD/cmd/net/mach.c, revision 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.