1c6dfea0eSMarcel Moolenaar /*- 2c6dfea0eSMarcel Moolenaar * Copyright (c) 1999 Marcel Moolenaar 3c6dfea0eSMarcel Moolenaar * All rights reserved. 4c6dfea0eSMarcel Moolenaar * 5c6dfea0eSMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 6c6dfea0eSMarcel Moolenaar * modification, are permitted provided that the following conditions 7c6dfea0eSMarcel Moolenaar * are met: 8c6dfea0eSMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 9c6dfea0eSMarcel Moolenaar * notice, this list of conditions and the following disclaimer 10c6dfea0eSMarcel Moolenaar * in this position and unchanged. 11c6dfea0eSMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 12c6dfea0eSMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 13c6dfea0eSMarcel Moolenaar * documentation and/or other materials provided with the distribution. 14c6dfea0eSMarcel Moolenaar * 3. The name of the author may not be used to endorse or promote products 15c6dfea0eSMarcel Moolenaar * derived from this software withough specific prior written permission 16c6dfea0eSMarcel Moolenaar * 17c6dfea0eSMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18c6dfea0eSMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19c6dfea0eSMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20c6dfea0eSMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21c6dfea0eSMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22c6dfea0eSMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23c6dfea0eSMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24c6dfea0eSMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25c6dfea0eSMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26c6dfea0eSMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27c6dfea0eSMarcel Moolenaar * 2828065282SPeter Wemm * $FreeBSD$ 29c6dfea0eSMarcel Moolenaar */ 30c6dfea0eSMarcel Moolenaar 31c6dfea0eSMarcel Moolenaar #include <sys/param.h> 32c6dfea0eSMarcel Moolenaar #include <sys/kernel.h> 33c6dfea0eSMarcel Moolenaar #include <sys/systm.h> 34c6dfea0eSMarcel Moolenaar #include <sys/sysctl.h> 35c6dfea0eSMarcel Moolenaar #include <sys/proc.h> 36c6dfea0eSMarcel Moolenaar #include <sys/malloc.h> 37c6dfea0eSMarcel Moolenaar #include <sys/jail.h> 38c6dfea0eSMarcel Moolenaar 39607d46efSMarcel Moolenaar #include <machine/../linux/linux.h> 40607d46efSMarcel Moolenaar #include <compat/linux/linux_mib.h> 41c6dfea0eSMarcel Moolenaar 42c6dfea0eSMarcel Moolenaar struct linux_prison { 43c6dfea0eSMarcel Moolenaar char pr_osname[LINUX_MAX_UTSNAME]; 44c6dfea0eSMarcel Moolenaar char pr_osrelease[LINUX_MAX_UTSNAME]; 45c6dfea0eSMarcel Moolenaar int pr_oss_version; 46c6dfea0eSMarcel Moolenaar }; 47c6dfea0eSMarcel Moolenaar 48c6dfea0eSMarcel Moolenaar SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0, 49c6dfea0eSMarcel Moolenaar "Linux mode"); 50c6dfea0eSMarcel Moolenaar 51c6dfea0eSMarcel Moolenaar static char linux_osname[LINUX_MAX_UTSNAME] = "Linux"; 52c6dfea0eSMarcel Moolenaar 53c6dfea0eSMarcel Moolenaar static int 5482d9ae4eSPoul-Henning Kamp linux_sysctl_osname(SYSCTL_HANDLER_ARGS) 55c6dfea0eSMarcel Moolenaar { 56c6dfea0eSMarcel Moolenaar char osname[LINUX_MAX_UTSNAME]; 57c6dfea0eSMarcel Moolenaar int error; 58c6dfea0eSMarcel Moolenaar 59c6dfea0eSMarcel Moolenaar strcpy(osname, linux_get_osname(req->p)); 60c6dfea0eSMarcel Moolenaar error = sysctl_handle_string(oidp, osname, LINUX_MAX_UTSNAME, req); 61c6dfea0eSMarcel Moolenaar if (error || req->newptr == NULL) 62c6dfea0eSMarcel Moolenaar return (error); 63c6dfea0eSMarcel Moolenaar error = linux_set_osname(req->p, osname); 64c6dfea0eSMarcel Moolenaar return (error); 65c6dfea0eSMarcel Moolenaar } 66c6dfea0eSMarcel Moolenaar 67c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, osname, 68c6dfea0eSMarcel Moolenaar CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON, 69c6dfea0eSMarcel Moolenaar 0, 0, linux_sysctl_osname, "A", 70c6dfea0eSMarcel Moolenaar "Linux kernel OS name"); 71c6dfea0eSMarcel Moolenaar 72759eb461SMarcel Moolenaar static char linux_osrelease[LINUX_MAX_UTSNAME] = "2.2.12"; 73c6dfea0eSMarcel Moolenaar 74c6dfea0eSMarcel Moolenaar static int 7582d9ae4eSPoul-Henning Kamp linux_sysctl_osrelease(SYSCTL_HANDLER_ARGS) 76c6dfea0eSMarcel Moolenaar { 77c6dfea0eSMarcel Moolenaar char osrelease[LINUX_MAX_UTSNAME]; 78c6dfea0eSMarcel Moolenaar int error; 79c6dfea0eSMarcel Moolenaar 80c6dfea0eSMarcel Moolenaar strcpy(osrelease, linux_get_osrelease(req->p)); 81c6dfea0eSMarcel Moolenaar error = sysctl_handle_string(oidp, osrelease, LINUX_MAX_UTSNAME, req); 82c6dfea0eSMarcel Moolenaar if (error || req->newptr == NULL) 83c6dfea0eSMarcel Moolenaar return (error); 84c6dfea0eSMarcel Moolenaar error = linux_set_osrelease(req->p, osrelease); 85c6dfea0eSMarcel Moolenaar return (error); 86c6dfea0eSMarcel Moolenaar } 87c6dfea0eSMarcel Moolenaar 88c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, osrelease, 89c6dfea0eSMarcel Moolenaar CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON, 90c6dfea0eSMarcel Moolenaar 0, 0, linux_sysctl_osrelease, "A", 91c6dfea0eSMarcel Moolenaar "Linux kernel OS release"); 92c6dfea0eSMarcel Moolenaar 93c6dfea0eSMarcel Moolenaar static int linux_oss_version = 0x030600; 94c6dfea0eSMarcel Moolenaar 95c6dfea0eSMarcel Moolenaar static int 9682d9ae4eSPoul-Henning Kamp linux_sysctl_oss_version(SYSCTL_HANDLER_ARGS) 97c6dfea0eSMarcel Moolenaar { 98c6dfea0eSMarcel Moolenaar int oss_version; 99c6dfea0eSMarcel Moolenaar int error; 100c6dfea0eSMarcel Moolenaar 101c6dfea0eSMarcel Moolenaar oss_version = linux_get_oss_version(req->p); 102c6dfea0eSMarcel Moolenaar error = sysctl_handle_int(oidp, &oss_version, 0, req); 103c6dfea0eSMarcel Moolenaar if (error || req->newptr == NULL) 104c6dfea0eSMarcel Moolenaar return (error); 105c6dfea0eSMarcel Moolenaar error = linux_set_oss_version(req->p, oss_version); 106c6dfea0eSMarcel Moolenaar return (error); 107c6dfea0eSMarcel Moolenaar } 108c6dfea0eSMarcel Moolenaar 109c6dfea0eSMarcel Moolenaar SYSCTL_PROC(_compat_linux, OID_AUTO, oss_version, 110c6dfea0eSMarcel Moolenaar CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_PRISON, 111c6dfea0eSMarcel Moolenaar 0, 0, linux_sysctl_oss_version, "I", 112c6dfea0eSMarcel Moolenaar "Linux OSS version"); 113c6dfea0eSMarcel Moolenaar 114c6dfea0eSMarcel Moolenaar static struct linux_prison * 115c6dfea0eSMarcel Moolenaar get_prison(struct proc *p) 116c6dfea0eSMarcel Moolenaar { 117c6dfea0eSMarcel Moolenaar register struct prison *pr; 118c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 119c6dfea0eSMarcel Moolenaar 120c6dfea0eSMarcel Moolenaar pr = p->p_prison; 121c6dfea0eSMarcel Moolenaar if (pr == NULL) 122c6dfea0eSMarcel Moolenaar return (NULL); 123c6dfea0eSMarcel Moolenaar 124c6dfea0eSMarcel Moolenaar if (pr->pr_linux == NULL) { 125c6dfea0eSMarcel Moolenaar MALLOC(lpr, struct linux_prison *, sizeof *lpr, 126c6dfea0eSMarcel Moolenaar M_PRISON, M_WAITOK); 127c6dfea0eSMarcel Moolenaar bzero((caddr_t)lpr, sizeof *lpr); 128c6dfea0eSMarcel Moolenaar pr->pr_linux = lpr; 129c6dfea0eSMarcel Moolenaar } 130c6dfea0eSMarcel Moolenaar 131c6dfea0eSMarcel Moolenaar return (pr->pr_linux); 132c6dfea0eSMarcel Moolenaar } 133c6dfea0eSMarcel Moolenaar 134c6dfea0eSMarcel Moolenaar char * 135c6dfea0eSMarcel Moolenaar linux_get_osname(p) 136c6dfea0eSMarcel Moolenaar struct proc *p; 137c6dfea0eSMarcel Moolenaar { 138c6dfea0eSMarcel Moolenaar register struct prison *pr; 139c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 140c6dfea0eSMarcel Moolenaar 141c6dfea0eSMarcel Moolenaar pr = p->p_prison; 142c6dfea0eSMarcel Moolenaar if (pr != NULL && pr->pr_linux != NULL) { 143c6dfea0eSMarcel Moolenaar lpr = pr->pr_linux; 144c6dfea0eSMarcel Moolenaar if (lpr->pr_osname[0]) 145c6dfea0eSMarcel Moolenaar return (lpr->pr_osname); 146c6dfea0eSMarcel Moolenaar } 147c6dfea0eSMarcel Moolenaar 148c6dfea0eSMarcel Moolenaar return (linux_osname); 149c6dfea0eSMarcel Moolenaar } 150c6dfea0eSMarcel Moolenaar 151c6dfea0eSMarcel Moolenaar int 152c6dfea0eSMarcel Moolenaar linux_set_osname(p, osname) 153c6dfea0eSMarcel Moolenaar struct proc *p; 154c6dfea0eSMarcel Moolenaar char *osname; 155c6dfea0eSMarcel Moolenaar { 156c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 157c6dfea0eSMarcel Moolenaar 158c6dfea0eSMarcel Moolenaar lpr = get_prison(p); 159c6dfea0eSMarcel Moolenaar if (lpr != NULL) 160c6dfea0eSMarcel Moolenaar strcpy(lpr->pr_osname, osname); 161c6dfea0eSMarcel Moolenaar else 162c6dfea0eSMarcel Moolenaar strcpy(linux_osname, osname); 163c6dfea0eSMarcel Moolenaar 164c6dfea0eSMarcel Moolenaar return (0); 165c6dfea0eSMarcel Moolenaar } 166c6dfea0eSMarcel Moolenaar 167c6dfea0eSMarcel Moolenaar char * 168c6dfea0eSMarcel Moolenaar linux_get_osrelease(p) 169c6dfea0eSMarcel Moolenaar struct proc *p; 170c6dfea0eSMarcel Moolenaar { 171c6dfea0eSMarcel Moolenaar register struct prison *pr; 172c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 173c6dfea0eSMarcel Moolenaar 174c6dfea0eSMarcel Moolenaar pr = p->p_prison; 175c6dfea0eSMarcel Moolenaar if (pr != NULL && pr->pr_linux != NULL) { 176c6dfea0eSMarcel Moolenaar lpr = pr->pr_linux; 177c6dfea0eSMarcel Moolenaar if (lpr->pr_osrelease[0]) 178c6dfea0eSMarcel Moolenaar return (lpr->pr_osrelease); 179c6dfea0eSMarcel Moolenaar } 180c6dfea0eSMarcel Moolenaar 181c6dfea0eSMarcel Moolenaar return (linux_osrelease); 182c6dfea0eSMarcel Moolenaar } 183c6dfea0eSMarcel Moolenaar 184c6dfea0eSMarcel Moolenaar int 185c6dfea0eSMarcel Moolenaar linux_set_osrelease(p, osrelease) 186c6dfea0eSMarcel Moolenaar struct proc *p; 187c6dfea0eSMarcel Moolenaar char *osrelease; 188c6dfea0eSMarcel Moolenaar { 189c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 190c6dfea0eSMarcel Moolenaar 191c6dfea0eSMarcel Moolenaar lpr = get_prison(p); 192c6dfea0eSMarcel Moolenaar if (lpr != NULL) 193c6dfea0eSMarcel Moolenaar strcpy(lpr->pr_osrelease, osrelease); 194c6dfea0eSMarcel Moolenaar else 195c6dfea0eSMarcel Moolenaar strcpy(linux_osrelease, osrelease); 196c6dfea0eSMarcel Moolenaar 197c6dfea0eSMarcel Moolenaar return (0); 198c6dfea0eSMarcel Moolenaar } 199c6dfea0eSMarcel Moolenaar 200c6dfea0eSMarcel Moolenaar int 201c6dfea0eSMarcel Moolenaar linux_get_oss_version(p) 202c6dfea0eSMarcel Moolenaar struct proc *p; 203c6dfea0eSMarcel Moolenaar { 204c6dfea0eSMarcel Moolenaar register struct prison *pr; 205c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 206c6dfea0eSMarcel Moolenaar 207c6dfea0eSMarcel Moolenaar pr = p->p_prison; 208c6dfea0eSMarcel Moolenaar if (pr != NULL && pr->pr_linux != NULL) { 209c6dfea0eSMarcel Moolenaar lpr = pr->pr_linux; 210c6dfea0eSMarcel Moolenaar if (lpr->pr_oss_version) 211c6dfea0eSMarcel Moolenaar return (lpr->pr_oss_version); 212c6dfea0eSMarcel Moolenaar } 213c6dfea0eSMarcel Moolenaar 214c6dfea0eSMarcel Moolenaar return (linux_oss_version); 215c6dfea0eSMarcel Moolenaar } 216c6dfea0eSMarcel Moolenaar 217c6dfea0eSMarcel Moolenaar int 218c6dfea0eSMarcel Moolenaar linux_set_oss_version(p, oss_version) 219c6dfea0eSMarcel Moolenaar struct proc *p; 220c6dfea0eSMarcel Moolenaar int oss_version; 221c6dfea0eSMarcel Moolenaar { 222c6dfea0eSMarcel Moolenaar register struct linux_prison *lpr; 223c6dfea0eSMarcel Moolenaar 224c6dfea0eSMarcel Moolenaar lpr = get_prison(p); 225c6dfea0eSMarcel Moolenaar if (lpr != NULL) 226c6dfea0eSMarcel Moolenaar lpr->pr_oss_version = oss_version; 227c6dfea0eSMarcel Moolenaar else 228c6dfea0eSMarcel Moolenaar linux_oss_version = oss_version; 229c6dfea0eSMarcel Moolenaar 230c6dfea0eSMarcel Moolenaar return (0); 231c6dfea0eSMarcel Moolenaar } 232