1139799Simp/*- 211397Sswallace * Copyright (c) 1994, 1995 Scott Bartram 311397Sswallace * Copyright (c) 1994 Arne H Juul 43584Ssos * All rights reserved. 53584Ssos * 63584Ssos * Redistribution and use in source and binary forms, with or without 73584Ssos * modification, are permitted provided that the following conditions 83584Ssos * are met: 93584Ssos * 1. Redistributions of source code must retain the above copyright 1011397Sswallace * notice, this list of conditions and the following disclaimer. 1111397Sswallace * 2. The name of the author may not be used to endorse or promote products 1211397Sswallace * derived from this software without specific prior written permission 133584Ssos * 143584Ssos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 153584Ssos * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 163584Ssos * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 173584Ssos * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 183584Ssos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 193584Ssos * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 203584Ssos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 213584Ssos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 223584Ssos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 233584Ssos * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 243584Ssos */ 253584Ssos 26115684Sobrien#include <sys/cdefs.h> 27115684Sobrien__FBSDID("$FreeBSD$"); 28115684Sobrien 293584Ssos#include <sys/param.h> 303584Ssos#include <sys/systm.h> 3111397Sswallace#include <sys/sysproto.h> 3291388Srobert#include <sys/jail.h> 3316310Snate#include <sys/kernel.h> 3416310Snate#include <sys/sysctl.h> 3511397Sswallace 363584Ssos#include <i386/ibcs2/ibcs2_socksys.h> 3711397Sswallace#include <i386/ibcs2/ibcs2_util.h> 383584Ssos 3916310Snate/* Local structures */ 4016310Snatestruct getipdomainname_args { 4116310Snate char *ipdomainname; 4216310Snate int len; 4316310Snate}; 4416310Snate 4516310Snatestruct setipdomainname_args { 4616310Snate char *ipdomainname; 4716310Snate int len; 4816310Snate}; 4916310Snate 5016310Snate/* Local prototypes */ 5192761Salfredstatic int ibcs2_getipdomainname(struct thread *, 5292761Salfred struct getipdomainname_args *); 5392761Salfredstatic int ibcs2_setipdomainname(struct thread *, 5492761Salfred struct setipdomainname_args *); 5516310Snate 563584Ssos/* 5711397Sswallace * iBCS2 socksys calls. 583584Ssos */ 593584Ssos 603584Ssosint 6183366Sjulianibcs2_socksys(td, uap) 6283366Sjulian register struct thread *td; 6311397Sswallace register struct ibcs2_socksys_args *uap; 643584Ssos{ 653584Ssos int error; 6611397Sswallace int realargs[7]; /* 1 for command, 6 for recvfrom */ 6711397Sswallace void *passargs; 683584Ssos 6911397Sswallace /* 7011397Sswallace * SOCKET should only be legal on /dev/socksys. 7111397Sswallace * GETIPDOMAINNAME should only be legal on /dev/socksys ? 7211397Sswallace * The others are (and should be) only legal on sockets. 733584Ssos */ 743584Ssos 7543314Sdillon if ((error = copyin(uap->argsp, (caddr_t)realargs, sizeof(realargs))) != 0) 763584Ssos return error; 7711397Sswallace DPRINTF(("ibcs2_socksys: %08x %08x %08x %08x %08x %08x %08x\n", 7811397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 7911397Sswallace realargs[4], realargs[5], realargs[6])); 803584Ssos 8111397Sswallace passargs = (void *)(realargs + 1); 8211397Sswallace switch (realargs[0]) { 8311397Sswallace case SOCKSYS_ACCEPT: 84225617Skmacy return sys_accept(td, passargs); 8511397Sswallace case SOCKSYS_BIND: 86225617Skmacy return sys_bind(td, passargs); 8711397Sswallace case SOCKSYS_CONNECT: 88225617Skmacy return sys_connect(td, passargs); 8911397Sswallace case SOCKSYS_GETPEERNAME: 90225617Skmacy return sys_getpeername(td, passargs); 9111397Sswallace case SOCKSYS_GETSOCKNAME: 92225617Skmacy return sys_getsockname(td, passargs); 9311397Sswallace case SOCKSYS_GETSOCKOPT: 94225617Skmacy return sys_getsockopt(td, passargs); 9511397Sswallace case SOCKSYS_LISTEN: 96225617Skmacy return sys_listen(td, passargs); 9711397Sswallace case SOCKSYS_RECV: 9811397Sswallace realargs[5] = realargs[6] = 0; 9911397Sswallace /* FALLTHROUGH */ 10011397Sswallace case SOCKSYS_RECVFROM: 101225617Skmacy return sys_recvfrom(td, passargs); 10211397Sswallace case SOCKSYS_SEND: 10311397Sswallace realargs[5] = realargs[6] = 0; 10411397Sswallace /* FALLTHROUGH */ 10511397Sswallace case SOCKSYS_SENDTO: 106225617Skmacy return sys_sendto(td, passargs); 10711397Sswallace case SOCKSYS_SETSOCKOPT: 108225617Skmacy return sys_setsockopt(td, passargs); 10911397Sswallace case SOCKSYS_SHUTDOWN: 110225617Skmacy return sys_shutdown(td, passargs); 11111397Sswallace case SOCKSYS_SOCKET: 112225617Skmacy return sys_socket(td, passargs); 11311397Sswallace case SOCKSYS_SELECT: 114225617Skmacy return sys_select(td, passargs); 11511397Sswallace case SOCKSYS_GETIPDOMAIN: 11683366Sjulian return ibcs2_getipdomainname(td, passargs); 11711397Sswallace case SOCKSYS_SETIPDOMAIN: 11883366Sjulian return ibcs2_setipdomainname(td, passargs); 11911397Sswallace case SOCKSYS_ADJTIME: 120225617Skmacy return sys_adjtime(td, passargs); 12111397Sswallace case SOCKSYS_SETREUID: 122225617Skmacy return sys_setreuid(td, passargs); 12311397Sswallace case SOCKSYS_SETREGID: 124225617Skmacy return sys_setregid(td, passargs); 12511397Sswallace case SOCKSYS_GETTIME: 126225617Skmacy return sys_gettimeofday(td, passargs); 12711397Sswallace case SOCKSYS_SETTIME: 128225617Skmacy return sys_settimeofday(td, passargs); 12911397Sswallace case SOCKSYS_GETITIMER: 130225617Skmacy return sys_getitimer(td, passargs); 13111397Sswallace case SOCKSYS_SETITIMER: 132225617Skmacy return sys_setitimer(td, passargs); 1333584Ssos 1343584Ssos default: 13511397Sswallace printf("socksys unknown %08x %08x %08x %08x %08x %08x %08x\n", 13611397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 13711397Sswallace realargs[4], realargs[5], realargs[6]); 13811397Sswallace return EINVAL; 1393584Ssos } 14011397Sswallace /* NOTREACHED */ 1413584Ssos} 14216310Snate 14316310Snate/* ARGSUSED */ 14416310Snatestatic int 14583366Sjulianibcs2_getipdomainname(td, uap) 14683366Sjulian struct thread *td; 14716310Snate struct getipdomainname_args *uap; 14816310Snate{ 14916310Snate char hname[MAXHOSTNAMELEN], *dptr; 15016310Snate int len; 15116310Snate 152193066Sjamie /* Get the domain name. */ 15391393Srobert getcredhostname(td->td_ucred, hname, sizeof(hname)); 15491388Srobert 155229272Sed dptr = strchr(hname, '.'); 15616310Snate if ( dptr ) 15716310Snate dptr++; 15816310Snate else 15916310Snate /* Make it effectively an empty string */ 16016310Snate dptr = hname + strlen(hname); 16116310Snate 16216310Snate len = strlen(dptr) + 1; 16316310Snate if ((u_int)uap->len > len + 1) 16416310Snate uap->len = len + 1; 16516310Snate return (copyout((caddr_t)dptr, (caddr_t)uap->ipdomainname, uap->len)); 16616310Snate} 16716310Snate 16816310Snate/* ARGSUSED */ 16916310Snatestatic int 17083366Sjulianibcs2_setipdomainname(td, uap) 17183366Sjulian struct thread *td; 17216310Snate struct setipdomainname_args *uap; 17316310Snate{ 17416310Snate char hname[MAXHOSTNAMELEN], *ptr; 17516310Snate int error, sctl[2], hlen; 17616310Snate 177193066Sjamie /* Get the domain name */ 178193066Sjamie getcredhostname(td->td_ucred, hname, sizeof(hname)); 179193066Sjamie 18016310Snate /* W/out a hostname a domain-name is nonsense */ 181193066Sjamie if ( strlen(hname) == 0 ) 18216310Snate return EINVAL; 18316310Snate 18416310Snate /* Get the host's unqualified name (strip off the domain) */ 185229272Sed ptr = strchr(hname, '.'); 18616310Snate if ( ptr != NULL ) { 18716310Snate ptr++; 18816310Snate *ptr = '\0'; 189121016Stjr } else { 190121016Stjr if (strlcat(hname, ".", sizeof(hname)) >= sizeof(hname)) 191121016Stjr return (EINVAL); 192121016Stjr } 19316310Snate 19416310Snate /* Set ptr to the end of the string so we can append to it */ 19516310Snate hlen = strlen(hname); 19616310Snate ptr = hname + hlen; 19716310Snate if ((u_int)uap->len > (sizeof (hname) - hlen - 1)) 19816310Snate return EINVAL; 19916310Snate 20016310Snate /* Append the ipdomain to the end */ 201121016Stjr error = copyinstr((caddr_t)uap->ipdomainname, ptr, uap->len, NULL); 20216310Snate if (error) 20316310Snate return (error); 20416310Snate 20516310Snate /* 'sethostname' with the new information */ 20616310Snate sctl[0] = CTL_KERN; 20716310Snate sctl[1] = KERN_HOSTNAME; 20816310Snate hlen = strlen(hname) + 1; 209136418Sphk return (kernel_sysctl(td, sctl, 2, 0, 0, hname, hlen, 0, 0)); 21016310Snate} 211