xref: /titanic_52/usr/src/lib/pysolaris/common/misc.c (revision e4d060fb4c00d44cd578713eb9a921f594b733b8)
1*e4d060fbSSam Falkner /*
2*e4d060fbSSam Falkner  * CDDL HEADER START
3*e4d060fbSSam Falkner  *
4*e4d060fbSSam Falkner  * The contents of this file are subject to the terms of the
5*e4d060fbSSam Falkner  * Common Development and Distribution License (the "License").
6*e4d060fbSSam Falkner  * You may not use this file except in compliance with the License.
7*e4d060fbSSam Falkner  *
8*e4d060fbSSam Falkner  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*e4d060fbSSam Falkner  * or http://www.opensolaris.org/os/licensing.
10*e4d060fbSSam Falkner  * See the License for the specific language governing permissions
11*e4d060fbSSam Falkner  * and limitations under the License.
12*e4d060fbSSam Falkner  *
13*e4d060fbSSam Falkner  * When distributing Covered Code, include this CDDL HEADER in each
14*e4d060fbSSam Falkner  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*e4d060fbSSam Falkner  * If applicable, add the following below this CDDL HEADER, with the
16*e4d060fbSSam Falkner  * fields enclosed by brackets "[]" replaced with your own identifying
17*e4d060fbSSam Falkner  * information: Portions Copyright [yyyy] [name of copyright owner]
18*e4d060fbSSam Falkner  *
19*e4d060fbSSam Falkner  * CDDL HEADER END
20*e4d060fbSSam Falkner  */
21*e4d060fbSSam Falkner /*
22*e4d060fbSSam Falkner  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*e4d060fbSSam Falkner  * Use is subject to license terms.
24*e4d060fbSSam Falkner  */
25*e4d060fbSSam Falkner 
26*e4d060fbSSam Falkner #include <Python.h>
27*e4d060fbSSam Falkner #include <zone.h>
28*e4d060fbSSam Falkner #include <libintl.h>
29*e4d060fbSSam Falkner #include <directory.h>
30*e4d060fbSSam Falkner 
31*e4d060fbSSam Falkner #ifdef __lint
32*e4d060fbSSam Falkner #define	dgettext(x, y) y
33*e4d060fbSSam Falkner #endif
34*e4d060fbSSam Falkner 
35*e4d060fbSSam Falkner #define	_(s) dgettext(TEXT_DOMAIN, s)
36*e4d060fbSSam Falkner 
37*e4d060fbSSam Falkner extern int sid_to_id(char *sid, boolean_t user, uid_t *id);
38*e4d060fbSSam Falkner 
39*e4d060fbSSam Falkner static PyObject *
40*e4d060fbSSam Falkner py_sid_to_id(PyObject *self, PyObject *args)
41*e4d060fbSSam Falkner {
42*e4d060fbSSam Falkner 	char *sid;
43*e4d060fbSSam Falkner 	int err, isuser;
44*e4d060fbSSam Falkner 	uid_t id;
45*e4d060fbSSam Falkner 
46*e4d060fbSSam Falkner 	if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
47*e4d060fbSSam Falkner 		return (NULL);
48*e4d060fbSSam Falkner 
49*e4d060fbSSam Falkner 	err = sid_to_id(sid, isuser, &id);
50*e4d060fbSSam Falkner 	if (err) {
51*e4d060fbSSam Falkner 		PyErr_SetString(PyExc_KeyError, sid);
52*e4d060fbSSam Falkner 		return (NULL);
53*e4d060fbSSam Falkner 	}
54*e4d060fbSSam Falkner 
55*e4d060fbSSam Falkner 	return (Py_BuildValue("I", id));
56*e4d060fbSSam Falkner }
57*e4d060fbSSam Falkner 
58*e4d060fbSSam Falkner /*
59*e4d060fbSSam Falkner  * Translate the sid string ("S-1-...") to the user@domain name, if
60*e4d060fbSSam Falkner  * possible.
61*e4d060fbSSam Falkner  */
62*e4d060fbSSam Falkner static PyObject *
63*e4d060fbSSam Falkner py_sid_to_name(PyObject *self, PyObject *args)
64*e4d060fbSSam Falkner {
65*e4d060fbSSam Falkner 	int isuser;
66*e4d060fbSSam Falkner 	char *name, *sid;
67*e4d060fbSSam Falkner 	directory_error_t e;
68*e4d060fbSSam Falkner 	uint64_t classes;
69*e4d060fbSSam Falkner 	PyObject *ret;
70*e4d060fbSSam Falkner 
71*e4d060fbSSam Falkner 	if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
72*e4d060fbSSam Falkner 		return (NULL);
73*e4d060fbSSam Falkner 	e = directory_name_from_sid(NULL, sid, &name, &classes);
74*e4d060fbSSam Falkner 	if (e != NULL) {
75*e4d060fbSSam Falkner 		directory_error_free(e);
76*e4d060fbSSam Falkner 		PyErr_SetString(PyExc_KeyError, sid);
77*e4d060fbSSam Falkner 		return (NULL);
78*e4d060fbSSam Falkner 	}
79*e4d060fbSSam Falkner 	if (name == NULL) {
80*e4d060fbSSam Falkner 		PyErr_SetString(PyExc_KeyError, sid);
81*e4d060fbSSam Falkner 		return (NULL);
82*e4d060fbSSam Falkner 	}
83*e4d060fbSSam Falkner 	if (isuser) {
84*e4d060fbSSam Falkner 		if (!(classes & DIRECTORY_CLASS_USER)) {
85*e4d060fbSSam Falkner 			free(name);
86*e4d060fbSSam Falkner 			PyErr_SetString(PyExc_KeyError, sid);
87*e4d060fbSSam Falkner 			return (NULL);
88*e4d060fbSSam Falkner 		}
89*e4d060fbSSam Falkner 	} else {
90*e4d060fbSSam Falkner 		if (!(classes & DIRECTORY_CLASS_GROUP)) {
91*e4d060fbSSam Falkner 			free(name);
92*e4d060fbSSam Falkner 			PyErr_SetString(PyExc_KeyError, sid);
93*e4d060fbSSam Falkner 			return (NULL);
94*e4d060fbSSam Falkner 		}
95*e4d060fbSSam Falkner 	}
96*e4d060fbSSam Falkner 
97*e4d060fbSSam Falkner 	ret = PyString_FromString(name);
98*e4d060fbSSam Falkner 	free(name);
99*e4d060fbSSam Falkner 	return (ret);
100*e4d060fbSSam Falkner }
101*e4d060fbSSam Falkner 
102*e4d060fbSSam Falkner static PyObject *
103*e4d060fbSSam Falkner py_isglobalzone(PyObject *self, PyObject *args)
104*e4d060fbSSam Falkner {
105*e4d060fbSSam Falkner 	return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
106*e4d060fbSSam Falkner }
107*e4d060fbSSam Falkner 
108*e4d060fbSSam Falkner static PyObject *
109*e4d060fbSSam Falkner py_gettext(PyObject *self, PyObject *args)
110*e4d060fbSSam Falkner {
111*e4d060fbSSam Falkner 	char *message, *result;
112*e4d060fbSSam Falkner 	PyObject *ret = NULL;
113*e4d060fbSSam Falkner 
114*e4d060fbSSam Falkner 	if (!PyArg_ParseTuple(args, "s", &message))
115*e4d060fbSSam Falkner 		return (NULL);
116*e4d060fbSSam Falkner 
117*e4d060fbSSam Falkner 	result = dgettext(TEXT_DOMAIN, message);
118*e4d060fbSSam Falkner 
119*e4d060fbSSam Falkner 	ret = Py_BuildValue("s", result);
120*e4d060fbSSam Falkner 	return (ret);
121*e4d060fbSSam Falkner }
122*e4d060fbSSam Falkner 
123*e4d060fbSSam Falkner static PyMethodDef solarismethods[] = {
124*e4d060fbSSam Falkner 	{"sid_to_id", py_sid_to_id, METH_VARARGS, "Map SID to UID/GID."},
125*e4d060fbSSam Falkner 	{"sid_to_name", py_sid_to_name, METH_VARARGS,
126*e4d060fbSSam Falkner 	    "Map SID to name@domain."},
127*e4d060fbSSam Falkner 	{"isglobalzone", py_isglobalzone, METH_NOARGS,
128*e4d060fbSSam Falkner 	    "Determine if this is the global zone."},
129*e4d060fbSSam Falkner 	{"gettext", py_gettext, METH_VARARGS, "Native call to gettext(3C)"},
130*e4d060fbSSam Falkner 	{NULL, NULL, 0, NULL}
131*e4d060fbSSam Falkner };
132*e4d060fbSSam Falkner 
133*e4d060fbSSam Falkner void
134*e4d060fbSSam Falkner initmisc(void)
135*e4d060fbSSam Falkner {
136*e4d060fbSSam Falkner 	char *noop;
137*e4d060fbSSam Falkner 
138*e4d060fbSSam Falkner 	noop = _("noop");
139*e4d060fbSSam Falkner 	PyObject *solaris_misc = Py_InitModule("solaris.misc", solarismethods);
140*e4d060fbSSam Falkner }
141