static bool open_sockets_smbd(struct smbd_parent_context *parent, struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const char *smb_ports) { int num_interfaces = iface_count(); int i; const char *ports; unsigned dns_port = 0; #ifdef HAVE_ATEXIT atexit(killkids); #endif /* Stop zombies */ smbd_setup_sig_chld_handler(ev_ctx); /* use a reasonable default set of ports - listing on 445 and 139 */ if (!smb_ports) { ports = lp_smb_ports(); if (!ports || !*ports) { ports = talloc_strdup(talloc_tos(), SMB_PORTS); } else { ports = talloc_strdup(talloc_tos(), ports); } } else { ports = talloc_strdup(talloc_tos(), smb_ports); } if (lp_interfaces() && lp_bind_interfaces_only()) { /* We have been given an interfaces line, and been told to only bind to those interfaces. Create a socket per interface and bind to only these. */ /* Now open a listen socket for each of the interfaces. */ for(i = 0; i < num_interfaces; i++) { const struct sockaddr_storage *ifss = iface_n_sockaddr_storage(i); char *tok; const char *ptr; if (ifss == NULL) { DEBUG(0,("open_sockets_smbd: " "interface %d has NULL IP address !\n", i)); continue; } for (ptr=ports; next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) { unsigned port = atoi(tok); if (port == 0 || port > 0xffff) { continue; } /* Keep the first port for mDNS service * registration. */ if (dns_port == 0) { dns_port = port; } if (!smbd_open_one_socket(parent, ev_ctx, msg_ctx, ifss, port)) { return false; } } } } else { /* Just bind to 0.0.0.0 - accept connections from anywhere. */ char *tok; const char *ptr; const char *sock_addr = lp_socket_address(); char *sock_tok; const char *sock_ptr; if (strequal(sock_addr, "0.0.0.0") || strequal(sock_addr, "::")) { #if HAVE_IPV6 sock_addr = "::,0.0.0.0"; #else sock_addr = "0.0.0.0"; #endif } for (sock_ptr=sock_addr; next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) { for (ptr=ports; next_token_talloc(talloc_tos(), &ptr, &tok, " \t,"); ) { struct sockaddr_storage ss; unsigned port = atoi(tok); if (port == 0 || port > 0xffff) { continue; } /* Keep the first port for mDNS service * registration. */ if (dns_port == 0) { dns_port = port; } /* open an incoming socket */ if (!interpret_string_addr(&ss, sock_tok, AI_NUMERICHOST|AI_PASSIVE)) { continue; } if (!smbd_open_one_socket(parent, ev_ctx, msg_ctx, &ss, port)) { return false; } } } } if (parent->sockets == NULL) { DEBUG(0,("open_sockets_smbd: No " "sockets available to bind to.\n")); return false; } /* Setup the main smbd so that we can get messages. Note that do this after starting listening. This is needed as when in clustered mode, ctdb won't allow us to start doing database operations until it has gone thru a full startup, which includes checking to see that smbd is listening. */ if (!serverid_register(procid_self(), FLAG_MSG_GENERAL|FLAG_MSG_SMBD |FLAG_MSG_PRINT_GENERAL |FLAG_MSG_DBWRAP)) { DEBUG(0, ("open_sockets_smbd: Failed to register " "myself in serverid.tdb\n")); return false; } /* Listen to messages */ messaging_register(msg_ctx, NULL, MSG_SMB_SAM_SYNC, msg_sam_sync); messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server); messaging_register(msg_ctx, NULL, MSG_SMB_FILE_RENAME, msg_file_was_renamed); messaging_register(msg_ctx, ev_ctx, MSG_SMB_CONF_UPDATED, smb_conf_updated); messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete); messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug); messaging_register(msg_ctx, ev_ctx, MSG_PRINTER_PCAP, smb_pcap_updated); brl_register_msgs(msg_ctx); msg_idmap_register_msg(msg_ctx); #ifdef CLUSTER_SUPPORT if (lp_clustering()) { ctdbd_register_reconfigure(messaging_ctdbd_connection()); } #endif #ifdef DEVELOPER messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT, msg_inject_fault); #endif if (lp_multicast_dns_register() && (dns_port != 0)) { #ifdef WITH_DNSSD_SUPPORT smbd_setup_mdns_registration(ev_ctx, parent, dns_port); #endif #ifdef WITH_AVAHI_SUPPORT void *avahi_conn; avahi_conn = avahi_start_register(ev_ctx, ev_ctx, dns_port); if (avahi_conn == NULL) { DEBUG(10, ("avahi_start_register failed\n")); } #endif } return true; }
static bool open_sockets_smbd(struct smbd_parent_context *parent, struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const char *smb_ports) { int num_interfaces = iface_count(); int i,j; const char **ports; unsigned dns_port = 0; #ifdef HAVE_ATEXIT atexit(killkids); #endif /* Stop zombies */ smbd_setup_sig_chld_handler(parent); ports = lp_smb_ports(); /* use a reasonable default set of ports - listing on 445 and 139 */ if (smb_ports) { char **l; l = str_list_make_v3(talloc_tos(), smb_ports, NULL); ports = discard_const_p(const char *, l); } for (j = 0; ports && ports[j]; j++) { unsigned port = atoi(ports[j]); if (port == 0 || port > 0xffff) { exit_server_cleanly("Invalid port in the config or on " "the commandline specified!"); } } if (lp_interfaces() && lp_bind_interfaces_only()) { /* We have been given an interfaces line, and been told to only bind to those interfaces. Create a socket per interface and bind to only these. */ /* Now open a listen socket for each of the interfaces. */ for(i = 0; i < num_interfaces; i++) { const struct sockaddr_storage *ifss = iface_n_sockaddr_storage(i); if (ifss == NULL) { DEBUG(0,("open_sockets_smbd: " "interface %d has NULL IP address !\n", i)); continue; } for (j = 0; ports && ports[j]; j++) { unsigned port = atoi(ports[j]); /* Keep the first port for mDNS service * registration. */ if (dns_port == 0) { dns_port = port; } if (!smbd_open_one_socket(parent, ev_ctx, ifss, port)) { return false; } } } } else { /* Just bind to 0.0.0.0 - accept connections from anywhere. */ const char *sock_addr; char *sock_tok; const char *sock_ptr; #if HAVE_IPV6 sock_addr = "::,0.0.0.0"; #else sock_addr = "0.0.0.0"; #endif for (sock_ptr=sock_addr; next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) { for (j = 0; ports && ports[j]; j++) { struct sockaddr_storage ss; unsigned port = atoi(ports[j]); /* Keep the first port for mDNS service * registration. */ if (dns_port == 0) { dns_port = port; } /* open an incoming socket */ if (!interpret_string_addr(&ss, sock_tok, AI_NUMERICHOST|AI_PASSIVE)) { continue; } /* * If we fail to open any sockets * in this loop the parent-sockets == NULL * case below will prevent us from starting. */ (void)smbd_open_one_socket(parent, ev_ctx, &ss, port); } } } if (parent->sockets == NULL) { DEBUG(0,("open_sockets_smbd: No " "sockets available to bind to.\n")); return false; } /* Setup the main smbd so that we can get messages. Note that do this after starting listening. This is needed as when in clustered mode, ctdb won't allow us to start doing database operations until it has gone thru a full startup, which includes checking to see that smbd is listening. */ if (!serverid_register(messaging_server_id(msg_ctx), FLAG_MSG_GENERAL|FLAG_MSG_SMBD |FLAG_MSG_PRINT_GENERAL |FLAG_MSG_DBWRAP)) { DEBUG(0, ("open_sockets_smbd: Failed to register " "myself in serverid.tdb\n")); return false; } /* Listen to messages */ messaging_register(msg_ctx, NULL, MSG_SHUTDOWN, msg_exit_server); messaging_register(msg_ctx, ev_ctx, MSG_SMB_CONF_UPDATED, smbd_parent_conf_updated); messaging_register(msg_ctx, NULL, MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete); messaging_register(msg_ctx, NULL, MSG_DEBUG, smbd_msg_debug); messaging_register(msg_ctx, NULL, MSG_SMB_BRL_VALIDATE, brl_revalidate); messaging_register(msg_ctx, NULL, MSG_SMB_FORCE_TDIS, smb_parent_send_to_children); messaging_register(msg_ctx, NULL, MSG_SMB_KILL_CLIENT_IP, smb_parent_send_to_children); messaging_register(msg_ctx, NULL, MSG_SMB_TELL_NUM_CHILDREN, smb_tell_num_children); messaging_register(msg_ctx, NULL, ID_CACHE_DELETE, smbd_parent_id_cache_delete); messaging_register(msg_ctx, NULL, ID_CACHE_KILL, smbd_parent_id_cache_kill); if (lp_clustering()) { struct ctdbd_connection *conn = messaging_ctdbd_connection(); register_with_ctdbd(conn, CTDB_SRVID_RECONFIGURE, smbd_parent_ctdb_reconfigured, msg_ctx); register_with_ctdbd(conn, CTDB_SRVID_SAMBA_NOTIFY, smbd_parent_ctdb_reconfigured, msg_ctx); } #ifdef DEVELOPER messaging_register(msg_ctx, NULL, MSG_SMB_INJECT_FAULT, msg_inject_fault); #endif if (lp_multicast_dns_register() && (dns_port != 0)) { #ifdef WITH_DNSSD_SUPPORT smbd_setup_mdns_registration(ev_ctx, parent, dns_port); #endif #ifdef WITH_AVAHI_SUPPORT void *avahi_conn; avahi_conn = avahi_start_register(ev_ctx, ev_ctx, dns_port); if (avahi_conn == NULL) { DEBUG(10, ("avahi_start_register failed\n")); } #endif } return true; }