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));