static bool open_sockets(void) { struct sockaddr_storage ss; const char *sock_addr = lp_nbt_client_socket_address(); if (!interpret_string_addr(&ss, sock_addr, AI_NUMERICHOST|AI_PASSIVE)) { DEBUG(0,("open_sockets: unable to get socket address " "from string %s", sock_addr)); return false; } ServerFD = open_socket_in( SOCK_DGRAM, (RootPort ? 137 : 0), (RootPort ? 0 : 3), &ss, true ); if (ServerFD == -1) { return false; } set_socket_options( ServerFD, "SO_BROADCAST" ); DEBUG(3, ("Socket opened.\n")); return true; }
static bool open_sockets(bool isdaemon, int port) { struct sockaddr_storage ss; const char *sock_addr = lp_nbt_client_socket_address(); /* * The sockets opened here will be used to receive broadcast * packets *only*. Interface specific sockets are opened in * make_subnet() in namedbsubnet.c. Thus we bind to the * address "0.0.0.0". The parameter 'socket address' is * now deprecated. */ if (!interpret_string_addr(&ss, sock_addr, AI_NUMERICHOST|AI_PASSIVE)) { DEBUG(0,("open_sockets: unable to get socket address " "from string %s", sock_addr)); return false; } if (ss.ss_family != AF_INET) { DEBUG(0,("open_sockets: unable to use IPv6 socket" "%s in nmbd\n", sock_addr)); return false; } if (isdaemon) { ClientNMB = open_socket_in(SOCK_DGRAM, port, 0, &ss, true); } else { ClientNMB = 0; } if (ClientNMB == -1) { return false; } ClientDGRAM = open_socket_in(SOCK_DGRAM, DGRAM_PORT, 3, &ss, true); if (ClientDGRAM == -1) { if (ClientNMB != 0) { close(ClientNMB); } return false; } /* we are never interested in SIGPIPE */ BlockSignals(True,SIGPIPE); set_socket_options( ClientNMB, "SO_BROADCAST" ); set_socket_options( ClientDGRAM, "SO_BROADCAST" ); /* Ensure we're non-blocking. */ set_blocking( ClientNMB, False); set_blocking( ClientDGRAM, False); DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) ); return( True ); }