Add server side support for epmapper pipe. Currently only does a fixed
authorJim McDonough <jmcd@samba.org>
Tue, 21 Oct 2003 17:59:08 +0000 (17:59 +0000)
committerJim McDonough <jmcd@samba.org>
Tue, 21 Oct 2003 17:59:08 +0000 (17:59 +0000)
mapping, but this is the base for changes to come.

source/Makefile.in
source/configure.in
source/rpc_server/srv_epmapper.c [new file with mode: 0644]
source/rpc_server/srv_epmapper_nt.c [new file with mode: 0644]
source/rpc_server/srv_pipe.c
source/smbd/nttrans.c

index a02bd751c8b8595f011b31ef228afc11e316dd6d..10c07d05eb9e2f84292a2966e18de210359aa724 100644 (file)
@@ -264,6 +264,8 @@ RPC_PIPE_OBJ = rpc_server/srv_pipe_hnd.o rpc_server/srv_util.o \
 
 RPC_ECHO_OBJ = rpc_server/srv_echo.o rpc_server/srv_echo_nt.o
 
+RPC_EPMAPPER_OBJ = rpc_server/srv_epmapper.o rpc_server/srv_epmapper_nt.o
+
 RPC_SERVER_OBJ = @RPC_STATIC@ $(RPC_PIPE_OBJ)
 
 # this includes only the low level parse code, not stuff
@@ -580,9 +582,10 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) \
            $(PASSDB_OBJ) $(GROUPDB_OBJ) $(MSDFS_OBJ) \
            $(READLINE_OBJ) $(PROFILE_OBJ) $(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) \
            $(LIB_SMBD_OBJ) $(SAM_OBJ) $(REGISTRY_OBJ) $(POPT_LIB_OBJ) \
-           $(RPC_LSA_OBJ) $(RPC_NETLOG_OBJ) $(RPC_SAMR_OBJ) $(RPC_REG_OBJ) $(RPC_LSA_DS_OBJ) \
-           $(RPC_SVC_OBJ) $(RPC_WKS_OBJ) $(RPC_DFS_OBJ) $(RPC_SPOOLSS_OBJ) \
-           $(RPC_ECHO_OBJ) $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o
+           $(RPC_LSA_OBJ) $(RPC_NETLOG_OBJ) $(RPC_SAMR_OBJ) $(RPC_REG_OBJ) \
+           $(RPC_LSA_DS_OBJ) $(RPC_SVC_OBJ) $(RPC_WKS_OBJ) $(RPC_DFS_OBJ) \
+           $(RPC_SPOOLSS_OBJ) $(RPC_ECHO_OBJ) $(RPC_EPMAPPER_OBJ) \
+           $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o
 
 WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) $(UBIQX_OBJ) \
        $(LIBSMB_OBJ) $(LIB_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ)
@@ -1005,6 +1008,11 @@ bin/librpc_echo.@SHLIBEXT@: $(RPC_ECHO_OBJ)
        @$(SHLD) $(LDSHFLAGS) -o $@ $(RPC_ECHO_OBJ) -lc \
                @SONAMEFLAG@`basename $@`
 
+bin/librpc_epmapper.@SHLIBEXT@: $(RPC_EPMAPPER_OBJ)
+       @echo "Linking $@"
+       @$(SHLD) $(LDSHFLAGS) -o $@ $(RPC_EPMAPPER_OBJ) -lc \
+               @SONAMEFLAG@`basename $@`
+
 bin/winbindd@EXEEXT@: $(WINBINDD_OBJ) @BUILD_POPT@ bin/.dummy
        @echo "Linking $@"
        @$(LINK) -o $@ $(WINBINDD_OBJ) $(DYNEXP) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS) 
index 16b07608028dcbbcc1bac5c134d01c110de5861b..01c71b3149c997b97feafb8f8c5f69edb2717024 100644 (file)
@@ -296,7 +296,7 @@ DYNEXP=
 
 dnl Add modules that have to be built by default here
 dnl These have to be built static:
-default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_lsa_ds rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin pdb_gums gums_tdbsam2"
+default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_lsa_ds rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss rpc_epmapper auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin pdb_gums gums_tdbsam2"
 
 dnl These are preferably build shared, and static if dlopen() is not available
 default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap charset_CP850 charset_CP437"
@@ -4128,6 +4128,8 @@ SMB_MODULE(rpc_srv, \$(RPC_SVC_OBJ), "bin/librpc_srvsvc.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_spoolss, \$(RPC_SPOOLSS_OBJ), "bin/librpc_spoolss.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_samr, \$(RPC_SAMR_OBJ), "bin/librpc_samr.$SHLIBEXT", RPC)
 SMB_MODULE(rpc_echo, \$(RPC_ECHO_OBJ), "bin/librpc_echo.$SHLIBEXT", RPC)
+SMB_MODULE(rpc_epmapper, \$(RPC_EPMAPPER_OBJ), "bin/librpc_epmapper.$SHLIBEXT",
+                        RPC)
 SMB_SUBSYSTEM(RPC,smbd/server.o)
 
 SMB_MODULE(idmap_ldap, sam/idmap_ldap.o, "bin/idmap_ldap.$SHLIBEXT", IDMAP)
