2 Unix SMB/Netbios implementation.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1998
6 Copyright (C) Luke Kenneth Casson Leighton 1994-1998
7 Copyright (C) Jeremy Allison 1994-1998
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern int DEBUGLEVEL;
29 extern pstring global_myname;
30 extern fstring global_myworkgroup;
31 extern BOOL found_lm_clients;
35 /* XXXX note: This function is currently unsuitable for use, as it
36 does not properly check that a server is in a fit state to become
37 a backup browser before asking it to be one.
38 The code is left here to be worked on at a later date.
41 /****************************************************************************
42 Tell a server to become a backup browser
43 **************************************************************************/
45 void tell_become_backup(void)
47 struct subnet_record *subrec;
48 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
50 struct work_record *work;
51 for (work = subrec->workgrouplist; work; work = work->next)
53 struct server_record *servrec;
57 for (servrec = work->serverlist; servrec; servrec = servrec->next)
61 if (is_myname(servrec->serv.name))
64 if (servrec->serv.type & SV_TYPE_BACKUP_BROWSER)
70 if (servrec->serv.type & SV_TYPE_MASTER_BROWSER)
73 if (!(servrec->serv.type & SV_TYPE_POTENTIAL_BROWSER))
76 DEBUG(3,("num servers: %d num backups: %d\n",
77 num_servers, num_backups));
79 /* make first server a backup server. thereafter make every
80 tenth server a backup server */
81 if (num_backups != 0 && (num_servers+9) / num_backups > 10)
84 DEBUG(2,("sending become backup to %s %s for %s\n",
85 servrec->serv.name, inet_ntoa(subrec->bcast_ip),
88 /* type 11 request from MYNAME(20) to WG(1e) for SERVER */
89 do_announce_request(servrec->serv.name, work->work_group,
90 ANN_BecomeBackup, 0x20, 0x1e, subrec->bcast_ip);
97 /*******************************************************************
98 Process an incoming host announcement packet.
99 *******************************************************************/
101 void process_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
103 struct dgram_packet *dgram = &p->packet.dgram;
104 int ttl = IVAL(buf,1)/1000;
105 char *announce_name = buf+5;
106 uint32 servertype = IVAL(buf,23);
107 char *comment = buf+31;
108 struct work_record *work;
109 struct server_record *servrec;
111 char *source_name = dgram->source_name.name;
115 DEBUG(3,("process_host_announce: from %s<%02x> IP %s to \
116 %s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
117 namestr(&dgram->dest_name),announce_name));
119 DEBUG(5,("process_host_announce: ttl=%d server type=%08x comment=%s\n",
120 ttl, servertype,comment));
122 /* Filter servertype to remove impossible bits. */
123 servertype &= ~(SV_TYPE_LOCAL_LIST_ONLY|SV_TYPE_DOMAIN_ENUM);
125 /* A host announcement must be sent to the name WORKGROUP<1d>. */
126 if(dgram->dest_name.name_type != 0x1d)
128 DEBUG(2,("process_host_announce: incorrect name type for destination from IP %s \
129 (was %02x) should be 0x1d. Allowing packet anyway.\n",
130 inet_ntoa(p->ip), dgram->dest_name.name_type));
131 /* Change it so it was. */
132 dgram->dest_name.name_type = 0x1d;
135 /* For a host announce the workgroup name is the destination name. */
136 work_name = dgram->dest_name.name;
139 * Syntax servers version 5.1 send HostAnnounce packets to
140 * *THE WRONG NAME*. They send to LOCAL_MASTER_BROWSER_NAME<00>
141 * instead of WORKGROUP<1d> name. So to fix this we check if
142 * the workgroup name is our own name, and if so change it
143 * to be our primary workgroup name.
146 if(strequal(work_name, global_myname))
147 work_name = global_myworkgroup;
150 * We are being very agressive here in adding a workgroup
151 * name on the basis of a host announcing itself as being
152 * in that workgroup. Maybe we should wait for the workgroup
153 * announce instead ? JRA.
156 work = find_workgroup_on_subnet(subrec, work_name);
162 /* We have no record of this workgroup. Add it. */
163 if((work = create_workgroup_on_subnet(subrec, work_name, ttl))==NULL)
167 if((servrec = find_server_in_workgroup( work, announce_name))==NULL)
169 /* If this server is not already in the workgroup, add it. */
170 create_server_on_workgroup(work, announce_name,
171 servertype|SV_TYPE_LOCAL_LIST_ONLY,
176 /* Update the record. */
177 servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
178 update_server_ttl( servrec, ttl);
179 StrnCpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment)-1);
185 * This server is announcing it is going down. Remove it from the
188 if(!is_myname(announce_name) && (work != NULL) &&
189 ((servrec = find_server_in_workgroup( work, announce_name))!=NULL)
192 remove_server_from_workgroup( work, servrec);
195 subrec->work_changed = True;
198 /*******************************************************************
199 Process an incoming WORKGROUP announcement packet.
200 *******************************************************************/
202 void process_workgroup_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
204 struct dgram_packet *dgram = &p->packet.dgram;
205 int ttl = IVAL(buf,1)/1000;
206 char *workgroup_announce_name = buf+5;
207 uint32 servertype = IVAL(buf,23);
208 char *master_name = buf+31;
209 struct work_record *work;
210 char *source_name = dgram->source_name.name;
214 DEBUG(3,("process_workgroup_announce: from %s<%02x> IP %s to \
215 %s for workgroup %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
216 namestr(&dgram->dest_name),workgroup_announce_name));
218 DEBUG(5,("process_workgroup_announce: ttl=%d server type=%08x master browser=%s\n",
219 ttl, servertype, master_name));
221 /* Workgroup announcements must only go to the MSBROWSE name. */
222 if (!strequal(dgram->dest_name.name, MSBROWSE) || (dgram->dest_name.name_type != 0x1))
224 DEBUG(0,("process_workgroup_announce: from IP %s should be to __MSBROWSE__<0x01> not %s\n",
225 inet_ntoa(p->ip), namestr(&dgram->dest_name)));
229 if ((work = find_workgroup_on_subnet(subrec, workgroup_announce_name))==NULL)
231 /* We have no record of this workgroup. Add it. */
232 if((work = create_workgroup_on_subnet(subrec, workgroup_announce_name, ttl))==NULL)
237 /* Update the workgroup death_time. */
238 update_workgroup_ttl(work, ttl);
241 if(*work->local_master_browser_name == '\0')
243 /* Set the master browser name. */
244 set_workgroup_local_master_browser_name( work, master_name );
247 subrec->work_changed = True;
250 /*******************************************************************
251 Process an incoming local master browser announcement packet.
252 *******************************************************************/
254 void process_local_master_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
256 struct dgram_packet *dgram = &p->packet.dgram;
257 int ttl = IVAL(buf,1)/1000;
258 char *server_name = buf+5;
259 uint32 servertype = IVAL(buf,23);
260 char *comment = buf+31;
262 struct work_record *work;
263 struct server_record *servrec;
264 char *source_name = dgram->source_name.name;
268 DEBUG(3,("process_local_master_announce: from %s<%02x> IP %s to \
269 %s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
270 namestr(&dgram->dest_name),server_name));
272 DEBUG(5,("process_local_master_announce: ttl=%d server type=%08x comment=%s\n",
273 ttl, servertype, comment));
275 /* A local master announcement must be sent to the name WORKGROUP<1e>. */
276 if(dgram->dest_name.name_type != 0x1e)
278 DEBUG(0,("process_local_master_announce: incorrect name type for destination from IP %s \
279 (was %02x) should be 0x1e. Ignoring packet.\n",
280 inet_ntoa(p->ip), dgram->dest_name.name_type));
284 /* Filter servertype to remove impossible bits. */
285 servertype &= ~(SV_TYPE_LOCAL_LIST_ONLY|SV_TYPE_DOMAIN_ENUM);
287 /* For a local master announce the workgroup name is the destination name. */
288 work_name = dgram->dest_name.name;
290 if ((work = find_workgroup_on_subnet(subrec, work_name))==NULL)
292 /* Don't bother adding if it's a local master release announce. */
296 /* We have no record of this workgroup. Add it. */
297 if((work = create_workgroup_on_subnet(subrec, work_name, ttl))==NULL)
301 /* If we think we're the local master browser for this workgroup,
302 we should never have got this packet. We don't see our own
305 if(AM_LOCAL_MASTER_BROWSER(work))
307 DEBUG(0,("process_local_master_announce: Server %s at IP %s is announcing itself as \
308 a local master browser for workgroup %s and we think we are master. Forcing election.\n",
309 server_name, inet_ntoa(p->ip), work_name));
311 /* Samba nmbd versions 1.9.17 to 1.9.17p4 have a bug in that when
312 they have become a local master browser once, they will never
313 stop sending local master announcements. To fix this we send
314 them a reset browser packet, with level 0x2 on the __SAMBA__
315 name that only they should be listening to. */
317 send_browser_reset( 0x2, "__SAMBA__" , 0x20, p->ip);
319 /* We should demote ourself and force an election. */
321 unbecome_local_master_browser( subrec, work);
323 /* The actual election requests are handled in
326 work->needelection = True;
330 /* Find the server record on this workgroup. If it doesn't exist, add it. */
334 if((servrec = find_server_in_workgroup( work, server_name))==NULL)
336 /* If this server is not already in the workgroup, add it. */
337 create_server_on_workgroup(work, server_name,
338 servertype|SV_TYPE_LOCAL_LIST_ONLY,
343 /* Update the record. */
344 servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
345 update_server_ttl(servrec, ttl);
346 StrnCpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment)-1);
349 set_workgroup_local_master_browser_name( work, server_name );
354 * This server is announcing it is going down. Remove it from the
357 if(!is_myname(server_name) && (work != NULL) &&
358 ((servrec = find_server_in_workgroup( work, server_name))!=NULL)
361 remove_server_from_workgroup( work, servrec);
365 subrec->work_changed = True;
368 /*******************************************************************
369 Process a domain master announcement frame.
370 Domain master browsers receive these from local masters. The Domain
371 master should then issue a sync with the local master, asking for
372 that machines local server list.
373 ******************************************************************/
375 void process_master_browser_announce(struct subnet_record *subrec,
376 struct packet_struct *p,char *buf)
378 char *local_master_name = buf;
379 struct work_record *work;
380 struct browse_cache_record *browrec;
382 local_master_name[15] = 0;
384 DEBUG(3,("process_master_browser_announce: Local master announce from %s IP %s.\n",
385 local_master_name, inet_ntoa(p->ip)));
387 if (!lp_domain_master())
389 DEBUG(0,("process_master_browser_announce: Not configured as domain \
390 master - ignoring master announce.\n"));
394 if((work = find_workgroup_on_subnet(subrec, global_myworkgroup)) == NULL)
396 DEBUG(0,("process_master_browser_announce: Cannot find workgroup %s on subnet %s\n",
397 global_myworkgroup, subrec->subnet_name));
401 if(!AM_DOMAIN_MASTER_BROWSER(work))
403 DEBUG(0,("process_master_browser_announce: Local master announce made to us from \
404 %s IP %s and we are not a domain master browser.\n", local_master_name, inet_ntoa(p->ip)));
408 /* Add this host as a local master browser entry on the browse lists.
409 This causes a sync request to be made to it at a later date.
412 if((browrec = find_browser_in_lmb_cache( local_master_name )) == NULL)
415 create_browser_in_lmb_cache( work->work_group, local_master_name, p->ip);
418 update_browser_death_time(browrec);
421 /*******************************************************************
422 Process an incoming LanMan host announcement packet.
423 *******************************************************************/
425 void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
427 struct dgram_packet *dgram = &p->packet.dgram;
428 uint32 servertype = IVAL(buf,1);
429 int osmajor=CVAL(buf,5); /* major version of node software */
430 int osminor=CVAL(buf,6); /* minor version of node software */
431 int ttl = SVAL(buf,7);
432 char *announce_name = buf+9;
433 struct work_record *work;
434 struct server_record *servrec;
436 char *source_name = dgram->source_name.name;
440 s = skip_string(s,1);
441 StrnCpy(comment, s, 43);
443 DEBUG(3,("process_lm_host_announce: LM Announcement from %s<%02x> IP %s to \
444 %s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
445 namestr(&dgram->dest_name),announce_name));
447 DEBUG(5,("process_lm_host_announce: os=(%d,%d) ttl=%d server type=%08x comment=%s\n",
448 osmajor, osminor, ttl, servertype,comment));
450 if ((osmajor < 36) || (osmajor > 38) || (osminor !=0))
452 DEBUG(5,("process_lm_host_announce: LM Announcement packet does not \
453 originate from OS/2 Warp client. Ignoring packet.\n"));
454 /* Could have been from a Windows machine (with its LM Announce enabled),
455 or a Samba server. Then don't disrupt the current browse list. */
459 /* Filter servertype to remove impossible bits. */
460 servertype &= ~(SV_TYPE_LOCAL_LIST_ONLY|SV_TYPE_DOMAIN_ENUM);
462 /* A LanMan host announcement must be sent to the name WORKGROUP<00>. */
463 if(dgram->dest_name.name_type != 0x00)
465 DEBUG(2,("process_lm_host_announce: incorrect name type for destination from IP %s \
466 (was %02x) should be 0x00. Allowing packet anyway.\n",
467 inet_ntoa(p->ip), dgram->dest_name.name_type));
468 /* Change it so it was. */
469 dgram->dest_name.name_type = 0x00;
472 /* For a LanMan host announce the workgroup name is the destination name. */
473 work_name = dgram->dest_name.name;
476 * Syntax servers version 5.1 send HostAnnounce packets to
477 * *THE WRONG NAME*. They send to LOCAL_MASTER_BROWSER_NAME<00>
478 * instead of WORKGROUP<1d> name. So to fix this we check if
479 * the workgroup name is our own name, and if so change it
480 * to be our primary workgroup name. This code is probably
481 * not needed in the LanMan announce code, but it won't hurt.
484 if(strequal(work_name, global_myname))
485 work_name = global_myworkgroup;
488 * We are being very agressive here in adding a workgroup
489 * name on the basis of a host announcing itself as being
490 * in that workgroup. Maybe we should wait for the workgroup
491 * announce instead ? JRA.
494 work = find_workgroup_on_subnet(subrec, work_name);
500 /* We have no record of this workgroup. Add it. */
501 if((work = create_workgroup_on_subnet(subrec, work_name, ttl))==NULL)
505 if((servrec = find_server_in_workgroup( work, announce_name))==NULL)
507 /* If this server is not already in the workgroup, add it. */
508 create_server_on_workgroup(work, announce_name,
509 servertype|SV_TYPE_LOCAL_LIST_ONLY,
514 /* Update the record. */
515 servrec->serv.type = servertype|SV_TYPE_LOCAL_LIST_ONLY;
516 update_server_ttl( servrec, ttl);
517 StrnCpy(servrec->serv.comment,comment,sizeof(servrec->serv.comment)-1);
523 * This server is announcing it is going down. Remove it from the
526 if(!is_myname(announce_name) && (work != NULL) &&
527 ((servrec = find_server_in_workgroup( work, announce_name))!=NULL)
530 remove_server_from_workgroup( work, servrec);
534 subrec->work_changed = True;
535 found_lm_clients = True;
538 /****************************************************************************
539 Send a backup list response.
540 *****************************************************************************/
542 static void send_backup_list_response(struct subnet_record *subrec,
543 struct work_record *work,
544 struct nmb_name *send_to_name,
545 unsigned char max_number_requested,
546 uint32 token, struct in_addr sendto_ip)
549 char *p, *countptr, *nameptr;
550 unsigned int count = 0;
552 struct server_record *servrec;
554 bzero(outbuf,sizeof(outbuf));
556 DEBUG(3,("send_backup_list_response: sending backup list for workgroup %s to %s IP %s\n",
557 work->work_group, namestr(send_to_name), inet_ntoa(sendto_ip)));
561 SCVAL(p,0,ANN_GetBackupListResp); /* Backup list response opcode. */
567 SIVAL(p,0,token); /* The sender's unique info. */
572 /* We always return at least one name - our own. */
574 StrnCpy(p,global_myname,15);
576 p = skip_string(p,1);
578 /* Look for backup browsers in this workgroup. */
579 for (servrec = work->serverlist; servrec; servrec = servrec->next)
581 len = PTR_DIFF(p, outbuf);
582 if((sizeof(outbuf) - len) < 16)
585 if(count >= (unsigned int)max_number_requested)
588 if(strnequal(servrec->serv.name, global_myname,15))
591 if(!(servrec->serv.type & SV_TYPE_BACKUP_BROWSER))
594 StrnCpy(p, servrec->serv.name, 15);
598 DEBUG(5,("send_backup_list_response: Adding server %s number %d\n",
601 p = skip_string(p,1);
604 SCVAL(countptr, 0, count);
606 len = PTR_DIFF(p, outbuf);
608 DEBUG(4,("send_backup_list_response: sending response to %s<00> IP %s with %d servers.\n",
609 send_to_name->name, inet_ntoa(sendto_ip), count));
611 send_mailslot(True, BROWSE_MAILSLOT,
612 outbuf,PTR_DIFF(p,outbuf),
614 send_to_name->name,0,
615 sendto_ip, subrec->myip);
618 /*******************************************************************
619 Process a send backup list request packet.
621 A client sends a backup list request to ask for a list of servers on
622 the net that maintain server lists for a domain. A server is then
623 chosen from this list to send NetServerEnum commands to to list
626 ********************************************************************/
628 void process_get_backup_list_request(struct subnet_record *subrec,
629 struct packet_struct *p,char *buf)
631 struct dgram_packet *dgram = &p->packet.dgram;
632 struct work_record *work;
633 unsigned char max_number_requested = CVAL(buf,0);
634 uint32 token = IVAL(buf,1); /* Sender's key index for the workgroup. */
635 int name_type = dgram->dest_name.name_type;
636 char *workgroup_name = dgram->dest_name.name;
638 DEBUG(3,("process_get_backup_list_request: request from %s IP %s to %s.\n",
639 namestr(&dgram->source_name), inet_ntoa(p->ip),
640 namestr(&dgram->dest_name)));
642 /* We have to be a master browser, or a domain master browser
643 for the requested workgroup. That means it must be our
646 if(strequal(workgroup_name, global_myworkgroup) == False)
648 DEBUG(7,("process_get_backup_list_request: Ignoring announce request for workgroup %s.\n",
653 if((work = find_workgroup_on_subnet(subrec, workgroup_name)) == NULL)
655 DEBUG(0,("process_get_backup_list_request: Cannot find workgroup %s on \
656 subnet %s.\n", workgroup_name, subrec->subnet_name));
660 if(name_type == 0x1b)
662 /* We must be a domain master browser in order to
663 process this packet. */
665 if(!AM_DOMAIN_MASTER_BROWSER(work))
667 DEBUG(0,("process_get_backup_list_request: domain list requested for workgroup %s \
668 and I am not a domain master browser.\n", workgroup_name));
672 else if (name_type == 0x1d)
674 /* We must be a local master browser in order to
675 process this packet. */
677 if(!AM_LOCAL_MASTER_BROWSER(work))
679 DEBUG(0,("process_get_backup_list_request: domain list requested for workgroup %s \
680 and I am not a local master browser.\n", workgroup_name));
686 DEBUG(0,("process_get_backup_list_request: Invalid name type %x - should be 0x1b or 0x1d.\n",
691 send_backup_list_response(subrec, work, &dgram->source_name,
692 max_number_requested, token, p->ip);
695 /*******************************************************************
696 Process a reset browser state packet.
699 0x1 - Stop being a master browser and become a backup browser.
700 0x2 - Discard browse lists, stop being a master browser, try again.
701 0x4 - Stop being a master browser forever.
703 ******************************************************************/
705 void process_reset_browser(struct subnet_record *subrec,
706 struct packet_struct *p,char *buf)
708 struct dgram_packet *dgram = &p->packet.dgram;
709 int state = CVAL(buf,0);
710 struct subnet_record *sr;
712 DEBUG(1,("process_reset_browser: received diagnostic browser reset \
713 request from %s IP %s state=0x%X\n",
714 namestr(&dgram->source_name), inet_ntoa(p->ip), state));
716 /* Stop being a local master browser on all our broadcast subnets. */
719 for (sr = FIRST_SUBNET; sr; sr = NEXT_SUBNET_EXCLUDING_UNICAST(sr))
721 struct work_record *work;
722 for (work = sr->workgrouplist; work; work = work->next)
724 if (AM_LOCAL_MASTER_BROWSER(work))
726 unbecome_local_master_browser(sr, work);
727 work->needelection = True;
733 /* Discard our browse lists. */
737 * Calling expire_workgroups_and_servers with a -1
738 * time causes all servers not marked with a PERMANENT_TTL
739 * on the workgroup lists to be discarded, and all
740 * workgroups with empty server lists to be discarded.
741 * This means we keep our own server names and workgroup
742 * as these have a PERMANENT_TTL.
745 expire_workgroups_and_servers(-1);
748 /* Request to stop browsing altogether. */
750 DEBUG(1,("process_reset_browser: ignoring request to stop being a browser.\n"));
753 /*******************************************************************
754 Process an announcement request packet.
755 We don't respond immediately, we just check it's a request for
756 our workgroup and then set the flag telling the announce code
757 in nmbd_sendannounce.c:announce_my_server_names that an
758 announcement is needed soon.
759 ******************************************************************/
761 void process_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
763 struct dgram_packet *dgram = &p->packet.dgram;
764 struct work_record *work;
765 char *workgroup_name = dgram->dest_name.name;
767 DEBUG(3,("process_announce_request: Announce request from %s IP %s to %s.\n",
768 namestr(&dgram->source_name), inet_ntoa(p->ip),
769 namestr(&dgram->dest_name)));
771 /* We only send announcement requests on our workgroup. */
772 if(strequal(workgroup_name, global_myworkgroup) == False)
774 DEBUG(7,("process_announce_request: Ignoring announce request for workgroup %s.\n",
779 if((work = find_workgroup_on_subnet(subrec, workgroup_name)) == NULL)
781 DEBUG(0,("process_announce_request: Unable to find workgroup %s on subnet !\n",
786 work->needannounce = True;
789 /*******************************************************************
790 Process a LanMan announcement request packet.
791 We don't respond immediately, we just check it's a request for
792 our workgroup and then set the flag telling that we have found
793 a LanMan client (DOS or OS/2) and that we will have to start
794 sending LanMan announcements (unless specifically disabled
795 through the "lm announce" parameter in smb.conf)
796 ******************************************************************/
798 void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
800 struct dgram_packet *dgram = &p->packet.dgram;
801 struct work_record *work;
802 char *workgroup_name = dgram->dest_name.name;
804 DEBUG(3,("process_lm_announce_request: Announce request from %s IP %s to %s.\n",
805 namestr(&dgram->source_name), inet_ntoa(p->ip),
806 namestr(&dgram->dest_name)));
808 /* We only send announcement requests on our workgroup. */
809 if(strequal(workgroup_name, global_myworkgroup) == False)
811 DEBUG(7,("process_lm_announce_request: Ignoring announce request for workgroup %s.\n",
816 if((work = find_workgroup_on_subnet(subrec, workgroup_name)) == NULL)
818 DEBUG(0,("process_announce_request: Unable to find workgroup %s on subnet !\n",
823 found_lm_clients = True;