Annotation of researchv8dc/sys/chncp/chutil.c, revision 1.1.1.1

1.1       root        1: #include "../chunix/chsys.h"
                      2: #include "../chunix/chconf.h"
                      3: #define CHDEFINE
                      4: #include "../chaos/chaos.h"
                      5: #undef CHDEFINE
                      6: 
                      7: /*
                      8:  * Miscellaneous utility routines - notice the CHDEFINE is turned on here
                      9:  * and only here.
                     10:  */
                     11: 
                     12: /*
                     13:  * Allocate a connection and return it, also allocating a slot in Chconntab
                     14:  */
                     15: struct connection *
                     16: allconn()
                     17: {
                     18:        register struct connection *conn;
                     19:        register struct connection **cptr;
                     20:        static int uniq;
                     21: 
                     22:        if ((conn = connalloc()) == NOCONN) {
                     23:                debug(DCONN|DABNOR,printf("Conn: alloc failed (packet)\n"));
                     24:                Chaos_error = CHNOPKT;
                     25:                return(NOCONN);
                     26:        }
                     27:        for(cptr = &Chconntab[0]; cptr != &Chconntab[CHNCONNS]; cptr++) {
                     28:                if(*cptr != NOCONN) continue;
                     29:                *cptr = conn;
                     30:                clear((char *)conn, sizeof(struct connection));
                     31:                conn->cn_ltidx = cptr - &Chconntab[0];
                     32:                if (++uniq == 0)
                     33:                        uniq = 1;
                     34:                conn->cn_luniq = uniq;
                     35:                debug(DCONN,printf("Conn: alloc #%x\n", conn->cn_lidx));
                     36:                return(conn);
                     37:        }
                     38:        ch_free((char *)conn);
                     39:        Chaos_error = CHNOCONN;
                     40:        debug(DCONN|DABNOR,printf("Conn: alloc failed (table)\n"));
                     41:        return(NOCONN);
                     42: }
                     43: /*
                     44:  * Make a connection closed with given state, at interrupt time.
                     45:  * Queue the given packet on the input queue for the user.
                     46:  */
                     47: clsconn(conn, state, pkt)
                     48: register struct connection *conn;
                     49: register struct packet *pkt;
                     50: {
                     51:        freelist(conn->cn_thead);
                     52:        conn->cn_thead = conn->cn_ttail = NOPKT;
                     53:        conn->cn_state = state;
                     54:        debug(DCONN|DABNOR, printf("Conn #%x: CLOSED: state: %d\n",
                     55:                conn->cn_lidx, state));
                     56:        if (pkt != NOPKT) {
                     57:                pkt->pk_next = NOPKT;
                     58:                if (conn->cn_rhead != NOPKT)
                     59:                        conn->cn_rtail->pk_next = pkt;
                     60:                else
                     61:                        conn->cn_rhead = pkt;
                     62:                conn->cn_rtail = pkt;
                     63:        }
                     64:        NEWSTATE(conn);
                     65: }
                     66:        
                     67: /*
                     68:  * Release a connection - freeing all associated storage.
                     69:  * This removes all trace of the connection.
                     70:  * Always called from top level at low priority.
                     71:  */
                     72: rlsconn(conn)
                     73: register struct connection *conn;
                     74: {
                     75:        Chconntab[conn->cn_ltidx] = NOCONN;
                     76:        freelist(conn->cn_routorder);
                     77:        freelist(conn->cn_rhead);
                     78:        freelist(conn->cn_thead);
                     79: #ifdef CHSTRCODE
                     80:        if (conn->cn_toutput != NOPKT)
                     81:                ch_free((char *)conn->cn_toutput);
                     82: #endif
                     83:        debug(DCONN,printf("Conn: release #%x\n", conn->cn_lidx));
                     84:        ch_free((char *)conn);
                     85: }
                     86: /*
                     87:  * Free a list of packets
                     88:  */
                     89: freelist(pkt)
                     90: register struct packet *pkt;
                     91: {
                     92:        register struct packet *opkt;
                     93: 
                     94:        while ((opkt = pkt) != NOPKT) {
                     95:                pkt = pkt->pk_next;
                     96:                ch_free((char *)opkt);
                     97:        }
                     98: }
                     99: 
                    100: /*
                    101:  * Fill a packet with a string, returning packet because it may reallocate
                    102:  * Assumes we are called from interrupt level (high priority).
                    103:  * If the pkt argument is NOPKT then allocate a packet here.
                    104:  * The string is null terminated and may be shorter than "len".
                    105:  */
                    106: struct packet *
                    107: pktstr(pkt, str, len)
                    108: struct packet *pkt;
                    109: register char *str;
                    110: register len;
                    111: {
                    112:        struct packet *npkt;
                    113:        register char *odata;
                    114: 
                    115:        if (pkt == NOPKT || ch_size((char *)pkt) < CHHEADSIZE + len ) {
                    116:                if ((npkt = pkalloc(len, 1)) == NOPKT)
                    117:                        return(NOPKT);
                    118:                if (pkt != NOPKT) {
                    119:                        pkt->pk_len = 0;
                    120:                        movepkt(pkt, npkt);
                    121:                        ch_free((char *)pkt);
                    122:                }
                    123:                pkt = npkt;
                    124:        }
                    125:        odata = pkt->pk_cdata;
                    126:        pkt->pk_len = len;
                    127:        if (len) do *odata++ = *str; while (*str++ && --len);
                    128:        return(pkt);
                    129: }
                    130: /*
                    131:  * Zero out n bytes - this should be somewhere else, probably provided
                    132:  * by the implementation.
                    133:  */
                    134: clear(ptr, n)
                    135: register char *ptr;
                    136: register int n;
                    137: {
                    138:        if (n)
                    139:                do {
                    140:                        *ptr++ = 0;
                    141:                } while (--n);
                    142: }
                    143: /*
                    144:  * Move contents of opkt to npkt
                    145:  */
                    146: movepkt(opkt, npkt)
                    147: struct packet *opkt, *npkt;
                    148: {
                    149:        register short *nptr, *optr, n;
                    150: 
                    151:        n = (CHHEADSIZE + opkt->pk_len + sizeof(short) - 1) / sizeof(short);
                    152:        nptr = (short *)npkt;
                    153:        optr = (short *)opkt;
                    154:        do {
                    155:                *nptr++ = *optr++;
                    156:        } while (--n);
                    157: }
                    158: /*
                    159:  * Move n bytes - should probably be elsewhere.
                    160:  * Can we replace this with a movc3?
                    161:  */
                    162: chmove(from, to, n)
                    163: register char *from, *to;
                    164: register int n;
                    165: {
                    166:        if (n)
                    167:                do *to++ = *from++; while(--n);
                    168: }
                    169: /*
                    170:  * Set packet fields from connection, many routines count on the fact that
                    171:  * this routine clears pk_type and pk_next
                    172:  */
                    173: setpkt(conn, pkt)
                    174: register struct connection *conn;
                    175: register struct packet *pkt;
                    176: {
                    177:        pkt->pk_daddr = conn->cn_faddr;
                    178:        pkt->pk_didx = conn->cn_fidx;
                    179:        pkt->pk_saddr = Chmyaddr;
                    180:        pkt->pk_sidx = conn->cn_lidx;
                    181:        pkt->pk_type = 0;
                    182:        pkt->pk_next = NOPKT;
                    183:        pkt->pk_fc = 0;
                    184: }
                    185: #ifdef pdp11
                    186: /*
                    187:  * Swap the word of n longs.
                    188:  */
                    189: swaplong(lp, n)
                    190: register short *lp;
                    191: register int n;
                    192: {
                    193:        register short temp;
                    194: 
                    195:        if (n)
                    196:                do {
                    197:                        temp = *lp++;
                    198:                        lp[-1] = *lp;
                    199:                        *lp++ = temp;
                    200:                } while (--n);
                    201: }

unix.superglobalmegacorp.com

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