Samba 3: added Samba 3.0.24 sources
[tomato.git] / release / src / router / samba3 / source / python / py_conv.c
blobd0a2d78aabd48d15066608ead8dd6070e46fb6b9
1 /*
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.
21 #include "py_conv.h"
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)
39 PyObject *obj, *item;
40 int i;
42 obj = PyDict_New();
44 for (i = 0; conv[i].name; i++) {
45 switch (conv[i].type) {
46 case PY_UNISTR: {
47 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
48 fstring str = "";
50 if (u->buffer)
51 fstr_pull(str, u);
53 item = PyString_FromString(str);
54 PyDict_SetItemString(obj, conv[i].name, item);
56 break;
58 case PY_UNISTR2: {
59 UNISTR2 *u = (UNISTR2 *)((char *)s + conv[i].offset);
60 fstring str = "";
62 if (u->buffer)
63 fstr_pull2(str, u);
65 item = PyString_FromString(str);
66 PyDict_SetItemString(obj, conv[i].name, item);
68 break;
70 case PY_UINT32: {
71 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
73 item = PyInt_FromLong(*u);
74 PyDict_SetItemString(obj, conv[i].name, item);
76 break;
78 case PY_UINT16: {
79 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
81 item = PyInt_FromLong(*u);
82 PyDict_SetItemString(obj, conv[i].name, item);
84 break;
86 case PY_STRING: {
87 char *str = (char *)s + conv[i].offset;
89 item = PyString_FromString(str);
90 PyDict_SetItemString(obj, conv[i].name, item);
92 break;
94 case PY_UID: {
95 uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
97 item = PyInt_FromLong(*uid);
98 PyDict_SetItemString(obj, conv[i].name, item);
100 break;
102 case PY_GID: {
103 gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
105 item = PyInt_FromLong(*gid);
106 PyDict_SetItemString(obj, conv[i].name, item);
108 break;
110 default:
112 break;
116 return obj;
119 /* Convert a Python dict to a structure */
121 BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
123 PyObject *visited, *key, *value;
124 BOOL result = False;
125 int i;
127 visited = PyDict_New();
129 for (i = 0; conv[i].name; i++) {
130 PyObject *obj;
132 obj = PyDict_GetItemString(dict, conv[i].name);
134 if (!obj)
135 goto done;
137 switch (conv[i].type) {
138 case PY_UNISTR: {
139 UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
140 char *str = "";
142 if (!PyString_Check(obj))
143 goto done;
145 str = PyString_AsString(obj);
146 init_unistr(u, str);
148 break;
150 case PY_UINT32: {
151 uint32 *u = (uint32 *)((char *)s + conv[i].offset);
153 if (!PyInt_Check(obj))
154 goto done;
156 *u = PyInt_AsLong(obj);
158 break;
160 case PY_UINT16: {
161 uint16 *u = (uint16 *)((char *)s + conv[i].offset);
163 if (!PyInt_Check(obj))
164 goto done;
166 *u = PyInt_AsLong(obj);
167 break;
169 default:
170 break;
173 /* Mark as visited */
175 PyDict_SetItemString(visited, conv[i].name,
176 PyInt_FromLong(1));
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. */
183 i = 0;
185 while (PyDict_Next(dict, &i, &key, &value)) {
186 if (!PyDict_GetItem(visited, key))
187 goto done;
190 result = True;
192 done:
193 /* We must decrement the reference count here or the visited
194 dictionary will not be freed. */
196 Py_DECREF(visited);
198 return result;
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)
206 PyObject *list;
207 int offset = 0;
209 list = PyList_New(0);
211 while (*(dependentfiles + offset) != 0) {
212 fstring name;
213 int len;
215 len = rpcstr_pull(name, dependentfiles + offset,
216 sizeof(fstring), -1, STR_TERMINATE);
218 offset += len / 2;
219 PyList_Append(list, PyString_FromString(name));
222 return list;