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

unix.superglobalmegacorp.com

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