Annotation of 43BSDReno/sys/netiso/tisrc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988, 1990 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution is only permitted until one year after the first shipment
                      6:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
                      7:  * binary forms are permitted provided that: (1) source distributions retain
                      8:  * this entire copyright notice and comment, and (2) distributions including
                      9:  * binaries display the following acknowledgement:  This product includes
                     10:  * software developed by the University of California, Berkeley and its
                     11:  * contributors'' in the documentation or other materials provided with the
                     12:  * distribution and in all advertising materials mentioning features or use
                     13:  * of this software.  Neither the name of the University nor the names of
                     14:  * its contributors may be used to endorse or promote products derived from
                     15:  * this software without specific prior written permission.
                     16:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     17:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     18:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     19:  */
                     20: #ifndef lint
                     21: static char sccsid[] = "@(#)tisrc.c    7.1 (Berkeley) 6/27/90";
                     22: #endif /* not lint */
                     23: 
                     24: /*
                     25:  * This is a test program to be a source for TP4 connections.
                     26:  */
                     27: #include <sys/types.h>
                     28: #include <sys/socket.h>
                     29: #include <sys/uio.h>
                     30: #include <sys/ioctl.h>
                     31: #include <net/route.h>
                     32: #include <net/if.h>
                     33: #define  TCPT_NTIMERS 4
                     34: #include <netiso/iso.h>
                     35: #include <netiso/tp_user.h>
                     36: 
                     37: #include <stdio.h>
                     38: #include <errno.h>
                     39: #include <ctype.h>
                     40: #include <netdb.h>
                     41: 
                     42: 
                     43: #define dbprintf if(verbose)printf
                     44: #define try(a,b,c) {x = (a b);dbprintf("%s%s returns %d\n",c,"a",x);\
                     45:                    if (x < 0) {perror("a"); exit(1);}}
                     46: 
                     47: struct iso_addr eon = {20, 0x47, 0, 6, 3, 0, 0, 0, 25 /*EGP for Berkeley*/};
                     48: struct  sockaddr_iso to_s = { sizeof(to_s), AF_ISO }, *to = &to_s;
                     49: fd_set readfds, writefds, exceptfds;
                     50: long size, count = 10;
                     51: int verbose = 1, selectp, type = SOCK_SEQPACKET, nobuffs, errno, playtag = 0;
                     52: int verify = 0;
                     53: short portnumber = 3000;
                     54: char your_it[] = "You're it!";
                     55: char *port, *conndata, data_msg[2048];
                     56: struct iovec iov[1] = {data_msg};
                     57: union {
                     58:     struct {
                     59:            struct cmsghdr      cmhdr;
                     60:            char                cmdata[128 - sizeof (struct cmsghdr)];
                     61:     } cm;
                     62:     char data[128];
                     63: } cm;
                     64: struct msghdr msg = { 0, 0, iov, 1, 0, 0, 0};
                     65: 
                     66: main(argc, argv)
                     67: int argc;
                     68: char *argv[];
                     69: {
                     70:        register char **av = argv;
                     71:        register char *cp;
                     72:        struct iso_addr iso_addr();
                     73:        u_long len;
                     74:        int handy;
                     75: 
                     76:        while(--argc > 0) {
                     77:                av++;
                     78:                if(strcmp(*av,"Servername")==0) {
                     79:                        av++;
                     80:                        port = *av;
                     81:                        argc--;
                     82:                } else if(strcmp(*av,"conndata")==0) {
                     83:                        av++;
                     84:                        conndata = *av;
                     85:                        argc--;
                     86:                } else if(strcmp(*av,"host")==0) {
                     87:                        av++;
                     88:                        to_s.siso_addr = iso_addr(*av);
                     89:                        argc--;
                     90:                } else if(strcmp(*av,"port")==0) {
                     91:                        av++;
                     92:                        sscanf(*av,"%hd",&portnumber);
                     93:                        argc--;
                     94:                } else if(strcmp(*av,"count")==0) {
                     95:                        av++;
                     96:                        sscanf(*av,"%ld",&count);
                     97:                        argc--;
                     98:                } else if(strcmp(*av,"size")==0) {
                     99:                        av++;
                    100:                        sscanf(*av,"%ld",&size);
                    101:                        iov->iov_len = size;
                    102:                } else if(strcmp(*av,"stream")==0) {
                    103:                        type = SOCK_STREAM;
                    104:                } else if (strcmp(*av,"eon") == 0) {
                    105:                        unsigned long l, inet_addr();
                    106: 
                    107:                        l = inet_addr(*++av); argc--;
                    108:                        to_s.siso_addr = eon;
                    109:                        bcopy((char *)&l, &to_s.siso_data[15], 4);
                    110:                }
                    111:        }
                    112:        if (port) {
                    113:                to_s.siso_tlen = strlen(port);
                    114:                len =  1 + to_s.siso_nlen + strlen(port)
                    115:                                + sizeof(*to) - sizeof(struct iso_addr);
                    116:                if (len > sizeof(*to)) {
                    117:                        to = (struct sockaddr_iso *)malloc(len);
                    118:                        bzero(to, len);
                    119:                        *to = to_s;
                    120:                        to->siso_len = len;
                    121:                }
                    122:                bcopy(port, TSEL(to), strlen(port));
                    123:        } else {
                    124:                to_s.siso_tlen = sizeof(portnumber);
                    125:                portnumber = htons(portnumber);
                    126:                bcopy((char *)&portnumber, TSEL(to), sizeof(portnumber));
                    127:        }
                    128: 
                    129:        tisrc();
                    130: }
                    131: 
                    132: tisrc() {
                    133:        int x, s, pid, on = 1, flags = 8, n;
                    134: 
                    135:        try(socket, (AF_ISO, type, 0),"");
                    136:        s = x;
                    137: 
                    138:        /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), "");*/
                    139: 
                    140:        if (conndata) doconndata(s);
                    141: 
                    142:        try(connect, (s, (struct sockaddr *) to, to->siso_len), "");
                    143: 
                    144:        if (selectp) {
                    145:                FD_ZERO(&writefds); FD_SET(s, &writefds);
                    146:                select(1, &writefds, 0, 0, 0);
                    147:        }
                    148:        while (count-- > 0) {
                    149:                if (size <= 0 && get_record(&flags) == EOF)
                    150:                        exit(0);
                    151:                n = put_record(s, flags);
                    152:                if (n < iov->iov_len) {
                    153:                        if (n==-1 && errno == 55) {
                    154:                                nobuffs++;
                    155:                                count++;
                    156:                                continue;
                    157:                        }
                    158:                        fprintf(stderr, "wrote %d < %d, count %d,",
                    159:                                                n, iov->iov_len, count);
                    160:                        perror("due to");
                    161:                }
                    162:        }
                    163:        if (playtag) {
                    164:                printf("Tag time!\n");
                    165:                iov->iov_base = your_it;
                    166:                iov->iov_len = sizeof your_it;
                    167:                sendmsg(s, &msg, MSG_EOR);
                    168:                sendmsg(s, &msg, MSG_EOR);
                    169:                iov->iov_base = data_msg;
                    170:                iov->iov_len = sizeof data_msg;
                    171:                try(recvmsg, (s, &msg, flags), " playtag ");
                    172:        }
                    173:        if(nobuffs) {
                    174:                printf("looped %d times waiting for bufs\n", nobuffs);
                    175:        }
                    176: }
                    177: int localsize;
                    178: char dupbuf[4096];
                    179: 
                    180: put_record(s, flags)
                    181: int s, flags;
                    182: {
                    183:        int fd, buflen;
                    184:        char *buf;
                    185:        struct sockaddr *to;
                    186:        int x, saved_x;
                    187: 
                    188:        msg.msg_flags = flags;
                    189:        if (verbose) {
                    190:                unsigned short *zp, *zlim;
                    191:                if (msg.msg_controllen) {
                    192:                        zp = (unsigned short *)&(cm.cm.cmhdr.cmsg_len);
                    193:                        printf("(CMessage Type is %x) ", cm.cm.cmhdr.cmsg_type);
                    194:                        printf("CMsg data: ");
                    195:                        x = msg.msg_controllen;
                    196:                        zlim = zp + ((x + 1) / 2);
                    197:                        while (zp < zlim) printf("%x ", *zp++);
                    198:                        putchar ('\n');
                    199:                }
                    200:                if (iov->iov_len) {
                    201:                        printf("sending: %s %s",
                    202:                        (flags & MSG_OOB ? "(OOB Data)" : ""),
                    203:                                (flags & MSG_EOR ? "(Record Mark)" : ""));
                    204:                        x = localsize;
                    205:                        zp = (unsigned short *)data_msg;
                    206:                        zlim = zp + ((x + 1) / 2);
                    207:                        while (zp < zlim) printf("%x ", *zp++);
                    208:                        putchar ('\n');
                    209:                }
                    210:        }
                    211:        if (verify) {
                    212:                buflen = iov->iov_len;
                    213:                bcopy(iov->iov_base, dupbuf, buflen);
                    214:        }
                    215:        try(sendmsg, (s, &msg, flags), " put_record ");
                    216:        saved_x = x;
                    217:        while (verify && buflen > 0) {
                    218:                iov->iov_len = buflen;
                    219:                iov->iov_base = dupbuf;
                    220:                try(recvmsg, (s, &msg, flags), " put_record ");
                    221:                printf("verify got %d\n", x);
                    222:                buflen -= x;
                    223:        }
                    224:        msg.msg_control = 0;
                    225:        return (saved_x);
                    226: }
                    227: int *datasize = &iov->iov_len;
                    228: char *cp, *cplim;
                    229: 
                    230: get_control_data(type)
                    231: {
                    232: 
                    233:        datasize = (int *)&msg.msg_controllen;
                    234:        cp = cm.cm.cmdata;
                    235:        cplim = cp + sizeof(cm.cm.cmdata);
                    236:        cm.cm.cmhdr.cmsg_level = SOL_TRANSPORT;
                    237:        cm.cm.cmhdr.cmsg_type = type;
                    238:        msg.msg_control = cm.data;
                    239: }
                    240: 
                    241: doconndata(s)
                    242: {
                    243:        get_control_data(TPOPT_CONN_DATA);
                    244:        *datasize = strlen(conndata) + sizeof(cm.cm.cmhdr);
                    245:        cm.cm.cmhdr.cmsg_len = *datasize;
                    246:        bcopy(conndata, cp, *datasize);
                    247:        put_record(s, 0);
                    248: }
                    249: 
                    250: 
                    251: 
                    252: get_record(flags)
                    253: int *flags;
                    254: {
                    255:        int factor = 1, x = 0;
                    256:        char workbuf[10240];
                    257: 
                    258:        *flags = 0;
                    259:        *datasize = 0;
                    260:        datasize = &iov->iov_len;
                    261:        cp = data_msg;
                    262:        cplim  = cp + sizeof(data_msg);
                    263: 
                    264:        for(;;) {
                    265:                x = scanf("%s", workbuf);
                    266:                if (x == EOF)
                    267:                        break;
                    268:                if (strcmp(workbuf, "disc") == 0)
                    269:                        x = get_control_data(TPOPT_DISC_DATA);
                    270:                else if (strcmp(workbuf, "cfrm") == 0)
                    271:                        x = get_control_data(TPOPT_CFRM_DATA);
                    272:                else if (strcmp(workbuf, "oob") == 0)
                    273:                        *flags |= MSG_OOB;
                    274:                else if (strcmp(workbuf, "eom") == 0)
                    275:                        *flags |= MSG_EOR;
                    276:                else if (strcmp(workbuf, "factor") == 0) {
                    277:                        x = scanf("%d", &factor);
                    278:                        if (factor <= 0) factor = 1;
                    279:                        if (x == EOF)
                    280:                                break;
                    281:                } else {
                    282:                        int len = strlen(workbuf);
                    283:                        localsize = 0;
                    284:                        while ((factor-- > 0) &&
                    285:                               ((cp + len) < cplim)) {
                    286:                                        strcpy(cp, workbuf);
                    287:                                        cp += len;
                    288:                                        localsize += len;
                    289:                        }
                    290:                        *datasize = localsize;
                    291:                        if (datasize != &iov->iov_len) {
                    292:                                *datasize += sizeof(cm.cm.cmhdr);
                    293:                                cm.cm.cmhdr.cmsg_len = *datasize;
                    294:                        }
                    295:                        break;
                    296:                }
                    297:        }
                    298:        errno = 0;
                    299:        return (x);
                    300: }

unix.superglobalmegacorp.com

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