|
|
1.1 root 1: #include <sys/param.h>
2: #include <sys/uio.h>
3: #include <sys/socket.h>
4: #include <sys/ioctl.h>
5: #include <net/route.h>
6: #include <net/if.h>
7: #define TCPT_NTIMERS 4
8: #include <netiso/iso.h>
9: #include <netiso/tp_param.h>
10: #include <netiso/tp_user.h>
11:
12: #include <stdio.h>
13: #include <errno.h>
14: #include <ctype.h>
15: #include <netdb.h>
16:
17:
18: #define dbprintf if(verbose)printf
19: #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
20: if(x<0) {perror("a"); myexit(0);}}
21:
22:
23: struct ifreq ifr;
24: short port = 128;
25: struct sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO };
26: struct sockaddr_iso *siso = &laddr;
27:
28: long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 1;
29: long records;
30:
31: char buf[2048];
32: char your_it[] = "You're it!";
33:
34: char *Servername;
35:
36: main(argc, argv, envp)
37: int argc;
38: char *argv[];
39: char **envp;
40: {
41: register char **av = argv;
42: register char *cp;
43: struct iso_addr iso_addr();
44:
45: while(--argc > 0) {
46: av++;
47: if(strcmp(*av,"Servername")==0) {
48: av++;
49: Servername = *av;
50: argc--;
51: } else if (strcmp(*av,"host")==0) {
52: av++;
53: laddr.siso_addr = iso_addr(*av);
54: argc--;
55: } else if (strcmp(*av,"count")==0) {
56: av++;
57: sscanf(*av,"%ld",&count);
58: argc--;
59: } else if (strcmp(*av,"port")==0) {
60: av++;
61: sscanf(*av,"%hd",&port);
62: argc--;
63: } else if (strcmp(*av,"size")==0) {
64: av++;
65: sscanf(*av,"%ld",&size);
66: argc--;
67: }
68: }
69: if (Servername) {
70: int tlen = laddr.siso_tlen = strlen(Servername);
71: int len = TSEL(siso) + tlen - (caddr_t) &siso;
72: if (len > sizeof(*siso)) {
73: siso = (struct sockaddr_iso *)malloc(len);
74: *siso = laddr;
75: siso->siso_len = len;
76: }
77: bcopy(Servername, TSEL(siso), tlen);
78: } else {
79: laddr.siso_tlen = sizeof(port);
80: port = htons(port);
81: bcopy((char *)&port, TSEL(siso), sizeof(port));
82: }
83: tisink(envp);
84: }
85: #define BIG 2048
86: #define MIDLIN 512
87: char readbuf[BIG];
88: struct iovec iov[1] = {
89: readbuf,
90: sizeof readbuf,
91: };
92: char name[MIDLIN];
93: union {
94: struct {
95: struct cmsghdr cmhdr;
96: char cmdata[128 - sizeof(struct cmsghdr)];
97: } cm;
98: char data[128];
99: } cbuf;
100: #define control cbuf.data
101: struct msghdr msghdr = {
102: name, sizeof(name),
103: iov, sizeof(iov)/sizeof(iov[1]),
104: control, sizeof control,
105: 0 /* flags */
106: };
107:
108: tisink(envp)
109: char **envp;
110: {
111: int x, s, pid, on = 1, loop = 0, n;
112: extern int errno;
113:
114: try(socket, (AF_ISO, SOCK_SEQPACKET, 0),"");
115:
116: s = x;
117:
118: try(bind, (s, (struct sockaddr *) siso, siso->siso_len), "");
119:
120: /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
121:
122: try(listen, (s, 5), "");
123: for(;;) {
124: int child, ns;
125: int addrlen = sizeof(faddr);
126: char childname[50];
127:
128: try (accept, (s, &faddr, &addrlen), "");
129: ns = x;
130: dumpit("connection from:", &faddr, sizeof faddr);
131: if (mynamep) {
132: addrlen = sizeof(faddr);
133: try (getsockname, (ns, &faddr, &addrlen), "");
134: dumpit("connected as:", &faddr, addrlen);
135: }
136: loop++;
137: if(loop > 3) myexit(0);
138: if (forkp) {
139: try(fork, (), "");
140: } else
141: x = 0;
142: if (x == 0) {
143: long n, count = 0, cn, flags;
144: records = 0;
145: if (ns) {
146: char Zbuf[20];
147: static char *argv[] = {"/usr/sbin/isod.tsap",0,"",0};
148: sprintf(Zbuf, "Z%d", ns);
149: argv[1] = Zbuf;
150: old_isod_main(3, argv, envp);
151: exit(0);
152: }
153: if (confp) {
154: msghdr.msg_iovlen = 0;
155: msghdr.msg_namelen = 0;
156: msghdr.msg_controllen =
157: cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr);
158: cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT;
159: cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA;
160: n = sendmsg(ns, &msghdr, 0);
161: if (n <= 0) {
162: printf("confirm: errno is %d\n", errno);
163: fflush(stdout);
164: perror("Confirm error");
165: } else {
166: dbprintf("confim ok\n");
167: }
168: sleep(10);
169: }
170: for (;;) {
171: msghdr.msg_iovlen = 1;
172: msghdr.msg_controllen = sizeof(control);
173: iov->iov_len = sizeof(readbuf);
174: n = recvmsg(ns, &msghdr, 0);
175: flags = msghdr.msg_flags;
176: count++;
177: dbprintf("recvmsg from child %d got %d ctl %d flags %x\n",
178: getpid(), n, (cn = msghdr.msg_controllen),
179: flags);
180: fflush(stdout);
181: if (cn && verbose)
182: dumpit("control data:\n", control, cn);
183: if (n <= 0) {
184: fprintf(stderr, "errno is %d\n", errno);
185: perror("recvmsg");
186: /*sleep (10);*/
187: break;
188: } else {
189: if (verbose)
190: dumpit("data:\n", readbuf, n);
191: }
192: if (echop) {
193: n = answerback(flags, n, ns);
194: }
195: if (flags & MSG_EOR)
196: records++;
197: if (playtag && n == sizeof(your_it) && (flags & MSG_EOR)
198: && bcmp(readbuf, your_it, n) == 0) {
199: printf("Answering back!!!!\n");
200: answerback(flags, n, ns);
201: answerback(flags, n, ns);
202: }
203: errno = 0;
204: }
205: }
206: myexit(0);
207: }
208: }
209: answerback(flags, n, ns)
210: {
211: msghdr.msg_controllen = 0;
212: msghdr.msg_iovlen = 1;
213: iov->iov_len = n;
214: n = sendmsg(ns, &msghdr, flags);
215: dbprintf("echoed %d\n", n);
216: return n;
217: }
218:
219: dumpit(what, where, n)
220: char *what; unsigned short *where; int n;
221: {
222: unsigned short *s = where;
223: unsigned short *z = where + (n+1)/2;
224: int count = 0;
225: printf(what);
226: while(s < z) {
227: count++;
228: printf("%x ",*s++);
229: if ((count & 15) == 0)
230: putchar('\n');
231: }
232: if (count & 15)
233: putchar('\n');
234: fflush(stdout);
235: }
236: myexit(n)
237: {
238: fflush(stderr);
239: printf("got %d records\n", records);
240: fflush(stdout);
241: exit(n);
242: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.