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