Added connect, session_request, session_setup and tconx methods.
authorTim Potter <tpot@samba.org>
Fri, 2 Aug 2002 05:35:09 +0000 (05:35 +0000)
committerTim Potter <tpot@samba.org>
Fri, 2 Aug 2002 05:35:09 +0000 (05:35 +0000)
source/python/py_smb.c

index c206e6ba9b4934692fac951566dbed980e51b4c3..77d7bb32fce6c019cac268462267579f48a6607d 100644 (file)
 
 #include "python/py_smb.h"
 
-/* 
- * Exceptions raised by this module 
- */
-
-PyObject *smb_ntstatus;                /* This exception is raised when a RPC call
-                                  returns a status code other than
-                                  NT_STATUS_OK */
-
-
-/*
- * Method dispatch tables
- */
-
-static PyMethodDef smb_methods[] = {
-       { NULL }
-};
-
 /* Create a new cli_state python object */
 
 PyObject *new_cli_state_object(struct cli_state *cli)
@@ -50,6 +33,143 @@ PyObject *new_cli_state_object(struct cli_state *cli)
        return (PyObject*)o;
 }
 
+static PyObject *py_smb_connect(PyObject *self, PyObject *args, PyObject *kw)
+{
+       static char *kwlist[] = { "server", NULL };
+       struct cli_state *cli;
+       char *server;
+       struct in_addr ip;
+
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "s", kwlist, &server))
+               return NULL;
+
+       if (!(cli = cli_initialise(NULL)))
+               return NULL;
+
+       ZERO_STRUCT(ip);
+
+       if (!cli_connect(cli, server, &ip))
+               return NULL;
+
+       return new_cli_state_object(cli);
+}
+
+static PyObject *py_smb_session_request(PyObject *self, PyObject *args,
+                                       PyObject *kw)
+{
+       cli_state_object *cli = (cli_state_object *)self;
+       static char *kwlist[] = { "called", "calling", NULL };
+       char *calling_name = NULL, *called_name;
+       struct nmb_name calling, called;
+       extern pstring global_myname;
+       BOOL result;
+
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "s|s", kwlist, &called_name, 
+                                        &calling_name))
+               return NULL;
+
+       if (!calling_name)
+               calling_name = global_myname;
+
+       make_nmb_name(&calling, calling_name, 0x00);
+       make_nmb_name(&called, called_name, 0x20);
+
+       result = cli_session_request(cli->cli, &calling, &called);
+
+       return Py_BuildValue("i", result);
+}
+                                     
+static PyObject *py_smb_negprot(PyObject *self, PyObject *args, PyObject *kw)
+{
+       cli_state_object *cli = (cli_state_object *)self;
+       static char *kwlist[] = { NULL };
+       BOOL result;
+
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "", kwlist))
+               return NULL;
+
+       result = cli_negprot(cli->cli);
+
+       return Py_BuildValue("i", result);
+}
+
+static PyObject *py_smb_session_setup(PyObject *self, PyObject *args, 
+                                     PyObject *kw)
+{
+       cli_state_object *cli = (cli_state_object *)self;
+       static char *kwlist[] = { "creds" };
+       PyObject *creds;
+       char *username, *domain, *password, *errstr;
+       BOOL result;
+
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "O", kwlist, &creds))
+               return NULL;
+
+       if (!py_parse_creds(creds, &username, &domain, &password, &errstr)) {
+               free(errstr);
+               return NULL;
+       }
+
+       result = cli_session_setup(
+               cli->cli, username, password, strlen(password) + 1,
+               password, strlen(password) + 1, domain);
+
+       return Py_BuildValue("i", result);
+}
+
+static PyObject *py_smb_tconx(PyObject *self, PyObject *args, PyObject *kw)
+{
+       cli_state_object *cli = (cli_state_object *)self;
+       static char *kwlist[] = { "service", "creds" };
+       PyObject *creds;
+       char *service, *username, *domain, *password, *errstr;
+       BOOL result;
+
+       if (!PyArg_ParseTupleAndKeywords(args, kw, "sO", kwlist, &service, 
+                                        &creds))
+               return NULL;
+
+       if (!py_parse_creds(creds, &username, &domain, &password, &errstr)) {
+               free(errstr);
+               return NULL;
+       }
+
+       result = cli_send_tconX(
+               cli->cli, service, strequal(service, "IPC$") ? "IPC" : "?????", 
+               password, strlen(password) + 1);
+
+       return Py_BuildValue("i", result);
+}
+
+static PyMethodDef smb_hnd_methods[] = {
+
+       { "session_request", (PyCFunction)py_smb_session_request, 
+         METH_VARARGS | METH_KEYWORDS, "Request a session" },
+
+       { "negprot", (PyCFunction)py_smb_negprot, 
+         METH_VARARGS | METH_KEYWORDS, "Protocol negotiation" },
+
+       { "session_setup", (PyCFunction)py_smb_session_setup,
+         METH_VARARGS | METH_KEYWORDS, "Session setup" },
+
+       { "tconx", (PyCFunction)py_smb_tconx,
+         METH_VARARGS | METH_KEYWORDS, "Tree connect" },
+
+       { NULL }
+};
+
+/*
+ * Method dispatch tables
+ */
+
+static PyMethodDef smb_methods[] = {
+
+       { "connect", (PyCFunction)py_smb_connect, METH_VARARGS | METH_KEYWORDS,
+         "Connect to a host" },
+
+       { NULL }
+};
+
 static void py_cli_state_dealloc(PyObject* self)
 {
        PyObject_Del(self);
@@ -57,7 +177,7 @@ static void py_cli_state_dealloc(PyObject* self)
 
 static PyObject *py_cli_state_getattr(PyObject *self, char *attrname)
 {
-       return Py_FindMethod(smb_methods, self, attrname);
+       return Py_FindMethod(smb_hnd_methods, self, attrname);
 }
 
 PyTypeObject cli_state_type = {
@@ -91,9 +211,6 @@ void initsmb(void)
        module = Py_InitModule("smb", smb_methods);
        dict = PyModule_GetDict(module);
 
-       smb_ntstatus = PyErr_NewException("smb.ntstatus", NULL, NULL);
-       PyDict_SetItemString(dict, "ntstatus", smb_ntstatus);
-
        /* Initialise policy handle object */
 
        cli_state_type.ob_type = &PyType_Type;