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 0 : int num_interfaces; 50 0 : int i; 51 0 : 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 0 : char **wcard; 72 0 : 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 30 : 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 66 : NTSTATUS server_service_smb_init(TALLOC_CTX *ctx) 99 : { 100 66 : struct loadparm_context *lp_ctx = samba_cmdline_get_lp_ctx(); 101 3 : 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 66 : ntvfs_init(lp_ctx); 108 66 : share_init(); 109 66 : return register_server_service(ctx, "smb", &details); 110 : }