s4:rpc_server: add dcesrv_browser template
[nivanova/samba-autobuild/.git] / source4 / rpc_server / service_rpc.c
index 33a86851a86805056d4aefd1e3227ccae5cad800..8b9020d8e7f2b7253341b1ae18016423f3f4f705 100644 (file)
@@ -25,8 +25,9 @@
 #include "librpc/gen_ndr/ndr_dcerpc.h"
 #include "auth/auth.h"
 #include "auth/gensec/gensec.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "rpc_server/dcerpc_server.h"
+#include "rpc_server/dcerpc_server_proto.h"
 #include "lib/events/events.h"
 #include "smbd/service_task.h"
 #include "smbd/service_stream.h"
@@ -37,7 +38,6 @@
 #include "lib/messaging/irpc.h"
 #include "system/network.h"
 #include "lib/socket/netif.h"
-#include "build.h"
 #include "param/param.h"
 
 struct dcesrv_socket_context {
@@ -105,20 +105,24 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
        struct dcesrv_socket_context *dcesrv_sock = 
                talloc_get_type(srv_conn->private, struct dcesrv_socket_context);
        struct dcesrv_connection *dcesrv_conn = NULL;
-       struct auth_session_info *session_info = NULL;
 
-       status = auth_anonymous_session_info(srv_conn, dcesrv_sock->dcesrv_ctx->lp_ctx, &session_info);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("dcesrv_sock_accept: auth_anonymous_session_info failed: %s\n", 
-                       nt_errstr(status)));
-               stream_terminate_connection(srv_conn, nt_errstr(status));
-               return;
+       if (!srv_conn->session_info) {
+               status = auth_anonymous_session_info(srv_conn,
+                                                    srv_conn->event.ctx,
+                                                    srv_conn->lp_ctx,
+                                                    &srv_conn->session_info);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0,("dcesrv_sock_accept: auth_anonymous_session_info failed: %s\n",
+                               nt_errstr(status)));
+                       stream_terminate_connection(srv_conn, nt_errstr(status));
+                       return;
+               }
        }
 
        status = dcesrv_endpoint_connect(dcesrv_sock->dcesrv_ctx,
                                         srv_conn,
                                         dcesrv_sock->endpoint,
-                                        session_info,
+                                        srv_conn->session_info,
                                         srv_conn->event.ctx,
                                         srv_conn->msg_ctx,
                                         srv_conn->server_id,
@@ -136,6 +140,10 @@ static void dcesrv_sock_accept(struct stream_connection *srv_conn)
        dcesrv_conn->transport.get_my_addr              = dcesrv_sock_get_my_addr;
        dcesrv_conn->transport.get_peer_addr            = dcesrv_sock_get_peer_addr;
 
+       if (dcesrv_sock->endpoint->ep_description->transport == NCACN_NP) {
+               dcesrv_conn->auth_state.session_key = dcesrv_inherited_session_key;
+       }
+
        srv_conn->private = dcesrv_conn;
 
        irpc_add_name(srv_conn->msg_ctx, "rpc_server");
@@ -232,7 +240,8 @@ static NTSTATUS dcesrv_add_ep_unix(struct dcesrv_context *dce_ctx,
        dcesrv_sock->endpoint           = e;
        dcesrv_sock->dcesrv_ctx         = talloc_reference(dcesrv_sock, dce_ctx);
 
-       status = stream_setup_socket(event_ctx, model_ops, &dcesrv_stream_ops, 
+       status = stream_setup_socket(event_ctx, lp_ctx,
+                                    model_ops, &dcesrv_stream_ops, 
                                     "unix", e->ep_description->endpoint, &port, 
                                     lp_socket_options(lp_ctx), 
                                     dcesrv_sock);
@@ -271,7 +280,8 @@ static NTSTATUS dcesrv_add_ep_ncalrpc(struct dcesrv_context *dce_ctx,
        dcesrv_sock->endpoint           = e;
        dcesrv_sock->dcesrv_ctx         = talloc_reference(dcesrv_sock, dce_ctx);
 
-       status = stream_setup_socket(event_ctx, model_ops, &dcesrv_stream_ops, 
+       status = stream_setup_socket(event_ctx, lp_ctx,
+                                    model_ops, &dcesrv_stream_ops, 
                                     "unix", full_path, &port, 
                                     lp_socket_options(lp_ctx), 
                                     dcesrv_sock);
@@ -282,12 +292,10 @@ static NTSTATUS dcesrv_add_ep_ncalrpc(struct dcesrv_context *dce_ctx,
        return status;
 }
 
-
-/*
-  add a socket address to the list of events, one event per dcerpc endpoint
-*/
-static NTSTATUS add_socket_rpc_pipe_iface(struct dcesrv_context *dce_ctx, struct dcesrv_endpoint *e,
-                                        struct event_context *event_ctx, const struct model_ops *model_ops)
+static NTSTATUS dcesrv_add_ep_np(struct dcesrv_context *dce_ctx,
+                                struct loadparm_context *lp_ctx,
+                                struct dcesrv_endpoint *e,
+                                struct event_context *event_ctx, const struct model_ops *model_ops)
 {
        struct dcesrv_socket_context *dcesrv_sock;
        NTSTATUS status;
@@ -304,30 +312,16 @@ static NTSTATUS add_socket_rpc_pipe_iface(struct dcesrv_context *dce_ctx, struct
        dcesrv_sock->endpoint           = e;
        dcesrv_sock->dcesrv_ctx         = talloc_reference(dcesrv_sock, dce_ctx);
 
-       status = NT_STATUS_OK;
-#if 0
-
-       status = stream_setup_smb_pipe(event_ctx, model_ops, &dcesrv_stream_ops, 
-                                    e->ep_description->endpoint, dcesrv_sock);
+       status = stream_setup_named_pipe(event_ctx, lp_ctx,
+                                        model_ops, &dcesrv_stream_ops,
+                                        e->ep_description->endpoint, dcesrv_sock);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("service_setup_stream_socket(path=%s) failed - %s\n", 
+               DEBUG(0,("stream_setup_named_pipe(pipe=%s) failed - %s\n",
                         e->ep_description->endpoint, nt_errstr(status)));
+               return status;
        }
-#endif
-       return status;
-}
 
-static NTSTATUS dcesrv_add_ep_np(struct dcesrv_context *dce_ctx, 
-                                struct loadparm_context *lp_ctx,
-                                struct dcesrv_endpoint *e,
-                                struct event_context *event_ctx, const struct model_ops *model_ops)
-{
-       NTSTATUS status;
-
-       status = add_socket_rpc_pipe_iface(dce_ctx, e, event_ctx, model_ops);
-       NT_STATUS_NOT_OK_RETURN(status);
-
-       return status;
+       return NT_STATUS_OK;
 }
 
 /*
@@ -352,7 +346,8 @@ static NTSTATUS add_socket_rpc_tcp_iface(struct dcesrv_context *dce_ctx, struct
        dcesrv_sock->endpoint           = e;
        dcesrv_sock->dcesrv_ctx         = talloc_reference(dcesrv_sock, dce_ctx);
 
-       status = stream_setup_socket(event_ctx, model_ops, &dcesrv_stream_ops, 
+       status = stream_setup_socket(event_ctx, dce_ctx->lp_ctx,
+                                    model_ops, &dcesrv_stream_ops, 
                                     "ipv4", address, &port, 
                                     lp_socket_options(dce_ctx->lp_ctx), 
                                     dcesrv_sock);
@@ -430,6 +425,26 @@ static void dcesrv_task_init(struct task_server *task)
        NTSTATUS status;
        struct dcesrv_context *dce_ctx;
        struct dcesrv_endpoint *e;
+       extern NTSTATUS dcerpc_server_wkssvc_init(void);
+       extern NTSTATUS dcerpc_server_drsuapi_init(void);
+       extern NTSTATUS dcerpc_server_winreg_init(void);
+       extern NTSTATUS dcerpc_server_spoolss_init(void);
+       extern NTSTATUS dcerpc_server_epmapper_init(void);
+       extern NTSTATUS dcerpc_server_srvsvc_init(void);
+       extern NTSTATUS dcerpc_server_netlogon_init(void);
+       extern NTSTATUS dcerpc_server_rpcecho_init(void);
+       extern NTSTATUS dcerpc_server_unixinfo_init(void);
+       extern NTSTATUS dcerpc_server_samr_init(void);
+       extern NTSTATUS dcerpc_server_remote_init(void);
+       extern NTSTATUS dcerpc_server_lsa_init(void);
+       extern NTSTATUS dcerpc_server_browser_init(void);
+       init_module_fn static_init[] = { STATIC_DCESRV_MODULES };
+       init_module_fn *shared_init = load_samba_modules(NULL, task->lp_ctx, "dcerpc_server");
+
+       run_init_functions(static_init);
+       run_init_functions(shared_init);
+
+       talloc_free(shared_init);
 
        task_server_set_title(task, "task[dcesrv]");
 
@@ -454,26 +469,8 @@ failed:
        task_server_terminate(task, "Failed to startup dcerpc server task");    
 }
 
-/*
-  called on startup of the smb server service It's job is to start
-  listening on all configured sockets
-*/
-static NTSTATUS dcesrv_init(struct event_context *event_context, 
-                           struct loadparm_context *lp_ctx,
-                           const struct model_ops *model_ops)
-{      
-       return task_server_startup(event_context, model_ops, dcesrv_task_init);
-}
-
 NTSTATUS server_service_rpc_init(void)
 {
-       init_module_fn static_init[] = STATIC_dcerpc_server_MODULES;
-       init_module_fn *shared_init = load_samba_modules(NULL, global_loadparm, "dcerpc_server");
 
-       run_init_functions(static_init);
-       run_init_functions(shared_init);
-
-       talloc_free(shared_init);
-       
-       return register_server_service("rpc", dcesrv_init);
+       return register_server_service("rpc", dcesrv_task_init);
 }