kern_xxx.c revision 1549
1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 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 */ 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/kernel.h> 39#include <sys/proc.h> 40#include <sys/reboot.h> 41#include <vm/vm.h> 42#include <sys/sysctl.h> 43#include <sys/utsname.h> 44 45char domainname[MAXHOSTNAMELEN]; 46int domainnamelen; 47 48struct reboot_args { 49 int opt; 50}; 51/* ARGSUSED */ 52int 53reboot(p, uap, retval) 54 struct proc *p; 55 struct reboot_args *uap; 56 int *retval; 57{ 58 int error; 59 60 if (error = suser(p->p_ucred, &p->p_acflag)) 61 return (error); 62 boot(uap->opt); 63 return (0); 64} 65 66#if defined(COMPAT_43) || defined(COMPAT_SUNOS) 67 68struct gethostname_args { 69 char *hostname; 70 u_int len; 71}; 72/* ARGSUSED */ 73int 74ogethostname(p, uap, retval) 75 struct proc *p; 76 struct gethostname_args *uap; 77 int *retval; 78{ 79 int name; 80 81 name = KERN_HOSTNAME; 82 return (kern_sysctl(&name, 1, uap->hostname, &uap->len, 0, 0)); 83} 84 85struct sethostname_args { 86 char *hostname; 87 u_int len; 88}; 89/* ARGSUSED */ 90int 91osethostname(p, uap, retval) 92 struct proc *p; 93 register struct sethostname_args *uap; 94 int *retval; 95{ 96 int name; 97 int error; 98 99 if (error = suser(p->p_ucred, &p->p_acflag)) 100 return (error); 101 name = KERN_HOSTNAME; 102 return (kern_sysctl(&name, 1, 0, 0, uap->hostname, uap->len)); 103} 104 105extern long hostid; 106 107struct gethostid_args { 108 int dummy; 109}; 110/* ARGSUSED */ 111int 112ogethostid(p, uap, retval) 113 struct proc *p; 114 struct gethostid_args *uap; 115 int *retval; 116{ 117 118 *(long *)retval = hostid; 119 return (0); 120} 121#endif /* COMPAT_43 || COMPAT_SUNOS */ 122 123#ifdef COMPAT_43 124struct sethostid_args { 125 long hostid; 126}; 127/* ARGSUSED */ 128int 129osethostid(p, uap, retval) 130 struct proc *p; 131 struct sethostid_args *uap; 132 int *retval; 133{ 134 int error; 135 136 if (error = suser(p->p_ucred, &p->p_acflag)) 137 return (error); 138 hostid = uap->hostid; 139 return (0); 140} 141 142int 143oquota() 144{ 145 146 return (ENOSYS); 147} 148#endif /* COMPAT_43 */ 149 150void 151shutdown_nice(void) 152{ 153 register struct proc *p; 154 155 /* Send a signal to init(8) and have it shutdown the world */ 156 p = pfind(1); 157 psignal(p, SIGINT); 158 159 return; 160} 161 162 163struct uname_args { 164 struct utsname *name; 165}; 166 167/* ARGSUSED */ 168int 169uname(p, uap, retval) 170 struct proc *p; 171 struct uname_args *uap; 172 int *retval; 173{ 174 int name; 175 int len; 176 int rtval; 177 char *s, *us; 178 179 name = KERN_OSTYPE; 180 len = sizeof uap->name->sysname; 181 rtval = kern_sysctl(&name, 1, uap->name->sysname, &len, 0, 0, p); 182 if( rtval) return rtval; 183 subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); 184 185 name = KERN_HOSTNAME; 186 len = sizeof uap->name->nodename; 187 rtval = kern_sysctl(&name, 1, uap->name->nodename, &len, 0, 0, p); 188 if( rtval) return rtval; 189 subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); 190 191 name = KERN_OSRELEASE; 192 len = sizeof uap->name->release; 193 rtval = kern_sysctl(&name, 1, uap->name->release, &len, 0, 0, p); 194 if( rtval) return rtval; 195 subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); 196 197/* 198 name = KERN_VERSION; 199 len = sizeof uap->name->version; 200 rtval = kern_sysctl(&name, 1, uap->name->version, &len, 0, 0, p); 201 if( rtval) return rtval; 202 subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); 203*/ 204 205/* 206 * this stupid hackery to make the version field look like FreeBSD 1.1 207 */ 208 for(s = version; *s && *s != '#'; s++); 209 210 for(us = uap->name->version; *s && *s != ':'; s++) { 211 rtval = subyte( us++, *s); 212 if( rtval) 213 return rtval; 214 } 215 rtval = subyte( us++, 0); 216 if( rtval) 217 return rtval; 218 219 name = HW_MACHINE; 220 len = sizeof uap->name->machine; 221 rtval = hw_sysctl(&name, 1, uap->name->machine, &len, 0, 0, p); 222 if( rtval) return rtval; 223 subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0); 224 225 return 0; 226} 227 228struct getdomainname_args { 229 char *domainname; 230 u_int len; 231}; 232 233/* ARGSUSED */ 234int 235getdomainname(p, uap, retval) 236 struct proc *p; 237 struct getdomainname_args *uap; 238 int *retval; 239{ 240 if (uap->len > domainnamelen + 1) 241 uap->len = domainnamelen + 1; 242 return (copyout((caddr_t)domainname, (caddr_t)uap->domainname, uap->len)); 243} 244 245struct setdomainname_args { 246 char *domainname; 247 u_int len; 248}; 249 250/* ARGSUSED */ 251int 252setdomainname(p, uap, retval) 253 struct proc *p; 254 struct setdomainname_args *uap; 255 int *retval; 256{ 257 int error; 258 259 if (error = suser(p->p_ucred, &p->p_acflag)) 260 return (error); 261 if (uap->len > sizeof (domainname) - 1) 262 return EINVAL; 263 domainnamelen = uap->len; 264 error = copyin((caddr_t)uap->domainname, domainname, uap->len); 265 domainname[domainnamelen] = 0; 266 return (error); 267} 268 269