jail_getid.c revision 272461
117721Speter/*- 217721Speter * Copyright (c) 2009 James Gritton. 317721Speter * All rights reserved. 417721Speter * 532785Speter * Redistribution and use in source and binary forms, with or without 617721Speter * modification, are permitted provided that the following conditions 717721Speter * are met: 817721Speter * 1. Redistributions of source code must retain the above copyright 917721Speter * notice, this list of conditions and the following disclaimer. 1017721Speter * 2. Redistributions in binary form must reproduce the above copyright 1117721Speter * notice, this list of conditions and the following disclaimer in the 1217721Speter * documentation and/or other materials provided with the distribution. 1317721Speter * 1417721Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1517721Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1617721Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1717721Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1817721Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1917721Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2017721Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2117721Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2225839Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2317721Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2432785Speter * SUCH DAMAGE. 2532785Speter */ 2617721Speter 2717721Speter#include <sys/cdefs.h> 2817721Speter__FBSDID("$FreeBSD: releng/10.1/lib/libjail/jail_getid.c 210134 2010-07-15 19:21:33Z jamie $"); 2917721Speter 3017721Speter#include <sys/param.h> 3117721Speter#include <sys/types.h> 3217721Speter#include <sys/jail.h> 3317721Speter#include <sys/uio.h> 3417721Speter 3517721Speter#include <errno.h> 3625839Speter#include <stdio.h> 3717721Speter#include <stdlib.h> 3817721Speter#include <string.h> 3917721Speter 4017721Speter#include "jail.h" 4117721Speter 4217721Speter 4317721Speter/* 4417721Speter * Return the JID corresponding to a jail name. 4517721Speter */ 4617721Speterint 4717721Speterjail_getid(const char *name) 4817721Speter{ 4917721Speter char *ep; 5017721Speter int jid; 5117721Speter struct iovec jiov[4]; 5217721Speter 5317721Speter jid = strtoul(name, &ep, 10); 5417721Speter if (*name && !*ep) 5517721Speter return jid; 5617721Speter *(const void **)&jiov[0].iov_base = "name"; 5717721Speter jiov[0].iov_len = sizeof("name"); 5817721Speter jiov[1].iov_len = strlen(name) + 1; 5917721Speter jiov[1].iov_base = alloca(jiov[1].iov_len); 6017721Speter strcpy(jiov[1].iov_base, name); 6117721Speter *(const void **)&jiov[2].iov_base = "errmsg"; 6217721Speter jiov[2].iov_len = sizeof("errmsg"); 6317721Speter jiov[3].iov_base = jail_errmsg; 6417721Speter jiov[3].iov_len = JAIL_ERRMSGLEN; 6517721Speter jail_errmsg[0] = 0; 6617721Speter jid = jail_get(jiov, 4, 0); 6717721Speter if (jid < 0 && !jail_errmsg[0]) 6817721Speter snprintf(jail_errmsg, JAIL_ERRMSGLEN, "jail_get: %s", 6917721Speter strerror(errno)); 7017721Speter return jid; 7117721Speter} 7217721Speter 7317721Speter/* 7417721Speter * Return the name corresponding to a JID. 7517721Speter */ 7625839Speterchar * 7717721Speterjail_getname(int jid) 7817721Speter{ 7917721Speter struct iovec jiov[6]; 8017721Speter char *name; 8117721Speter char namebuf[MAXHOSTNAMELEN]; 8217721Speter 8317721Speter *(const void **)&jiov[0].iov_base = "jid"; 8417721Speter jiov[0].iov_len = sizeof("jid"); 8517721Speter jiov[1].iov_base = &jid; 8617721Speter jiov[1].iov_len = sizeof(jid); 8717721Speter *(const void **)&jiov[2].iov_base = "name"; 8817721Speter jiov[2].iov_len = sizeof("name"); 8917721Speter jiov[3].iov_base = namebuf; 9017721Speter jiov[3].iov_len = sizeof(namebuf); 9117721Speter *(const void **)&jiov[4].iov_base = "errmsg"; 9217721Speter jiov[4].iov_len = sizeof("errmsg"); 9317721Speter jiov[5].iov_base = jail_errmsg; 9417721Speter jiov[5].iov_len = JAIL_ERRMSGLEN; 9517721Speter jail_errmsg[0] = 0; 9617721Speter jid = jail_get(jiov, 6, 0); 9717721Speter if (jid < 0) { 9817721Speter if (!jail_errmsg[0]) 9917721Speter snprintf(jail_errmsg, JAIL_ERRMSGLEN, "jail_get: %s", 10017721Speter strerror(errno)); 10117721Speter return NULL; 10217721Speter } else { 10317721Speter name = strdup(namebuf); 10417721Speter if (name == NULL) 10517721Speter strerror_r(errno, jail_errmsg, JAIL_ERRMSGLEN); 10617721Speter } 10717721Speter return name; 10817721Speter} 10917721Speter