The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_xxx.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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: releng/5.0/sys/kern/kern_xxx.c 99012 2002-06-29 02:00:02Z alfred $
   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/lock.h>
   45 #include <sys/mutex.h>
   46 #include <sys/sysctl.h>
   47 #include <sys/utsname.h>
   48 
   49 
   50 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
   51 
   52 #ifndef _SYS_SYSPROTO_H_
   53 struct gethostname_args {
   54         char    *hostname;
   55         u_int   len;
   56 };
   57 #endif
   58 /*
   59  * MPSAFE
   60  */
   61 /* ARGSUSED */
   62 int
   63 ogethostname(td, uap)
   64         struct thread *td;
   65         struct gethostname_args *uap;
   66 {
   67         int name[2];
   68         int error;
   69         size_t len = uap->len;
   70 
   71         name[0] = CTL_KERN;
   72         name[1] = KERN_HOSTNAME;
   73         mtx_lock(&Giant);
   74         error = userland_sysctl(td, name, 2, uap->hostname, &len, 1, 0, 0, 0);
   75         mtx_unlock(&Giant);
   76         return(error);
   77 }
   78 
   79 #ifndef _SYS_SYSPROTO_H_
   80 struct sethostname_args {
   81         char    *hostname;
   82         u_int   len;
   83 };
   84 #endif
   85 /*
   86  * MPSAFE
   87  */
   88 /* ARGSUSED */
   89 int
   90 osethostname(td, uap)
   91         struct thread *td;
   92         register struct sethostname_args *uap;
   93 {
   94         int name[2];
   95         int error;
   96 
   97         name[0] = CTL_KERN;
   98         name[1] = KERN_HOSTNAME;
   99         mtx_lock(&Giant);
  100         if ((error = suser_cred(td->td_ucred, PRISON_ROOT)) == 0) {
  101                 error = userland_sysctl(td, name, 2, 0, 0, 0,
  102                     uap->hostname, uap->len, 0);
  103         }
  104         mtx_unlock(&Giant);
  105         return (error);
  106 }
  107 
  108 #ifndef _SYS_SYSPROTO_H_
  109 struct ogethostid_args {
  110         int     dummy;
  111 };
  112 #endif
  113 /*
  114  * MPSAFE
  115  */
  116 /* ARGSUSED */
  117 int
  118 ogethostid(td, uap)
  119         struct thread *td;
  120         struct ogethostid_args *uap;
  121 {
  122 
  123         *(long *)(td->td_retval) = hostid;
  124         return (0);
  125 }
  126 #endif /* COMPAT_43 || COMPAT_SUNOS */
  127 
  128 #ifdef COMPAT_43
  129 #ifndef _SYS_SYSPROTO_H_
  130 struct osethostid_args {
  131         long    hostid;
  132 };
  133 #endif
  134 /*
  135  * MPSAFE
  136  */
  137 /* ARGSUSED */
  138 int
  139 osethostid(td, uap)
  140         struct thread *td;
  141         struct osethostid_args *uap;
  142 {
  143         int error;
  144 
  145         mtx_lock(&Giant);
  146         if ((error = suser(td)))
  147                 hostid = uap->hostid;
  148         mtx_unlock(&Giant);
  149         return (error);
  150 }
  151 
  152 /*
  153  * MPSAFE
  154  */
  155 int
  156 oquota(td, uap)
  157         struct thread *td;
  158         struct oquota_args *uap;
  159 {
  160         return (ENOSYS);
  161 }
  162 #endif /* COMPAT_43 */
  163 
  164 /*
  165  * This is the FreeBSD-1.1 compatable uname(2) interface.  These
  166  * days it is done in libc as a wrapper around a bunch of sysctl's.
  167  * This must maintain the old 1.1 binary ABI.
  168  */
  169 #if SYS_NMLN != 32
  170 #error "FreeBSD-1.1 uname syscall has been broken"
  171 #endif
  172 #ifndef _SYS_SYSPROTO_H_
  173 struct uname_args {
  174         struct utsname  *name;
  175 };
  176 #endif
  177 
  178 /*
  179  * MPSAFE
  180  */
  181 /* ARGSUSED */
  182 int
  183 uname(td, uap)
  184         struct thread *td;
  185         struct uname_args *uap;
  186 {
  187         int name[2], error;
  188         size_t len;
  189         char *s, *us;
  190 
  191         name[0] = CTL_KERN;
  192         name[1] = KERN_OSTYPE;
  193         len = sizeof (uap->name->sysname);
  194         mtx_lock(&Giant);
  195         error = userland_sysctl(td, name, 2, uap->name->sysname, &len, 
  196                 1, 0, 0, 0);
  197         if (error)
  198                 goto done2;
  199         subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0);
  200 
  201         name[1] = KERN_HOSTNAME;
  202         len = sizeof uap->name->nodename;
  203         error = userland_sysctl(td, name, 2, uap->name->nodename, &len, 
  204                 1, 0, 0, 0);
  205         if (error)
  206                 goto done2;
  207         subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0);
  208 
  209         name[1] = KERN_OSRELEASE;
  210         len = sizeof uap->name->release;
  211         error = userland_sysctl(td, name, 2, uap->name->release, &len, 
  212                 1, 0, 0, 0);
  213         if (error)
  214                 goto done2;
  215         subyte( uap->name->release + sizeof(uap->name->release) - 1, 0);
  216 
  217 /*
  218         name = KERN_VERSION;
  219         len = sizeof uap->name->version;
  220         error = userland_sysctl(td, name, 2, uap->name->version, &len, 
  221                 1, 0, 0, 0);
  222         if (error)
  223                 goto done2;
  224         subyte( uap->name->version + sizeof(uap->name->version) - 1, 0);
  225 */
  226 
  227 /*
  228  * this stupid hackery to make the version field look like FreeBSD 1.1
  229  */
  230         for(s = version; *s && *s != '#'; s++);
  231 
  232         for(us = uap->name->version; *s && *s != ':'; s++) {
  233                 error = subyte( us++, *s);
  234                 if (error)
  235                         goto done2;
  236         }
  237         error = subyte( us++, 0);
  238         if (error)
  239                 goto done2;
  240 
  241         name[0] = CTL_HW;
  242         name[1] = HW_MACHINE;
  243         len = sizeof uap->name->machine;
  244         error = userland_sysctl(td, name, 2, uap->name->machine, &len, 
  245                 1, 0, 0, 0);
  246         if (error)
  247                 goto done2;
  248         subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0);
  249 done2:
  250         mtx_unlock(&Giant);
  251         return (error);
  252 }
  253 
  254 #ifndef _SYS_SYSPROTO_H_
  255 struct getdomainname_args {
  256         char    *domainname;
  257         int     len;
  258 };
  259 #endif
  260 
  261 /*
  262  * MPSAFE
  263  */
  264 /* ARGSUSED */
  265 int
  266 getdomainname(td, uap)
  267         struct thread *td;
  268         struct getdomainname_args *uap;
  269 {
  270         int domainnamelen;
  271         int error;
  272 
  273         mtx_lock(&Giant);
  274         domainnamelen = strlen(domainname) + 1;
  275         if ((u_int)uap->len > domainnamelen + 1)
  276                 uap->len = domainnamelen + 1;
  277         error = copyout(domainname, uap->domainname, uap->len);
  278         mtx_unlock(&Giant);
  279         return (error);
  280 }
  281 
  282 #ifndef _SYS_SYSPROTO_H_
  283 struct setdomainname_args {
  284         char    *domainname;
  285         int     len;
  286 };
  287 #endif
  288 
  289 /*
  290  * MPSAFE
  291  */
  292 /* ARGSUSED */
  293 int
  294 setdomainname(td, uap)
  295         struct thread *td;
  296         struct setdomainname_args *uap;
  297 {
  298         int error, domainnamelen;
  299 
  300         mtx_lock(&Giant);
  301         if ((error = suser(td)))
  302                 goto done2;
  303         if ((u_int)uap->len > sizeof (domainname) - 1) {
  304                 error = EINVAL;
  305                 goto done2;
  306         }
  307         domainnamelen = uap->len;
  308         error = copyin(uap->domainname, domainname, uap->len);
  309         domainname[domainnamelen] = 0;
  310 done2:
  311         mtx_unlock(&Giant);
  312         return (error);
  313 }
  314 

Cache object: da2f12a790a5dc6bc6d20c2810b7ab25


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.