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