summaryrefslogtreecommitdiffstats
path: root/source/nmbd
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-06-08 22:10:34 +0000
committerGerald Carter <jerry@samba.org>2005-06-08 22:10:34 +0000
commitdf27dca930c7a76737b22f98ba40e4f3b3a74d7f (patch)
tree9e3cb869854075540c9784c829f7b6ce8cb74459 /source/nmbd
parentfb360b8763df7eb7ca4a83c3290f71ef4e2e6b9d (diff)
downloadsamba-df27dca930c7a76737b22f98ba40e4f3b3a74d7f.tar.gz
samba-df27dca930c7a76737b22f98ba40e4f3b3a74d7f.tar.xz
samba-df27dca930c7a76737b22f98ba40e4f3b3a74d7f.zip
r7415: * big change -- volker's new async winbindd from trunk
Diffstat (limited to 'source/nmbd')
-rw-r--r--source/nmbd/nmbd.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/source/nmbd/nmbd.c b/source/nmbd/nmbd.c
index 532b578f3c7..af93bf5197c 100644
--- a/source/nmbd/nmbd.c
+++ b/source/nmbd/nmbd.c
@@ -323,6 +323,56 @@ static void msg_reload_nmbd_services(int msg_type, pid_t src, void *buf, size_t
}
}
+static void msg_nmbd_send_packet(int msg_type, pid_t src,
+ void *buf, size_t len)
+{
+ struct packet_struct *p = (struct packet_struct *)buf;
+ struct subnet_record *subrec;
+ struct in_addr *local_ip;
+
+ DEBUG(10, ("Received send_packet from %d\n", src));
+
+ if (len != sizeof(struct packet_struct)) {
+ DEBUG(2, ("Discarding invalid packet length from %d\n", src));
+ return;
+ }
+
+ if ((p->packet_type != NMB_PACKET) &&
+ (p->packet_type != DGRAM_PACKET)) {
+ DEBUG(2, ("Discarding invalid packet type from %d: %d\n",
+ src, p->packet_type));
+ return;
+ }
+
+ local_ip = iface_ip(p->ip);
+
+ if (local_ip == NULL) {
+ DEBUG(2, ("Could not find ip for packet from %d\n", src));
+ return;
+ }
+
+ subrec = FIRST_SUBNET;
+
+ p->fd = (p->packet_type == NMB_PACKET) ?
+ subrec->nmb_sock : subrec->dgram_sock;
+
+ for (subrec = FIRST_SUBNET; subrec != NULL;
+ subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
+ if (ip_equal(*local_ip, subrec->myip)) {
+ p->fd = (p->packet_type == NMB_PACKET) ?
+ subrec->nmb_sock : subrec->dgram_sock;
+ break;
+ }
+ }
+
+ if (p->packet_type == DGRAM_PACKET) {
+ p->port = 138;
+ p->packet.dgram.header.source_ip.s_addr = local_ip->s_addr;
+ p->packet.dgram.header.source_port = 138;
+ }
+
+ send_packet(p);
+}
/**************************************************************************** **
The main select loop.
@@ -720,6 +770,7 @@ static BOOL open_sockets(BOOL isdaemon, int port)
message_register(MSG_WINS_NEW_ENTRY, nmbd_wins_new_entry);
message_register(MSG_SHUTDOWN, nmbd_terminate);
message_register(MSG_SMB_CONF_UPDATED, msg_reload_nmbd_services);
+ message_register(MSG_SEND_PACKET, msg_nmbd_send_packet);
DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );