mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
5e54558c6d
(This used to be commit b0132e94fc
)
223 lines
4.5 KiB
C
223 lines
4.5 KiB
C
/*
|
|
Python wrappers for DCERPC/SMB client routines.
|
|
|
|
Copyright (C) Tim Potter, 2002
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "py_conv.h"
|
|
|
|
/* Helper for rpcstr_pull() function */
|
|
|
|
static void fstr_pull(fstring str, UNISTR *uni)
|
|
{
|
|
rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
|
|
}
|
|
|
|
static void fstr_pull2(fstring str, UNISTR2 *uni)
|
|
{
|
|
rpcstr_pull(str, uni->buffer, sizeof(fstring), -1, STR_TERMINATE);
|
|
}
|
|
|
|
/* Convert a structure to a Python dict */
|
|
|
|
PyObject *from_struct(void *s, struct pyconv *conv)
|
|
{
|
|
PyObject *obj, *item;
|
|
int i;
|
|
|
|
obj = PyDict_New();
|
|
|
|
for (i = 0; conv[i].name; i++) {
|
|
switch (conv[i].type) {
|
|
case PY_UNISTR: {
|
|
UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
|
|
fstring str = "";
|
|
|
|
if (u->buffer)
|
|
fstr_pull(str, u);
|
|
|
|
item = PyString_FromString(str);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_UNISTR2: {
|
|
UNISTR2 *u = (UNISTR2 *)((char *)s + conv[i].offset);
|
|
fstring str = "";
|
|
|
|
if (u->buffer)
|
|
fstr_pull2(str, u);
|
|
|
|
item = PyString_FromString(str);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_UINT32: {
|
|
uint32 *u = (uint32 *)((char *)s + conv[i].offset);
|
|
|
|
item = PyInt_FromLong(*u);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_UINT16: {
|
|
uint16 *u = (uint16 *)((char *)s + conv[i].offset);
|
|
|
|
item = PyInt_FromLong(*u);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_STRING: {
|
|
char *str = (char *)s + conv[i].offset;
|
|
|
|
item = PyString_FromString(str);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_UID: {
|
|
uid_t *uid = (uid_t *)((char *)s + conv[i].offset);
|
|
|
|
item = PyInt_FromLong(*uid);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
case PY_GID: {
|
|
gid_t *gid = (gid_t *)((char *)s + conv[i].offset);
|
|
|
|
item = PyInt_FromLong(*gid);
|
|
PyDict_SetItemString(obj, conv[i].name, item);
|
|
|
|
break;
|
|
}
|
|
default:
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
/* Convert a Python dict to a structure */
|
|
|
|
BOOL to_struct(void *s, PyObject *dict, struct pyconv *conv)
|
|
{
|
|
PyObject *visited, *key, *value;
|
|
BOOL result = False;
|
|
int i;
|
|
|
|
visited = PyDict_New();
|
|
|
|
for (i = 0; conv[i].name; i++) {
|
|
PyObject *obj;
|
|
|
|
obj = PyDict_GetItemString(dict, conv[i].name);
|
|
|
|
if (!obj)
|
|
goto done;
|
|
|
|
switch (conv[i].type) {
|
|
case PY_UNISTR: {
|
|
UNISTR *u = (UNISTR *)((char *)s + conv[i].offset);
|
|
char *str = "";
|
|
|
|
if (!PyString_Check(obj))
|
|
goto done;
|
|
|
|
str = PyString_AsString(obj);
|
|
init_unistr(u, str);
|
|
|
|
break;
|
|
}
|
|
case PY_UINT32: {
|
|
uint32 *u = (uint32 *)((char *)s + conv[i].offset);
|
|
|
|
if (!PyInt_Check(obj))
|
|
goto done;
|
|
|
|
*u = PyInt_AsLong(obj);
|
|
|
|
break;
|
|
}
|
|
case PY_UINT16: {
|
|
uint16 *u = (uint16 *)((char *)s + conv[i].offset);
|
|
|
|
if (!PyInt_Check(obj))
|
|
goto done;
|
|
|
|
*u = PyInt_AsLong(obj);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* Mark as visited */
|
|
|
|
PyDict_SetItemString(visited, conv[i].name,
|
|
PyInt_FromLong(1));
|
|
}
|
|
|
|
/* Iterate over each item in the input dictionary and see if it was
|
|
visited. If it wasn't then the user has added some extra crap
|
|
to the dictionary. */
|
|
|
|
i = 0;
|
|
|
|
while (PyDict_Next(dict, &i, &key, &value)) {
|
|
if (!PyDict_GetItem(visited, key))
|
|
goto done;
|
|
}
|
|
|
|
result = True;
|
|
|
|
done:
|
|
/* We must decrement the reference count here or the visited
|
|
dictionary will not be freed. */
|
|
|
|
Py_DECREF(visited);
|
|
|
|
return result;
|
|
}
|
|
|
|
/* Convert a NULL terminated list of NULL terminated unicode strings
|
|
to a list of (char *) strings */
|
|
|
|
PyObject *from_unistr_list(uint16 *dependentfiles)
|
|
{
|
|
PyObject *list;
|
|
int offset = 0;
|
|
|
|
list = PyList_New(0);
|
|
|
|
while (*(dependentfiles + offset) != 0) {
|
|
fstring name;
|
|
int len;
|
|
|
|
len = rpcstr_pull(name, dependentfiles + offset,
|
|
sizeof(fstring), -1, STR_TERMINATE);
|
|
|
|
offset += len / 2;
|
|
PyList_Append(list, PyString_FromString(name));
|
|
}
|
|
|
|
return list;
|
|
}
|