From 36101d3fa45c0b583628862794054f60eb4e6ed3 Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Fri, 30 Mar 2012 22:04:28 -0700 Subject: Add an open and close method to samba.smb.SMB so we can open and close files. Also, fix up some documentation. Autobuild-User: Richard Sharpe Autobuild-Date: Sun Apr 1 16:29:52 CEST 2012 on sn-devel-104 --- source4/libcli/pysmb.c | 96 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 10 deletions(-) (limited to 'source4') diff --git a/source4/libcli/pysmb.c b/source4/libcli/pysmb.c index b4eba14547..a0021b9982 100644 --- a/source4/libcli/pysmb.c +++ b/source4/libcli/pysmb.c @@ -53,7 +53,6 @@ struct smb_private_data { struct smbcli_tree *tree; }; - static void dos_format(char *s) { string_replace(s, '/', '\\'); @@ -151,7 +150,6 @@ static PyObject * py_smb_savefile(pytalloc_Object *self, PyObject *args) Py_RETURN_NONE; } - /* * Callback function to accumulate directory contents in a python list */ @@ -183,7 +181,6 @@ static void py_smb_list_callback(struct clilist_file_info *f, const char *mask, } } - /* * List the directory contents for specified directory (Ignore '.' and '..' dirs) */ @@ -225,7 +222,6 @@ static PyObject *py_smb_list(pytalloc_Object *self, PyObject *args, PyObject *kw return py_dirlist; } - /* * Create a directory */ @@ -246,7 +242,6 @@ static PyObject *py_smb_mkdir(pytalloc_Object *self, PyObject *args) Py_RETURN_NONE; } - /* * Remove a directory */ @@ -267,7 +262,6 @@ static PyObject *py_smb_rmdir(pytalloc_Object *self, PyObject *args) Py_RETURN_NONE; } - /* * Check existence of a path */ @@ -291,7 +285,6 @@ static PyObject *py_smb_chkpath(pytalloc_Object *self, PyObject *args) Py_RETURN_FALSE; } - /* * Read ACL on a given file/directory as a security descriptor object */ @@ -357,7 +350,6 @@ static PyObject *py_smb_getacl(pytalloc_Object *self, PyObject *args, PyObject * self->talloc_ctx, fio.query_secdesc.out.sd); } - /* * Set ACL on file/directory using given security descriptor object */ @@ -436,6 +428,86 @@ static PyObject *py_smb_setacl(pytalloc_Object *self, PyObject *args, PyObject * Py_RETURN_NONE; } +/* + * Open the file with the parameters passed in and return an object if OK + */ +static PyObject *py_open_file(pytalloc_Object *self, PyObject *args, PyObject *kwargs) +{ + NTSTATUS status; + union smb_open io; + struct smb_private_data *spdata; + const char *filename; + uint32_t access_mask = 0; + uint32_t share_access = 0; + uint32_t open_disposition = 0; + uint32_t create_options = 0; + int fnum; + + if (!PyArg_ParseTuple(args, "si|iii:open_file", + &filename, + &access_mask, + &share_access, + &open_disposition, + &create_options)) { + return NULL; + } + + if (!access_mask) + access_mask = SEC_FLAG_MAXIMUM_ALLOWED; + + if (!share_access) + share_access = NTCREATEX_SHARE_ACCESS_READ | + NTCREATEX_SHARE_ACCESS_WRITE; + + if (!open_disposition) + open_disposition = NTCREATEX_DISP_OPEN; + + ZERO_STRUCT(io); + + spdata = self->ptr; + + io.generic.level = RAW_OPEN_NTCREATEX; + io.ntcreatex.in.root_fid.fnum = 0; + io.ntcreatex.in.flags = 0; + io.ntcreatex.in.access_mask = access_mask; + io.ntcreatex.in.create_options = create_options; + io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; + io.ntcreatex.in.share_access = share_access; + io.ntcreatex.in.alloc_size = 0; + io.ntcreatex.in.open_disposition = open_disposition; + io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; + io.ntcreatex.in.security_flags = 0; + io.ntcreatex.in.fname = filename; + + status = smb_raw_open(spdata->tree, self->talloc_ctx, &io); + PyErr_NTSTATUS_IS_ERR_RAISE(status); + + fnum = io.ntcreatex.out.file.fnum; + + return Py_BuildValue("i", fnum); +} + +/* + * Close the file based on the fnum passed in + */ +static PyObject *py_close_file(pytalloc_Object *self, PyObject *args, PyObject *kwargs) +{ + struct smb_private_data *spdata; + int fnum; + + if (!PyArg_ParseTuple(args, "i:close_file", &fnum)) { + return NULL; + } + + spdata = self->ptr; + + /* + * Should check the status ... + */ + smbcli_close(spdata->tree, fnum); + + Py_RETURN_NONE; +} static PyMethodDef py_smb_methods[] = { { "loadfile", (PyCFunction)py_smb_loadfile, METH_VARARGS, @@ -467,10 +539,15 @@ static PyMethodDef py_smb_methods[] = { { "set_acl", (PyCFunction)py_smb_setacl, METH_VARARGS, "set_acl(path, security_descriptor[, security_info=0]) -> None\n\n \ Set security descriptor for file." }, + { "open_file", (PyCFunction)py_open_file, METH_VARARGS, + "open_file(path, access_mask[, share_access[, open_disposition[, create_options]]] -> fnum\n\n \ + Open a file. Throws exceptions on errors." }, + { "close_file", (PyCFunction)py_close_file, METH_VARARGS, + "close_file(fnum) -> None\n\n \ + Close the file based on fnum."}, { NULL }, }; - static PyObject *py_smb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *py_creds = Py_None; @@ -530,7 +607,6 @@ static PyObject *py_smb_new(PyTypeObject *type, PyObject *args, PyObject *kwargs return (PyObject *)smb; } - static PyTypeObject PySMB = { .tp_name = "smb.SMB", .tp_basicsize = sizeof(pytalloc_Object), -- cgit