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