Home | History | Annotate | Line # | Download | only in compat
      1  1.2    itojun /*	$NetBSD: uipc_syscalls_43.c,v 1.2 2002/02/21 07:38:20 itojun Exp $	*/
      2  1.1  jdolecek 
      3  1.1  jdolecek /*
      4  1.1  jdolecek  * This is regression test for COMPAT_43 code. Tested 4.3 syscalls are:
      5  1.1  jdolecek  * - getsockname(2), getpeername(2)
      6  1.1  jdolecek  * - recv(2), recvfrom(2), recvmsg(2)
      7  1.1  jdolecek  * - send(2), sendmsg(2)
      8  1.1  jdolecek  *
      9  1.1  jdolecek  * This program uses inetd echo service. You need to configure
     10  1.1  jdolecek  * inetd to provide echo for both tcp and udp in order to run
     11  1.1  jdolecek  * this program successfully, and adjust 'echoserver' to IP address
     12  1.1  jdolecek  * of the machine running the service.
     13  1.1  jdolecek  *
     14  1.1  jdolecek  * Public domain. Do whatever you please with this. Jaromir Dolecek
     15  1.1  jdolecek  */
     16  1.1  jdolecek 
     17  1.1  jdolecek #include <sys/syscall.h>
     18  1.1  jdolecek #include <unistd.h>
     19  1.1  jdolecek #include <err.h>
     20  1.1  jdolecek #include <sys/types.h>
     21  1.1  jdolecek #include <netinet/in.h>
     22  1.1  jdolecek #include <sys/un.h>
     23  1.1  jdolecek #include <sys/socket.h>
     24  1.1  jdolecek #include <sys/uio.h>
     25  1.1  jdolecek 
     26  1.1  jdolecek const char *unixd = "unixdomain";
     27  1.1  jdolecek const char *echoserver = "127.0.0.1";
     28  1.1  jdolecek const char *localhost = "127.0.0.1";
     29  1.1  jdolecek const int echoport = 7;
     30  1.1  jdolecek 
     31  1.1  jdolecek int
     32  1.1  jdolecek main()
     33  1.1  jdolecek {
     34  1.1  jdolecek 	int s, descr;
     35  1.1  jdolecek 	socklen_t sz;
     36  1.1  jdolecek 	struct sockaddr_in sa;
     37  1.1  jdolecek 	struct sockaddr_un sun;
     38  1.1  jdolecek 	struct osockaddr *osa = (struct osockaddr *) &sa;
     39  1.1  jdolecek 	struct omsghdr msg;
     40  1.1  jdolecek 	struct iovec iov;
     41  1.1  jdolecek 	char buf[10];
     42  1.1  jdolecek 
     43  1.1  jdolecek 	/*
     44  1.1  jdolecek 	 * TCP connection, test connect(2), bind(2), recv(2), send(2),
     45  1.1  jdolecek 	 * getsockname(2), getpeername(2).
     46  1.1  jdolecek 	 */
     47  1.1  jdolecek 	if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
     48  1.1  jdolecek 		err(1, "socket");
     49  1.1  jdolecek 
     50  1.1  jdolecek 	sa.sin_addr.s_addr = inet_addr(echoserver);
     51  1.1  jdolecek 	sa.sin_port = htons(echoport);
     52  1.1  jdolecek 	osa->sa_family = AF_INET;
     53  1.1  jdolecek 	if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0)
     54  1.1  jdolecek 		err(1, "connect");
     55  1.1  jdolecek 
     56  1.1  jdolecek 	/* ogetpeername */
     57  1.1  jdolecek 	sz = sizeof(sa);
     58  1.1  jdolecek 	memset(&sa, '\0', sizeof(sa));
     59  1.1  jdolecek 	if (syscall(SYS_compat_43_ogetpeername, s, (struct sockaddr *) &sa, &sz))
     60  1.1  jdolecek 		err(1, "getpeername");
     61  1.1  jdolecek 
     62  1.1  jdolecek 	printf("ogetpeername: sz %d:%d name %s port %d family %d\n",
     63  1.1  jdolecek 		sizeof(sa), sz,
     64  1.1  jdolecek 		inet_ntoa(sa.sin_addr),
     65  1.1  jdolecek 		ntohs(sa.sin_port),
     66  1.1  jdolecek 		osa->sa_family);
     67  1.1  jdolecek 
     68  1.1  jdolecek 	/* ogetsockname */
     69  1.1  jdolecek 	sz = sizeof(sa);
     70  1.1  jdolecek 	memset(&sa, '\0', sizeof(sa));
     71  1.1  jdolecek 	if (syscall(SYS_compat_43_ogetsockname, s, (struct sockaddr *) &sa, &sz))
     72  1.1  jdolecek 		err(1, "getsockname");
     73  1.1  jdolecek 
     74  1.1  jdolecek 	printf("osockname: sz %d:%d name %s port %d family %d\n",
     75  1.1  jdolecek 		sizeof(sa), sz,
     76  1.1  jdolecek 		inet_ntoa(sa.sin_addr),
     77  1.1  jdolecek 		ntohs(sa.sin_port),
     78  1.1  jdolecek 		osa->sa_family);
     79  1.1  jdolecek 
     80  1.1  jdolecek 	/* osend */
     81  1.1  jdolecek 	if (syscall(SYS_compat_43_osend, s, "fobj", 4, 0) < 0)
     82  1.1  jdolecek 		err(1, "osend");
     83  1.1  jdolecek 
     84  1.1  jdolecek 	/* orecv */
     85  1.1  jdolecek 	memset(buf, '\0', sizeof(buf));
     86  1.1  jdolecek 	if (syscall(SYS_compat_43_orecv, s, buf, sizeof(buf), 0) < 0)
     87  1.1  jdolecek 		err(1, "orecv");
     88  1.1  jdolecek 
     89  1.1  jdolecek 	printf("orecv: %s\n", buf);
     90  1.1  jdolecek 
     91  1.1  jdolecek 	shutdown(s, SHUT_RDWR);
     92  1.1  jdolecek 	close(s);
     93  1.1  jdolecek 
     94  1.1  jdolecek 	/* UDP connection, test sendto()/recvfrom() */
     95  1.1  jdolecek 
     96  1.1  jdolecek 	if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
     97  1.1  jdolecek 		err(1, "socket");
     98  1.1  jdolecek 
     99  1.1  jdolecek 	sa.sin_addr.s_addr = INADDR_ANY;
    100  1.1  jdolecek 	sa.sin_port = htons(65533);
    101  1.1  jdolecek 	osa->sa_family = AF_INET;
    102  1.1  jdolecek 	if (bind(s, (struct sockaddr *) &sa, sizeof(sa)))
    103  1.1  jdolecek 		err(1, "bind1");
    104  1.1  jdolecek 
    105  1.1  jdolecek 	/* ogetsockname */
    106  1.1  jdolecek 	sz = sizeof(sa);
    107  1.1  jdolecek 	memset(&sa, '\0', sizeof(sa));
    108  1.1  jdolecek 	if (syscall(SYS_compat_43_ogetsockname, s, (struct sockaddr *) &sa, &sz))
    109  1.1  jdolecek 		err(1, "getsockname");
    110  1.1  jdolecek 
    111  1.1  jdolecek 	printf("osockname2: sz %d:%d name %s port %d family %d\n",
    112  1.1  jdolecek 		sizeof(sa), sz,
    113  1.1  jdolecek 		inet_ntoa(sa.sin_addr),
    114  1.1  jdolecek 		ntohs(sa.sin_port),
    115  1.1  jdolecek 		osa->sa_family);
    116  1.1  jdolecek 
    117  1.1  jdolecek 	sa.sin_addr.s_addr = inet_addr(echoserver);
    118  1.1  jdolecek 	sa.sin_port = htons(echoport);
    119  1.1  jdolecek 	osa->sa_family = AF_INET;
    120  1.1  jdolecek 	/* common sendto(2) - not versioned */
    121  1.1  jdolecek 	if (sendto(s, "fob2", 4, 0, (struct sockaddr *) &sa, sizeof(sa)) < 0)
    122  1.1  jdolecek 		err(1, "sendto");
    123  1.1  jdolecek 
    124  1.1  jdolecek 	/* orecvfrom */
    125  1.1  jdolecek 	memset(buf, '\0', sizeof(buf));
    126  1.1  jdolecek 	memset(&sa, '\0', sizeof(sa));
    127  1.1  jdolecek 	sz = sizeof(sa);
    128  1.1  jdolecek 	if (syscall(SYS_compat_43_orecvfrom, s, buf, sizeof(buf), 0, (struct osockaddr *) &sa, &sz) < 0)
    129  1.1  jdolecek 		err(1, "orecvfrom");
    130  1.1  jdolecek 	printf("orecvfrom: '%s' sz %d:%d name %s port %d family %d\n",
    131  1.1  jdolecek 		buf,
    132  1.1  jdolecek 		sizeof(sa), sz,
    133  1.1  jdolecek 		inet_ntoa(sa.sin_addr),
    134  1.1  jdolecek 		ntohs(sa.sin_port),
    135  1.1  jdolecek 		osa->sa_family);
    136  1.1  jdolecek 
    137  1.1  jdolecek 	shutdown(s, SHUT_RDWR);
    138  1.1  jdolecek 	close(s);
    139  1.1  jdolecek 
    140  1.1  jdolecek 	/* UDP connection, test sendmsg()/recvmsg() */
    141  1.1  jdolecek 
    142  1.1  jdolecek 	if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    143  1.1  jdolecek 		err(1, "socket");
    144  1.1  jdolecek 
    145  1.1  jdolecek 	sa.sin_addr.s_addr = INADDR_ANY;
    146  1.1  jdolecek 	sa.sin_port = htons(65533);
    147  1.1  jdolecek 	osa->sa_family = AF_INET;
    148  1.1  jdolecek 	if (bind(s, (struct sockaddr *) &sa, sizeof(sa)))
    149  1.1  jdolecek 		err(1, "bind2");
    150  1.1  jdolecek 
    151  1.1  jdolecek 	sa.sin_addr.s_addr = inet_addr(echoserver);
    152  1.1  jdolecek 	sa.sin_port = htons(echoport);
    153  1.1  jdolecek 	osa->sa_family = AF_INET;
    154  1.1  jdolecek 	memset(&msg, '\0', sizeof(msg));
    155  1.1  jdolecek 	msg.msg_name = (void *) &sa;
    156  1.1  jdolecek 	msg.msg_namelen = sizeof(sa);
    157  1.1  jdolecek 	iov.iov_base = "fob3";
    158  1.1  jdolecek 	iov.iov_len = 4;
    159  1.1  jdolecek 	msg.msg_iov = &iov;
    160  1.1  jdolecek 	msg.msg_iovlen = 1;
    161  1.1  jdolecek 	/* osendmsg */
    162  1.1  jdolecek 	if (syscall(SYS_compat_43_osendmsg, s, &msg, 0) < 0)
    163  1.1  jdolecek 		err(1, "osendmsg");
    164  1.1  jdolecek 
    165  1.1  jdolecek 	/* orecvmsg */
    166  1.1  jdolecek 	memset(&sa, '\0', sizeof(sa));
    167  1.1  jdolecek 	iov.iov_base = buf;
    168  1.1  jdolecek 	iov.iov_len = sizeof(buf);
    169  1.1  jdolecek 	if (syscall(SYS_compat_43_orecvmsg, s, &msg, 0) < 0)
    170  1.1  jdolecek 		err(1, "orecvmsg");
    171  1.1  jdolecek 
    172  1.1  jdolecek 	printf("orecvmsg: '%s' sz %d:%d name %s port %d family %d\n",
    173  1.1  jdolecek 		buf,
    174  1.1  jdolecek 		sizeof(sa), msg.msg_namelen,
    175  1.1  jdolecek 		inet_ntoa(sa.sin_addr),
    176  1.1  jdolecek 		ntohs(sa.sin_port),
    177  1.1  jdolecek 		osa->sa_family);
    178  1.1  jdolecek 
    179  1.1  jdolecek 	shutdown(s, SHUT_RDWR);
    180  1.1  jdolecek 	close(s);
    181  1.1  jdolecek 
    182  1.1  jdolecek 	/*
    183  1.1  jdolecek 	 * Local (unix domain) socket, test sendmsg()/recvmsg() with
    184  1.1  jdolecek 	 * accrights
    185  1.1  jdolecek 	 */
    186  1.1  jdolecek 
    187  1.1  jdolecek 	if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0)
    188  1.1  jdolecek 		err(1, "socket");
    189  1.1  jdolecek 
    190  1.1  jdolecek 	osa = (struct osockaddr *) &sun;
    191  1.1  jdolecek 	strcpy(sun.sun_path, unixd);
    192  1.1  jdolecek 	osa->sa_family = AF_LOCAL;
    193  1.1  jdolecek 	if (bind(s, (struct sockaddr *) &sun, SUN_LEN(&sun)))
    194  1.1  jdolecek 		err(1, "bind3");
    195  1.1  jdolecek 
    196  1.1  jdolecek 	/* osendmsg, old style descriptor passing */
    197  1.1  jdolecek 	memset(&msg, '\0', sizeof(msg));
    198  1.1  jdolecek 	msg.msg_name = (void *) &sun;
    199  1.1  jdolecek 	msg.msg_namelen = sizeof(sun);
    200  1.1  jdolecek 	iov.iov_base = "fob4";
    201  1.1  jdolecek 	iov.iov_len = 4;
    202  1.1  jdolecek 	msg.msg_iov = &iov;
    203  1.1  jdolecek 	msg.msg_iovlen = 1;
    204  1.1  jdolecek 	descr = s;
    205  1.1  jdolecek 	msg.msg_accrights = (caddr_t) &descr;
    206  1.1  jdolecek 	msg.msg_accrightslen = sizeof(int);
    207  1.1  jdolecek 	if (syscall(SYS_compat_43_osendmsg, s, &msg, 0) < 0) {
    208  1.1  jdolecek 		unlink(unixd);
    209  1.1  jdolecek 		err(1, "osendmsg");
    210  1.1  jdolecek 	}
    211  1.1  jdolecek 
    212  1.1  jdolecek 	memset(&sun, '\0', sizeof(sa));
    213  1.1  jdolecek 	iov.iov_base = buf;
    214  1.1  jdolecek 	iov.iov_len = sizeof(buf);
    215  1.1  jdolecek 	descr = -1;
    216  1.1  jdolecek 
    217  1.1  jdolecek 	/* orecvmsg */
    218  1.1  jdolecek 	if (syscall(SYS_compat_43_orecvmsg, s, &msg, 0) < 0) {
    219  1.1  jdolecek 		unlink(unixd);
    220  1.1  jdolecek 		err(1, "orecvmsg");
    221  1.1  jdolecek 	}
    222  1.1  jdolecek 
    223  1.1  jdolecek 	printf("orecvmsg: '%s' sz %d:%d name '%s' family %d descr %d\n",
    224  1.1  jdolecek 		buf,
    225  1.1  jdolecek 		sizeof(sun), msg.msg_namelen, sun.sun_path,
    226  1.1  jdolecek 		osa->sa_family, descr);
    227  1.1  jdolecek 
    228  1.1  jdolecek 	unlink(unixd);
    229  1.1  jdolecek 	close(s);
    230  1.1  jdolecek 	close(descr);
    231  1.1  jdolecek 
    232  1.1  jdolecek }
    233