linux_socket.c revision 12858
1291716Sken/*- 2291716Sken * Copyright (c) 1995 S�ren Schmidt 3291716Sken * All rights reserved. 4291716Sken * 5291716Sken * Redistribution and use in source and binary forms, with or without 6291716Sken * modification, are permitted provided that the following conditions 7291716Sken * are met: 8291716Sken * 1. Redistributions of source code must retain the above copyright 9291716Sken * notice, this list of conditions and the following disclaimer 10291716Sken * in this position and unchanged. 11291716Sken * 2. Redistributions in binary form must reproduce the above copyright 12291716Sken * notice, this list of conditions and the following disclaimer in the 13291716Sken * documentation and/or other materials provided with the distribution. 14291716Sken * 3. The name of the author may not be used to endorse or promote products 15291716Sken * derived from this software withough specific prior written permission 16291716Sken * 17291716Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18291716Sken * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19291716Sken * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20291716Sken * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21291716Sken * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22291716Sken * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23291716Sken * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24291716Sken * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25291716Sken * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26291716Sken * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27291716Sken * 28291716Sken * $Id: linux_socket.c,v 1.2 1995/11/22 07:43:50 bde Exp $ 29291716Sken */ 30291716Sken 31291716Sken/* XXX we use functions that might not exist. */ 32291716Sken#define COMPAT_43 1 33291716Sken 34291716Sken#include <sys/param.h> 35291716Sken#include <sys/systm.h> 36291716Sken#include <sys/sysproto.h> 37291716Sken#include <sys/proc.h> 38291716Sken#include <sys/socket.h> 39291716Sken#include <sys/socketvar.h> 40291716Sken 41291716Sken#include <netinet/in.h> 42291716Sken 43291716Sken#include <i386/linux/linux.h> 44291716Sken#include <i386/linux/sysproto.h> 45291716Sken 46291716Skenstatic int 47291716Skenlinux_to_bsd_domain(int domain) 48291716Sken{ 49291716Sken switch (domain) { 50291716Sken case LINUX_AF_UNSPEC: 51291716Sken return AF_UNSPEC; 52291716Sken case LINUX_AF_UNIX: 53291716Sken return AF_LOCAL; 54291716Sken case LINUX_AF_INET: 55291716Sken return AF_INET; 56291716Sken case LINUX_AF_AX25: 57291716Sken return AF_CCITT; 58291716Sken case LINUX_AF_IPX: 59291716Sken return AF_IPX; 60291716Sken case LINUX_AF_APPLETALK: 61291716Sken return AF_APPLETALK; 62291716Sken default: 63291716Sken return -1; 64291716Sken } 65291716Sken} 66291716Sken 67291716Skenstatic int 68291716Skenlinux_to_bsd_sockopt_level(int level) 69291716Sken{ 70291716Sken switch (level) { 71291716Sken case LINUX_SOL_SOCKET: 72291716Sken return SOL_SOCKET; 73291716Sken default: 74291716Sken return level; 75291716Sken } 76291716Sken} 77291716Sken 78291716Skenstatic int linux_to_bsd_ip_sockopt(int opt) 79291716Sken{ 80291716Sken switch (opt) { 81291716Sken case LINUX_IP_TOS: 82291716Sken return IP_TOS; 83291716Sken case LINUX_IP_TTL: 84291716Sken return IP_TTL; 85291716Sken default: 86291716Sken return -1; 87291716Sken } 88291716Sken} 89291716Sken 90291716Skenstatic int 91291716Skenlinux_to_bsd_so_sockopt(int opt) 92291716Sken{ 93291716Sken switch (opt) { 94291716Sken case LINUX_SO_DEBUG: 95291716Sken return SO_DEBUG; 96291716Sken case LINUX_SO_REUSEADDR: 97291716Sken return SO_REUSEADDR; 98291716Sken case LINUX_SO_TYPE: 99291716Sken return SO_TYPE; 100291716Sken case LINUX_SO_ERROR: 101291716Sken return SO_ERROR; 102291716Sken case LINUX_SO_DONTROUTE: 103291716Sken return SO_DONTROUTE; 104291716Sken case LINUX_SO_BROADCAST: 105291716Sken return SO_BROADCAST; 106291716Sken case LINUX_SO_SNDBUF: 107291716Sken return SO_SNDBUF; 108291716Sken case LINUX_SO_RCVBUF: 109291716Sken return SO_RCVBUF; 110291716Sken case LINUX_SO_KEEPALIVE: 111291716Sken return SO_KEEPALIVE; 112291716Sken case LINUX_SO_OOBINLINE: 113291716Sken return SO_OOBINLINE; 114291716Sken case LINUX_SO_LINGER: 115291716Sken return SO_LINGER; 116291716Sken case LINUX_SO_PRIORITY: 117291716Sken case LINUX_SO_NO_CHECK: 118291716Sken default: 119291716Sken return -1; 120291716Sken } 121291716Sken} 122291716Sken 123291716Skenstruct linux_socket_args { 124291716Sken int domain; 125291716Sken int type; 126291716Sken int protocol; 127291716Sken}; 128291716Sken 129291716Skenstatic int 130291716Skenlinux_socket(struct proc *p, struct linux_socket_args *args, int *retval) 131291716Sken{ 132291716Sken struct linux_socket_args linux_args; 133291716Sken struct socket_args /* { 134291716Sken int domain; 135291716Sken int type; 136291716Sken int protocol; 137291716Sken } */ bsd_args; 138291716Sken int error; 139291716Sken 140291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 141291716Sken return error; 142291716Sken bsd_args.protocol = linux_args.protocol; 143291716Sken bsd_args.type = linux_args.type; 144291716Sken bsd_args.domain = linux_to_bsd_domain(linux_args.domain); 145291716Sken if (bsd_args.domain == -1) 146291716Sken return EINVAL; 147291716Sken return socket(p, &bsd_args, retval); 148291716Sken} 149291716Sken 150291716Skenstruct linux_bind_args { 151291716Sken int s; 152291716Sken struct sockaddr *name; 153291716Sken int namelen; 154291716Sken}; 155291716Sken 156291716Skenstatic int 157291716Skenlinux_bind(struct proc *p, struct linux_bind_args *args, int *retval) 158291716Sken{ 159291716Sken struct linux_bind_args linux_args; 160291716Sken struct bind_args /* { 161291716Sken int s; 162291716Sken caddr_t name; 163291716Sken int namelen; 164291716Sken } */ bsd_args; 165291716Sken int error; 166291716Sken 167291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 168291716Sken return error; 169291716Sken bsd_args.s = linux_args.s; 170291716Sken bsd_args.name = (caddr_t)linux_args.name; 171291716Sken bsd_args.namelen = linux_args.namelen; 172291716Sken return bind(p, &bsd_args, retval); 173291716Sken} 174291716Sken 175291716Skenstruct linux_connect_args { 176291716Sken int s; 177291716Sken struct sockaddr * name; 178291716Sken int namelen; 179291716Sken}; 180291716Sken 181291716Skenstatic int 182291716Skenlinux_connect(struct proc *p, struct linux_connect_args *args, int *retval) 183291716Sken{ 184291716Sken struct linux_connect_args linux_args; 185291716Sken struct connect_args /* { 186291716Sken int s; 187291716Sken caddr_t name; 188291716Sken int namelen; 189291716Sken } */ bsd_args; 190291716Sken int error; 191291716Sken 192291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 193291716Sken return error; 194291716Sken bsd_args.s = linux_args.s; 195291716Sken bsd_args.name = (caddr_t)linux_args.name; 196291716Sken bsd_args.namelen = linux_args.namelen; 197291716Sken return connect(p, &bsd_args, retval); 198291716Sken} 199291716Sken 200291716Skenstruct linux_listen_args { 201291716Sken int s; 202291716Sken int backlog; 203291716Sken}; 204291716Sken 205291716Skenstatic int 206291716Skenlinux_listen(struct proc *p, struct linux_listen_args *args, int *retval) 207291716Sken{ 208291716Sken struct linux_listen_args linux_args; 209291716Sken struct listen_args /* { 210291716Sken int s; 211291716Sken int backlog; 212291716Sken } */ bsd_args; 213291716Sken int error; 214291716Sken 215291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 216291716Sken return error; 217291716Sken bsd_args.s = linux_args.s; 218291716Sken bsd_args.backlog = linux_args.backlog; 219291716Sken return listen(p, &bsd_args, retval); 220291716Sken} 221291716Sken 222291716Skenstruct linux_accept_args { 223291716Sken int s; 224291716Sken struct sockaddr *addr; 225291716Sken int *namelen; 226291716Sken}; 227291716Sken 228291716Skenstatic int 229291716Skenlinux_accept(struct proc *p, struct linux_accept_args *args, int *retval) 230291716Sken{ 231291716Sken struct linux_accept_args linux_args; 232291716Sken struct accept_args /* { 233291716Sken int s; 234291716Sken caddr_t name; 235291716Sken int *anamelen; 236291716Sken } */ bsd_args; 237291716Sken int error; 238291716Sken 239291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 240291716Sken return error; 241291716Sken bsd_args.s = linux_args.s; 242291716Sken bsd_args.name = (caddr_t)linux_args.addr; 243291716Sken bsd_args.anamelen = linux_args.namelen; 244291716Sken return oaccept(p, &bsd_args, retval); 245291716Sken} 246291716Sken 247291716Skenstruct linux_getsockname_args { 248291716Sken int s; 249291716Sken struct sockaddr *addr; 250291716Sken int *namelen; 251291716Sken}; 252291716Sken 253291716Skenstatic int 254291716Skenlinux_getsockname(struct proc *p, struct linux_getsockname_args *args, int *retval) 255291716Sken{ 256291716Sken struct linux_getsockname_args linux_args; 257291716Sken struct getsockname_args /* { 258291716Sken int fdes; 259291716Sken caddr_t asa; 260291716Sken int *alen; 261291716Sken } */ bsd_args; 262291716Sken int error; 263291716Sken 264291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 265291716Sken return error; 266291716Sken bsd_args.fdes = linux_args.s; 267291716Sken bsd_args.asa = (caddr_t) linux_args.addr; 268291716Sken bsd_args.alen = linux_args.namelen; 269291716Sken return ogetsockname(p, &bsd_args, retval); 270291716Sken} 271291716Sken 272291716Skenstruct linux_getpeername_args { 273291716Sken int s; 274291716Sken struct sockaddr *addr; 275291716Sken int *namelen; 276291716Sken}; 277291716Sken 278291716Skenstatic int 279291716Skenlinux_getpeername(struct proc *p, struct linux_getpeername_args *args, int *retval) 280291716Sken{ 281291716Sken struct linux_getpeername_args linux_args; 282291716Sken struct ogetpeername_args /* { 283291716Sken int fdes; 284291716Sken caddr_t asa; 285291716Sken int *alen; 286291716Sken } */ bsd_args; 287291716Sken int error; 288291716Sken 289291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 290291716Sken return error; 291291716Sken bsd_args.fdes = linux_args.s; 292291716Sken bsd_args.asa = (caddr_t) linux_args.addr; 293291716Sken bsd_args.alen = linux_args.namelen; 294291716Sken return ogetpeername(p, &bsd_args, retval); 295291716Sken} 296291716Sken 297291716Skenstruct linux_socketpair_args { 298291716Sken int domain; 299291716Sken int type; 300291716Sken int protocol; 301291716Sken int *rsv; 302291716Sken}; 303291716Sken 304291716Skenstatic int 305291716Skenlinux_socketpair(struct proc *p, struct linux_socketpair_args *args, int *retval) 306291716Sken{ 307291716Sken struct linux_socketpair_args linux_args; 308291716Sken struct socketpair_args /* { 309291716Sken int domain; 310291716Sken int type; 311291716Sken int protocol; 312291716Sken int *rsv; 313291716Sken } */ bsd_args; 314291716Sken int error; 315291716Sken 316291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 317291716Sken return error; 318291716Sken bsd_args.domain = linux_to_bsd_domain(linux_args.domain); 319291716Sken if (bsd_args.domain == -1) 320291716Sken return EINVAL; 321291716Sken bsd_args.type = linux_args.type; 322291716Sken bsd_args.protocol = linux_args.protocol; 323291716Sken bsd_args.rsv = linux_args.rsv; 324291716Sken return socketpair(p, &bsd_args, retval); 325291716Sken} 326291716Sken 327291716Skenstruct linux_send_args { 328291716Sken int s; 329291716Sken void *msg; 330291716Sken int len; 331291716Sken int flags; 332291716Sken}; 333291716Sken 334291716Skenstatic int 335291716Skenlinux_send(struct proc *p, struct linux_send_args *args, int *retval) 336291716Sken{ 337291716Sken struct linux_send_args linux_args; 338291716Sken struct osend_args /* { 339291716Sken int s; 340291716Sken caddr_t buf; 341291716Sken int len; 342291716Sken int flags; 343291716Sken } */ bsd_args; 344291716Sken int error; 345291716Sken 346291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 347291716Sken return error; 348291716Sken bsd_args.s = linux_args.s; 349291716Sken bsd_args.buf = linux_args.msg; 350291716Sken bsd_args.len = linux_args.len; 351291716Sken bsd_args.flags = linux_args.flags; 352291716Sken return osend(p, &bsd_args, retval); 353291716Sken} 354291716Sken 355291716Skenstruct linux_recv_args { 356291716Sken int s; 357291716Sken void *msg; 358291716Sken int len; 359291716Sken int flags; 360291716Sken}; 361291716Sken 362291716Skenstatic int 363291716Skenlinux_recv(struct proc *p, struct linux_recv_args *args, int *retval) 364291716Sken{ 365291716Sken struct linux_recv_args linux_args; 366291716Sken struct orecv_args /* { 367291716Sken int s; 368291716Sken caddr_t buf; 369291716Sken int len; 370291716Sken int flags; 371291716Sken } */ bsd_args; 372291716Sken int error; 373291716Sken 374291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 375291716Sken return error; 376291716Sken bsd_args.s = linux_args.s; 377291716Sken bsd_args.buf = linux_args.msg; 378291716Sken bsd_args.len = linux_args.len; 379291716Sken bsd_args.flags = linux_args.flags; 380291716Sken return orecv(p, &bsd_args, retval); 381291716Sken} 382291716Sken 383291716Skenstruct linux_sendto_args { 384291716Sken int s; 385291716Sken void *msg; 386291716Sken int len; 387291716Sken int flags; 388291716Sken caddr_t to; 389291716Sken int tolen; 390291716Sken}; 391291716Sken 392291716Skenstatic int 393291716Skenlinux_sendto(struct proc *p, struct linux_sendto_args *args, int *retval) 394291716Sken{ 395291716Sken struct linux_sendto_args linux_args; 396291716Sken struct sendto_args /* { 397291716Sken int s; 398291716Sken caddr_t buf; 399291716Sken size_t len; 400291716Sken int flags; 401291716Sken caddr_t to; 402291716Sken int tolen; 403291716Sken } */ bsd_args; 404291716Sken int error; 405291716Sken 406291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 407291716Sken return error; 408291716Sken bsd_args.s = linux_args.s; 409291716Sken bsd_args.buf = linux_args.msg; 410291716Sken bsd_args.len = linux_args.len; 411291716Sken bsd_args.flags = linux_args.flags; 412291716Sken bsd_args.to = linux_args.to; 413291716Sken bsd_args.tolen = linux_args.tolen; 414291716Sken return sendto(p, &bsd_args, retval); 415291716Sken} 416291716Sken 417291716Skenstruct linux_recvfrom_args { 418291716Sken int s; 419291716Sken void *buf; 420291716Sken int len; 421291716Sken int flags; 422291716Sken caddr_t from; 423314438Sasomers int *fromlen; 424314438Sasomers}; 425314438Sasomers 426291716Skenstatic int 427291716Skenlinux_recvfrom(struct proc *p, struct linux_recvfrom_args *args, int *retval) 428291716Sken{ 429291716Sken struct linux_recvfrom_args linux_args; 430291716Sken struct recvfrom_args /* { 431291716Sken int s; 432291716Sken caddr_t buf; 433291716Sken size_t len; 434291716Sken int flags; 435291716Sken caddr_t from; 436291716Sken int *fromlenaddr; 437291716Sken } */ bsd_args; 438291716Sken int error; 439291716Sken 440291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 441291716Sken return error; 442291716Sken bsd_args.s = linux_args.s; 443291716Sken bsd_args.buf = linux_args.buf; 444291716Sken bsd_args.len = linux_args.len; 445291716Sken bsd_args.flags = linux_args.flags; 446291716Sken bsd_args.from = linux_args.from; 447291716Sken bsd_args.fromlenaddr = linux_args.fromlen; 448291716Sken return orecvfrom(p, &bsd_args, retval); 449291716Sken} 450291716Sken 451291716Skenstruct linux_shutdown_args { 452291716Sken int s; 453291716Sken int how; 454291716Sken}; 455291716Sken 456291716Skenstatic int 457291716Skenlinux_shutdown(struct proc *p, struct linux_shutdown_args *args, int *retval) 458291716Sken{ 459291716Sken struct linux_shutdown_args linux_args; 460291716Sken struct shutdown_args /* { 461291716Sken int s; 462291716Sken int how; 463291716Sken } */ bsd_args; 464291716Sken int error; 465291716Sken 466291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 467291716Sken return error; 468291716Sken bsd_args.s = linux_args.s; 469291716Sken bsd_args.how = linux_args.how; 470291716Sken return shutdown(p, &bsd_args, retval); 471291716Sken} 472291716Sken 473291716Skenstruct linux_setsockopt_args { 474291716Sken int s; 475291716Sken int level; 476291716Sken int optname; 477291716Sken void *optval; 478291716Sken int optlen; 479291716Sken}; 480291716Sken 481291716Skenstatic int 482291716Skenlinux_setsockopt(struct proc *p, struct linux_setsockopt_args *args, int *retval) 483291716Sken{ 484291716Sken struct linux_setsockopt_args linux_args; 485291716Sken struct setsockopt_args /* { 486291716Sken int s; 487291716Sken int level; 488291716Sken int name; 489291716Sken caddr_t val; 490291716Sken int valsize; 491291716Sken } */ bsd_args; 492291716Sken int error, name; 493291716Sken 494291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 495291716Sken return error; 496291716Sken bsd_args.s = linux_args.s; 497291716Sken bsd_args.level = linux_to_bsd_sockopt_level(linux_args.level); 498291716Sken switch (bsd_args.level) { 499291716Sken case SOL_SOCKET: 500291716Sken name = linux_to_bsd_so_sockopt(linux_args.optname); 501291716Sken break; 502291716Sken case IPPROTO_IP: 503291716Sken name = linux_to_bsd_ip_sockopt(linux_args.optname); 504291716Sken break; 505291716Sken default: 506291716Sken return EINVAL; 507291716Sken } 508291716Sken if (name == -1) 509291716Sken return EINVAL; 510291716Sken bsd_args.name = name; 511291716Sken bsd_args.val = linux_args.optval; 512291716Sken bsd_args.valsize = linux_args.optlen; 513291716Sken return setsockopt(p, &bsd_args, retval); 514291716Sken} 515291716Sken 516291716Skenstruct linux_getsockopt_args { 517291716Sken int s; 518291716Sken int level; 519291716Sken int optname; 520291716Sken void *optval; 521291716Sken int *optlen; 522291716Sken}; 523291716Sken 524291716Skenstatic int 525291716Skenlinux_getsockopt(struct proc *p, struct linux_getsockopt_args *args, int *retval) 526291716Sken{ 527291716Sken struct linux_getsockopt_args linux_args; 528291716Sken struct getsockopt_args /* { 529291716Sken int s; 530291716Sken int level; 531291716Sken int name; 532291716Sken caddr_t val; 533291716Sken int *avalsize; 534291716Sken } */ bsd_args; 535291716Sken int error, name; 536291716Sken 537291716Sken if ((error=copyin((caddr_t)args, (caddr_t)&linux_args, sizeof(linux_args)))) 538291716Sken return error; 539291716Sken bsd_args.s = linux_args.s; 540291716Sken bsd_args.level = linux_to_bsd_sockopt_level(linux_args.level); 541291716Sken switch (bsd_args.level) { 542291716Sken case SOL_SOCKET: 543291716Sken name = linux_to_bsd_so_sockopt(linux_args.optname); 544291716Sken break; 545291716Sken case IPPROTO_IP: 546291716Sken name = linux_to_bsd_ip_sockopt(linux_args.optname); 547291716Sken break; 548291716Sken default: 549291716Sken return EINVAL; 550291716Sken } 551291716Sken if (name == -1) 552291716Sken return EINVAL; 553291716Sken bsd_args.val = linux_args.optval; 554291716Sken bsd_args.avalsize = linux_args.optlen; 555291716Sken return getsockopt(p, &bsd_args, retval); 556291716Sken} 557291716Sken 558291716Skenstruct linux_socketcall_args { 559291716Sken int what; 560291716Sken void *args; 561291716Sken}; 562291716Sken 563291716Skenint 564291716Skenlinux_socketcall(struct proc *p, struct linux_socketcall_args *args,int *retval) 565291716Sken{ 566291716Sken switch (args->what) { 567291716Sken case LINUX_SOCKET: 568291716Sken return linux_socket(p, args->args, retval); 569291716Sken case LINUX_BIND: 570291716Sken return linux_bind(p, args->args, retval); 571291716Sken case LINUX_CONNECT: 572291716Sken return linux_connect(p, args->args, retval); 573291716Sken case LINUX_LISTEN: 574291716Sken return linux_listen(p, args->args, retval); 575291716Sken case LINUX_ACCEPT: 576291716Sken return linux_accept(p, args->args, retval); 577291716Sken case LINUX_GETSOCKNAME: 578291716Sken return linux_getsockname(p, args->args, retval); 579291716Sken case LINUX_GETPEERNAME: 580291716Sken return linux_getpeername(p, args->args, retval); 581291716Sken case LINUX_SOCKETPAIR: 582291716Sken return linux_socketpair(p, args->args, retval); 583291716Sken case LINUX_SEND: 584291716Sken return linux_send(p, args->args, retval); 585291716Sken case LINUX_RECV: 586291716Sken return linux_recv(p, args->args, retval); 587291716Sken case LINUX_SENDTO: 588291716Sken return linux_sendto(p, args->args, retval); 589291716Sken case LINUX_RECVFROM: 590291716Sken return linux_recvfrom(p, args->args, retval); 591291716Sken case LINUX_SHUTDOWN: 592291716Sken return linux_shutdown(p, args->args, retval); 593291716Sken case LINUX_SETSOCKOPT: 594291716Sken return linux_setsockopt(p, args->args, retval); 595291716Sken case LINUX_GETSOCKOPT: 596291716Sken return linux_getsockopt(p, args->args, retval); 597291716Sken default: 598291716Sken uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what); 599291716Sken return ENOSYS; 600291716Sken } 601291716Sken} 602291716Sken