2 Python wrappers for DCERPC/SMB client routines.
4 Copyright (C) Tim Potter, 2002
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* Helper for rpcstr_pull() function */
25 static void fstr_pull(fstring str, UNISTR *uni)
27 rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
30 static void fstr_pull2(fstring str, UNISTR2 *uni)
32 rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
35 /* Convert a structure to a Python dict */
37 PyObject *from_struct(void *s, struct pyconv *conv)
44 for (i = 0; conv[i].name; i++) {
45 switch (conv[i].type) {
47 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
53 item = PyString_FromString(str);
54 PyDict_SetItemString(obj, conv[i].name, item);
59 UNISTR2 *u = (UNISTR2 *)((char *)s + conv[i].offset);
65 item = PyString_FromString(str);
66 PyDict_SetItemString(obj, conv[i].name, item);
71 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
73 item = PyInt_FromLong(*u);
74 PyDict_SetItemString(obj, conv[i].name, item);
79 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
81 item = PyInt_FromLong(*u);
82 PyDict_SetItemString(obj, conv[i].name, item);
87 char *str = (char *)s + conv[i].offset;
89 item = PyString_FromString(str);
90 PyDict_SetItemString(obj, conv[i].name, item);
95 uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
97 item = PyInt_FromLong(*uid);
98 PyDict_SetItemString(obj, conv[i].name, item);
103 gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
105 item = PyInt_FromLong(*gid);
106 PyDict_SetItemString(obj, conv[i].name, item);
119 /* Convert a Python dict to a structure */
121 BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
123 PyObject *visited, *key, *value;
127 visited = PyDict_New();
129 for (i = 0; conv[i].name; i++) {
132 obj = PyDict_GetItemString(dict, conv[i].name);
137 switch (conv[i].type) {
139 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
142 if (!PyString_Check(obj))
145 str = PyString_AsString(obj);
151 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
153 if (!PyInt_Check(obj))
156 *u = PyInt_AsLong(obj);
161 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
163 if (!PyInt_Check(obj))
166 *u = PyInt_AsLong(obj);
173 /* Mark as visited */
175 PyDict_SetItemString(visited, conv[i].name,
179 /* Iterate over each item in the input dictionary and see if it was
180 visited. If it wasn't then the user has added some extra crap
181 to the dictionary. */
185 while (PyDict_Next(dict, &i, &key, &value)) {
186 if (!PyDict_GetItem(visited, key))
193 /* We must decrement the reference count here or the visited
194 dictionary will not be freed. */
201 /* Convert a NULL terminated list of NULL terminated unicode strings
202 to a list of (char *) strings */
204 PyObject *from_unistr_list(uint16 *dependentfiles)
209 list = PyList_New(0);
211 while (*(dependentfiles + offset) != 0) {
215 len = rpcstr_pull(name, dependentfiles + offset,
216 sizeof(fstring), -1, STR_TERMINATE);
219 PyList_Append(list, PyString_FromString(name));