Annotation of researchv9/jerq/src/32ld/32ld.c, revision 1.1.1.1

1.1       root        1: #define M32LD   "/bin/32reloc"
                      2: #define        BINARY_LOAD     0
                      3: #define        HEX_LOAD        1
                      4: int Loadtype = BINARY_LOAD;
                      5: 
                      6: /*
                      7:  *      MAC-32 (down)loader
                      8:  */
                      9: 
                     10: char    Usage[]         = "Usage: 32ld [-d] [-p] [-z] objectfile";
                     11:                /* also a [-l] flag, but the user never sees this */
                     12: char   *name;
                     13: 
                     14: /*
                     15:  * swapw        words must be swapped between host and MAC-32
                     16:  * swapb        bytes must be swapped between host and MAC-32
                     17:  */
                     18: #ifdef  pdp11
                     19: #define swapb   1
                     20: #define swapw   0
                     21: #endif
                     22: #ifdef  vax
                     23: #define swapb   1
                     24: #define swapw   1
                     25: #endif
                     26: #ifdef  u3b
                     27: #define swapb   0
                     28: #define swapw   0
                     29: #endif
                     30: #ifdef  u3b2
                     31: #define swapb   0
                     32: #define swapw   0
                     33: #endif
                     34: #ifdef  u3b5
                     35: #define swapb   0
                     36: #define swapw   0
                     37: #endif
                     38: #ifdef  mc68000
                     39: #define swapb   0
                     40: #define swapw   0
                     41: #endif
                     42: 
                     43: #include <sgtty.h>
                     44: #include "a.out.h"
                     45: #include "aouthdr.h"
                     46: #include "filehdr.h"
                     47: #include "scnhdr.h"
                     48: #include <stdio.h>
                     49: #include <errno.h>
                     50: #include <jioctl.h>
                     51: #include "proto.h"
                     52: #include <sys/types.h>
                     53: #include <sys/stat.h>
                     54: 
                     55: #define MAXRETRIES      10
                     56: #define SLEEPTIME       7
                     57: #define DATASIZE        512
                     58: 
                     59: #define NSECTS  12
                     60: 
                     61: #define MPX_VER 0x5620
                     62: #define FBOMAGIC 0560
                     63: #define SENDTERMID "\033[c"
                     64: #define TERM_1_0 "\033[?8;7;1c"
                     65: #define TERMB_1_0 "\033[?8;7;2c"
                     66: #define TERM_DMD "\033[?8;"
                     67: #define TERMIDSIZE 9
                     68: #define STR_EQUAL 0
                     69: 
                     70: struct filehdr fileheader;
                     71: struct aouthdr aoutheader;
                     72: struct scnhdr secthdrs[NSECTS];
                     73: char    *errname;       /* name of error file for m32ld */
                     74: 
                     75: #if vax | u3b | u3b2 | mc68000
                     76: struct sgttyb   ttysave,        /* save the state of tty */
                     77:                ttyraw;
                     78: struct ttydevb ttydsave, ttydraw;
                     79: #else
                     80: struct termio   ttysave,        /* save the state of tty */
                     81:                ttyraw;
                     82: #endif
                     83: int     obj;            /* File descriptor for object file */
                     84: int     mpx;            /* Running under mpx */
                     85: long    location;
                     86: char    file[128];      /* Name of file */
                     87: char    m32ld[128];     /* path name to m32ld command */
                     88: int     nargchars;      /* Number of characters, including nulls, in args */
                     89: long    longbuf[3];
                     90: int     debug;          /* Show sizes etc. */
                     91: int     psflag;         /* Print error detection statistics */
                     92: short   maxpktdsize;
                     93: int     rflag;          /* relocate? */
                     94: int     zflag;          /* Do a JZOMBOOT */
                     95: int     booted;
                     96: int     errfile;
                     97: int     retries;
                     98: int     open();
                     99: int     access();
                    100: char    *malloc();
                    101: 
                    102: char    Load_str[] = "\033[0;0v";               /* default download (binary & standalone*/
                    103: int     Layerflag = 0;
                    104: struct stat Statbuf, *Statptr;
                    105: 
                    106: short speeds[16]={
                    107:         1,     5,      7,      10,     13,     15,     20,     30,
                    108:        60,     120,    180,    240,    480,    960,    1920,   1
                    109: };
                    110: 
                    111: unsigned char sizes[16]={
                    112:         16,    16,     16,     16,     16,     16,     16,     16,
                    113:         16,    32,     32,     56,     56,     120,    60,     16
                    114: };
                    115: 
                    116: void    Psend();
                    117: void    Precv();
                    118: void   Write();
                    119: 
                    120: extern int      errno;
                    121: extern char *getenv();
                    122: 
                    123: timeout_id()
                    124: {
                    125:        error(0, "Error: can't identify terminal:\n\t not a 5620 terminal or 5620 failed to respond",
                    126:                (char *) 0);
                    127: }
                    128: 
                    129: main(argc, argv)
                    130: int argc;
                    131: register char *argv[];
                    132: {
                    133:        char    *dwnldflag;
                    134: 
                    135: #ifndef M32LD
                    136:        M32LD;          /* force a compile time error if undefined */
                    137: #endif
                    138:                        /* Start out by checking that download is going */
                    139:                        /* to a DMD with at least 1.1 firmware (not 1.0) */
                    140:        char termid[TERMIDSIZE+1];
                    141:        int lpindex;
                    142:        int count;
                    143:        char *strcpy(), *strcat();
                    144: 
                    145:        for (lpindex=0; lpindex<=TERMIDSIZE; lpindex++)
                    146:                termid[lpindex] = 0;
                    147: 
                    148:        (void)strcpy(m32ld, getenv("DMDSGS")? getenv("DMDSGS") : "/usr/jerq");
                    149:        (void)strcat(m32ld, M32LD);   /* attach tail of path to head */
                    150: 
                    151: #if vax | u3b | u3b2 | mc68000
                    152:        (void)ioctl(1, TIOCGETP, &ttysave); /* get the current state */
                    153:        if (ioctl(1, TIOCGDEV, &ttydsave) < 0) {
                    154:                ttydsave.ospeed = ttysave.sg_ospeed;
                    155:                ttydsave.ispeed = ttysave.sg_ispeed;
                    156:        }
                    157: #else
                    158:        (void)ioctl(1, TCGETA, &ttysave); /* get the current state */
                    159: #endif
                    160: 
                    161:        name = *argv;
                    162: 
                    163:        while(argc>1 && argv[1][0]=='-'){
                    164:                switch(argv[1][1]){
                    165:                case 'd':
                    166:                        debug++;
                    167:                        break;
                    168:                case 'e':
                    169:                        printf("-e flag no longer used: always assumed\n");
                    170:                        break;
                    171:                case 'p':
                    172:                        psflag++;
                    173:                        break;
                    174:                case 'z':
                    175:                        zflag++;
                    176:                        break;
                    177:                case 'l':
                    178:                        Layerflag++;
                    179:                        break;
                    180:                case '\0':
                    181:                        break;
                    182:                default:
                    183:                        error(0, Usage, (char *)0);
                    184:                        return 1;
                    185:                }
                    186:                argv++; argc--;
                    187:        }
                    188:        if(argc<2){
                    189:                error(0, Usage, (char *)0);
                    190:                return 2;
                    191:        }
                    192: 
                    193:        /*
                    194:         * see what type of download is expected
                    195:         */
                    196:        if(((dwnldflag = getenv("DMDLOAD")) != NULL) && (dwnldflag[0] != NULL)) {
                    197:                if(strcmp(dwnldflag, "hex") == 0)
                    198:                        Loadtype = HEX_LOAD;
                    199:                else
                    200:                        Loadtype = BINARY_LOAD;
                    201:        }
                    202:        Load_str[4] = Loadtype + '0';
                    203: 
                    204: 
                    205: #if vax | u3b | u3b2 | mc68000
                    206:        ttyraw = ttysave;
                    207:        ttydraw = ttydsave;
                    208:        ttyraw.sg_flags |= RAW;
                    209:        ttydraw.flags |= F8BIT;
                    210:        (void)ioctl(1, TIOCSETP, &ttyraw);
                    211:        (void)ioctl(1, TIOCSDEV, &ttydraw);
                    212: #else
                    213:        ttyraw.c_iflag = IGNBRK;
                    214:        ttyraw.c_cflag = (ttysave.c_cflag & CBAUD) | (ttysave.c_cflag & CLOCAL) | CS8 | CREAD;
                    215:        ttyraw.c_cc[VMIN] = 1;
                    216:        (void)ioctl(1, TCSETAW, &ttyraw);
                    217: #endif
                    218:        mpx = (ioctl(1, JMUX, 0) > -1);
                    219:        if ( !mpx )
                    220:        {
                    221: 
                    222:                /* make sure we've got the correct rom */
                    223:                write(1,SENDTERMID,strlen(SENDTERMID));
                    224:                count = 0;
                    225:                while(count < TERMIDSIZE){
                    226:                        lpindex = read(0,&termid[count],TERMIDSIZE); 
                    227:                        if(lpindex <= 0)
                    228:                                error(1, "read error", (char *)0);
                    229:                        count += lpindex;
                    230:                }
                    231:                if ((strcmp(termid,TERM_1_0) == STR_EQUAL) ||   /* equal strings */
                    232:                        (strcmp(termid,TERMB_1_0) == STR_EQUAL))
                    233:                        error(0,"Error: Firmware not updated to 1.1 or greater\n",
                    234:                                (char *) 0);
                    235:                if (strncmp(termid,TERM_DMD,strlen(TERM_DMD)) != STR_EQUAL)
                    236:                        error(0, "Error: 32ld must be run on a 5620 terminal\n",
                    237:                                (char *) 0);
                    238:        } else {
                    239: 
                    240:                /* load sequence for mux is shorter */
                    241:                Load_str[3] = '\0';
                    242:        }
                    243: 
                    244:        if(jpath(argv[1], access, 4)!=0)
                    245:                error(1, "no such file '%s'", argv[1]);
                    246: 
                    247:        Statptr= &Statbuf;
                    248:        stat(argv[1], Statptr);
                    249:        if(Layerflag && (Statbuf.st_size == 0)) {
                    250:                Load_str[2] = '2';
                    251:                realwrite(Load_str, 6);
                    252:                goto cleanup;
                    253:        }
                    254: 
                    255:        obj=jpath(argv[1], open, 0);
                    256:        if(obj<0)
                    257:                error(1, "cannot open '%s'", file);
                    258: 
                    259:        Read (&fileheader, sizeof(struct filehdr));
                    260:        if(fileheader.f_magic!=FBOMAGIC)        /* FBOMAGIC is 0560 */
                    261:                error(0, "'%s' is not a MAC-32 a.out", file);
                    262:        Read (&aoutheader, fileheader.f_opthdr);
                    263: 
                    264:        if (fileheader.f_nscns > NSECTS)
                    265:                error(0,"32ld: exceeded max number of sections -- see system administrator");
                    266:        if((aoutheader.vstamp==MPX_VER) ^ mpx)  /* MPX_VER is 0x5620 */
                    267:                error(0, mpx? "'%s' compiled stand-alone": "'%s' compiled for mpx", file);
                    268: 
                    269:        if(((aoutheader.tsize + aoutheader.dsize + aoutheader.bsize) == 0) && Layerflag) {
                    270:                Load_str[2] = '2';
                    271:                realwrite(Load_str, mpx ? 3 : 6);
                    272:                goto cleanup;
                    273:        }
                    274:        if(Layerflag) {
                    275:                /*
                    276:                * if it got here then we want to download layers with a patch
                    277:                */
                    278:                Load_str[2] = '1';
                    279:        }
                    280: 
                    281:        if(boot() && rflag==0)
                    282:                rflag++;
                    283:        if(!mpx){
                    284: #if vax | u3b | u3b2 | mc68000
                    285:                maxpktdsize = min(sizes[ttydsave.ospeed & 017], (long)MAXPKTDSIZE);
                    286:                pinit(speeds[ttydsave.ospeed & 017], maxpktdsize, ACKON);
                    287: #else
                    288:                maxpktdsize = min(sizes[ttysave.c_cflag&CBAUD], (long)MAXPKTDSIZE);
                    289:                pinit(speeds[ttysave.c_cflag&CBAUD], maxpktdsize, ACKON);
                    290: #endif
                    291:        }
                    292: 
                    293:        load(argv[1], argc-1, argv+1);
                    294:        if(!mpx){       /* ACKON is always true */
                    295:                buzz();
                    296:                (void)ioctl(0, TIOCFLUSH, (struct termio *)0);
                    297:        }
                    298:        (void)ioctl(1, TIOCNXCL, 0);
                    299: cleanup:
                    300: #if vax | u3b | u3b2 | mc68000
                    301:        (void)ioctl(1, TIOCSETP, &ttysave);
                    302:        (void)ioctl(1, TIOCSDEV, &ttydsave);
                    303: #else
                    304:        (void)ioctl(1, TCSETAW, &ttysave);
                    305: #endif
                    306: 
                    307:        if(psflag)
                    308:                pstats(stderr);
                    309:        return(0);
                    310: }
                    311: 
                    312: 
                    313: char *
                    314: bldargs(argc, argv)
                    315:        char *argv[];
                    316: {
                    317:        register i;
                    318:        register char *argp, *p, *q;
                    319:        for(nargchars=0, i=0; i<argc; i++)
                    320:                nargchars+=strlen(argv[i])+1;
                    321:        if((argp=malloc(nargchars))==0)
                    322:                error("can't allocate argument chars", "");
                    323:        /* this loop is probably not necessary, but it's safe */
                    324:        for(i=0, q=argp; i<argc; i++){
                    325:                p=argv[i];
                    326:                do; while(*q++ = *p++);
                    327:        }
                    328:        return argp;
                    329: }
                    330: 
                    331: 
                    332: load(f, argc, argv)
                    333:        char *f;
                    334:        char *argv[];
                    335: {
                    336:        char *argp;
                    337:        long largc;
                    338:        int i;
                    339:        if(mpx){
                    340:                argp=bldargs(argc, argv);
                    341:                largc=argc;
                    342:                writeswap((char *)&largc, 4);   /* number of arguments */
                    343:                largc=nargchars;
                    344:                writeswap((char *)&largc, 4);   /* number of chars in arguments */
                    345:                writeswap((char *)&aoutheader.tsize, 12);
                    346:        }
                    347: 
                    348:        if(rflag)
                    349:                relocate();
                    350:        else
                    351:                location = aoutheader.entry;
                    352:        if(mpx)
                    353:                Write(argp, nargchars);
                    354:        for (i = 0; i < fileheader.f_nscns; ++i)     /* read section header array */
                    355:                Read (&secthdrs[i], sizeof(struct scnhdr));
                    356: 
                    357:        if(debug){
                    358:                fprintf(stderr, "%s:\nSection:\taddr:\tsize:\n", file);
                    359:                for ( i = 0; i < fileheader.f_nscns; ++i)
                    360:                        fprintf(stderr,"%s\t\t0x%lx\t0x%lx\n",
                    361:                        secthdrs[i].s_name,secthdrs[i].s_paddr,secthdrs[i].s_size);
                    362:                buzz();
                    363:        }
                    364:        sendfile();
                    365:        if(!mpx){
                    366:                long    startaddr;
                    367: 
                    368:                retries = 0;
                    369:                while(freepkts != NPBUFS)
                    370:                        Precv();
                    371:                location = aoutheader.entry;
                    372:                swaw(&location, &startaddr, PKTASIZE);
                    373:                psend((char *)&startaddr, PKTASIZE);
                    374:                retries = 0;
                    375:                while(freepkts != NPBUFS)
                    376:                        Precv();
                    377:        }
                    378: }
                    379: 
                    380: jpath(f, fn, a)
                    381:        register char *f;
                    382:        register int (*fn)();
                    383: {
                    384:        char *getenv(), *strcpy();
                    385:        register char *jp, *p;
                    386:        register o;
                    387:        if (*f != '/' && strncmp(f, "./", 2) && strncmp(f, "../", 3) && 
                    388:            (jp=getenv("JPATH"))!=0){
                    389:                while(*jp){
                    390:                        for(p=file; *jp && *jp!=':'; p++,jp++)
                    391:                                *p= *jp;
                    392:                        if(p!=file)
                    393:                                *p++='/';
                    394:                        if(*jp)
                    395:                                jp++;
                    396:                        (void)strcpy(p, f);
                    397:                        if((o=(*fn)(file, a))!=-1)
                    398:                                return o;
                    399:                }
                    400:        }
                    401:        return((*fn)(strcpy(file, f), a));
                    402: }
                    403: 
                    404: error(pflag, s1, s2)
                    405:        char *s1, *s2;
                    406: {
                    407:        long flushval = 0L;
                    408:        register int    n;
                    409:        register int    saverrno;
                    410:        char            buf[BUFSIZ];
                    411:        extern int      errno;
                    412: 
                    413:        saverrno = errno;
                    414:        if(booted){
                    415:                if (mpx)                /* tell dmd side to give up */
                    416:                        (void)ioctl(1, JTERM, 0);
                    417:                else
                    418:                {
                    419:                        psend((char *)(&flushval),sizeof(long));        
                    420:                }
                    421:                if(errfile>0){
                    422:                        buzz();
                    423:                        while((n=read(errfile, buf, sizeof buf))>0)
                    424:                                write(2, buf, n);
                    425:                        unlink(errname);
                    426:                }
                    427:        }
                    428:        (void)ioctl(1, TIOCNXCL, 0);
                    429: #if vax | u3b | u3b2 | mc68000
                    430:        (void)ioctl(1, TIOCSETP, &ttysave);
                    431:        (void)ioctl(1, TIOCSDEV, &ttydsave);
                    432: #else
                    433:        (void)ioctl(1, TCSETAW, &ttysave);
                    434: #endif
                    435:        if(pflag){
                    436:                errno=saverrno;
                    437:                perror(s2);
                    438:        }
                    439:        fprintf(stderr, "%s: ", name);
                    440:        fprintf(stderr, s1, s2);
                    441:        fprintf(stderr, "\n");
                    442:        if(psflag)
                    443:                pstats(stderr);
                    444:        exit(1);
                    445: }
                    446: int
                    447: Read(a, n)
                    448:        char *a;
                    449: {
                    450:        register i;
                    451:        i=read(obj, a, n);
                    452:        if(i<0)
                    453:                error(1, "read error on '%s'", file);
                    454:        return(i);
                    455: }
                    456: void
                    457: Write(a, n)
                    458:        char *a;
                    459: {
                    460:        if(realwrite(a, n)!=n)
                    461:                error(1, "write error to jerq", (char *)0);
                    462:        if(psflag && !mpx)
                    463:                trace(a);
                    464: }
                    465: writeswap(a, n)
                    466:        char *a;
                    467: {
                    468:        char buf1[DATASIZE+PKTASIZE], buf2[DATASIZE+PKTASIZE];
                    469:        swaw(a, buf1, n);
                    470:        swab(buf1, buf2, n);
                    471:        Write(buf2, n);
                    472: }
                    473: trace(a)
                    474:        char *a;
                    475: {
                    476:        register int    i;
                    477: 
                    478:        for(i=0; i<(PKTHDRSIZE+PKTASIZE); i++)
                    479:                fprintf(stderr, "<%o>", a[i]&0xff);
                    480:        fprintf(stderr, "\n");
                    481: }
                    482: 
                    483: sendfile()
                    484: {
                    485:        register int i;
                    486:        for ( i = 0; i<fileheader.f_nscns; ++i) {
                    487:                if(secthdrs[i].s_scnptr > 0)  {
                    488:                        if ((secthdrs[i].s_flags & STYP_NOLOAD) ||
                    489:                            (secthdrs[i].s_flags & STYP_DSECT))
                    490:                                continue;
                    491:                        lseek(obj,secthdrs[i].s_scnptr,0);
                    492:                        sendseg(secthdrs[i].s_paddr,secthdrs[i].s_paddr+secthdrs[i].s_size);
                    493:                }
                    494:        }
                    495: }
                    496: 
                    497: sendseg(strloc,endloc)
                    498: long strloc;
                    499: long endloc;
                    500: {
                    501:        char buf[DATASIZE+PKTASIZE], buf2[DATASIZE];
                    502:        char tmpbuf[DATASIZE+PKTASIZE];
                    503:        register n;
                    504:        while((n=Read(&buf[PKTASIZE], min(!mpx?maxpktdsize:DATASIZE, endloc-strloc)))>0){
                    505:                if(mpx){
                    506:        /*              swab(&buf[PKTASIZE], buf2, n); NOT RITE with m32 sgs*/
                    507:                        Write(&buf[PKTASIZE], n);
                    508:                }else{
                    509:                        swab(&buf[PKTASIZE], &tmpbuf[PKTASIZE], n);
                    510:                        swaw((short *)&strloc, (short *)&tmpbuf[0], PKTASIZE);
                    511:                        Psend(tmpbuf, n+PKTASIZE);
                    512:                }
                    513:                strloc+=n;
                    514:        }
                    515: }
                    516: void
                    517: Psend(bufp, count)
                    518:        char *bufp;
                    519:        int count;
                    520: {
                    521:        retries = 0;
                    522:        while(freepkts == 0)
                    523:                Precv();
                    524:        psend(bufp, count);
                    525: }
                    526: void
                    527: Precv()
                    528: {
                    529:        char c;
                    530: 
                    531:        alarm(3);               /* sleep at least 2 seconds */
                    532:        if(realread(&c, 1) == 1){
                    533:                alarm(0);
                    534:                if(psflag)
                    535:                        fprintf(stderr, "recv <%o>\n", c&0xff);
                    536:                precv(c);
                    537:        }else if(errno != EINTR )
                    538:                error(1, "read error", (char *)0);
                    539:        else if(++retries >= MAXRETRIES)
                    540:                error(0, "load protocol failed", (char *)0);
                    541:        else if(psflag)
                    542:                        fprintf(stderr, "recv timeout.. retries=%d\n",retries);
                    543: }
                    544: 
                    545: min(a, b)
                    546:        long b; /* not your average min() */
                    547: {
                    548:        return(a<b? a : (int)b);
                    549: }
                    550: 
                    551: swab(a, b, n)
                    552:        register char *a, *b;
                    553:        register n;
                    554: {
                    555: #       if(swapb)
                    556:        register char *s, *t;
                    557:        n/=2;   /* n in bytes */
                    558:        s=b+1;
                    559:        t=b;
                    560:        while(n--){
                    561:                *s= *a++;
                    562:                *t= *a++;
                    563:                s+=2;
                    564:                t+=2;
                    565:        }
                    566: #       else
                    567:        while(n--)
                    568:                *b++= *a++;
                    569: #       endif
                    570: }
                    571: 
                    572: swaw(a, b, n)
                    573:        register short *a, *b;
                    574:        register n;
                    575: {
                    576: #       if(swapw)
                    577:        register short *s, *t;
                    578:        n/=4;   /* n in bytes */
                    579:        s=b+1;
                    580:        t=b;
                    581:        while(n--){
                    582:                *s= *a++;
                    583:                *t= *a++;
                    584:                s+=2;
                    585:                t+=2;
                    586:        }
                    587: #       else
                    588:        n>>=1;
                    589:        while(n--)
                    590:                *b++= *a++;
                    591: #       endif
                    592: }
                    593: relocate(){
                    594:        long address;
                    595:        char buf[200];
                    596:        char *mktemp();
                    597:        long caddress;
                    598:        register i;
                    599:        register char *p=(char *)&address;
                    600:        char    *tmpname;       /* name of temporary file for reloc */
                    601:        for(i=0; i<4; i++)
                    602:                read(0, p++, 1);
                    603:        (void)ioctl(1, TIOCEXCL, 0);    /* must be here so PUSHLD can work in mux */
                    604:        swab(&address, &caddress, 4);
                    605:        swaw(&caddress, &address, 4);
                    606:        location=address;
                    607:        if(location==0)
                    608:                error(0, "no memory in terminal", (char *)0);
                    609:        sprintf(buf, "%s -b %lx %s >%s 2>%s", m32ld, location, file,
                    610:                tmpname=mktemp("/tmp/32XXXXXX"),
                    611:                errname=mktemp("/tmp/32EXXXXXX"));
                    612:        if(system(buf)){
                    613:                errfile=open(errname, 0);
                    614:                if (!debug)
                    615:                        unlink(tmpname);
                    616:                unlink(errname);
                    617:                error(0, "reloc errors", (char *)0);
                    618:        }
                    619:        close(obj);
                    620:        unlink(errname);
                    621:        obj=open(tmpname, 0);
                    622:        if(obj<0)       /* HELP!! */
                    623:                error(1, "tmp file vanished! (%s)", tmpname);
                    624:        if (!debug)
                    625:                unlink (tmpname);
                    626:        Read (&fileheader, sizeof(struct filehdr));
                    627:        Read (&aoutheader, fileheader.f_opthdr);
                    628: }
                    629: 
                    630: boot(){
                    631:        char c = 0;
                    632: 
                    633:        if(mpx){
                    634:                (void)ioctl(0, TIOCFLUSH, 0);      /* throw away type-ahead! */
                    635:                (void)ioctl(1, zflag?JZOMBOOT:JBOOT, 0);
                    636:        }else{
                    637:                write(1, Load_str,6);   /* esc sequence for download */
                    638:                while(c != 'a' && c != 1)
                    639:                        read(0, &c, 1); /* wait for terminal to be ready */
                    640:        }
                    641:        booted++;
                    642:        return mpx;
                    643: }
                    644: 
                    645: buzz(){
                    646:        /* sleep for a time >~0.5 sec; nice if we had nap! */
                    647:        sleep(2);       /* sleep(1) not necessarily long enough */
                    648: }
                    649: 
                    650: /*
                    651: * This routine is the lowest level write routine to the dmd.  It provides a 
                    652: * simple way to implement a safer download protocol through networks. 
                    653: * This requires that a shell varariable will be set if this extra precaution
                    654: * is to be taken.
                    655: */
                    656: 
                    657: realwrite(a,n)
                    658: char *a;
                    659: {
                    660:        char cbuf[(MAXPKTSIZE + PKTASIZE) * 2], c;
                    661:        int i, j, maxsize;
                    662: 
                    663:        if((Loadtype == BINARY_LOAD) || mpx){
                    664:                return(write(1,a,n));
                    665:        }
                    666:        else {
                    667:                /*
                    668:                * do a hex load
                    669:                */
                    670:                j = n;
                    671:                maxsize = ((MAXPKTSIZE + PKTASIZE) / 2);
                    672:                for(i = 0;i < n*2; i++){
                    673:                        c = *a++;
                    674:                        cbuf[i]=(c & 0xf) | 0x40;
                    675:                        cbuf[++i]=((c >> 4) & 0xf) | 0x40;
                    676:                }
                    677:                i = 0;
                    678:                while(n > 0) {
                    679:                        if(n > maxsize) {
                    680:                                if(write(1, &cbuf[i*maxsize*2], maxsize*2) != maxsize*2)
                    681:                                        return(-1);
                    682:                                n -= maxsize;
                    683:                                i++;
                    684:                        }
                    685:                        else {
                    686:                                if(write(1, &cbuf[i*maxsize*2], n*2) != n*2)
                    687:                                        return(-1);
                    688:                                n=0;    /* last buffer so don't loop anymore */
                    689:                        }               
                    690:                }
                    691:                return(j); /* all correct so return number of actual characters sent */
                    692:        }
                    693: }
                    694: 
                    695: realread(a, n)
                    696: char *a;
                    697: {
                    698:        char    cbuf[2];
                    699:        int     i;
                    700: 
                    701:        if((Loadtype == BINARY_LOAD) || mpx){
                    702:                return(read(0, a, n));
                    703:        }
                    704:        else {
                    705:                for(i = 0; i < n ; i++) {
                    706:                        if(read(0, cbuf, 2) != 2)
                    707:                                return(-1);
                    708:                        *a++ = (cbuf[0] & 0xf) | ((cbuf[1] & 0xf) << 4);
                    709:                }
                    710:                return(n);
                    711:        }
                    712: }

unix.superglobalmegacorp.com

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