kern_xxx.c revision 31778
1160995Ssam/* 2160995Ssam * Copyright (c) 1982, 1986, 1989, 1993 3160995Ssam * The Regents of the University of California. All rights reserved. 4160995Ssam * 5160995Ssam * Redistribution and use in source and binary forms, with or without 6160995Ssam * modification, are permitted provided that the following conditions 7160995Ssam * are met: 8160995Ssam * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)kern_xxx.c 8.2 (Berkeley) 11/14/93 34 * $Id: kern_xxx.c,v 1.26 1997/11/06 19:29:18 phk Exp $ 35 */ 36 37#include "opt_compat.h" 38 39#include <sys/param.h> 40#include <sys/systm.h> 41#include <sys/sysproto.h> 42#include <sys/kernel.h> 43#include <sys/proc.h> 44#include <sys/sysctl.h> 45#include <sys/utsname.h> 46 47 48#if defined(COMPAT_43) || defined(COMPAT_SUNOS) 49 50#ifndef _SYS_SYSPROTO_H_ 51struct gethostname_args { 52 char *hostname; 53 u_int len; 54}; 55#endif 56/* ARGSUSED */ 57int 58ogethostname(p, uap) 59 struct proc *p; 60 struct gethostname_args *uap; 61{ 62 int name[2]; 63 64 name[0] = CTL_KERN; 65 name[1] = KERN_HOSTNAME; 66 return (userland_sysctl(p, name, 2, uap->hostname, &uap->len, 67 1, 0, 0, 0)); 68} 69 70#ifndef _SYS_SYSPROTO_H_ 71struct sethostname_args { 72 char *hostname; 73 u_int len; 74}; 75#endif 76/* ARGSUSED */ 77int 78osethostname(p, uap) 79 struct proc *p; 80 register struct sethostname_args *uap; 81{ 82 int name[2]; 83 int error; 84 85 name[0] = CTL_KERN; 86 name[1] = KERN_HOSTNAME; 87 if ((error = suser(p->p_ucred, &p->p_acflag))) 88 return (error); 89 return (userland_sysctl(p, name, 2, 0, 0, 0, 90 uap->hostname, uap->len, 0)); 91} 92 93#ifndef _SYS_SYSPROTO_H_ 94struct ogethostid_args { 95 int dummy; 96}; 97#endif 98/* ARGSUSED */ 99int 100ogethostid(p, uap) 101 struct proc *p; 102 struct ogethostid_args *uap; 103{ 104 105 *(long *)(p->p_retval) = hostid; 106 return (0); 107} 108#endif /* COMPAT_43 || COMPAT_SUNOS */ 109 110#ifdef COMPAT_43 111#ifndef _SYS_SYSPROTO_H_ 112struct osethostid_args { 113 long hostid; 114}; 115#endif 116/* ARGSUSED */ 117int 118osethostid(p, uap) 119 struct proc *p; 120 struct osethostid_args *uap; 121{ 122 int error; 123 124 if ((error = suser(p->p_ucred, &p->p_acflag))) 125 return (error); 126 hostid = uap->hostid; 127 return (0); 128} 129 130int 131oquota(p, uap) 132 struct proc *p; 133 struct oquota_args *uap; 134{ 135 136 return (ENOSYS); 137} 138#endif /* COMPAT_43 */ 139 140#ifndef _SYS_SYSPROTO_H_ 141struct uname_args { 142 struct utsname *name; 143}; 144#endif 145 146/* ARGSUSED */ 147int 148uname(p, uap) 149 struct proc *p; 150 struct uname_args *uap; 151{ 152 int name[2], len, rtval; 153 char *s, *us; 154 155 name[0] = CTL_KERN; 156 name[1] = KERN_OSTYPE; 157 len = sizeof uap->name->sysname; 158 rtval = userland_sysctl(p, name, 2, uap->name->sysname, &len, 159 1, 0, 0, 0); 160 if( rtval) return rtval; 161 subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); 162 163 name[1] = KERN_HOSTNAME; 164 len = sizeof uap->name->nodename; 165 rtval = userland_sysctl(p, name, 2, uap->name->nodename, &len, 166 1, 0, 0, 0); 167 if( rtval) return rtval; 168 subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); 169 170 name[1] = KERN_OSRELEASE; 171 len = sizeof uap->name->release; 172 rtval = userland_sysctl(p, name, 2, uap->name->release, &len, 173 1, 0, 0, 0); 174 if( rtval) return rtval; 175 subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); 176 177/* 178 name = KERN_VERSION; 179 len = sizeof uap->name->version; 180 rtval = userland_sysctl(p, name, 2, uap->name->version, &len, 181 1, 0, 0, 0); 182 if( rtval) return rtval; 183 subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); 184*/ 185 186/* 187 * this stupid hackery to make the version field look like FreeBSD 1.1 188 */ 189 for(s = version; *s && *s != '#'; s++); 190 191 for(us = uap->name->version; *s && *s != ':'; s++) { 192 rtval = subyte( us++, *s); 193 if( rtval) 194 return rtval; 195 } 196 rtval = subyte( us++, 0); 197 if( rtval) 198 return rtval; 199 200 name[1] = HW_MACHINE; 201 len = sizeof uap->name->machine; 202 rtval = userland_sysctl(p, name, 2, uap->name->machine, &len, 203 1, 0, 0, 0); 204 if( rtval) return rtval; 205 subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0); 206 207 return 0; 208} 209 210#ifndef _SYS_SYSPROTO_H_ 211struct getdomainname_args { 212 char *domainname; 213 int len; 214}; 215#endif 216 217/* ARGSUSED */ 218int 219getdomainname(p, uap) 220 struct proc *p; 221 struct getdomainname_args *uap; 222{ 223 int domainnamelen = strlen(domainname) + 1; 224 if ((u_int)uap->len > domainnamelen + 1) 225 uap->len = domainnamelen + 1; 226 return (copyout((caddr_t)domainname, (caddr_t)uap->domainname, uap->len)); 227} 228 229#ifndef _SYS_SYSPROTO_H_ 230struct setdomainname_args { 231 char *domainname; 232 int len; 233}; 234#endif 235 236/* ARGSUSED */ 237int 238setdomainname(p, uap) 239 struct proc *p; 240 struct setdomainname_args *uap; 241{ 242 int error, domainnamelen; 243 244 if ((error = suser(p->p_ucred, &p->p_acflag))) 245 return (error); 246 if ((u_int)uap->len > sizeof (domainname) - 1) 247 return EINVAL; 248 domainnamelen = uap->len; 249 error = copyin((caddr_t)uap->domainname, domainname, uap->len); 250 domainname[domainnamelen] = 0; 251 return (error); 252} 253 254