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 * $FreeBSD$ 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 /* 142 * This is the FreeBSD-1.1 compatable uname(2) interface. These 143 * days it is done in libc as a wrapper around a bunch of sysctl's. 144 * This must maintain the old 1.1 binary ABI. 145 */ 146 #if SYS_NMLN != 32 147 #error "FreeBSD-1.1 uname syscall has been broken" 148 #endif 149 #ifndef _SYS_SYSPROTO_H_ 150 struct uname_args { 151 struct utsname *name; 152 }; 153 #endif 154 155 /* ARGSUSED */ 156 int 157 uname(p, uap) 158 struct proc *p; 159 struct uname_args *uap; 160 { 161 int name[2], rtval; 162 size_t len; 163 char *s, *us; 164 165 name[0] = CTL_KERN; 166 name[1] = KERN_OSTYPE; 167 len = sizeof uap->name->sysname; 168 rtval = userland_sysctl(p, name, 2, uap->name->sysname, &len, 169 1, 0, 0, 0); 170 if( rtval) return rtval; 171 subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); 172 173 name[1] = KERN_HOSTNAME; 174 len = sizeof uap->name->nodename; 175 rtval = userland_sysctl(p, name, 2, uap->name->nodename, &len, 176 1, 0, 0, 0); 177 if( rtval) return rtval; 178 subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); 179 180 name[1] = KERN_OSRELEASE; 181 len = sizeof uap->name->release; 182 rtval = userland_sysctl(p, name, 2, uap->name->release, &len, 183 1, 0, 0, 0); 184 if( rtval) return rtval; 185 subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); 186 187 /* 188 name = KERN_VERSION; 189 len = sizeof uap->name->version; 190 rtval = userland_sysctl(p, name, 2, uap->name->version, &len, 191 1, 0, 0, 0); 192 if( rtval) return rtval; 193 subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); 194 */ 195 196 /* 197 * this stupid hackery to make the version field look like FreeBSD 1.1 198 */ 199 for(s = version; *s && *s != '#'; s++); 200 201 for(us = uap->name->version; *s && *s != ':'; s++) { 202 rtval = subyte( us++, *s); 203 if( rtval) 204 return rtval; 205 } 206 rtval = subyte( us++, 0); 207 if( rtval) 208 return rtval; 209 210 name[0] = CTL_HW; 211 name[1] = HW_MACHINE; 212 len = sizeof uap->name->machine; 213 rtval = userland_sysctl(p, name, 2, uap->name->machine, &len, 214 1, 0, 0, 0); 215 if( rtval) return rtval; 216 subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0); 217 218 return 0; 219 } 220 221 #ifndef _SYS_SYSPROTO_H_ 222 struct getdomainname_args { 223 char *domainname; 224 int len; 225 }; 226 #endif 227 228 /* ARGSUSED */ 229 int 230 getdomainname(p, uap) 231 struct proc *p; 232 struct getdomainname_args *uap; 233 { 234 int domainnamelen = strlen(domainname) + 1; 235 if ((u_int)uap->len > domainnamelen + 1) 236 uap->len = domainnamelen + 1; 237 return (copyout((caddr_t)domainname, (caddr_t)uap->domainname, uap->len)); 238 } 239 240 #ifndef _SYS_SYSPROTO_H_ 241 struct setdomainname_args { 242 char *domainname; 243 int len; 244 }; 245 #endif 246 247 /* ARGSUSED */ 248 int 249 setdomainname(p, uap) 250 struct proc *p; 251 struct setdomainname_args *uap; 252 { 253 int error, domainnamelen; 254 255 if ((error = suser(p))) 256 return (error); 257 if ((u_int)uap->len > sizeof (domainname) - 1) 258 return EINVAL; 259 domainnamelen = uap->len; 260 error = copyin((caddr_t)uap->domainname, domainname, uap->len); 261 domainname[domainnamelen] = 0; 262 return (error); 263 } 264 265