ibcs2_socksys.c revision 41514
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. 243584Ssos */ 253584Ssos 263584Ssos#include <sys/param.h> 273584Ssos#include <sys/systm.h> 2811397Sswallace#include <sys/sysproto.h> 2916310Snate#include <sys/kernel.h> 3016310Snate#include <sys/sysctl.h> 3111397Sswallace 323584Ssos#include <i386/ibcs2/ibcs2_socksys.h> 3311397Sswallace#include <i386/ibcs2/ibcs2_util.h> 343584Ssos 3516310Snate/* Local structures */ 3616310Snatestruct getipdomainname_args { 3716310Snate char *ipdomainname; 3816310Snate int len; 3916310Snate}; 4016310Snate 4116310Snatestruct setipdomainname_args { 4216310Snate char *ipdomainname; 4316310Snate int len; 4416310Snate}; 4516310Snate 4616310Snate/* Local prototypes */ 4716310Snatestatic int ibcs2_getipdomainname __P((struct proc *, 4830994Sphk struct getipdomainname_args *)); 4916310Snatestatic int ibcs2_setipdomainname __P((struct proc *, 5030994Sphk struct setipdomainname_args *)); 5116310Snate 523584Ssos/* 5311397Sswallace * iBCS2 socksys calls. 543584Ssos */ 553584Ssos 563584Ssosint 5730994Sphkibcs2_socksys(p, uap) 5811397Sswallace register struct proc *p; 5911397Sswallace register struct ibcs2_socksys_args *uap; 603584Ssos{ 613584Ssos int error; 6211397Sswallace int realargs[7]; /* 1 for command, 6 for recvfrom */ 6311397Sswallace void *passargs; 643584Ssos 6511397Sswallace /* 6611397Sswallace * SOCKET should only be legal on /dev/socksys. 6711397Sswallace * GETIPDOMAINNAME should only be legal on /dev/socksys ? 6811397Sswallace * The others are (and should be) only legal on sockets. 693584Ssos */ 703584Ssos 7111397Sswallace if (error = copyin(uap->argsp, (caddr_t)realargs, sizeof(realargs))) 723584Ssos return error; 7311397Sswallace DPRINTF(("ibcs2_socksys: %08x %08x %08x %08x %08x %08x %08x\n", 7411397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 7511397Sswallace realargs[4], realargs[5], realargs[6])); 763584Ssos 7711397Sswallace passargs = (void *)(realargs + 1); 7811397Sswallace switch (realargs[0]) { 7911397Sswallace case SOCKSYS_ACCEPT: 8030994Sphk return accept(p, passargs); 8111397Sswallace case SOCKSYS_BIND: 8230994Sphk return bind(p, passargs); 8311397Sswallace case SOCKSYS_CONNECT: 8430994Sphk return connect(p, passargs); 8511397Sswallace case SOCKSYS_GETPEERNAME: 8630994Sphk return getpeername(p, passargs); 8711397Sswallace case SOCKSYS_GETSOCKNAME: 8830994Sphk return getsockname(p, passargs); 8911397Sswallace case SOCKSYS_GETSOCKOPT: 9030994Sphk return getsockopt(p, passargs); 9111397Sswallace case SOCKSYS_LISTEN: 9230994Sphk return listen(p, passargs); 9311397Sswallace case SOCKSYS_RECV: 9411397Sswallace realargs[5] = realargs[6] = 0; 9511397Sswallace /* FALLTHROUGH */ 9611397Sswallace case SOCKSYS_RECVFROM: 9730994Sphk return recvfrom(p, passargs); 9811397Sswallace case SOCKSYS_SEND: 9911397Sswallace realargs[5] = realargs[6] = 0; 10011397Sswallace /* FALLTHROUGH */ 10111397Sswallace case SOCKSYS_SENDTO: 10230994Sphk return sendto(p, passargs); 10311397Sswallace case SOCKSYS_SETSOCKOPT: 10430994Sphk return setsockopt(p, passargs); 10511397Sswallace case SOCKSYS_SHUTDOWN: 10630994Sphk return shutdown(p, passargs); 10711397Sswallace case SOCKSYS_SOCKET: 10830994Sphk return socket(p, passargs); 10911397Sswallace case SOCKSYS_SELECT: 11030994Sphk return select(p, passargs); 11111397Sswallace case SOCKSYS_GETIPDOMAIN: 11230994Sphk return ibcs2_getipdomainname(p, passargs); 11311397Sswallace case SOCKSYS_SETIPDOMAIN: 11430994Sphk return ibcs2_setipdomainname(p, passargs); 11511397Sswallace case SOCKSYS_ADJTIME: 11630994Sphk return adjtime(p, passargs); 11711397Sswallace case SOCKSYS_SETREUID: 11830994Sphk return setreuid(p, passargs); 11911397Sswallace case SOCKSYS_SETREGID: 12030994Sphk return setregid(p, passargs); 12111397Sswallace case SOCKSYS_GETTIME: 12230994Sphk return gettimeofday(p, passargs); 12311397Sswallace case SOCKSYS_SETTIME: 12430994Sphk return settimeofday(p, passargs); 12511397Sswallace case SOCKSYS_GETITIMER: 12630994Sphk return getitimer(p, passargs); 12711397Sswallace case SOCKSYS_SETITIMER: 12830994Sphk return setitimer(p, passargs); 1293584Ssos 1303584Ssos default: 13111397Sswallace printf("socksys unknown %08x %08x %08x %08x %08x %08x %08x\n", 13211397Sswallace realargs[0], realargs[1], realargs[2], realargs[3], 13311397Sswallace realargs[4], realargs[5], realargs[6]); 13411397Sswallace return EINVAL; 1353584Ssos } 13611397Sswallace /* NOTREACHED */ 1373584Ssos} 13816310Snate 13916310Snate/* ARGSUSED */ 14016310Snatestatic int 14130994Sphkibcs2_getipdomainname(p, uap) 14216310Snate struct proc *p; 14316310Snate struct getipdomainname_args *uap; 14416310Snate{ 14516310Snate char hname[MAXHOSTNAMELEN], *dptr; 14616310Snate int len; 14716310Snate 14816310Snate /* Get the domain name */ 14941514Sarchie snprintf(hname, sizeof(hname), "%s", hostname); 15016310Snate dptr = index(hname, '.'); 15116310Snate if ( dptr ) 15216310Snate dptr++; 15316310Snate else 15416310Snate /* Make it effectively an empty string */ 15516310Snate dptr = hname + strlen(hname); 15616310Snate 15716310Snate len = strlen(dptr) + 1; 15816310Snate if ((u_int)uap->len > len + 1) 15916310Snate uap->len = len + 1; 16016310Snate return (copyout((caddr_t)dptr, (caddr_t)uap->ipdomainname, uap->len)); 16116310Snate} 16216310Snate 16316310Snate/* ARGSUSED */ 16416310Snatestatic int 16530994Sphkibcs2_setipdomainname(p, uap) 16616310Snate struct proc *p; 16716310Snate struct setipdomainname_args *uap; 16816310Snate{ 16916310Snate char hname[MAXHOSTNAMELEN], *ptr; 17016310Snate int error, sctl[2], hlen; 17116310Snate 17216310Snate if ((error = suser(p->p_ucred, &p->p_acflag))) 17316310Snate return (error); 17416310Snate 17516310Snate /* W/out a hostname a domain-name is nonsense */ 17616310Snate if ( strlen(hostname) == 0 ) 17716310Snate return EINVAL; 17816310Snate 17916310Snate /* Get the host's unqualified name (strip off the domain) */ 18041514Sarchie snprintf(hname, sizeof(hname), "%s", hostname); 18116310Snate ptr = index(hname, '.'); 18216310Snate if ( ptr != NULL ) { 18316310Snate ptr++; 18416310Snate *ptr = '\0'; 18516310Snate } else 18616310Snate strcat(hname, "."); 18716310Snate 18816310Snate /* Set ptr to the end of the string so we can append to it */ 18916310Snate hlen = strlen(hname); 19016310Snate ptr = hname + hlen; 19116310Snate if ((u_int)uap->len > (sizeof (hname) - hlen - 1)) 19216310Snate return EINVAL; 19316310Snate 19416310Snate /* Append the ipdomain to the end */ 19516310Snate error = copyin((caddr_t)uap->ipdomainname, ptr, uap->len); 19616310Snate if (error) 19716310Snate return (error); 19816310Snate 19916310Snate /* 'sethostname' with the new information */ 20016310Snate sctl[0] = CTL_KERN; 20116310Snate sctl[1] = KERN_HOSTNAME; 20216310Snate hlen = strlen(hname) + 1; 20316310Snate return (kernel_sysctl(p, sctl, 2, 0, 0, hname, hlen, 0)); 20416310Snate} 205