ibcs2_socksys.c revision 91393
111397Sswallace/* 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. 2483366Sjulian * 2583366Sjulian * $FreeBSD: head/sys/i386/ibcs2/ibcs2_socksys.c 91393 2002-02-27 16:55:30Z robert $ 263584Ssos */ 273584Ssos 283584Ssos#include <sys/param.h> 293584Ssos#include <sys/systm.h> 3011397Sswallace#include <sys/sysproto.h> 3191388Srobert#include <sys/jail.h> 3216310Snate#include <sys/kernel.h> 3316310Snate#include <sys/sysctl.h> 3411397Sswallace 353584Ssos#include <i386/ibcs2/ibcs2_socksys.h> 3611397Sswallace#include <i386/ibcs2/ibcs2_util.h> 373584Ssos 3816310Snate/* Local structures */ 3916310Snatestruct getipdomainname_args { 4016310Snate char *ipdomainname; 4116310Snate int len; 4216310Snate}; 4316310Snate 4416310Snatestruct setipdomainname_args { 4516310Snate char *ipdomainname; 4616310Snate int len; 4716310Snate}; 4816310Snate 4916310Snate/* Local prototypes */ 5083366Sjulianstatic int ibcs2_getipdomainname __P((struct thread *, 5130994Sphk struct getipdomainname_args *)); 5283366Sjulianstatic int ibcs2_setipdomainname __P((struct thread *, 5330994Sphk struct setipdomainname_args *)); 5416310Snate 553584Ssos/* 5611397Sswallace * iBCS2 socksys calls. 573584Ssos */ 583584Ssos 593584Ssosint 6083366Sjulianibcs2_socksys(td, uap) 6183366Sjulian register struct thread *td; 6211397Sswallace register struct ibcs2_socksys_args *uap; 633584Ssos{ 643584Ssos int error; 6511397Sswallace int realargs[7]; /* 1 for command, 6 for recvfrom */ 6611397Sswallace void *passargs; 673584Ssos 6811397Sswallace /* 6911397Sswallace * SOCKET should only be legal on /dev/socksys. 7011397Sswallace * GETIPDOMAINNAME should only be legal on /dev/socksys ? 7111397Sswallace * The others are (and should be) only legal on sockets. 723584Ssos */ 733584Ssos 7443314Sdillon if ((error = copyin(uap->argsp, (caddr_t)realargs, sizeof(realargs))) != 0) 753584Ssos return error; 7611397Sswallace DPRINTF(("ibcs2_socksys: %08x %08x %08x %08x %08x %08x %08x\n", 7711397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 7811397Sswallace realargs[4], realargs[5], realargs[6])); 793584Ssos 8011397Sswallace passargs = (void *)(realargs + 1); 8111397Sswallace switch (realargs[0]) { 8211397Sswallace case SOCKSYS_ACCEPT: 8383366Sjulian return accept(td, passargs); 8411397Sswallace case SOCKSYS_BIND: 8583366Sjulian return bind(td, passargs); 8611397Sswallace case SOCKSYS_CONNECT: 8783366Sjulian return connect(td, passargs); 8811397Sswallace case SOCKSYS_GETPEERNAME: 8983366Sjulian return getpeername(td, passargs); 9011397Sswallace case SOCKSYS_GETSOCKNAME: 9183366Sjulian return getsockname(td, passargs); 9211397Sswallace case SOCKSYS_GETSOCKOPT: 9383366Sjulian return getsockopt(td, passargs); 9411397Sswallace case SOCKSYS_LISTEN: 9583366Sjulian return listen(td, passargs); 9611397Sswallace case SOCKSYS_RECV: 9711397Sswallace realargs[5] = realargs[6] = 0; 9811397Sswallace /* FALLTHROUGH */ 9911397Sswallace case SOCKSYS_RECVFROM: 10083366Sjulian return recvfrom(td, passargs); 10111397Sswallace case SOCKSYS_SEND: 10211397Sswallace realargs[5] = realargs[6] = 0; 10311397Sswallace /* FALLTHROUGH */ 10411397Sswallace case SOCKSYS_SENDTO: 10583366Sjulian return sendto(td, passargs); 10611397Sswallace case SOCKSYS_SETSOCKOPT: 10783366Sjulian return setsockopt(td, passargs); 10811397Sswallace case SOCKSYS_SHUTDOWN: 10983366Sjulian return shutdown(td, passargs); 11011397Sswallace case SOCKSYS_SOCKET: 11183366Sjulian return socket(td, passargs); 11211397Sswallace case SOCKSYS_SELECT: 11383366Sjulian return select(td, passargs); 11411397Sswallace case SOCKSYS_GETIPDOMAIN: 11583366Sjulian return ibcs2_getipdomainname(td, passargs); 11611397Sswallace case SOCKSYS_SETIPDOMAIN: 11783366Sjulian return ibcs2_setipdomainname(td, passargs); 11811397Sswallace case SOCKSYS_ADJTIME: 11983366Sjulian return adjtime(td, passargs); 12011397Sswallace case SOCKSYS_SETREUID: 12183366Sjulian return setreuid(td, passargs); 12211397Sswallace case SOCKSYS_SETREGID: 12383366Sjulian return setregid(td, passargs); 12411397Sswallace case SOCKSYS_GETTIME: 12583366Sjulian return gettimeofday(td, passargs); 12611397Sswallace case SOCKSYS_SETTIME: 12783366Sjulian return settimeofday(td, passargs); 12811397Sswallace case SOCKSYS_GETITIMER: 12983366Sjulian return getitimer(td, passargs); 13011397Sswallace case SOCKSYS_SETITIMER: 13183366Sjulian return setitimer(td, passargs); 1323584Ssos 1333584Ssos default: 13411397Sswallace printf("socksys unknown %08x %08x %08x %08x %08x %08x %08x\n", 13511397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 13611397Sswallace realargs[4], realargs[5], realargs[6]); 13711397Sswallace return EINVAL; 1383584Ssos } 13911397Sswallace /* NOTREACHED */ 1403584Ssos} 14116310Snate 14216310Snate/* ARGSUSED */ 14316310Snatestatic int 14483366Sjulianibcs2_getipdomainname(td, uap) 14583366Sjulian struct thread *td; 14616310Snate struct getipdomainname_args *uap; 14716310Snate{ 14816310Snate char hname[MAXHOSTNAMELEN], *dptr; 14916310Snate int len; 15016310Snate 15116310Snate /* Get the domain name */ 15291393Srobert getcredhostname(td->td_ucred, hname, sizeof(hname)); 15391388Srobert 15416310Snate dptr = index(hname, '.'); 15516310Snate if ( dptr ) 15616310Snate dptr++; 15716310Snate else 15816310Snate /* Make it effectively an empty string */ 15916310Snate dptr = hname + strlen(hname); 16016310Snate 16116310Snate len = strlen(dptr) + 1; 16216310Snate if ((u_int)uap->len > len + 1) 16316310Snate uap->len = len + 1; 16416310Snate return (copyout((caddr_t)dptr, (caddr_t)uap->ipdomainname, uap->len)); 16516310Snate} 16616310Snate 16716310Snate/* ARGSUSED */ 16816310Snatestatic int 16983366Sjulianibcs2_setipdomainname(td, uap) 17083366Sjulian struct thread *td; 17116310Snate struct setipdomainname_args *uap; 17216310Snate{ 17316310Snate char hname[MAXHOSTNAMELEN], *ptr; 17416310Snate int error, sctl[2], hlen; 17516310Snate 17683366Sjulian if ((error = suser_td(td))) 17716310Snate return (error); 17816310Snate 17916310Snate /* W/out a hostname a domain-name is nonsense */ 18016310Snate if ( strlen(hostname) == 0 ) 18116310Snate return EINVAL; 18216310Snate 18316310Snate /* Get the host's unqualified name (strip off the domain) */ 18441514Sarchie snprintf(hname, sizeof(hname), "%s", hostname); 18516310Snate ptr = index(hname, '.'); 18616310Snate if ( ptr != NULL ) { 18716310Snate ptr++; 18816310Snate *ptr = '\0'; 18916310Snate } else 19016310Snate strcat(hname, "."); 19116310Snate 19216310Snate /* Set ptr to the end of the string so we can append to it */ 19316310Snate hlen = strlen(hname); 19416310Snate ptr = hname + hlen; 19516310Snate if ((u_int)uap->len > (sizeof (hname) - hlen - 1)) 19616310Snate return EINVAL; 19716310Snate 19816310Snate /* Append the ipdomain to the end */ 19916310Snate error = copyin((caddr_t)uap->ipdomainname, ptr, uap->len); 20016310Snate if (error) 20116310Snate return (error); 20216310Snate 20316310Snate /* 'sethostname' with the new information */ 20416310Snate sctl[0] = CTL_KERN; 20516310Snate sctl[1] = KERN_HOSTNAME; 20616310Snate hlen = strlen(hname) + 1; 20783366Sjulian return (kernel_sysctl(td, sctl, 2, 0, 0, hname, hlen, 0)); 20816310Snate} 209