xref: /illumos-gate/usr/src/lib/pysolaris/common/misc.c (revision f770199a45a8893d2f1615ff4e2d13e041992dc3)
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 <idmap.h>
30  #include <directory.h>
31  
32  #ifdef __lint
33  #define	dgettext(x, y) y
34  #endif
35  
36  #define	_(s) dgettext(TEXT_DOMAIN, s)
37  
38  extern int sid_to_id(char *sid, boolean_t user, uid_t *id);
39  
40  static PyObject *
41  py_sid_to_id(PyObject *self, PyObject *args)
42  {
43  	char *sid;
44  	int err, isuser;
45  	uid_t id;
46  
47  	if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
48  		return (NULL);
49  
50  	err = sid_to_id(sid, isuser, &id);
51  	if (err) {
52  		PyErr_SetString(PyExc_KeyError, sid);
53  		return (NULL);
54  	}
55  
56  	return (Py_BuildValue("I", id));
57  }
58  
59  /*
60   * Translate the sid string ("S-1-...") to the user@domain name, if
61   * possible.
62   */
63  static PyObject *
64  py_sid_to_name(PyObject *self, PyObject *args)
65  {
66  	int isuser, err, flag = IDMAP_REQ_FLG_USE_CACHE;
67  	char *name, *sid;
68  	idmap_stat stat;
69  	uid_t pid;
70  	PyObject *ret;
71  
72  	if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
73  		return (NULL);
74  
75  	err = sid_to_id(sid, isuser, &pid);
76  	if (err) {
77  		PyErr_SetString(PyExc_KeyError, sid);
78  		return (NULL);
79  	}
80  	if (isuser)
81  		stat = idmap_getwinnamebyuid(pid, flag, &name, NULL);
82  	else
83  		stat = idmap_getwinnamebygid(pid, flag, &name, NULL);
84  	if (stat < 0) {
85  		PyErr_SetString(PyExc_KeyError, sid);
86  		return (NULL);
87  	}
88  
89  	if (name == NULL) {
90  		PyErr_SetString(PyExc_KeyError, sid);
91  		return (NULL);
92  	}
93  
94  	ret = PyString_FromString(name);
95  	free(name);
96  	return (ret);
97  }
98  
99  static PyObject *
100  py_isglobalzone(PyObject *self, PyObject *args)
101  {
102  	return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
103  }
104  
105  static PyObject *
106  py_gettext(PyObject *self, PyObject *args)
107  {
108  	char *message, *result;
109  	PyObject *ret = NULL;
110  
111  	if (!PyArg_ParseTuple(args, "s", &message))
112  		return (NULL);
113  
114  	result = dgettext(TEXT_DOMAIN, message);
115  
116  	ret = Py_BuildValue("s", result);
117  	return (ret);
118  }
119  
120  static PyMethodDef solarismethods[] = {
121  	{"sid_to_id", py_sid_to_id, METH_VARARGS, "Map SID to UID/GID."},
122  	{"sid_to_name", py_sid_to_name, METH_VARARGS,
123  	    "Map SID to name@domain."},
124  	{"isglobalzone", py_isglobalzone, METH_NOARGS,
125  	    "Determine if this is the global zone."},
126  	{"gettext", py_gettext, METH_VARARGS, "Native call to gettext(3C)"},
127  	{NULL, NULL, 0, NULL}
128  };
129  
130  void
131  initmisc(void)
132  {
133  	char *noop;
134  
135  	noop = _("noop");
136  	PyObject *solaris_misc = Py_InitModule("solaris.misc", solarismethods);
137  }
138