BSD 4_4 release
[unix-history] / usr / src / sys / tests / netccitt / xi_sink.c
index 453ed1e..0833ee7 100644 (file)
@@ -2,7 +2,33 @@
  * Copyright (c) 1988, 1991 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1988, 1991 The Regents of the University of California.
  * All rights reserved.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
@@ -12,7 +38,7 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)xi_sink.c  7.4 (Berkeley) %G%";
+static char sccsid[] = "@(#)xi_sink.c  7.6 (Berkeley) 7/15/91";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -33,8 +59,13 @@ static char sccsid[] = "@(#)xi_sink.c        7.4 (Berkeley) %G%";
 
 
 #define dbprintf if(verbose)printf
 
 
 #define dbprintf if(verbose)printf
+#ifdef __STDC__
+#define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,#a,x);\
+               if(x<0) {perror(#a); myexit(0);}}
+#else
 #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
                if(x<0) {perror("a"); myexit(0);}}
 #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
                if(x<0) {perror("a"); myexit(0);}}
+#endif
 
 
 struct  ifreq ifr;
 
 
 struct  ifreq ifr;
@@ -43,8 +74,9 @@ struct  sockaddr_x25 faddr, laddr = { sizeof(laddr), AF_CCITT };
 struct  sockaddr_x25 *sx25 = &laddr;
 char **xenvp;
 
 struct  sockaddr_x25 *sx25 = &laddr;
 char **xenvp;
 
-long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0;
-long records, intercept = 0, isode_mode;
+long size, count = 10, forkp, echop = 0, mynamep, verbose = 1, playtag = 0;
+long records, intercept = 0, confp;
+void savedata();
 
 char buf[2048];
 char your_it[] = "You're it!";
 
 char buf[2048];
 char your_it[] = "You're it!";
@@ -78,16 +110,13 @@ char *envp[];
                        intercept++;
                }
        }
                        intercept++;
                }
        }
-       tisink();
+       xisink();
 }
 #define BIG 2048
 #define MIDLIN 512
 char readbuf[BIG];
 }
 #define BIG 2048
 #define MIDLIN 512
 char readbuf[BIG];
-struct iovec iov[1] = {
-       readbuf,
-       sizeof readbuf,
-};
 char name[MIDLIN];
 char name[MIDLIN];
