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.
25 /* Helper for rpcstr_pull() function */
27 static void fstr_pull(fstring str, UNISTR *uni)
29 rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
32 /* Convert a structure to a Python dict */
34 PyObject *from_struct(void *s, struct pyconv *conv)
41 for (i = 0; conv[i].name; i++) {
42 switch (conv[i].type) {
44 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
50 item = PyString_FromString(s);
51 PyDict_SetItemString(obj, conv[i].name, item);
56 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
58 item = PyInt_FromLong(*u);
59 PyDict_SetItemString(obj, conv[i].name, item);
64 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
66 item = PyInt_FromLong(*u);
67 PyDict_SetItemString(obj, conv[i].name, item);
72 char *str = (char *)s + conv[i].offset;
74 item = PyString_FromString(str);
75 PyDict_SetItemString(obj, conv[i].name, item);
80 uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
82 item = PyInt_FromLong(*uid);
83 PyDict_SetItemString(obj, conv[i].name, item);
88 gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
90 item = PyInt_FromLong(*gid);
91 PyDict_SetItemString(obj, conv[i].name, item);
104 /* Convert a Python dict to a structure */
106 BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
108 PyObject *visited, *key, *value;
112 visited = PyDict_New();
114 for (i = 0; conv[i].name; i++) {
117 obj = PyDict_GetItemString(dict, conv[i].name);
122 switch (conv[i].type) {
124 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
127 if (!PyString_Check(obj))
130 s = PyString_AsString(obj);
136 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
138 if (!PyInt_Check(obj))
141 *u = PyInt_AsLong(obj);
146 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
148 if (!PyInt_Check(obj))
151 *u = PyInt_AsLong(obj);
158 /* Mark as visited */
160 PyDict_SetItemString(visited, conv[i].name,
164 /* Iterate over each item in the input dictionary and see if it was
165 visited. If it wasn't then the user has added some extra crap
166 to the dictionary. */
170 while (PyDict_Next(dict, &i, &key, &value)) {
171 if (!PyDict_GetItem(visited, key))
178 /* We must decrement the reference count here or the visited
179 dictionary will not be freed. */
186 /* Convert a NULL terminated list of NULL terminated unicode strings
187 to a list of (char *) strings */
189 PyObject *from_unistr_list(uint16 *dependentfiles)
194 list = PyList_New(0);
196 while (*(dependentfiles + offset) != 0) {
200 len = rpcstr_pull(name, dependentfiles + offset,
201 sizeof(fstring), -1, STR_TERMINATE);
204 PyList_Append(list, PyString_FromString(name));