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 * $Id: kern_xxx.c,v 1.29 1999/04/27 11:16:09 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_ 51 struct gethostname_args { 52 char *hostname; 53 u_int len; 54 }; 55 #endif 56 /* ARGSUSED */ 57 int 58 ogethostname(p, uap) 59 struct proc *p; 60 struct gethostname_args *uap; 61 { 62 int name[2]; 63 size_t len = uap->len; 64 65 name[0] = CTL_KERN; 66 name[1] = KERN_HOSTNAME; 67 return (userland_sysctl(p, name, 2, uap->hostname, &len, 68 1, 0, 0, 0)); 69 } 70 71 #ifndef _SYS_SYSPROTO_H_ 72 struct sethostname_args { 73 char *hostname; 74 u_int len; 75 }; 76 #endif 77 /* ARGSUSED */ 78 int 79 osethostname(p, uap) 80 struct proc *p; 81 register struct sethostname_args *uap; 82 { 83 int name[2]; 84 int error; 85 86 name[0] = CTL_KERN; 87 name[1] = KERN_HOSTNAME; 88 if ((error = suser_xxx(0, p, PRISON_ROOT))) 89 return (error); 90 return (userland_sysctl(p, name, 2, 0, 0, 0, 91 uap->hostname, uap->len, 0)); 92 } 93 94 #ifndef _SYS_SYSPROTO_H_ 95 struct ogethostid_args { 96 int dummy; 97 }; 98 #endif 99 /* ARGSUSED */ 100 int 101 ogethostid(p, uap) 102 struct proc *p; 103 struct ogethostid_args *uap; 104 { 105 106 *(long *)(p->p_retval) = hostid; 107 return (0); 108 } 109 #endif /* COMPAT_43 || COMPAT_SUNOS */ 110 111 #ifdef COMPAT_43 112 #ifndef _SYS_SYSPROTO_H_ 113 struct osethostid_args { 114 long hostid; 115 }; 116 #endif 117 /* ARGSUSED */ 118 int 119 osethostid(p, uap) 120 struct proc *p; 121 struct osethostid_args *uap; 122 { 123 int error; 124 125 if ((error = suser(p))) 126 return (error); 127 hostid = uap->hostid; 128 return (0); 129 } 130 131 int 132 oquota(p, uap) 133 struct proc *p; 134 struct oquota_args *uap; 135 { 136 137 return (ENOSYS); 138 } 139 #endif /* COMPAT_43 */ 140 141 #ifndef _SYS_SYSPROTO_H_ 142 struct uname_args { 143 struct utsname *name; 144 }; 145 #endif 146 147 /* ARGSUSED */ 148 int 149 uname(p, uap) 150 struct proc *p; 151 struct uname_args *uap; 152 { 153 int name[2], rtval; 154 size_t len; 155 char *s, *us; 156 157 name[0] = CTL_KERN; 158 name[1] = KERN_OSTYPE; 159 len = sizeof uap->name->sysname; 160 rtval = userland_sysctl(p, name, 2, uap->name->sysname, &len, 161 1, 0, 0, 0); 162 if( rtval) return rtval; 163 subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); 164 165 name[1] = KERN_HOSTNAME; 166 len = sizeof uap->name->nodename; 167 rtval = userland_sysctl(p, name, 2, uap->name->nodename, &len, 168 1, 0, 0, 0); 169 if( rtval) return rtval; 170 subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); 171 172 name[1] = KERN_OSRELEASE; 173 len = sizeof uap->name->release; 174 rtval = userland_sysctl(p, name, 2, uap->name->release, &len, 175 1, 0, 0, 0); 176 if( rtval) return rtval; 177 subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); 178 179 /* 180 name = KERN_VERSION; 181 len = sizeof uap->name->version; 182 rtval = userland_sysctl(p, name, 2, uap->name->version, &len, 183 1, 0, 0, 0); 184 if( rtval) return rtval; 185 subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); 186 */ 187 188 /* 189 * this stupid hackery to make the version field look like FreeBSD 1.1 190 */ 191 for(s = version; *s && *s != '#'; s++); 192 193 for(us = uap->name->version; *s && *s != ':'; s++) { 194 rtval = subyte( us++, *s); 195 if( rtval) 196 return rtval; 197 } 198 rtval = subyte( us++, 0); 199 if( rtval) 200 return rtval; 201 202 name[0] = CTL_HW; 203 name[1] = HW_MACHINE; 204 len = sizeof uap->name->machine; 205 rtval = userland_sysctl(p, name, 2, uap->name->machine, &len, 206 1, 0, 0, 0); 207 if( rtval) return rtval; 208 subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0); 209 210 return 0; 211 } 212 213 #ifndef _SYS_SYSPROTO_H_ 214 struct getdomainname_args { 215 char *domainname; 216 int len; 217 }; 218 #endif 219 220 /* ARGSUSED */ 221 int 222 getdomainname(p, uap) 223 struct proc *p; 224 struct getdomainname_args *uap; 225 { 226 int domainnamelen = strlen(domainname) + 1; 227 if ((u_int)uap->len > domainnamelen + 1) 228 uap->len = domainnamelen + 1; 229 return (copyout((caddr_t)domainname, (caddr_t)uap->domainname, uap->len)); 230 } 231 232 #ifndef _SYS_SYSPROTO_H_ 233 struct setdomainname_args { 234 char *domainname; 235 int len; 236 }; 237 #endif 238 239 /* ARGSUSED */ 240 int 241 setdomainname(p, uap) 242 struct proc *p; 243 struct setdomainname_args *uap; 244 { 245 int error, domainnamelen; 246 247 if ((error = suser(p))) 248 return (error); 249 if ((u_int)uap->len > sizeof (domainname) - 1) 250 return EINVAL; 251 domainnamelen = uap->len; 252 error = copyin((caddr_t)uap->domainname, domainname, uap->len); 253 domainname[domainnamelen] = 0; 254 return (error); 255 } 256 257