+struct iovec iov[1];
 union {
     struct {
            struct cmsghdr      cmhdr;
 union {
     struct {
            struct cmsghdr      cmhdr;
@@ -97,13 +126,12 @@ union {
 } cbuf;
 #define control cbuf.data
 struct msghdr msghdr = {
 } cbuf;
 #define control cbuf.data
 struct msghdr msghdr = {
-       name, sizeof(name),
+       0, 0,
        iov, sizeof(iov)/sizeof(iov[1]),
        iov, sizeof(iov)/sizeof(iov[1]),
-       control, sizeof control,
-       0 /* flags */
+       0, 0, 0
 };
 
 };
 
-tisink()
+xisink()
 {
        int x, s, pid, on = 1, loop = 0, n;
        extern int errno;
 {
        int x, s, pid, on = 1, loop = 0, n;
        extern int errno;
@@ -123,12 +151,13 @@ tisink()
                int addrlen = sizeof(faddr);
                char childname[50];
 
                int addrlen = sizeof(faddr);
                char childname[50];
 
-               try (accept, (s, &faddr, &addrlen), "");
+               try (accept, (s, (struct sockaddr *)&faddr, &addrlen), "");
                ns = x;
                dumpit("connection from:", &faddr, sizeof faddr);
                if (mynamep || intercept) {
                        addrlen = sizeof(faddr);
                ns = x;
                dumpit("connection from:", &faddr, sizeof faddr);
                if (mynamep || intercept) {
                        addrlen = sizeof(faddr);
-                       try (getsockname, (ns, &faddr, &addrlen), "");
+                       try (getsockname, (ns, (struct sockaddr *)&faddr,
+                               &addrlen), "");
                        dumpit("connected as:", &faddr, addrlen);
                }
                loop++;
                        dumpit("connected as:", &faddr, addrlen);
                }
                loop++;
@@ -140,19 +169,11 @@ tisink()
                if (x == 0)  {
                    long n, count = 0, cn, flags;
                    records = 0;
                if (x == 0)  {
                    long n, count = 0, cn, flags;
                    records = 0;
-#ifdef ISODE_MODE
-                   if (isode_mode) {
-                       static char fdbuf[10];
-                       static char *nargv[4] =
-                           {"/usr/sbin/isod.tsap", fdbuf, "", 0};
-                       sprintf(fdbuf, "Z%d", ns);
-                       old_isod_main(3, nargv, xenvp);
-                   } else
-#endif
                    for (;;) {
                    for (;;) {
-                       msghdr.msg_iovlen = 1;
                        msghdr.msg_controllen = sizeof(control);
                        msghdr.msg_controllen = sizeof(control);
+                       msghdr.msg_control = control;
                        iov->iov_len = sizeof(readbuf);
                        iov->iov_len = sizeof(readbuf);
+                       iov->iov_base = readbuf;
                        n = recvmsg(ns, &msghdr, 0);
                        flags = msghdr.msg_flags;
                        count++;
                        n = recvmsg(ns, &msghdr, 0);
                        flags = msghdr.msg_flags;
                        count++;
@@ -171,16 +192,13 @@ tisink()
                                if (verbose)
                                        dumpit("data:\n", readbuf, n);
                        }
                                if (verbose)
                                        dumpit("data:\n", readbuf, n);
                        }
-                       if (echop) {
-                               n = answerback(flags, n, ns);
-                       }
+                       if (echop)
+                               savedata(n);
                        if (flags & MSG_EOR)
                                records++;
                        if (flags & MSG_EOR)
                                records++;
-                       if (playtag && n == sizeof(your_it) && (flags & MSG_EOR)
-                           && bcmp(readbuf, your_it, n) == 0) {
-                               printf("Answering back!!!!\n");
-                               answerback(flags, n, ns);
-                               answerback(flags, n, ns);
+                       if (echop && (readbuf[0] & 0x80)) {
+                               dbprintf("Answering back!!!!\n");
+                               answerback(ns);
                        }
                        errno = 0;
                    }
                        }
                        errno = 0;
                    }
@@ -188,14 +206,40 @@ tisink()
                myexit(0);
        }
 }
                myexit(0);
        }
 }
-answerback(flags, n, ns)
+
+struct savebuf {
+       struct savebuf *s_next;
+       struct savebuf *s_prev;
+       int     s_n;
+       int     s_flags;
+} savebuf = {&savebuf, &savebuf};
+
+void
+savedata(n)
+int n;
 {
 {
+       register struct savebuf *s = (struct savebuf *)malloc(n + sizeof *s);
+       if (s == 0)
+               return;
+       insque(s, savebuf.s_prev);
+       s->s_n = n;
+       s->s_flags = msghdr.msg_flags;
+       bcopy(readbuf, (char *)(s + 1), n);
+}
+
+answerback(ns)
+{
+       int n;
+       register struct savebuf *s = savebuf.s_next, *t;
        msghdr.msg_controllen = 0;
        msghdr.msg_controllen = 0;
-       msghdr.msg_iovlen = 1;
-       iov->iov_len = n;
-       n = sendmsg(ns, &msghdr, flags);
-       dbprintf("echoed %d\n", n);
-       return n;
+       msghdr.msg_control = 0;
+       while (s != &savebuf) {
+               iov->iov_len = s->s_n;
+               iov->iov_base = (char *)(s + 1);
+               n = sendmsg(ns, &msghdr, s->s_flags);
+               dbprintf("echoed %d\n", n);
+               t = s; s = s->s_next; remque(t); free((char *)t);
+       }
 }
 
 dumpit(what, where, n)
 }
 
 dumpit(what, where, n)