diff --git a/source/rpc_server/srv_epmapper.c b/source/rpc_server/srv_epmapper.c
new file mode 100644 (file)
index 0000000..70de092
--- /dev/null
@@ -0,0 +1,88 @@
+
+/* 
+   Unix SMB/CIFS implementation.
+   Samba end point mapper utility and mapping functions
+   Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003
+   
+   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"
+
+/*****************************************************************
+  api_handle_map_req - handles standard epm mapping request
+******************************************************************/
+static BOOL api_handle_map_req(pipes_struct * p)
+{
+
+       EPM_Q_MAP q_in;
+       EPM_R_MAP q_out;
+
+       prs_struct *in_data = &p->in_data.data;
+       prs_struct *ret_data = &p->out_data.rdata;
+
+       ZERO_STRUCT(q_in);
+       ZERO_STRUCT(q_out);
+
+       /* process input request and parse packet */
+
+       if (!epm_io_q_map("", &q_in, in_data, 0)) {
+               DEBUG(0,
+                     ("api_handle_map_request: unable to unmarshall EPMD_MAP\n"));
+               return False;
+       }
+
+       _epm_map(p, &q_in, &q_out);
+
+       if (!epm_io_r_map("", &q_out, ret_data, 0)) {
+               DEBUG(0,
+                     ("api_handle_map_req: unable to marshall EPMD_MAP\n"));
+               return False;
+       }
+
+       return True;
+}
+
+/*******************************************************************/
+/*                  \pipe\epmapper commands                        */
+/*******************************************************************/
+/* opnum is 3 on map request */
+
+struct api_struct api_epmapper_cmds[] = {
+       {"MAP_PIPE_NAME", EPM_MAP_PIPE_NAME, api_handle_map_req},
+};
+
+/*******************************************************************/
+/*                                                                 */
+/*******************************************************************/
+
+void epm_get_pipe_fns(struct api_struct **funcs, int *n_funcs)
+{
+       *funcs = api_epmapper_cmds;
+       *n_funcs = sizeof(api_epmapper_cmds) / sizeof(struct api_struct);
+}
+
+/*******************************************************************/
+/*                                                                 */
+/*******************************************************************/
+
+NTSTATUS rpc_epmapper_init(void)
+{
+       return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION,
+                                         EPM_PIPE_NM, EPM_PIPE_NM,
+                                         api_epmapper_cmds,
+                                         sizeof(api_epmapper_cmds) /
+                                         sizeof(struct api_struct));
+}
diff --git a/source/rpc_server/srv_epmapper_nt.c b/source/rpc_server/srv_epmapper_nt.c
new file mode 100644 (file)
index 0000000..1b72a5e
--- /dev/null
@@ -0,0 +1,70 @@
+
+/* 
+   Unix SMB/CIFS implementation.
+   Samba end point mapper utility and mapping functions
+   Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003
+   
+   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"
+
+/*******************************************************************/
+/*  _epm_map - fill out mapping on input and output structs */
+/*******************************************************************/
+void _epm_map(pipes_struct *ps, const EPM_Q_MAP *q_u, EPM_R_MAP *r_u)
+{
+       int i;
+       uint8 target_address[] = { 9, 53, 95, 27 };
+       EPM_FLOOR *floors = talloc(ps->mem_ctx, sizeof(EPM_FLOOR) *
+                                  q_u->tower->num_floors);
+       EPM_TOWER *towers = talloc(ps->mem_ctx, 
+                                  sizeof(EPM_TOWER) * MAX_TOWERS);
+       EPM_TOWER_ARRAY array;
+
+       if (!floors || !towers) {
+               DEBUG(0, ("_epm_map: talloc failed!\n"));
+               return;
+       }
+
+       for (i = 0; i < q_u->tower->num_floors; i++) {
+               switch (q_u->tower->floors[i].lhs.protocol) {
+                case EPM_FLOOR_UUID:
+                       init_epm_floor_uuid(&floors[i],
+                                           &q_u->tower->floors[i].
+                                           lhs.uuid.uuid,
+                                           q_u->tower->floors[i].
+                                           lhs.uuid.version);
+                       break;
+               case EPM_FLOOR_RPC:
+                       init_epm_floor_rpc(&floors[i]);
+                       break;
+               case EPM_FLOOR_TCP:
+                       /* for now map all requests to port 135 */
+                       init_epm_floor_tcp(&floors[i], 135);
+                       break;
+               case EPM_FLOOR_IP:
+                       init_epm_floor_ip(&floors[i], target_address);
+                       break;
+               }
+       }
+
+       init_epm_tower(ps->mem_ctx, &towers[0], floors, 5);
+       init_epm_tower_array(ps->mem_ctx, &array, towers, 1);
+       init_epm_r_map(ps->mem_ctx, r_u, &q_u->term_handle, &array, 1, 0);
+
+       return;
+
+}
index 96261c665f7455bf24d8ff2e5c4a375fcbd4645d..444c35987acd1665317c31f3be580f206f515773 100644 (file)
@@ -1603,6 +1603,9 @@ void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns )
                        echo_get_pipe_fns( &cmds, &n_cmds );
                        break;
 #endif
+               case PI_EPM:
+                       epm_get_pipe_fns( &cmds, &n_cmds );
+                       break;
                default:
                        DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx));
        }
index 19af61f1901ecc237e8e9d2455fc51abb63b14ab..e7d7c20f6beb3ebee8dc2ad5662546db734945b5 100644 (file)
@@ -43,6 +43,7 @@ static const char *known_nt_pipes[] = {
        "\\spoolss",
        "\\netdfs",
        "\\rpcecho",
+       "\\epmapper",
        NULL
 };