Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : process incoming packets - main loop
4 : Copyright (C) Andrew Tridgell 2004-2005
5 : Copyright (C) Stefan Metzmacher 2004-2005
6 :
7 : This program is free software; you can redistribute it and/or modify
8 : it under the terms of the GNU General Public License as published by
9 : the Free Software Foundation; either version 3 of the License, or
10 : (at your option) any later version.
11 :
12 : This program is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU General Public License for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with this program. If not, see <http://www.gnu.org/licenses/>.
19 : */
20 :
21 : #include "includes.h"
22 : #include "samba/service_task.h"
23 : #include "samba/service_stream.h"
24 : #include "samba/service.h"
25 : #include "smb_server/smb_server.h"
26 : #include "smb_server/service_smb_proto.h"
27 : #include "lib/messaging/irpc.h"
28 : #include "lib/stream/packet.h"
29 : #include "libcli/smb2/smb2.h"
30 : #include "smb_server/smb2/smb2_server.h"
31 : #include "system/network.h"
32 : #include "lib/socket/netif.h"
33 : #include "param/share.h"
34 : #include "dsdb/samdb/samdb.h"
35 : #include "param/param.h"
36 : #include "ntvfs/ntvfs.h"
37 : #include "lib/cmdline/cmdline.h"
38 :
39 : /*
40 : open the smb server sockets
41 : */
42 15 : static NTSTATUS smbsrv_task_init(struct task_server *task)
43 : {
44 15 : NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
45 :
46 15 : task_server_set_title(task, "task[smbsrv]");
47 :
48 15 : if (lpcfg_interfaces(task->lp_ctx) && lpcfg_bind_interfaces_only(task->lp_ctx)) {
49 : int num_interfaces;
50 : int i;
51 : struct interface *ifaces;
52 :
53 0 : load_interface_list(task, task->lp_ctx, &ifaces);
54 :
55 0 : num_interfaces = iface_list_count(ifaces);
56 :
57 : /* We have been given an interfaces line, and been
58 : told to only bind to those interfaces. Create a
59 : socket per interface and bind to only these.
60 : */
61 0 : for(i = 0; i < num_interfaces; i++) {
62 0 : const char *address = iface_list_n_ip(ifaces, i);
63 0 : status = smbsrv_add_socket(task, task->event_ctx,
64 : task->lp_ctx,
65 : task->model_ops,
66 : address,
67 : task->process_context);
68 0 : if (!NT_STATUS_IS_OK(status)) goto failed;
69 : }
70 : } else {
71 : char **wcard;
72 : int i;
73 15 : wcard = iface_list_wildcard(task);
74 15 : if (wcard == NULL) {
75 0 : DEBUG(0,("No wildcard addresses available\n"));
76 0 : status = NT_STATUS_UNSUCCESSFUL;
77 0 : goto failed;
78 : }
79 45 : for (i=0; wcard[i]; i++) {
80 48 : status = smbsrv_add_socket(task, task->event_ctx,
81 : task->lp_ctx,
82 : task->model_ops,
83 30 : wcard[i],
84 : task->process_context);
85 30 : if (!NT_STATUS_IS_OK(status)) goto failed;
86 : }
87 15 : talloc_free(wcard);
88 : }
89 :
90 15 : irpc_add_name(task->msg_ctx, "smb_server");
91 15 : return NT_STATUS_OK;
92 0 : failed:
93 0 : task_server_terminate(task, "Failed to startup smb server task", true);
94 0 : return status;
95 : }
96 :
97 : /* called at smbd startup - register ourselves as a server service */
98 53 : NTSTATUS server_service_smb_init(TALLOC_CTX *ctx)
99 : {
100 53 : struct loadparm_context *lp_ctx = samba_cmdline_get_lp_ctx();
101 : static const struct service_details details = {
102 : .inhibit_fork_on_accept = true,
103 : .inhibit_pre_fork = true,
104 : .task_init = smbsrv_task_init,
105 : .post_fork = NULL
106 : };
107 53 : ntvfs_init(lp_ctx);
108 53 : share_init();
109 53 : return register_server_service(ctx, "smb", &details);
110 : }
|