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