xref: /freebsd-src/sys/contrib/openzfs/lib/libspl/os/linux/gethostid.c (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
1*eda14cbcSMatt Macy /*
2*eda14cbcSMatt Macy  * CDDL HEADER START
3*eda14cbcSMatt Macy  *
4*eda14cbcSMatt Macy  * The contents of this file are subject to the terms of the
5*eda14cbcSMatt Macy  * Common Development and Distribution License (the "License").
6*eda14cbcSMatt Macy  * You may not use this file except in compliance with the License.
7*eda14cbcSMatt Macy  *
8*eda14cbcSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*eda14cbcSMatt Macy  * or http://www.opensolaris.org/os/licensing.
10*eda14cbcSMatt Macy  * See the License for the specific language governing permissions
11*eda14cbcSMatt Macy  * and limitations under the License.
12*eda14cbcSMatt Macy  *
13*eda14cbcSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
14*eda14cbcSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*eda14cbcSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
16*eda14cbcSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
17*eda14cbcSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
18*eda14cbcSMatt Macy  *
19*eda14cbcSMatt Macy  * CDDL HEADER END
20*eda14cbcSMatt Macy  */
21*eda14cbcSMatt Macy /*
22*eda14cbcSMatt Macy  * Copyright (c) 2017, Lawrence Livermore National Security, LLC.
23*eda14cbcSMatt Macy  */
24*eda14cbcSMatt Macy 
25*eda14cbcSMatt Macy #include <fcntl.h>
26*eda14cbcSMatt Macy #include <stdlib.h>
27*eda14cbcSMatt Macy #include <stdio.h>
28*eda14cbcSMatt Macy #include <sys/types.h>
29*eda14cbcSMatt Macy #include <sys/stat.h>
30*eda14cbcSMatt Macy #include <sys/systeminfo.h>
31*eda14cbcSMatt Macy 
32*eda14cbcSMatt Macy static unsigned long
33*eda14cbcSMatt Macy get_spl_hostid(void)
34*eda14cbcSMatt Macy {
35*eda14cbcSMatt Macy 	FILE *f;
36*eda14cbcSMatt Macy 	unsigned long hostid;
37*eda14cbcSMatt Macy 	char *env;
38*eda14cbcSMatt Macy 
39*eda14cbcSMatt Macy 	/*
40*eda14cbcSMatt Macy 	 * Allow the hostid to be subverted for testing.
41*eda14cbcSMatt Macy 	 */
42*eda14cbcSMatt Macy 	env = getenv("ZFS_HOSTID");
43*eda14cbcSMatt Macy 	if (env) {
44*eda14cbcSMatt Macy 		hostid = strtoull(env, NULL, 0);
45*eda14cbcSMatt Macy 		return (hostid & HOSTID_MASK);
46*eda14cbcSMatt Macy 	}
47*eda14cbcSMatt Macy 
48*eda14cbcSMatt Macy 	f = fopen("/sys/module/spl/parameters/spl_hostid", "r");
49*eda14cbcSMatt Macy 	if (!f)
50*eda14cbcSMatt Macy 		return (0);
51*eda14cbcSMatt Macy 
52*eda14cbcSMatt Macy 	if (fscanf(f, "%lu", &hostid) != 1)
53*eda14cbcSMatt Macy 		hostid = 0;
54*eda14cbcSMatt Macy 
55*eda14cbcSMatt Macy 	fclose(f);
56*eda14cbcSMatt Macy 
57*eda14cbcSMatt Macy 	return (hostid & HOSTID_MASK);
58*eda14cbcSMatt Macy }
59*eda14cbcSMatt Macy 
60*eda14cbcSMatt Macy unsigned long
61*eda14cbcSMatt Macy get_system_hostid(void)
62*eda14cbcSMatt Macy {
63*eda14cbcSMatt Macy 	unsigned long system_hostid = get_spl_hostid();
64*eda14cbcSMatt Macy 	/*
65*eda14cbcSMatt Macy 	 * We do not use the library call gethostid() because
66*eda14cbcSMatt Macy 	 * it generates a hostid value that the kernel is
67*eda14cbcSMatt Macy 	 * unaware of, if the spl_hostid module parameter has not
68*eda14cbcSMatt Macy 	 * been set and there is no system hostid file (e.g.
69*eda14cbcSMatt Macy 	 * /etc/hostid).  The kernel and userspace must agree.
70*eda14cbcSMatt Macy 	 * See comments above hostid_read() in the SPL.
71*eda14cbcSMatt Macy 	 */
72*eda14cbcSMatt Macy 	if (system_hostid == 0) {
73*eda14cbcSMatt Macy 		int fd, rc;
74*eda14cbcSMatt Macy 		unsigned long hostid;
75*eda14cbcSMatt Macy 		int hostid_size = 4;  /* 4 bytes regardless of arch */
76*eda14cbcSMatt Macy 
77*eda14cbcSMatt Macy 		fd = open("/etc/hostid", O_RDONLY);
78*eda14cbcSMatt Macy 		if (fd >= 0) {
79*eda14cbcSMatt Macy 			rc = read(fd, &hostid, hostid_size);
80*eda14cbcSMatt Macy 			if (rc > 0)
81*eda14cbcSMatt Macy 				system_hostid = (hostid & HOSTID_MASK);
82*eda14cbcSMatt Macy 			close(fd);
83*eda14cbcSMatt Macy 		}
84*eda14cbcSMatt Macy 	}
85*eda14cbcSMatt Macy 	return (system_hostid);
86*eda14cbcSMatt Macy }
87