diff options
-rw-r--r-- | source4/scripting/config.mk | 1 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls.c | 1 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls_cli.c | 89 |
3 files changed, 91 insertions, 0 deletions
diff --git a/source4/scripting/config.mk b/source4/scripting/config.mk index 597fa1a84a..8d6c5058cf 100644 --- a/source4/scripting/config.mk +++ b/source4/scripting/config.mk @@ -6,6 +6,7 @@ OBJ_FILES = \ scripting/ejs/smbcalls_config.o \ scripting/ejs/smbcalls_ldb.o \ scripting/ejs/smbcalls_nbt.o \ + scripting/ejs/smbcalls_cli.o \ scripting/ejs/mprutil.o REQUIRED_SUBSYSTEMS = AUTH EJS LIBBASIC # End SUBSYSTEM SMBCALLS diff --git a/source4/scripting/ejs/smbcalls.c b/source4/scripting/ejs/smbcalls.c index 00a2547bac..46fce4b98e 100644 --- a/source4/scripting/ejs/smbcalls.c +++ b/source4/scripting/ejs/smbcalls.c @@ -187,6 +187,7 @@ void smb_setup_ejs_functions(void) smb_setup_ejs_config(); smb_setup_ejs_ldb(); smb_setup_ejs_nbt(); + smb_setup_ejs_cli(); ejsDefineCFunction(-1, "typeof", ejs_typeof, NULL, MPR_VAR_SCRIPT_HANDLE); ejsDefineStringCFunction(-1, "getDomainList", ejs_domain_list, NULL, MPR_VAR_SCRIPT_HANDLE); diff --git a/source4/scripting/ejs/smbcalls_cli.c b/source4/scripting/ejs/smbcalls_cli.c new file mode 100644 index 0000000000..adb55a0184 --- /dev/null +++ b/source4/scripting/ejs/smbcalls_cli.c @@ -0,0 +1,89 @@ +/* + Unix SMB/CIFS implementation. + + provide hooks into smbd C calls from ejs scripts + + Copyright (C) Tim Potter 2005 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "lib/ejs/ejs.h" +#include "librpc/gen_ndr/ndr_nbt.h" + +/* Connect to a server */ + +static int ejs_cli_connect(MprVarHandle eid, int argc, char **argv) +{ + struct smbcli_socket *sock; + struct smbcli_transport *transport; + struct nbt_name calling, called; + NTSTATUS result; + + if (argc != 1) { + ejsSetErrorMsg(eid, "connect invalid arguments"); + return -1; + } + + /* Socket connect */ + + sock = smbcli_sock_init(NULL, NULL); + + if (!sock) { + ejsSetErrorMsg(eid, "socket initialisation failed"); + return -1; + } + + if (!smbcli_sock_connect_byname(sock, argv[0], 0)) { + ejsSetErrorMsg(eid, "socket connect failed"); + return -1; + } + + transport = smbcli_transport_init(sock, sock, True); + + if (!transport) { + ejsSetErrorMsg(eid, "transport init failed"); + return -1; + } + + /* Send a netbios session request */ + + make_nbt_name_client(&calling, lp_netbios_name()); + + nbt_choose_called_name(NULL, &called, argv[0], NBT_NAME_SERVER); + + if (!smbcli_transport_connect(transport, &calling, &called)) { + ejsSetErrorMsg(eid, "transport establishment failed"); + return -1; + } + + result = smb_raw_negotiate(transport, lp_maxprotocol()); + + if (!NT_STATUS_IS_OK(result)) { + ejsSetReturnValue(eid, mprNTSTATUS(result)); + return 0; + } + + return 0; +} + +/* + setup C functions that be called from ejs +*/ +void smb_setup_ejs_cli(void) +{ + ejsDefineStringCFunction(-1, "connect", ejs_cli_connect, NULL, MPR_VAR_SCRIPT_HANDLE); +} |