diff options
Diffstat (limited to 'source3/python')
-rw-r--r-- | source3/python/py_smb.c | 104 | ||||
-rw-r--r-- | source3/python/py_spoolss.h | 3 | ||||
-rw-r--r-- | source3/python/py_spoolss_drivers.c | 2 | ||||
-rw-r--r-- | source3/python/py_spoolss_drivers_conv.c | 53 |
4 files changed, 154 insertions, 8 deletions
diff --git a/source3/python/py_smb.c b/source3/python/py_smb.c index 1347f79a9b..c3d59d4fb8 100644 --- a/source3/python/py_smb.c +++ b/source3/python/py_smb.c @@ -179,6 +179,83 @@ static PyObject *py_smb_nt_create_andx(PyObject *self, PyObject *args, return PyInt_FromLong(result); } +static PyObject *py_smb_open(PyObject *self, PyObject *args, PyObject *kw) +{ + cli_state_object *cli = (cli_state_object *)self; + static char *kwlist[] = { "filename", "flags", + "share_mode", NULL }; + char *filename; + uint32 flags, share_mode = DENY_NONE; + int result; + + /* Parse parameters */ + + if (!PyArg_ParseTupleAndKeywords( + args, kw, "si|i", kwlist, &filename, &flags, &share_mode)) + return NULL; + + result = cli_open(cli->cli, filename, flags, share_mode); + + if (cli_is_error(cli->cli)) { + PyErr_SetString(PyExc_RuntimeError, "open failed"); + return NULL; + } + + /* Return FID */ + + return PyInt_FromLong(result); +} + +static PyObject *py_smb_read(PyObject *self, PyObject *args, PyObject *kw) +{ + cli_state_object *cli = (cli_state_object *)self; + static char *kwlist[] = { "fnum", "offset", "size", NULL }; + int fnum, offset=0, size=0; + ssize_t result; + size_t fsize; + char *data; + PyObject *ret; + + /* Parse parameters */ + + if (!PyArg_ParseTupleAndKeywords( + args, kw, "i|ii", kwlist, &fnum, &offset, &size)) + return NULL; + + if (!cli_qfileinfo(cli->cli, fnum, NULL, &fsize, NULL, NULL, + NULL, NULL, NULL) && + !cli_getattrE(cli->cli, fnum, NULL, &fsize, NULL, NULL, NULL)) { + PyErr_SetString(PyExc_RuntimeError, "getattrib failed"); + return NULL; + } + + if (offset < 0) + offset = 0; + + if (size < 1 || size > fsize - offset) + size = fsize - offset; + + if (!(data = (char *) malloc((size_t) size))) { + PyErr_SetString(PyExc_RuntimeError, "malloc failed"); + return NULL; + } + + result = cli_read(cli->cli, fnum, data, (off_t) offset, (size_t) size); + + if (result==-1 || cli_is_error(cli->cli)) { + SAFE_FREE(data); + PyErr_SetString(PyExc_RuntimeError, "read failed"); + return NULL; + } + + /* Return a python string */ + + ret = Py_BuildValue("s#", data, result); + SAFE_FREE(data); + + return ret; +} + static PyObject *py_smb_close(PyObject *self, PyObject *args, PyObject *kw) { @@ -323,6 +400,33 @@ static PyMethodDef smb_hnd_methods[] = { { "nt_create_andx", (PyCFunction)py_smb_nt_create_andx, METH_VARARGS | METH_KEYWORDS, "NT Create&X" }, + { "open", (PyCFunction)py_smb_open, + METH_VARARGS | METH_KEYWORDS, + "Open a file\n" +"\n" +"This function returns a fnum handle to an open file. The file is\n" +"opened with flags and optional share mode. If unspecified, the\n" +"default share mode is DENY_NONE\n" +"\n" +"Example:\n" +"\n" +">>> fnum=conn.open(filename, os.O_RDONLY)" }, + + { "read", (PyCFunction)py_smb_read, + METH_VARARGS | METH_KEYWORDS, + "Read from an open file\n" +"\n" +"This function returns a string read from an open file starting at\n" +"offset for size bytes (until EOF is reached). If unspecified, the\n" +"default offset is 0, and default size is the remainder of the file.\n" +"\n" +"Example:\n" +"\n" +">>> conn.read(fnum) # read entire file\n" +">>> conn.read(fnum,5) # read entire file from offset 5\n" +">>> conn.read(fnum,size=64) # read 64 bytes from start of file\n" +">>> conn.read(fnum,4096,1024) # read 1024 bytes from offset 4096\n" }, + { "close", (PyCFunction)py_smb_close, METH_VARARGS | METH_KEYWORDS, "Close" }, diff --git a/source3/python/py_spoolss.h b/source3/python/py_spoolss.h index 34b48190cd..ec94de8fe4 100644 --- a/source3/python/py_spoolss.h +++ b/source3/python/py_spoolss.h @@ -67,7 +67,8 @@ BOOL py_to_DRIVER_INFO_1(DRIVER_INFO_1 *info, PyObject *dict); BOOL py_from_DRIVER_INFO_2(PyObject **dict, DRIVER_INFO_2 *info); BOOL py_to_DRIVER_INFO_2(DRIVER_INFO_2 *info, PyObject *dict); BOOL py_from_DRIVER_INFO_3(PyObject **dict, DRIVER_INFO_3 *info); -BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict); +BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict, + TALLOC_CTX *mem_ctx); BOOL py_from_DRIVER_INFO_6(PyObject **dict, DRIVER_INFO_6 *info); BOOL py_to_DRIVER_INFO_6(DRIVER_INFO_6 *info, PyObject *dict); BOOL py_from_DRIVER_DIRECTORY_1(PyObject **dict, DRIVER_DIRECTORY_1 *info); diff --git a/source3/python/py_spoolss_drivers.c b/source3/python/py_spoolss_drivers.c index 9424fe1527..310f978188 100644 --- a/source3/python/py_spoolss_drivers.c +++ b/source3/python/py_spoolss_drivers.c @@ -365,7 +365,7 @@ PyObject *spoolss_addprinterdriver(PyObject *self, PyObject *args, case 3: ctr.info3 = &dinfo.driver_3; - if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info)) { + if (!py_to_DRIVER_INFO_3(&dinfo.driver_3, info, mem_ctx)) { PyErr_SetString(spoolss_error, "error converting to driver info 3"); goto done; diff --git a/source3/python/py_spoolss_drivers_conv.c b/source3/python/py_spoolss_drivers_conv.c index 9bc8408052..ae196c1903 100644 --- a/source3/python/py_spoolss_drivers_conv.c +++ b/source3/python/py_spoolss_drivers_conv.c @@ -78,9 +78,49 @@ struct pyconv py_DRIVER_DIRECTORY_1[] = { { NULL } }; -static uint16 *to_dependentfiles(PyObject *dict) +static uint16 *to_dependentfiles(PyObject *list, TALLOC_CTX *mem_ctx) { - return (uint16 *)"abcd\0"; + uint32 elements, size=0, pos=0, i; + char *str; + uint16 *ret = NULL; + PyObject *borrowedRef; + + if (!PyList_Check(list)) { + goto done; + } + + /* calculate size for dependentfiles */ + elements=PyList_Size(list); + for (i = 0; i < elements; i++) { + borrowedRef=PyList_GetItem(list, i); + if (!PyString_Check(borrowedRef)) + /* non string found, return error */ + goto done; + size+=PyString_Size(borrowedRef)+1; + } + + if (!(ret = (uint16*) talloc(mem_ctx,(size+1)*sizeof(uint16)))) + goto done; + + /* create null terminated sequence of null terminated strings */ + for (i = 0; i < elements; i++) { + borrowedRef=PyList_GetItem(list, i); + str=PyString_AsString(borrowedRef); + do { + if (pos >= size) { + /* dependentfiles too small. miscalculated? */ + ret = NULL; + goto done; + } + SSVAL(&ret[pos], 0, str[0]); + pos++; + } while (*(str++)); + } + /* final null */ + ret[pos]='\0'; + +done: + return ret; } BOOL py_from_DRIVER_INFO_1(PyObject **dict, DRIVER_INFO_1 *info) @@ -122,16 +162,17 @@ BOOL py_from_DRIVER_INFO_3(PyObject **dict, DRIVER_INFO_3 *info) return True; } -BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict) +BOOL py_to_DRIVER_INFO_3(DRIVER_INFO_3 *info, PyObject *dict, + TALLOC_CTX *mem_ctx) { PyObject *obj, *dict_copy = PyDict_Copy(dict); BOOL result = False; - if (!(obj = PyDict_GetItemString(dict_copy, "dependent_files")) || - !PyList_Check(obj)) + if (!(obj = PyDict_GetItemString(dict_copy, "dependent_files"))) goto done; - info->dependentfiles = to_dependentfiles(obj); + if (!(info->dependentfiles = to_dependentfiles(obj, mem_ctx))) + goto done; PyDict_DelItemString(dict_copy, "dependent_files"); |