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