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