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(str
);
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 str
= 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
));