summaryrefslogtreecommitdiff
path: root/source4/nbt_server/winsserver.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-02-11 23:54:37 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:09:44 -0500
commit0487eee93a06c8d4d1925660d6d14374c4039d86 (patch)
tree94c251edd48c5996aa831f8378459079e01939c5 /source4/nbt_server/winsserver.c
parent801889f71af52d8d136656ec1100364c50c1626d (diff)
downloadsamba-0487eee93a06c8d4d1925660d6d14374c4039d86.tar.gz
samba-0487eee93a06c8d4d1925660d6d14374c4039d86.tar.bz2
samba-0487eee93a06c8d4d1925660d6d14374c4039d86.zip
r5346: - a bit more preparation for the WINS server going in
- more NBT packet asserts, to ensure that incoming requests have all the elements we depend on - open the WINS database at startup if we are configured as a WINS server - split out the nbtd server reply packet generation code so it can be shared by the WINS server - re-did the logic of what is answered by the WINS server and what by the B node server. It now always tries to answer by the B node, and only "recurses" to the WINS server for names that are not found. (This used to be commit 5613e6b8ad9b32639caf5055f793dbc4d0a2fc19)
Diffstat (limited to 'source4/nbt_server/winsserver.c')
-rw-r--r--source4/nbt_server/winsserver.c70
1 files changed, 64 insertions, 6 deletions
diff --git a/source4/nbt_server/winsserver.c b/source4/nbt_server/winsserver.c
index 5940303f66..c7720b6ec7 100644
--- a/source4/nbt_server/winsserver.c
+++ b/source4/nbt_server/winsserver.c
@@ -23,15 +23,73 @@
#include "includes.h"
#include "nbt_server/nbt_server.h"
+
+static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const char *src_address, int src_port)
+{
+ nbtd_negative_name_query_reply(nbtsock, packet, src_address, src_port);
+}
+
+static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const char *src_address, int src_port)
+{
+ nbtd_negative_name_registration_reply(nbtsock, packet, src_address, src_port);
+}
+
+
+static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const char *src_address, int src_port)
+{
+}
+
+
/*
answer a name query
*/
-void nbtd_query_wins(struct nbt_name_socket *nbtsock,
- struct nbt_name_packet *packet,
- const char *src_address, int src_port)
+void nbtd_winsserver_request(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const char *src_address, int src_port)
+{
+ if (packet->operation & NBT_FLAG_BROADCAST) {
+ return;
+ }
+
+ switch (packet->operation & NBT_OPCODE) {
+ case NBT_OPCODE_QUERY:
+ nbtd_winsserver_query(nbtsock, packet, src_address, src_port);
+ break;
+
+ case NBT_OPCODE_REGISTER:
+ case NBT_OPCODE_REFRESH:
+ case NBT_OPCODE_REFRESH2:
+ case NBT_OPCODE_MULTI_HOME_REG:
+ nbtd_winsserver_register(nbtsock, packet, src_address, src_port);
+ break;
+
+ case NBT_OPCODE_RELEASE:
+ nbtd_winsserver_release(nbtsock, packet, src_address, src_port);
+ break;
+ }
+
+}
+
+/*
+ startup the WINS server, if configured
+*/
+NTSTATUS nbtd_winsserver_init(struct nbtd_server *nbtsrv)
{
- DEBUG(0,("WINS query from %s\n", src_address));
- if (DEBUGLVL(10)) {
- NDR_PRINT_DEBUG(nbt_name_packet, packet);
+ if (!lp_wins_support()) {
+ nbtsrv->wins_db = NULL;
+ return NT_STATUS_OK;
}
+
+ nbtsrv->wins_db = ldb_wrap_connect(nbtsrv, lp_wins_url(), 0, NULL);
+ if (nbtsrv->wins_db == NULL) {
+ return NT_STATUS_INTERNAL_DB_ERROR;
+ }
+
+ return NT_STATUS_OK;
}