root/compat/common/kern_info_43.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. compat_43_sys_getdtablesize
  2. compat_43_sys_gethostid
  3. compat_43_sys_gethostname
  4. compat_43_sys_getkerninfo
  5. compat_43_sys_sethostid
  6. compat_43_sys_sethostname

    1 /*      $OpenBSD: kern_info_43.c,v 1.15 2003/08/15 20:32:15 tedu Exp $  */
    2 /*      $NetBSD: kern_info_43.c,v 1.5 1996/02/04 02:02:22 christos Exp $        */
    3 
    4 /*
    5  * Copyright (c) 1982, 1986, 1991, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)subr_xxx.c  8.1 (Berkeley) 6/10/93
   33  */
   34 
   35 #include <sys/param.h>
   36 #include <sys/systm.h>
   37 #include <sys/filedesc.h>
   38 #include <sys/kernel.h>
   39 #include <sys/vnode.h>
   40 #include <sys/proc.h>
   41 #include <sys/file.h>
   42 #include <sys/socket.h>
   43 #include <sys/socketvar.h>
   44 #include <sys/stat.h>
   45 #include <sys/ioctl.h>
   46 #include <sys/fcntl.h>
   47 #include <sys/malloc.h>
   48 #include <sys/syslog.h>
   49 #include <sys/unistd.h>
   50 #include <sys/resourcevar.h>
   51 #include <uvm/uvm_extern.h>
   52 #include <sys/sysctl.h>
   53 
   54 #include <sys/mount.h>
   55 #include <sys/syscallargs.h>
   56 
   57 int
   58 compat_43_sys_getdtablesize(p, v, retval)
   59         struct proc *p;
   60         void *v;
   61         register_t *retval;
   62 {
   63 
   64         *retval = min((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfiles);
   65         return (0);
   66 }
   67 
   68 
   69 /* ARGSUSED */
   70 int
   71 compat_43_sys_gethostid(p, v, retval)
   72         struct proc *p;
   73         void *v;
   74         register_t *retval;
   75 {
   76 
   77         *(int32_t *)retval = hostid;
   78         return (0);
   79 }
   80 
   81 
   82 /*ARGSUSED*/
   83 int
   84 compat_43_sys_gethostname(p, v, retval)
   85         struct proc *p;
   86         void *v;
   87         register_t *retval;
   88 {
   89         struct compat_43_sys_gethostname_args /* {
   90                 syscallarg(char *) hostname;
   91                 syscallarg(u_int) len;
   92         } */ *uap = v;
   93         int name;
   94         size_t sz;
   95 
   96         name = KERN_HOSTNAME;
   97         sz = SCARG(uap, len);
   98         return (kern_sysctl(&name, 1, SCARG(uap, hostname), &sz, 0, 0, p));
   99 }
  100 
  101 #define KINFO_PROC              (0<<8)
  102 #define KINFO_RT                (1<<8)
  103 #define KINFO_VNODE             (2<<8)
  104 #define KINFO_FILE              (3<<8)
  105 #define KINFO_METER             (4<<8)
  106 #define KINFO_LOADAVG           (5<<8)
  107 #define KINFO_CLOCKRATE         (6<<8)
  108 #define KINFO_BSDI_SYSINFO      (101<<8)
  109 
  110 
  111 /*
  112  * The string data is appended to the end of the bsdi_si structure during
  113  * copyout. The "char *" offsets in the bsdi_si struct are relative to the
  114  * base of the bsdi_si struct. 
  115  */
  116 struct bsdi_si {
  117         char    *machine;
  118         char    *cpu_model;
  119         long    ncpu;
  120         long    cpuspeed;
  121         long    hwflags;
  122         u_long  physmem;
  123         u_long  usermem;
  124         u_long  pagesize;
  125 
  126         char    *ostype;
  127         char    *osrelease;
  128         long    os_revision;
  129         long    posix1_version;
  130         char    *version;
  131 
  132         long    hz;
  133         long    profhz;
  134         int     ngroups_max;
  135         long    arg_max;
  136         long    open_max;
  137         long    child_max;
  138 
  139         struct  timeval boottime;
  140         char    *hostname;
  141 };
  142 
  143 /* Non-standard BSDI extension - only present on their 4.3 net-2 releases */
  144 #define       KINFO_BSDI_SYSINFO      (101<<8)
  145 
  146 /*
  147  * XXX this is bloat, but I hope it's better here than on the potentially
  148  * limited kernel stack...  -Peter
  149  */
  150 
  151 struct {      
  152         char    *bsdi_machine;          /* "i386" on BSD/386 */
  153         char    *pad0;
  154         long    pad1;
  155         long    pad2;
  156         long    pad3;
  157         u_long  pad4;
  158         u_long  pad5;
  159         u_long  pad6;
  160 
  161         char    *bsdi_ostype;           /* "BSD/386" on BSD/386 */
  162         char    *bsdi_osrelease;        /* "1.1" on BSD/386 */
  163         long    pad7;   
  164         long    pad8;
  165         char    *pad9;
  166 
  167         long    pad10;
  168         long    pad11;  
  169         int     pad12;
  170         long    pad13; 
  171         quad_t  pad14; 
  172         long    pad15;
  173 
  174         struct  timeval pad16;
  175         /* we dont set this, because BSDI's uname used gethostname() instead */
  176         char    *bsdi_hostname;         /* hostname on BSD/386 */
  177 
  178         /* the actual string data is appended here */
  179 
  180 } bsdi_si;
  181 /*
  182  * this data is appended to the end of the bsdi_si structure during copyout.
  183  * The "char *" offsets are relative to the base of the bsdi_si struct.
  184  * This contains "OpenBSD\01.2-BUILT-nnnnnn\0i386\0", and these strings
  185  * should not exceed the length of the buffer here... (or else!! :-)
  186  */
  187 char bsdi_strings[80];        /* It had better be less than this! */
  188 
  189 int
  190 compat_43_sys_getkerninfo(p, v, retval)
  191         struct proc *p;
  192         void *v;
  193         register_t *retval;
  194 {
  195         register struct compat_43_sys_getkerninfo_args /* {
  196                 syscallarg(int) op;
  197                 syscallarg(char *) where;
  198                 syscallarg(int *) size;
  199                 syscallarg(int) arg;
  200         } */ *uap = v;
  201         int error, name[5];
  202         size_t size;
  203 
  204         extern char machine[];
  205 
  206         if (SCARG(uap, size) && (error = copyin((caddr_t)SCARG(uap, size),
  207             (caddr_t)&size, sizeof(size))))
  208                 return (error);
  209 
  210         switch (SCARG(uap, op) & 0xff00) {
  211 
  212         case KINFO_RT:
  213                 name[0] = PF_ROUTE;
  214                 name[1] = 0;
  215                 name[2] = (SCARG(uap, op) & 0xff0000) >> 16;
  216                 name[3] = SCARG(uap, op) & 0xff;
  217                 name[4] = SCARG(uap, arg);
  218                 error =
  219                     net_sysctl(name, 5, SCARG(uap, where), &size, NULL, 0, p);
  220                 break;
  221 
  222         case KINFO_VNODE:
  223                 name[0] = KERN_VNODE;
  224                 error =
  225                     kern_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
  226                 break;
  227 
  228         case KINFO_PROC:
  229                 name[0] = KERN_PROC;
  230                 name[1] = SCARG(uap, op) & 0xff;
  231                 name[2] = SCARG(uap, arg);
  232                 error =
  233                     kern_sysctl(name, 3, SCARG(uap, where), &size, NULL, 0, p);
  234                 break;
  235 
  236         case KINFO_FILE:
  237                 name[0] = KERN_FILE;
  238                 error =
  239                     kern_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
  240                 break;
  241 
  242         case KINFO_METER:
  243                 name[0] = VM_METER;
  244                 error =
  245                     uvm_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
  246                 break;
  247 
  248         case KINFO_LOADAVG:
  249                 name[0] = VM_LOADAVG;
  250                 error =
  251                     uvm_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
  252                 break;
  253 
  254         case KINFO_CLOCKRATE:
  255                 name[0] = KERN_CLOCKRATE;
  256                 error =
  257                     kern_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
  258                 break;
  259 
  260         case KINFO_BSDI_SYSINFO: { 
  261                 /*
  262                  * this is pretty crude, but it's just enough for uname()
  263                  * from BSDI's 1.x libc to work.
  264                  */
  265 
  266                 u_int needed;
  267                 u_int left;
  268                 char *s;
  269 
  270                 bzero((char *)&bsdi_si, sizeof(bsdi_si));
  271                 bzero(bsdi_strings, sizeof(bsdi_strings));
  272 
  273                 s = bsdi_strings;
  274 
  275                 bsdi_si.bsdi_ostype = ((char *)(s - bsdi_strings)) +
  276                                        sizeof(bsdi_si);
  277                 strlcpy(s, ostype, bsdi_strings + sizeof bsdi_strings - s);
  278                 s += strlen(s) + 1;
  279 
  280                 bsdi_si.bsdi_osrelease = ((char *)(s - bsdi_strings)) +
  281                                           sizeof(bsdi_si);
  282                 strlcpy(s, osrelease, bsdi_strings + sizeof bsdi_strings - s);
  283                 s += strlen(s) + 1;
  284 
  285                 bsdi_si.bsdi_machine = ((char *)(s - bsdi_strings)) +
  286                                         sizeof(bsdi_si);
  287                 strlcpy(s, machine, bsdi_strings + sizeof bsdi_strings - s);
  288                 s += strlen(s) + 1;
  289 
  290                 needed = sizeof(bsdi_si) + (s - bsdi_strings);
  291 
  292                 if (SCARG(uap, where) == NULL) {
  293                         /* process is asking how much buffer to supply.. */
  294                         size = needed;
  295                         error = 0;
  296                         break;
  297                 }
  298 
  299                 /* if too much buffer supplied, trim it down */
  300                 if (size > needed)
  301                         size = needed;
  302 
  303                 /* how much of the buffer is remaining */
  304                 left = size;
  305 
  306                 if ((error = copyout((char *)&bsdi_si, SCARG(uap, where), 
  307                     left)) != 0)
  308                         break;
  309 
  310                 /* is there any point in continuing? */
  311                 if (left > sizeof(bsdi_si))
  312                         left -= sizeof(bsdi_si);
  313                 else
  314                         break;
  315 
  316                 error = copyout(&bsdi_strings, SCARG(uap, where) +
  317                                 sizeof(bsdi_si), left);
  318 
  319                 break;
  320         }
  321 
  322         default:
  323                 return (EOPNOTSUPP);
  324         }
  325         if (error)
  326                 return (error);
  327         *retval = size;
  328         if (SCARG(uap, size))
  329                 error = copyout((caddr_t)&size, (caddr_t)SCARG(uap, size),
  330                     sizeof(size));
  331         return (error);
  332 }
  333 
  334 
  335 /* ARGSUSED */
  336 int
  337 compat_43_sys_sethostid(p, v, retval)
  338         struct proc *p;
  339         void *v;
  340         register_t *retval;
  341 {
  342         struct compat_43_sys_sethostid_args /* {
  343                 syscallarg(int32_t) hostid;
  344         } */ *uap = v;
  345         int error;
  346 
  347         if ((error = suser(p, 0)) != 0)
  348                 return (error);
  349         hostid = SCARG(uap, hostid);
  350         return (0);
  351 }
  352 
  353 
  354 /* ARGSUSED */
  355 int
  356 compat_43_sys_sethostname(p, v, retval)
  357         struct proc *p;
  358         void *v;
  359         register_t *retval;
  360 {
  361         struct compat_43_sys_sethostname_args *uap = v;
  362         int name;
  363         int error;
  364 
  365         if ((error = suser(p, 0)) != 0)
  366                 return (error);
  367         name = KERN_HOSTNAME;
  368         return (kern_sysctl(&name, 1, 0, 0, SCARG(uap, hostname),
  369                             SCARG(uap, len), p));
  370 }

/* [<][>][^][v][top][bottom][index][help] */