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

Cache object: 3df560fb31121b400aa523e3b8b2126e


[ 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.