Annotation of researchv9/jtools/src/pads/host/remote.c, revision 1.1.1.1

1.1       root        1: #include <pads.pri>
                      2: #include <CC/sys/types.h>
                      3: #include <sgtty.h>
                      4: 
                      5: void Remote::checkproto(int p)         { if( get()!=p ) err();                 }
                      6: void Remote::put(char c)               { writebuffer[pktbase + pktsize++] = c; }
                      7: void Remote::proto(int p)              { put( p ); }
                      8: 
                      9: long Remote::rcvlong()                 { return (long)  shiftin( P_LONG  );    }
                     10: short Remote::rcvshort()               { return (short) shiftin( P_SHORT );    }
                     11: unsigned char Remote::rcvuchar()       { return (unsigned char) shiftin(P_UCHAR); }
                     12: 
                     13: void Remote::sendlong(long  x)         { shiftout( P_LONG, x );         }
                     14: void Remote::sendshort(short x)                { shiftout( P_SHORT, (long) x ); }
                     15: void Remote::senduchar(unsigned char x)        { shiftout( P_UCHAR, (long) x ); }
                     16: 
                     17: void Remote::pktstart(char c)          { if( pktsize ) err(); put(c);  }
                     18: void Remote::pktflush()                        { writesize = 0; pktend();      }
                     19: 
                     20: #define ADDRBITS  24
                     21: #define ALIGNBITS 2
                     22: #define OIDBITS   (32-(ADDRBITS-ALIGNBITS))
                     23: #define MASK(n)         ((1<<n)-1)
                     24: void Remote::sendobj(PadRcv *o)
                     25: {
                     26:        if( !o ){
                     27:                sendlong(0);
                     28:                return;
                     29:        }
                     30:        long l = (long) o;
                     31:        if( l & (~MASK(ADDRBITS)^MASK(ALIGNBITS)) ) abort();
                     32:        sendlong( (l<<(OIDBITS-ALIGNBITS)) | (o->oid&MASK(OIDBITS)) );
                     33: }
                     34: 
                     35: PadRcv *Remote::rcvobj()
                     36: {
                     37:        register long o = rcvlong(), a;
                     38:        a = o >> (OIDBITS-ALIGNBITS);
                     39:        a &= MASK(ADDRBITS)&~MASK(ALIGNBITS);
                     40:        PadRcv *obj = (PadRcv*) a;
                     41:        if( obj && (obj->oid&MASK(OIDBITS)) != (o&MASK(OIDBITS)) )
                     42:                obj = 0;
                     43:        return obj;
                     44: }
                     45: 
                     46: void Remote::err(char *e)
                     47: {
                     48:        if( !e ) e = "host/term protocol error";
                     49:        write(fd, e, strlen(e));
                     50: }
                     51: 
                     52: Remote::Remote(int opened)
                     53: {
                     54:        fd = opened;
                     55:        pktsize = writesize = pktbase = 0;
                     56: }
                     57: 
                     58: Remote::Remote(char *dev)
                     59: {
                     60:        struct sgttyb tty;
                     61: 
                     62:        fd = open(dev, 2);
                     63:        pktsize = writesize = pktbase = 0;
                     64: 
                     65:        trace( "%d.Remote(%d,%d)", this, in, out );
                     66:        if( ioctl(fd, TIOCGETP, &tty) ) err("tty ioctl: GETP failed");
                     67:        tty.sg_flags = (tty.sg_flags|CBREAK|RAW) & ~ECHO;
                     68:        if( ioctl(fd, TIOCSETP, &tty) ) err("tty ioctl: SETP failed");
                     69:        trace( "sg_flags=0x%X", tty.sg_flags );
                     70:        if( ioctl(fd, TIOCEXCL, 0)  ) err("tty ioctl: EXCL failed");
                     71: }
                     72: 
                     73: void Remote::share()
                     74: {
                     75:        trace( "%d.share()", this, );
                     76:        if( ioctl(fd, TIOCNXCL, 0)  ) err("tty ioctl: NXCL failed");
                     77: }      
                     78: 
                     79: long Remote::shiftin(register int bytes)
                     80: {
                     81:        register long shifter = 0;
                     82: 
                     83:        checkproto( bytes );
                     84:        while( bytes-- ) shifter = (shifter<<8) + (get()&0xFF);
                     85:        return shifter;
                     86: }
                     87: 
                     88: void Remote::shiftout( register bytes, register long shifter )
                     89: {
                     90:        proto( bytes );
                     91:        do { put( (char)(shifter>>( (--bytes)*8 )) ); } while( bytes );
                     92: }
                     93: 
                     94: long BytesToTerm;
                     95: void Remote::pktend()
                     96: {
                     97:        if( pktsize<=0 ) err();
                     98:        pktbase += pktsize;
                     99:        if( pktbase > writesize ){
                    100:                if( write(fd, (char*)writebuffer, pktbase) != pktbase ) abort();
                    101:                BytesToTerm += pktbase;
                    102:                pktbase = 0;
                    103:                writesize = 768;
                    104:        }
                    105:        pktsize = 0;
                    106: }
                    107: 
                    108: char *Remote::rcvstring( char *s0 )
                    109: {
                    110:        register char *s = s0;
                    111:        register unsigned char len;
                    112: 
                    113:        checkproto( P_STRING );
                    114:        len = rcvuchar();
                    115:        if( !s0 ) s = s0 = new char [len+1];
                    116:        while( len-->0 ) *s++ = get();
                    117:        *s = '\0';
                    118:        return s0;
                    119: }
                    120: 
                    121: void Remote::sendstring(register char *s)
                    122: {
                    123:        int len;
                    124: 
                    125:        proto( P_STRING );
                    126:        len =  strlen(s);
                    127:        if( len > 255 ) len = 255;
                    128:        senduchar( len );
                    129:        while( len-- ) put(*s++); 
                    130: }
                    131: 
                    132: long BytesFromTerm;
                    133: int Remote::get()
                    134: {
                    135:        char c;
                    136:        if( pktsize!=0 || read(fd, &c, 1)!=1 ) err();
                    137:        ++BytesFromTerm;
                    138:        return c;
                    139: }

unix.superglobalmegacorp.com

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