xref: /freebsd-src/sys/contrib/openzfs/lib/libspl/os/linux/zone.c (revision 1f1e2261e341e6ca6862f82261066ef1705f0a7a)
1eac7052fSMatt Macy /*
2eac7052fSMatt Macy  * CDDL HEADER START
3eac7052fSMatt Macy  *
4eac7052fSMatt Macy  * The contents of this file are subject to the terms of the
5eac7052fSMatt Macy  * Common Development and Distribution License (the "License").
6eac7052fSMatt Macy  * You may not use this file except in compliance with the License.
7eac7052fSMatt Macy  *
8eac7052fSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9eac7052fSMatt Macy  * or http://www.opensolaris.org/os/licensing.
10eac7052fSMatt Macy  * See the License for the specific language governing permissions
11eac7052fSMatt Macy  * and limitations under the License.
12eac7052fSMatt Macy  *
13eac7052fSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
14eac7052fSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15eac7052fSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
16eac7052fSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
17eac7052fSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
18eac7052fSMatt Macy  *
19eac7052fSMatt Macy  * CDDL HEADER END
20eac7052fSMatt Macy  */
21eac7052fSMatt Macy /*
22eac7052fSMatt Macy  * Copyright 2006 Ricardo Correia.  All rights reserved.
23eac7052fSMatt Macy  * Use is subject to license terms.
24eac7052fSMatt Macy  */
25eac7052fSMatt Macy 
26*1f1e2261SMartin Matuska #include <unistd.h>
27*1f1e2261SMartin Matuska #include <stdio.h>
28*1f1e2261SMartin Matuska #include <errno.h>
29*1f1e2261SMartin Matuska #include <stdlib.h>
30*1f1e2261SMartin Matuska #include <limits.h>
31*1f1e2261SMartin Matuska #include <string.h>
32*1f1e2261SMartin Matuska 
33eac7052fSMatt Macy #include <zone.h>
34eac7052fSMatt Macy 
35eac7052fSMatt Macy zoneid_t
36c03c5b1cSMartin Matuska getzoneid(void)
37eac7052fSMatt Macy {
38*1f1e2261SMartin Matuska 	char path[PATH_MAX];
39*1f1e2261SMartin Matuska 	char buf[128] = { '\0' };
40*1f1e2261SMartin Matuska 	char *cp;
41*1f1e2261SMartin Matuska 
42*1f1e2261SMartin Matuska 	int c = snprintf(path, sizeof (path), "/proc/self/ns/user");
43*1f1e2261SMartin Matuska 	/* This API doesn't have any error checking... */
44*1f1e2261SMartin Matuska 	if (c < 0)
45*1f1e2261SMartin Matuska 		return (0);
46*1f1e2261SMartin Matuska 
47*1f1e2261SMartin Matuska 	ssize_t r = readlink(path, buf, sizeof (buf) - 1);
48*1f1e2261SMartin Matuska 	if (r < 0)
49*1f1e2261SMartin Matuska 		return (0);
50*1f1e2261SMartin Matuska 
51*1f1e2261SMartin Matuska 	cp = strchr(buf, '[');
52*1f1e2261SMartin Matuska 	if (cp == NULL)
53*1f1e2261SMartin Matuska 		return (0);
54*1f1e2261SMartin Matuska 	cp++;
55*1f1e2261SMartin Matuska 
56*1f1e2261SMartin Matuska 	unsigned long n = strtoul(cp, NULL, 10);
57*1f1e2261SMartin Matuska 	if (n == ULONG_MAX && errno == ERANGE)
58*1f1e2261SMartin Matuska 		return (0);
59*1f1e2261SMartin Matuska 	zoneid_t z = (zoneid_t)n;
60*1f1e2261SMartin Matuska 
61*1f1e2261SMartin Matuska 	return (z);
62eac7052fSMatt Macy }
63