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/contrib/openzfs/lib/libspl/os/linux/gethostid.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  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or https://opensource.org/licenses/CDDL-1.0.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright (c) 2017, Lawrence Livermore National Security, LLC.
   23  */
   24 
   25 #include <fcntl.h>
   26 #include <stdlib.h>
   27 #include <stdio.h>
   28 #include <sys/types.h>
   29 #include <sys/stat.h>
   30 #include <sys/systeminfo.h>
   31 
   32 static unsigned long
   33 get_spl_hostid(void)
   34 {
   35         FILE *f;
   36         unsigned long hostid;
   37         char *env;
   38 
   39         /*
   40          * Allow the hostid to be subverted for testing.
   41          */
   42         env = getenv("ZFS_HOSTID");
   43         if (env)
   44                 return (strtoull(env, NULL, 0));
   45 
   46         f = fopen("/proc/sys/kernel/spl/hostid", "re");
   47         if (!f)
   48                 return (0);
   49 
   50         if (fscanf(f, "%lx", &hostid) != 1)
   51                 hostid = 0;
   52 
   53         fclose(f);
   54 
   55         return (hostid);
   56 }
   57 
   58 unsigned long
   59 get_system_hostid(void)
   60 {
   61         unsigned long hostid = get_spl_hostid();
   62         uint32_t system_hostid;
   63 
   64         /*
   65          * We do not use gethostid(3) because it can return a bogus ID,
   66          * depending on the libc and /etc/hostid presence,
   67          * and the kernel and userspace must agree.
   68          * See comments above hostid_read() in the SPL.
   69          */
   70         if (hostid == 0) {
   71                 int fd = open("/etc/hostid", O_RDONLY | O_CLOEXEC);
   72                 if (fd >= 0) {
   73                         if (read(fd, &system_hostid, sizeof (system_hostid))
   74                             != sizeof (system_hostid))
   75                                 hostid = 0;
   76                         else
   77                                 hostid = system_hostid;
   78                         (void) close(fd);
   79                 }
   80         }
   81 
   82         return (hostid & HOSTID_MASK);
   83 }

Cache object: ba9fe9080ada68e76586e01ae48fb17c


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