Annotation of 42BSD/games/compat/unixtraps.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)unixtraps.c        4.2 83/07/31";
        !             2: 
        !             3: /*
        !             4:  * Function to execute version 6 and version 7 UNIX system calls from
        !             5:  * compatability mode on UNIX-32V.
        !             6:  *     Art Wetzel      August 1979
        !             7:  */
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <signal.h>
        !            11: #include <sys/types.h>
        !            12: #include <sys/stat.h>
        !            13: #include <sys/ioctl.h>
        !            14: #include <sys/time.h>
        !            15: #ifdef V6UNIX
        !            16: #ifdef TRACE
        !            17: #define        RTSNAME "/../../../../usr/local/v6trc"
        !            18: #else
        !            19: #define        RTSNAME "/../../../../usr/local/v6run"
        !            20: #endif
        !            21: #include "unix6sys.h"
        !            22: #ifdef TRACE
        !            23: #include "unix6sysn.h"
        !            24: #endif
        !            25: #endif
        !            26: #ifdef V7UNIX
        !            27: #ifdef TRACE
        !            28: #define        RTSNAME "/../../../../usr/local/v7trc"
        !            29: #else
        !            30: #define        RTSNAME "/../../../../usr/local/v7run"
        !            31: #endif
        !            32: #include "unix7sys.h"
        !            33: #ifdef TRACE
        !            34: #include "unix7sysn.h"
        !            35: #endif
        !            36: #endif
        !            37: #include "defs.h"
        !            38: #define        CARRY   1
        !            39: #define        MAXSARGS        25
        !            40: #ifdef V6UNIX
        !            41: #define        ARGVLEN 512
        !            42: #define        ENVLEN  0
        !            43: #endif
        !            44: #ifdef V7UNIX
        !            45: #define        ARGVLEN 5120
        !            46: #define        ENVLEN  1000
        !            47: #endif
        !            48: char   argvs[ARGVLEN+ENVLEN];
        !            49: int    args[MAXSARGS];
        !            50: 
        !            51: /* 32v type stat structure */
        !            52: extern struct  stat    stat32v;
        !            53: 
        !            54: /* place for times data so we can reverse the longs */
        !            55: struct timebuf {
        !            56:        long    t1;
        !            57:        long    t2;
        !            58:        long    t3;
        !            59:        long    t4;
        !            60: } timebuf;
        !            61: 
        !            62: /* place for pipe file descriptors */
        !            63: int    pipes[2];
        !            64: 
        !            65: /* wait status */
        !            66: int    wstatus;
        !            67: 
        !            68: #ifdef V6UNIX
        !            69: /* version 6 style stat structure */
        !            70: struct v6nod {
        !            71:        dev_t   majmin;
        !            72:        ino_t   inumber;
        !            73:        unsigned short  flags;
        !            74:        unsigned char   nlinks;
        !            75:        unsigned char   uid;
        !            76:        unsigned char   gid;
        !            77:        unsigned char   size0;
        !            78:        unsigned short  size1;
        !            79:        unsigned short  addr[8];
        !            80:        long    actime;
        !            81:        long    modtime;
        !            82: } *v6stat;
        !            83: #endif
        !            84: 
        !            85: #ifdef V7UNIX
        !            86: /* version 7 style stat structure */
        !            87: struct v7stat {
        !            88:        dev_t   v7st_dev;
        !            89:        u_short v7st_ino;
        !            90:        u_short v7st_mode;
        !            91:        short   v7st_nlink;
        !            92:        short   v7st_uid;
        !            93:        short   v7st_gid;
        !            94:        dev_t   v7st_rdev;
        !            95:        int     v7st_size;
        !            96:        int     v7st_atime;
        !            97:        int     v7st_mtime;
        !            98:        int     v7st_ctime;
        !            99: } statv7;
        !           100: 
        !           101: struct timeb {
        !           102:        time_t  time;
        !           103:        u_short millitm;
        !           104:        short   timezone;
        !           105:        short   dstflag;
        !           106: } timeb;
        !           107: #endif
        !           108: 
        !           109: /* do the trap stuff for the trap with code */
        !           110: dotrap(code)
        !           111:        int code;
        !           112: {
        !           113:        register unsigned short *argp, *savp, *savep;
        !           114:        register int i, j, indirflg;
        !           115:        register char *avp, *oavp;
        !           116:        extern sigcatch();
        !           117:        extern errno;
        !           118: 
        !           119:        /* clear out condition codes of psl */
        !           120:        psl &= ~017;
        !           121:        /* special case of indirect sys call */
        !           122:        if (code == 0) {
        !           123:                /* remember this was indirect */
        !           124:                indirflg = 1;
        !           125:                /* point to args */
        !           126:                argp = (unsigned short *)*(pc++);
        !           127:                /* code for indirect sys call */
        !           128:                code = *argp++;
        !           129:                /* is it legit */
        !           130:                if (code>>8 != TRAPS) {
        !           131:                        fprintf(stderr,"Bad indirect sys call at 0x%x\n",pc-2);
        !           132:                        pc++;
        !           133:                        /* set carry flag */
        !           134:                        psl |= CARRY;
        !           135:                        regs[0] = -1;
        !           136:                        return(-1);
        !           137:                }
        !           138:                code &= 0377;
        !           139:        } else {
        !           140:                /* remember this was not indirect */
        !           141:                indirflg = 0;
        !           142:                /* point to args */
        !           143:                argp = pc;
        !           144:        }
        !           145:        /* check if code too high or bad sys code */
        !           146:        if (code >= NSYSTRAPS || sysargs[code][0] == ILLSYS) {
        !           147:                fprintf(stderr,"Unimplimented trap %d at 0x%x\n",code,argp);
        !           148:                /* set carry bit */
        !           149:                psl |= CARRY;
        !           150:                regs[0] = -1;
        !           151:                return(-1);
        !           152:        }
        !           153:        /* copy args to known locations */
        !           154:        i=0;
        !           155:        for (j=0; j<sysargs[code][0]; j++)
        !           156:                args[i++] = regs[j];
        !           157:        for (j=0; j<(sysargs[code][1]); j++)
        !           158:                args[i++] = *argp++;
        !           159: #ifdef TRACE
        !           160:        fprintf(stderr,"pid %d ",getpid());
        !           161:        if (indirflg)
        !           162:                fprintf(stderr,"indirect ");
        !           163:        fprintf(stderr, "%s (%d) from 0%o with %d args",
        !           164:            sysnames[code], code, pc-1, i);
        !           165:        for (j=0; j<i; j++)
        !           166:                fprintf(stderr," 0%o",args[j]);
        !           167:        if (code==OPEN || code==STAT || code==CREAT || code==EXEC || 
        !           168:            code==UNLNK || code==LINK || code==CHDIR || code==MKNOD)
        !           169:                fprintf(stderr," (%s)",args[0]);
        !           170: #ifdef V7UNIX
        !           171:        if (code==EXECE)
        !           172:                fprintf(stderr," (%s)",args[0]);
        !           173: #endif
        !           174:        if (code==LINK)
        !           175:                fprintf(stderr," (%s)",args[1]);
        !           176: #endif
        !           177:        /* go do whatever sys call it is */
        !           178:        switch (code) {
        !           179:        case FORK:
        !           180:                /* indirect forks return pids on both sides - must do here */
        !           181:                /* this is possibly a bug in 32V */
        !           182:                i = fork();
        !           183:                break;
        !           184: 
        !           185:        case WAIT:
        !           186:                i = wait(&wstatus);
        !           187:                args[0] = i;
        !           188:                args[1] = wstatus;
        !           189:                break;
        !           190: 
        !           191:        case EXEC:
        !           192: #ifdef V7UNIX
        !           193:        case EXECE:
        !           194: #endif
        !           195:                /*
        !           196:                 *  have to do a lot of junk here to fix up an argv
        !           197:                 *  for execute since (1) the pdp-11 argv consists of 16
        !           198:                 *  bit pointers and (2) the argv itself is in the
        !           199:                 *  pdp-11 program space where it would get clobbered
        !           200:                 *  when a new program is read in and before its
        !           201:                 *  argv is set up.
        !           202:                 */
        !           203:                avp = &argvs[0];
        !           204:                savp = (unsigned short *)args[1];
        !           205: #ifdef V6UNIX
        !           206:                for (i=1; args[i] = *savp++; i++)
        !           207:                        if (args[i] == 0177777)
        !           208:                                break;
        !           209: #ifdef TRACE
        !           210:                        else
        !           211:                                fprintf(stderr,"argv[%d]%s ",i-1,args[i]);
        !           212: #endif
        !           213: #endif
        !           214: #ifdef V7UNIX
        !           215:                savep = (unsigned short *)args[2];
        !           216:                for (i=1; args[i] = *savp++; i++)
        !           217: #ifdef TRACE
        !           218:                        fprintf(stderr,"argv[%d]%s ",i-1,args[i]);
        !           219: #else
        !           220:                        ;
        !           221: #endif
        !           222: #endif
        !           223:                if (stat(args[0], &stat32v)) {
        !           224:                        /* return error here if file does not exist */
        !           225: #ifdef TRACE
        !           226:                        fprintf(stderr," does not exist\n");
        !           227: #endif
        !           228:                        i = -1;
        !           229:                        break;
        !           230:                }
        !           231:                /* must have execute permission */
        !           232:                if (stat32v.st_mode & (S_IEXEC>>6))
        !           233:                        goto experm;
        !           234:                if (stat32v.st_mode & (S_IEXEC>>3)) {
        !           235:                        if (stat32v.st_gid == getegid())
        !           236:                                goto experm;
        !           237:                        if (geteuid() == 0)
        !           238:                                goto experm;
        !           239:                }
        !           240:                if (stat32v.st_mode & S_IEXEC) {
        !           241:                        if (stat32v.st_uid == geteuid())
        !           242:                                goto experm;
        !           243:                        if (geteuid() == 0)
        !           244:                                goto experm;
        !           245:                }
        !           246:                /* return failure if no exec permision allowed */
        !           247:                i = -1;
        !           248: experm:
        !           249:                /* can't exec a directory */
        !           250:                if ((stat32v.st_mode&S_IFMT) == S_IFDIR)
        !           251:                        i = -1;
        !           252:                if (i == -1)
        !           253:                        break;
        !           254:                args[i] = 0;
        !           255:                for (j=0; j<i; j++) {
        !           256:                        oavp = (char *)args[j];
        !           257:                        args[j] = (int)avp;
        !           258:                        while (*avp++ = *oavp++)
        !           259:                                ;
        !           260:                }
        !           261: #ifdef V7UNIX
        !           262:                if (code == EXECE) {
        !           263:                        for (j = ++i; args[j] = *savep++; j++)
        !           264:                                ;
        !           265:                        for ( ; j > i; j--) {
        !           266:                                oavp = (char *)args[j];
        !           267:                                args[j] = (int)avp;
        !           268:                                while (*avp++ = *oavp++)
        !           269:                                        ;
        !           270:                        }
        !           271:                }
        !           272: #endif
        !           273:                /* SETUID and SETGID files must be started with a fresh RTS */
        !           274:                if (stat32v.st_mode & S_ISGID || stat32v.st_mode & S_ISUID) {
        !           275:                        /* should add a check here for good magic # in header */
        !           276:                        args[1] = args[0];
        !           277:                        args[0] = (int)RTSNAME;
        !           278: #ifdef TRACE
        !           279:                        fprintf(stderr," SETUID-GID");
        !           280: #endif
        !           281:                        if (args[i])
        !           282:                                i = execve(args[0], &args[0], &args[i]);
        !           283:                        else
        !           284:                                i = execv(args[0], &args[0]);
        !           285:                        fprintf(stderr,"can't exec %s\n",RTSNAME);
        !           286:                        break;
        !           287:                }
        !           288:                i = execute(args[0], &args[1], &args[i]);
        !           289:                /* shouldn't get here if exec works */
        !           290:                break;
        !           291: 
        !           292:        case SEEK:
        !           293: #ifdef V6UNIX
        !           294:                /* fix up negative offsets */
        !           295:                if (args[2] != 0 && args[2] != 3)
        !           296:                        if (args[1] >= 32768)
        !           297:                                args[1] -= 65536;
        !           298:                if (args[2] <= 2)
        !           299:                        i = lseek(args[0], args[1], args[2]);
        !           300:                else
        !           301:                        i = lseek(args[0], args[1]*512, args[2]-3);
        !           302:                if (i != -1)
        !           303:                        i = 0;
        !           304: #endif
        !           305: #ifdef V7UNIX
        !           306:                i = lseek(args[0], (args[1]<<16)|(args[2]&0177777), args[3]);
        !           307: #endif
        !           308:                break;
        !           309: 
        !           310: #ifdef V6UNIX
        !           311:        case MKNOD:
        !           312:                /* version 6 uses allocated bit which means regular file here */
        !           313:                if (args[1] & S_IFBLK)
        !           314:                        args[1] &= ~S_IFREG;
        !           315:                i = mknod(args[0], args[1], args[2]);
        !           316:                break;
        !           317: #endif 
        !           318: 
        !           319:        case PIPE:
        !           320:                i = pipe(pipes);
        !           321:                args[0] = pipes[0];
        !           322:                args[1] = pipes[1];
        !           323:                break;
        !           324: 
        !           325: #ifdef V6UNIX
        !           326:        case TELL:
        !           327:                i = lseek(args[0], 0L, 1);
        !           328:                break;
        !           329: 
        !           330:        case STTY:
        !           331:                i = stty(args[0], args[1]);
        !           332:                break;
        !           333: 
        !           334:        case GTTY:
        !           335:                i = gtty(args[0], args[1]);
        !           336:                break;
        !           337: #endif
        !           338: 
        !           339:        case STAT:
        !           340:                i = stat(args[0], &stat32v);
        !           341:                goto allstat;
        !           342: 
        !           343:        case FSTAT:
        !           344:                /* do the syscall to a local stat buffer */
        !           345:                i = fstat(args[0], &stat32v);
        !           346: 
        !           347:        allstat:
        !           348:                /* reverse the longs */
        !           349:                stat32v.st_size = longrev(stat32v.st_size);
        !           350:                stat32v.st_atime = longrev(stat32v.st_atime);
        !           351:                stat32v.st_mtime = longrev(stat32v.st_mtime);
        !           352:                stat32v.st_ctime = longrev(stat32v.st_ctime);
        !           353: #ifdef V7UNIX
        !           354:                statv7.v7st_dev = stat32v.st_dev;
        !           355:                statv7.v7st_ino = stat32v.st_ino;
        !           356:                statv7.v7st_mode = stat32v.st_mode;
        !           357:                statv7.v7st_nlink = stat32v.st_nlink;
        !           358:                statv7.v7st_uid = stat32v.st_uid;
        !           359:                statv7.v7st_gid = stat32v.st_gid;
        !           360:                statv7.v7st_rdev = stat32v.st_rdev;
        !           361:                statv7.v7st_size = stat32v.st_size;
        !           362:                statv7.v7st_atime = stat32v.st_atime;
        !           363:                statv7.v7st_mtime = stat32v.st_mtime;
        !           364:                statv7.v7st_ctime = stat32v.st_ctime;
        !           365:                /* copy out otherwise unchanged stat buffer */
        !           366:                /* in two pieces with st_size as the breaking point */
        !           367:                /* note that st_rdev is a short but due to alingnmemt */
        !           368:                /* problems the rest of the structure is out of sync */
        !           369:                j = (int)((char *)(&statv7.v7st_size) -
        !           370:                    (char *)(&statv7.v7st_dev));
        !           371:                bcopy(&statv7, args[1], j);
        !           372:                bcopy(&statv7.v7st_size, args[1]+j-2, sizeof(struct v7stat)-j);
        !           373: #endif
        !           374: #ifdef V6UNIX
        !           375:                /* point to user area as v6stat structure */
        !           376:                v6stat = (struct v6nod *)args[1];
        !           377:                /* copy out piece by piece */
        !           378:                v6stat->majmin = stat32v.st_dev;
        !           379:                v6stat->inumber = stat32v.st_ino;
        !           380:                v6stat->flags = stat32v.st_mode;
        !           381:                v6stat->nlinks = (unsigned char)stat32v.st_nlink;
        !           382:                v6stat->uid = (unsigned char)stat32v.st_uid;
        !           383:                v6stat->gid = (unsigned char)stat32v.st_gid;
        !           384:                /* note size already reversed */
        !           385:                v6stat->size0 = (unsigned char)(stat32v.st_size & 0377);
        !           386:                v6stat->size1 = (unsigned short)(stat32v.st_size>>16);
        !           387:                v6stat->actime = stat32v.st_atime;
        !           388:                v6stat->modtime = stat32v.st_mtime;
        !           389:                /* patch up flags */
        !           390:                /* for now just set 100000 bit if not a plain file */
        !           391:                if (v6stat->flags & 060000)
        !           392:                        v6stat->flags |= 0100000;
        !           393: #endif
        !           394:                break;
        !           395: 
        !           396:        case TIMES:
        !           397:                i = times(&timebuf);
        !           398:                timebuf.t2 = longrev(timebuf.t2) + timebuf.t1;
        !           399:                timebuf.t3 = longrev(timebuf.t3);
        !           400:                timebuf.t4 = longrev(timebuf.t4);
        !           401:                bcopy(&timebuf.t2,args[0],sizeof(struct timebuf)-sizeof(long));
        !           402:                break;
        !           403: 
        !           404: #ifdef V6UNIX
        !           405:        case SLEEP:
        !           406:                /* do a sleep function - what about pwb which has alarm? */
        !           407:                sleep(args[0]);
        !           408:                break;
        !           409: #endif
        !           410: 
        !           411:        case GETUID:
        !           412:                args[0] = getuid();
        !           413:                args[1] = geteuid();
        !           414: #ifdef V6UNIX
        !           415:                i = args[1]<<8 | (args[0] & 0377);
        !           416: #endif
        !           417:                break;
        !           418: 
        !           419:        case GETGID:
        !           420:                args[0] = getgid();
        !           421:                args[1] = getegid();
        !           422: #ifdef V6UNIX
        !           423:                i = args[1]<<8 | (args[0] & 0377);
        !           424: #endif
        !           425:                break;
        !           426: 
        !           427:                /* uids and gids are 8 bits in version 6 */
        !           428:        case SETUID:
        !           429:        case SETGID:
        !           430: #ifdef V6UNIX
        !           431:                args[0] &= 0377;
        !           432: #endif
        !           433:                if (code == SETUID)
        !           434:                        i = setuid(args[0]);
        !           435:                else
        !           436:                        i = setgid(args[0]);
        !           437:                break;
        !           438: 
        !           439:        case SIG:
        !           440:                /* if it is a good signal code */
        !           441:                if (args[0] <= NSIG) {
        !           442:                        /* get the current signal value */
        !           443:                        i = sigvals[args[0]];
        !           444:                        /* reset the signal to the new value */
        !           445:                        sigvals[args[0]] = args[1];
        !           446:                        /* actually do signal except don't reset SIGILL */
        !           447:                        if (args[0] != SIGILL) {
        !           448:                                if (args[1] == (int)SIG_DFL ||
        !           449:                                    args[1] & (int)SIG_IGN) {
        !           450:                                        if ((int)signal(args[0],args[1]) == -1)
        !           451:                                                i = -1;
        !           452:                                } else {
        !           453:                                        if ((int)signal(args[0],sigcatch) == -1)
        !           454:                                                i = -1;
        !           455:                                }
        !           456:                        }
        !           457:                } else
        !           458:                        i = -1;
        !           459:                break;
        !           460: 
        !           461:        case BRK:
        !           462:                /* brk is successful unless we run over the stack */
        !           463:                /* NB: this assumes register usage which need not be used */
        !           464:                i = 0;
        !           465:                if (args[0] >= regs[6])
        !           466:                        i = -1;
        !           467:                break;
        !           468: 
        !           469:        /*
        !           470:         * the next bunch are to cope with sys calls removed from 4.2
        !           471:         */
        !           472:        case TIME:
        !           473:                i = time(0);
        !           474:                break;
        !           475: 
        !           476:        case STIME: {
        !           477:                struct timeval tv;
        !           478: 
        !           479:                tv.tv_usec = 0;
        !           480:                tv.tv_sec = (args[0] & 0xffff) | ((args[1] & 0xffff) << 16);
        !           481:                i = settimeofday(&tv);
        !           482:                break;
        !           483:        }
        !           484: 
        !           485:        case NICE:
        !           486:                i = nice(args[0]);
        !           487:                break;
        !           488: 
        !           489: #ifdef V7UNIX
        !           490:        case ALARM:
        !           491:                i = alarm(args[0]);
        !           492:                break;
        !           493: 
        !           494:        case PAUSE:
        !           495:                i = pause();
        !           496:                break;
        !           497: 
        !           498:        case UTIME:
        !           499:                i = utime(args[0], args[1]);
        !           500:                break;
        !           501: 
        !           502:        case FTIME:
        !           503:                i = ftime(&timeb);
        !           504:                timeb.time = longrev(timeb.time);
        !           505:                bcopy(&timeb, args[0], sizeof timeb - 2);
        !           506:                break;
        !           507: 
        !           508:        case IOCTL:
        !           509:                args[1] = mapioctl(args[1]);
        !           510:                if (args[1] == 0)
        !           511:                        i = -1;
        !           512:                else
        !           513:                        i = ioctl(args[0], args[1], args[2]);
        !           514:                break;
        !           515: #endif
        !           516: 
        !           517: #ifdef V6UNIX
        !           518:        case PWBSYS:
        !           519:                /* ignore pwbsys for now */
        !           520:                switch (args[2]) {
        !           521:                case UNAME:
        !           522: #ifdef TRACE
        !           523:                        fprintf(stderr,"UNAME with %d %d\n",args[0],args[1]);
        !           524: #endif
        !           525:                        strcpy(args[0],"pwbname");
        !           526:                        i = 0;
        !           527:                        break;
        !           528: 
        !           529:                case UDATA:
        !           530: #ifdef TRACE
        !           531:                        fprintf(stderr,"UDATA with %d %d\n",args[0],args[1]);
        !           532: #endif
        !           533:                        i = 0;
        !           534:                        break;
        !           535: 
        !           536:                case USTAT:
        !           537: fprintf(stderr,"USTAT with %d %d\n",args[0],args[1]);
        !           538:                        i = 0;
        !           539:                        break;
        !           540: 
        !           541:                case UTIME:
        !           542: fprintf(stderr,"UTIME with %d %d\n",args[0],args[1]);
        !           543:                        i = 0;
        !           544:                        break;
        !           545:                default:
        !           546: fprintf(stderr,"bad PWBSYS %d\n",args[3]);
        !           547:                        i = -1;
        !           548:                        break;
        !           549:                }
        !           550:                break;
        !           551: #endif
        !           552: 
        !           553:        default:
        !           554:                /*
        !           555:                 *      Many sys calls are easily done here since most
        !           556:                 *      system call codes are the same on version 6 and 7 UNIX
        !           557:                 *      as they are here.
        !           558:                 */
        !           559:                i = syscall(code,args[0],args[1],args[2],args[3],args[4]);
        !           560: #ifdef V6UNIX
        !           561:                /* allow read write access to created files for (IDIS v6 mod) */
        !           562:                if (code==CREAT) {
        !           563:                        /* get actual file mode after create */
        !           564:                        fstat(i, &stat32v);
        !           565:                        close(i);
        !           566:                        /* ensure read/write access to owner */
        !           567:                        chmod(args[0], 0644);
        !           568:                        i = open(args[0], 2);
        !           569:                        /* change mode back the way it was */
        !           570:                        chmod(args[0], stat32v.st_mode);
        !           571:                }
        !           572: #endif
        !           573:                break;
        !           574:        }
        !           575: #ifdef TRACE
        !           576:        fprintf(stderr," sys val -> 0%o\n",i);
        !           577: #endif
        !           578:        /* set carry bit if sys error */
        !           579:        if (i == -1)
        !           580:                psl |= CARRY;
        !           581:        /* if not an indirect sys call, adjust the pc */
        !           582:        if (indirflg == 0)
        !           583:                pc = argp;
        !           584:        /* do alternate return on one side of fork */
        !           585:        if (code == FORK && i != 0)
        !           586:                pc++;
        !           587:        /* do the various return value formats */
        !           588:        switch (sysargs[code][2]) {
        !           589:        case NORMRET:
        !           590:                /* normal case only one return value in r0 */
        !           591:                regs[0] = i;
        !           592:                break;
        !           593:        case LONGRET:
        !           594:                /* return a long in r0 - r1 as in time */
        !           595:                regs[1] = i;
        !           596:                regs[0] = i >> 16;
        !           597:                break;
        !           598:        case TWORET:
        !           599:                /* return two ints in r0 - r1 as in pipe */
        !           600:                if (i == -1)
        !           601:                        regs[0] = i;
        !           602:                else {
        !           603:                        regs[1] = args[1];
        !           604:                        regs[0] = args[0];
        !           605:                }
        !           606:                break;
        !           607:        }
        !           608:        if (i== -1)
        !           609:                regs[0] = errno;
        !           610: }
        !           611: 
        !           612: long
        !           613: longrev(l)
        !           614:        long l;
        !           615: {
        !           616:        /* function to reverse the halves of a long */
        !           617:        union {
        !           618:                long    lng;
        !           619:                short   s[2];
        !           620:        } u;
        !           621:        register short t;
        !           622:        u.lng = l;
        !           623:        t = u.s[0];
        !           624:        u.s[0] = u.s[1];
        !           625:        u.s[1] = t;
        !           626:        return(u.lng);
        !           627: }
        !           628: 
        !           629: /*
        !           630:  * Note: these tables are sorted by
        !           631:  * ioctl "code" (in ascending order).
        !           632:  */
        !           633: int fctls[] = { FIOCLEX, FIONCLEX, FIOASYNC, FIONBIO, FIONREAD, 0 };
        !           634: int tctls[] = {
        !           635:        TIOCGETD, TIOCSETD, TIOCHPCL, TIOCMODG, TIOCMODS,
        !           636:        TIOCGETP, TIOCSETP, TIOCSETN, TIOCEXCL, TIOCNXCL,
        !           637:        TIOCFLUSH,TIOCSETC, TIOCGETC, TIOCREMOTE,TIOCMGET,
        !           638:        TIOCMBIC, TIOCMBIS, TIOCMSET, TIOCSTART,TIOCSTOP,
        !           639:        TIOCPKT,  TIOCNOTTY,TIOCSTI,  TIOCOUTQ, TIOCGLTC,
        !           640:        TIOCSLTC, TIOCSPGRP,TIOCGPGRP,TIOCCDTR, TIOCSDTR,
        !           641:        TIOCCBRK, TIOCSBRK, TIOCLGET, TIOCLSET, TIOCLBIC,
        !           642:        TIOCLBIS, 0
        !           643: };
        !           644: 
        !           645: /*
        !           646:  * Map an old style ioctl command to new.
        !           647:  */
        !           648: mapioctl(cmd)
        !           649:        int cmd;
        !           650: {
        !           651:        register int *map, c;
        !           652: 
        !           653:        switch ((cmd >> 8) & 0xff) {
        !           654: 
        !           655:        case 'f':
        !           656:                map = fctls;
        !           657:                break;
        !           658: 
        !           659:        case 't':
        !           660:                map = tctls;
        !           661:                break;
        !           662: 
        !           663:        default:
        !           664:                return (0);
        !           665:        }
        !           666:        while ((c = *map) && (c&0xff) < (cmd&0xff))
        !           667:                map++;
        !           668:        if (c && (c&0xff) == (cmd&0xff))
        !           669:                return (c);
        !           670:        return (0);
        !           671: }

unix.superglobalmegacorp.com

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