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/kernel/utsname_sysctl.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) 2007
    3  *
    4  *  Author: Eric Biederman <ebiederm@xmision.com>
    5  *
    6  *  This program is free software; you can redistribute it and/or
    7  *  modify it under the terms of the GNU General Public License as
    8  *  published by the Free Software Foundation, version 2 of the
    9  *  License.
   10  */
   11 
   12 #include <linux/export.h>
   13 #include <linux/uts.h>
   14 #include <linux/utsname.h>
   15 #include <linux/sysctl.h>
   16 #include <linux/wait.h>
   17 
   18 static void *get_uts(ctl_table *table, int write)
   19 {
   20         char *which = table->data;
   21         struct uts_namespace *uts_ns;
   22 
   23         uts_ns = current->nsproxy->uts_ns;
   24         which = (which - (char *)&init_uts_ns) + (char *)uts_ns;
   25 
   26         if (!write)
   27                 down_read(&uts_sem);
   28         else
   29                 down_write(&uts_sem);
   30         return which;
   31 }
   32 
   33 static void put_uts(ctl_table *table, int write, void *which)
   34 {
   35         if (!write)
   36                 up_read(&uts_sem);
   37         else
   38                 up_write(&uts_sem);
   39 }
   40 
   41 #ifdef CONFIG_PROC_SYSCTL
   42 /*
   43  *      Special case of dostring for the UTS structure. This has locks
   44  *      to observe. Should this be in kernel/sys.c ????
   45  */
   46 static int proc_do_uts_string(ctl_table *table, int write,
   47                   void __user *buffer, size_t *lenp, loff_t *ppos)
   48 {
   49         struct ctl_table uts_table;
   50         int r;
   51         memcpy(&uts_table, table, sizeof(uts_table));
   52         uts_table.data = get_uts(table, write);
   53         r = proc_dostring(&uts_table,write,buffer,lenp, ppos);
   54         put_uts(table, write, uts_table.data);
   55 
   56         if (write)
   57                 proc_sys_poll_notify(table->poll);
   58 
   59         return r;
   60 }
   61 #else
   62 #define proc_do_uts_string NULL
   63 #endif
   64 
   65 static DEFINE_CTL_TABLE_POLL(hostname_poll);
   66 static DEFINE_CTL_TABLE_POLL(domainname_poll);
   67 
   68 static struct ctl_table uts_kern_table[] = {
   69         {
   70                 .procname       = "ostype",
   71                 .data           = init_uts_ns.name.sysname,
   72                 .maxlen         = sizeof(init_uts_ns.name.sysname),
   73                 .mode           = 0444,
   74                 .proc_handler   = proc_do_uts_string,
   75         },
   76         {
   77                 .procname       = "osrelease",
   78                 .data           = init_uts_ns.name.release,
   79                 .maxlen         = sizeof(init_uts_ns.name.release),
   80                 .mode           = 0444,
   81                 .proc_handler   = proc_do_uts_string,
   82         },
   83         {
   84                 .procname       = "version",
   85                 .data           = init_uts_ns.name.version,
   86                 .maxlen         = sizeof(init_uts_ns.name.version),
   87                 .mode           = 0444,
   88                 .proc_handler   = proc_do_uts_string,
   89         },
   90         {
   91                 .procname       = "hostname",
   92                 .data           = init_uts_ns.name.nodename,
   93                 .maxlen         = sizeof(init_uts_ns.name.nodename),
   94                 .mode           = 0644,
   95                 .proc_handler   = proc_do_uts_string,
   96                 .poll           = &hostname_poll,
   97         },
   98         {
   99                 .procname       = "domainname",
  100                 .data           = init_uts_ns.name.domainname,
  101                 .maxlen         = sizeof(init_uts_ns.name.domainname),
  102                 .mode           = 0644,
  103                 .proc_handler   = proc_do_uts_string,
  104                 .poll           = &domainname_poll,
  105         },
  106         {}
  107 };
  108 
  109 static struct ctl_table uts_root_table[] = {
  110         {
  111                 .procname       = "kernel",
  112                 .mode           = 0555,
  113                 .child          = uts_kern_table,
  114         },
  115         {}
  116 };
  117 
  118 #ifdef CONFIG_PROC_SYSCTL
  119 /*
  120  * Notify userspace about a change in a certain entry of uts_kern_table,
  121  * identified by the parameter proc.
  122  */
  123 void uts_proc_notify(enum uts_proc proc)
  124 {
  125         struct ctl_table *table = &uts_kern_table[proc];
  126 
  127         proc_sys_poll_notify(table->poll);
  128 }
  129 #endif
  130 
  131 static int __init utsname_sysctl_init(void)
  132 {
  133         register_sysctl_table(uts_root_table);
  134         return 0;
  135 }
  136 
  137 __initcall(utsname_sysctl_init);

Cache object: 90f278e64823cf00bfd2805e125328e3


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