2 Unix SMB/Netbios implementation.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1995
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 14 jan 96: lkcl@pires.co.uk
24 added multiple workgroup domain master support
31 extern int ClientDGRAM;
33 #define FIND_SELF 0x01
34 #define FIND_WINS 0x02
35 #define FIND_LOCAL 0x04
37 extern int DEBUGLEVEL;
40 extern BOOL CanRecurse;
41 extern pstring myname;
42 extern struct in_addr ipzero;
43 extern struct in_addr ipgrp;
45 extern struct subnet_record *subnetlist;
47 #define WINS_LIST "wins.dat"
49 #define GET_TTL(ttl) ((ttl)?MIN(ttl,lp_max_ttl()):lp_max_ttl())
51 /****************************************************************************
52 finds the appropriate subnet structure. directed packets (non-bcast) are
53 assumed to come from a point-to-point (P or M node), and so the subnet we
54 return in this instance is the WINS 'pseudo-subnet' with ip 255.255.255.255
55 ****************************************************************************/
56 static struct subnet_record *find_req_subnet(struct in_addr ip, BOOL bcast)
60 /* identify the subnet the broadcast request came from */
61 return find_subnet(*iface_bcast(ip));
63 /* find the subnet under the pseudo-ip of 255.255.255.255 */
64 return find_subnet(ipgrp);
67 /****************************************************************************
68 true if two netbios names are equal
69 ****************************************************************************/
70 static BOOL name_equal(struct nmb_name *n1,struct nmb_name *n2)
72 if (n1->name_type != n2->name_type) return(False);
74 return(strequal(n1->name,n2->name) && strequal(n1->scope,n2->scope));
77 /****************************************************************************
78 add a netbios name into the namelist
79 **************************************************************************/
80 static void add_name(struct subnet_record *d, struct name_record *n)
82 struct name_record *n2;
94 for (n2 = d->namelist; n2->next; n2 = n2->next) ;
101 /****************************************************************************
102 remove a name from the namelist. The pointer must be an element just
104 **************************************************************************/
105 void remove_name(struct subnet_record *d, struct name_record *n)
107 struct name_record *nlist;
112 while (nlist && nlist != n) nlist = nlist->next;
116 if (nlist->next) nlist->next->prev = nlist->prev;
117 if (nlist->prev) nlist->prev->next = nlist->next;
123 /****************************************************************************
124 find a name in a namelist
125 **************************************************************************/
126 static struct name_record *find_name(struct name_record *n,
127 struct nmb_name *name,
128 int search, struct in_addr ip)
130 struct name_record *ret;
132 for (ret = n; ret; ret = ret->next)
134 if (name_equal(&ret->name,name))
136 /* self search: self names only */
137 if ((search&FIND_SELF) == FIND_SELF && ret->source != SELF)
140 if (zero_ip(ip) || ip_equal(ip, ret->ip))
150 /****************************************************************************
151 find a name in the domain database namelist
152 search can be any of:
153 FIND_SELF - look exclusively for names the samba server has added for itself
154 FIND_LOCAL - look for names in the local subnet record.
155 FIND_WINS - look for names in the WINS record
156 **************************************************************************/
157 static struct name_record *find_name_search(struct subnet_record **d,
158 struct nmb_name *name,
159 int search, struct in_addr ip)
161 if (d == NULL) return NULL; /* bad error! */
163 if ((search & FIND_LOCAL) == FIND_LOCAL)
167 return find_name((*d)->namelist, name, search, ip);
171 DEBUG(4,("local find_name_search with a NULL subnet pointer\n"));
176 if ((search & FIND_WINS) != FIND_WINS) return NULL;
180 /* find WINS subnet record */
181 *d = find_subnet(ipgrp);
184 if (*d == NULL) return NULL;
186 return find_name((*d)->namelist, name, search, ip);
190 /****************************************************************************
191 dump a copy of the name table
192 **************************************************************************/
193 void dump_names(void)
195 struct name_record *n;
196 struct subnet_record *d;
197 fstring fname, fnamenew;
198 time_t t = time(NULL);
202 strcpy(fname,lp_lockdir());
203 trim_string(fname,NULL,"/");
205 strcat(fname,WINS_LIST);
206 strcpy(fnamenew,fname);
207 strcat(fnamenew,".");
209 f = fopen(fnamenew,"w");
213 DEBUG(4,("Can't open %s - %s\n",fnamenew,strerror(errno)));
216 DEBUG(3,("Dump of local name table:\n"));
218 for (d = subnetlist; d; d = d->next)
219 for (n = d->namelist; n; n = n->next)
221 if (f && ip_equal(d->bcast_ip, ipgrp) && n->source == REGISTER)
225 /* XXXX i have little imagination as to how to output nb_flags as
226 anything other than a hexadecimal number :-) */
228 sprintf(data, "%s#%02x %s %ld %2x",
229 n->name.name,n->name.name_type, /* XXXX ignore the scope for now */
233 fprintf(f, "%s\n", data);
236 DEBUG(3,("%15s ", inet_ntoa(d->bcast_ip)));
237 DEBUG(3,("%15s ", inet_ntoa(d->mask_ip)));
238 DEBUG(3,("%s %15s TTL=%15d NBFLAGS=%2x\n",
241 n->death_time?n->death_time-t:0,
247 chmod(fnamenew,0644);
248 rename(fnamenew,fname);
250 DEBUG(3,("Wrote wins database %s\n",fname));
253 /****************************************************************************
254 load a netbios name database file
255 ****************************************************************************/
256 void load_netbios_names(void)
258 struct subnet_record *d = find_subnet(ipgrp);
266 strcpy(fname,lp_lockdir());
267 trim_string(fname,NULL,"/");
269 strcat(fname,WINS_LIST);
271 f = fopen(fname,"r");
274 DEBUG(2,("Can't open wins database file %s\n",fname));
280 pstring name_str, ip_str, ttd_str, nb_flags_str;
286 struct in_addr ipaddr;
288 enum name_source source;
295 if (!fgets_slash(line,sizeof(pstring),f)) continue;
297 if (*line == '#') continue;
301 if (next_token(&ptr,name_str ,NULL)) ++count;
302 if (next_token(&ptr,ip_str ,NULL)) ++count;
303 if (next_token(&ptr,ttd_str ,NULL)) ++count;
304 if (next_token(&ptr,nb_flags_str,NULL)) ++count;
306 if (count <= 0) continue;
309 DEBUG(0,("Ill formed wins line"));
310 DEBUG(0,("[%s]: name#type ip nb_flags abs_time\n",line));
314 /* netbios name. # divides the name from the type (hex): netbios#xx */
315 strcpy(name,name_str);
317 p = strchr(name,'#');
321 sscanf(p+1,"%x",&type);
324 /* decode the netbios flags (hex) and the time-to-die (seconds) */
325 sscanf(nb_flags_str,"%x",&nb_flags);
326 sscanf(ttd_str,"%ld",&ttd);
328 ipaddr = *interpret_addr2(ip_str);
330 if (ip_equal(ipaddr,ipzero)) {
338 DEBUG(4, ("add WINS line: %s#%02x %s %ld %2x\n",
339 name,type, inet_ntoa(ipaddr), ttd, nb_flags));
341 /* add all entries that have 60 seconds or more to live */
342 if (ttd - 10 < time(NULL) || ttd == 0)
344 time_t t = (ttd?ttd-time(NULL):0) / 3;
346 /* add netbios entry read from the wins.dat file. IF it's ok */
347 add_netbios_entry(d,name,type,nb_flags,t,source,ipaddr,True,True);
355 /****************************************************************************
356 remove an entry from the name list
357 ****************************************************************************/
358 void remove_netbios_name(struct subnet_record *d,
359 char *name,int type, enum name_source source,
363 struct name_record *n;
364 int search = FIND_LOCAL;
366 /* if it's not a special browser name, search the WINS database */
367 if (type != 0x01 && type != 0x1d && type != 0x1e)
370 make_nmb_name(&nn, name, type, scope);
371 n = find_name_search(&d, &nn, search, ip);
373 if (n && n->source == source) remove_name(d,n);
377 /****************************************************************************
378 add an entry to the name list.
380 this is a multi-purpose function.
382 it adds samba's own names in to its records on each interface, keeping a
383 record of whether it is a master browser, domain master, or WINS server.
385 it also keeps a record of WINS entries (names of type 0x00, 0x20, 0x03 etc)
387 ****************************************************************************/
388 struct name_record *add_netbios_entry(struct subnet_record *d,
389 char *name, int type, int nb_flags,
390 int ttl, enum name_source source, struct in_addr ip,
391 BOOL new_only,BOOL wins)
393 struct name_record *n;
394 struct name_record *n2=NULL;
396 BOOL self = source == SELF;
398 /* add the name to the WINS list if the name comes from a directed query */
399 search |= wins ? FIND_WINS : FIND_LOCAL;
400 /* search for SELF names only */
401 search |= self ? FIND_SELF : 0;
407 if (type == 0x01 || type == 0x1d || type == 0x1e)
409 /* XXXX WINS server supposed to ignore special browser names. hm.
410 but is a primary domain controller supposed to ignore special
411 browser names? luke doesn't think so, but can't test it! :-)
418 /* the only broadcast (non-WINS) names we are adding are ours (SELF) */
423 n = (struct name_record *)malloc(sizeof(*n));
424 if (!n) return(NULL);
426 bzero((char *)n,sizeof(*n));
428 make_nmb_name(&n->name,name,type,scope);
430 if ((n2 = find_name_search(&d, &n->name, search, new_only?ipzero:ip)))
433 if (new_only || (n2->source==SELF && source!=SELF)) return n2;
437 if (ttl) n->death_time = time(NULL)+ttl*3;
439 n->nb_flags = nb_flags;
442 if (!n2) add_name(d,n);
444 DEBUG(3,("Added netbios name %s at %s ttl=%d nb_flags=%2x\n",
445 namestr(&n->name),inet_ntoa(ip),ttl,nb_flags));
451 /****************************************************************************
452 remove an entry from the name list
453 ****************************************************************************/
454 void remove_name_entry(struct subnet_record *d, char *name,int type)
456 if (lp_wins_support())
458 /* we are a WINS server. */
459 /* XXXX assume that if we are a WINS server that we are therefore
460 not pointing to another WINS server as well. this may later NOT
462 remove_netbios_name(d,name,type,SELF,ipzero);
466 /* not a WINS server: cannot just remove our own names: we have to
467 ask permission from the WINS server, or if no reply is received,
468 _then_ we can remove the name */
470 struct name_record n;
471 struct name_record *n2=NULL;
473 make_nmb_name(&n.name,name,type,scope);
475 if ((n2 = find_name_search(&d, &n.name, FIND_SELF, ipzero)))
477 /* check name isn't already being de-registered */
478 if (NAME_DEREG(n2->nb_flags))
481 /* mark the name as in the process of deletion. */
482 n2->nb_flags &= NB_DEREG;
484 queue_netbios_pkt_wins(d,ClientNMB,NMB_REL,NAME_RELEASE,
486 False, True, ipzero);
491 /****************************************************************************
492 add an entry to the name list
493 ****************************************************************************/
494 void add_my_name_entry(struct subnet_record *d,char *name,int type,int nb_flags)
501 /* not that it particularly matters, but if the SELF name already exists,
502 it must be re-registered, rather than just registered */
504 make_nmb_name(&n, name, type, scope);
505 if (find_name(d->namelist, &n, SELF, ipzero))
508 /* always add our own entries */
509 add_netbios_entry(d,name,type,nb_flags,0,SELF,ipzero,False,lp_wins_support());
511 if (!lp_wins_support())
513 /* we aren't supporting WINS: register name using broadcast or
514 contact WINS server */
516 queue_netbios_pkt_wins(d,ClientNMB,
517 re_reg ? NMB_REG_REFRESH : NMB_REG, NAME_REGISTER,
518 name, type, nb_flags, GET_TTL(0),
519 False, True, ipzero);
524 /****************************************************************************
525 add the magic samba names, useful for finding samba servers
526 **************************************************************************/
527 void add_my_names(void)
529 BOOL wins = lp_wins_support();
530 struct subnet_record *d;
532 struct in_addr ip = ipzero;
534 /* each subnet entry, including the WINS one, must have its own
536 /* XXXX if there was a transport layer added to samba (ipx/spx, netbeui
537 etc) then there would be yet _another_ for-loop, this time on the
539 for (d = subnetlist; d; d = d->next)
541 add_my_name_entry(d, myname,0x20,NB_ACTIVE);
542 add_my_name_entry(d, myname,0x03,NB_ACTIVE);
543 add_my_name_entry(d, myname,0x00,NB_ACTIVE);
544 add_my_name_entry(d, myname,0x1f,NB_ACTIVE);
546 add_netbios_entry(d,"*",0x0,NB_ACTIVE,0,SELF,ip,False,wins);
547 add_netbios_entry(d,"__SAMBA__",0x20,NB_ACTIVE,0,SELF,ip,False,wins);
548 add_netbios_entry(d,"__SAMBA__",0x00,NB_ACTIVE,0,SELF,ip,False,wins);
551 /* the 0x1c name gets added by any WINS server it seems */
552 add_my_name_entry(d, my_workgroup(),0x1c,NB_ACTIVE|NB_GROUP);
558 /****************************************************************************
559 remove all the samba names... from a WINS server if necessary.
560 **************************************************************************/
561 void remove_my_names()
563 struct subnet_record *d;
565 for (d = subnetlist; d; d = d->next)
567 struct name_record *n;
569 for (n = d->namelist; n; n = n->next)
571 if (n->source == SELF)
573 /* get all SELF names removed from the WINS server's database */
574 remove_name_entry(d,n->name.name, n->name.name_type);
581 /*******************************************************************
583 ******************************************************************/
584 void refresh_my_names(time_t t)
586 static time_t lasttime = 0;
588 if (t - lasttime < REFRESH_TIME)
595 /*******************************************************************
596 queries names occasionally. an over-cautious, non-trusting WINS server!
597 ******************************************************************/
598 void query_refresh_names(void)
600 struct name_record *n;
601 struct subnet_record *d = find_subnet(ipgrp);
603 static time_t lasttime = 0;
604 time_t t = time(NULL);
607 int name_refresh_time = NAME_POLL_REFRESH_TIME;
608 int max_count = name_refresh_time * 2 / NAME_POLL_INTERVAL;
609 if (max_count > 10) max_count = 10;
611 name_refresh_time = NAME_POLL_INTERVAL * max_count / 2;
613 /* if (!lp_poll_wins()) return; polling of registered names allowed */
617 if (t - lasttime < NAME_POLL_INTERVAL) return;
619 for (n = d->namelist; n; n = n->next)
621 /* only do unique, registered names */
623 if (n->source != REGISTER) continue;
624 if (!NAME_GROUP(n->nb_flags)) continue;
626 if (n->refresh_time < t)
628 DEBUG(3,("Polling name %s\n", namestr(&n->name)));
630 queue_netbios_packet(d,ClientNMB,NMB_QUERY,NAME_QUERY_CONFIRM,
631 n->name.name, n->name.name_type,
637 if (count >= max_count)
639 /* don't do too many of these at once, but do enough to
640 cover everyone in the list */
644 /* this name will be checked on again, if it's not removed */
645 n->refresh_time += name_refresh_time;
650 /*******************************************************************
651 expires old names in the namelist
652 ******************************************************************/
653 void expire_names(time_t t)
655 struct name_record *n;
656 struct name_record *next;
657 struct subnet_record *d;
659 /* expire old names */
660 for (d = subnetlist; d; d = d->next)
662 for (n = d->namelist; n; n = next)
664 if (n->death_time && n->death_time < t)
666 DEBUG(3,("Removing dead name %s\n", namestr(&n->name)));
670 if (n->prev) n->prev->next = n->next;
671 if (n->next) n->next->prev = n->prev;
673 if (d->namelist == n) d->namelist = n->next;
686 /****************************************************************************
687 response for a reg release received. samba has asked a WINS server if it
688 could release a name.
689 **************************************************************************/
690 void response_name_release(struct subnet_record *d, struct packet_struct *p)
692 struct nmb_packet *nmb = &p->packet.nmb;
693 char *name = nmb->question.question_name.name;
694 int type = nmb->question.question_name.name_type;
696 DEBUG(4,("response name release received\n"));
698 if (nmb->header.rcode == 0 && nmb->answers->rdata)
700 /* IMPORTANT: see expire_netbios_response_entries() */
702 struct in_addr found_ip;
703 putip((char*)&found_ip,&nmb->answers->rdata[2]);
705 if (ismyip(found_ip))
707 remove_netbios_name(d,name,type,SELF,found_ip);
712 DEBUG(2,("name release for %s rejected!\n",
713 namestr(&nmb->question.question_name)));
715 /* XXXX do we honestly care if our name release was rejected?
716 only if samba is issuing the release on behalf of some out-of-sync
717 server. if it's one of samba's SELF names, we don't care. */
722 /****************************************************************************
723 reply to a name release
724 ****************************************************************************/
725 void reply_name_release(struct packet_struct *p)
727 struct nmb_packet *nmb = &p->packet.nmb;
730 int opcode = nmb->header.opcode;
731 int nb_flags = nmb->additional->rdata[0];
732 BOOL bcast = nmb->header.nm_flags.bcast;
733 struct name_record *n;
734 struct subnet_record *d = NULL;
738 putip((char *)&ip,&nmb->additional->rdata[2]);
740 DEBUG(3,("Name release on name %s rcode=%d\n",
741 namestr(&nmb->question.question_name),rcode));
743 if (!(d = find_req_subnet(p->ip, bcast)))
745 DEBUG(3,("response packet: bcast %s not known\n",
751 search &= FIND_LOCAL;
755 n = find_name_search(&d, &nmb->question.question_name,
758 /* XXXX under what conditions should we reject the removal?? */
759 if (n && n->nb_flags == nb_flags)
772 putip(&rdata[2],(char *)&ip);
774 /* Send a NAME RELEASE RESPONSE */
775 reply_netbios_packet(p,nmb->header.name_trn_id,
777 &nmb->question.question_name,
778 nmb->question.question_type,
779 nmb->question.question_class,
785 /****************************************************************************
786 response for a reg request received
787 **************************************************************************/
788 void response_name_reg(struct subnet_record *d, struct packet_struct *p)
790 struct nmb_packet *nmb = &p->packet.nmb;
791 char *name = nmb->question.question_name.name;
792 int type = nmb->question.question_name.name_type;
793 BOOL bcast = nmb->header.nm_flags.bcast;
795 DEBUG(4,("response name registration received!\n"));
797 if (nmb->header.rcode == 0 && nmb->answers->rdata)
799 /* IMPORTANT: see expire_netbios_response_entries() */
801 int nb_flags = nmb->answers->rdata[0];
802 struct in_addr found_ip;
803 int ttl = nmb->answers->ttl;
804 enum name_source source = REGISTER;
806 putip((char*)&found_ip,&nmb->answers->rdata[2]);
808 if (ismyip(found_ip)) source = SELF;
810 add_netbios_entry(d, name,type,nb_flags,ttl,source,found_ip,True,!bcast);
814 struct work_record *work;
816 DEBUG(1,("name registration for %s rejected!\n",
817 namestr(&nmb->question.question_name)));
819 /* XXXX oh dear. we have problems. must deal with our name having
820 been rejected: e.g if it was our GROUP(1d) name, we must unbecome
823 if (!(work = find_workgroupstruct(d, name, False))) return;
825 /* remove_netbios_name(d,name,type,SELF,ipzero); */
827 if (AM_MASTER(work) && (type == 0x1d || type == 0x1b))
830 if (type == 0x1d) remove_type = SV_TYPE_MASTER_BROWSER;
831 if (type == 0x1b) remove_type = SV_TYPE_DOMAIN_MASTER;
833 become_nonmaster(d, work, remove_type);
839 /****************************************************************************
840 reply to a reg request
841 **************************************************************************/
842 void reply_name_reg(struct packet_struct *p)
844 struct nmb_packet *nmb = &p->packet.nmb;
845 struct nmb_name *question = &nmb->question.question_name;
847 struct nmb_name *reply_name = question;
848 char *qname = question->name;
849 int name_type = question->name_type;
850 int name_class = nmb->question.question_class;
852 BOOL bcast = nmb->header.nm_flags.bcast;
854 int ttl = GET_TTL(nmb->additional->ttl);
855 int nb_flags = nmb->additional->rdata[0];
856 BOOL group = NAME_GROUP(nb_flags);
858 int opcode = nmb->header.opcode;
860 struct subnet_record *d = NULL;
861 struct name_record *n = NULL;
863 BOOL recurse = True; /* true if samba replies yes/no: false if caller */
864 /* must challenge the current owner of the unique name */
866 struct in_addr ip, from_ip;
869 putip((char *)&from_ip,&nmb->additional->rdata[2]);
872 DEBUG(3,("Name registration for name %s at %s rcode=%d\n",
873 namestr(question),inet_ntoa(ip),rcode));
877 /* apparently we should return 255.255.255.255 for group queries
882 if (!(d = find_req_subnet(p->ip, bcast)))
884 DEBUG(3,("response packet: bcast %s not known\n",
890 search &= FIND_LOCAL;
894 /* see if the name already exists */
895 n = find_name_search(&d, question, search, from_ip);
899 if (!group) /* unique names */
901 if (n->source == SELF || NAME_GROUP(n->nb_flags))
903 /* no-one can register one of samba's names, nor can they
904 register a name that's a group name as a unique name */
909 else if(!ip_equal(ip, n->ip))
911 /* hm. this unique name doesn't belong to them. */
913 /* XXXX rfc1001.txt says:
914 * if we are doing secured WINS, we must send a Wait-Acknowledge
915 * packet (WACK) to the person who wants the name, then do a
916 * name query on the person who currently owns the unique name.
917 * if the current owner still says they own it, the person who wants
918 * the name can't have it. if they do not, or are not alive, they can.
920 * if we are doing non-secured WINS (which is much simpler) then
921 * we send a message to the person wanting the name saying 'he
922 * owns this name: i don't want to hear from you ever again
923 * until you've checked with him if you can have it!'. we then
924 * abandon the registration. once the person wanting the name
925 * has checked with the current owner, they will repeat the
926 * registration packet if the current owner is dead or doesn't
930 /* non-secured WINS implementation: caller is responsible
931 for checking with current owner of name, then getting back
932 to us... IF current owner no longer owns the unique name */
938 /* we inform on the current owner to the caller (which is
939 why it's non-secure */
941 reply_name = &n->name;
945 XXXX sorry, guys: i really can't see what name_type
946 and name_class should be set to according to rfc1001 */
951 n->death_time = ttl?p->timestamp+ttl*3:0;
952 DEBUG(3,("%s owner: %s\n",namestr(&n->name),inet_ntoa(n->ip)));
957 /* refresh the name */
958 if (n->source != SELF)
960 n->death_time = ttl?p->timestamp + ttl*3:0;
964 /* XXXX bug reported by terryt@ren.pc.athabascau.ca */
965 /* names that people have checked for and not found get DNSFAILed.
966 we need to update the name record if someone then registers */
968 if (n->source == DNSFAIL)
969 n->source = REGISTER;
974 /* add the name to our name/subnet, or WINS, database */
975 n = add_netbios_entry(d,qname,name_type,nb_flags,ttl,REGISTER,ip,
983 putip(&rdata[2],(char *)&ip);
985 /* Send a NAME REGISTRATION RESPONSE (pos/neg)
986 or an END-NODE CHALLENGE REGISTRATION RESPONSE */
987 reply_netbios_packet(p,nmb->header.name_trn_id,
988 rcode,opcode,recurse,
989 reply_name, name_type, name_class,
995 /****************************************************************************
996 reply to a name status query
997 ****************************************************************************/
998 void reply_name_status(struct packet_struct *p)
1000 struct nmb_packet *nmb = &p->packet.nmb;
1001 char *qname = nmb->question.question_name.name;
1002 int ques_type = nmb->question.question_name.name_type;
1003 char rdata[MAX_DGRAM_SIZE];
1004 char *countptr, *buf, *bufend;
1006 struct name_record *n;
1007 struct subnet_record *d = NULL;
1009 BOOL bcast = nmb->header.nm_flags.bcast;
1011 if (!(d = find_req_subnet(p->ip, bcast)))
1013 DEBUG(3,("Name status req: bcast %s not known\n",
1018 DEBUG(3,("Name status for name %s %s\n",
1019 namestr(&nmb->question.question_name), inet_ntoa(p->ip)));
1021 n = find_name_search(&d, &nmb->question.question_name,
1022 FIND_SELF|FIND_LOCAL,
1027 /* XXXX hack, we should calculate exactly how many will fit */
1028 bufend = &rdata[MAX_DGRAM_SIZE] - 18;
1029 countptr = buf = rdata;
1034 for (n = d->namelist ; n && buf < bufend; n = n->next)
1036 int name_type = n->name.name_type;
1038 if (n->source != SELF) continue;
1040 /* start with first bit of putting info in buffer: the name */
1043 sprintf(buf,"%-15.15s",n->name.name);
1046 /* now check if we want to exclude other workgroup names
1047 from the response. if we don't exclude them, windows clients
1048 get confused and will respond with an error for NET VIEW */
1050 if (name_type >= 0x1b && name_type <= 0x20 &&
1051 ques_type >= 0x1b && ques_type <= 0x20)
1053 if (!strequal(qname, n->name.name)) continue;
1056 /* carry on putting name info in buffer */
1058 buf[15] = name_type;
1059 buf[16] = n->nb_flags;
1066 SCVAL(countptr,0,names_added);
1068 /* XXXXXXX we should fill in more fields of the statistics structure */
1071 extern int num_good_sends,num_good_receives;
1072 SIVAL(buf,20,num_good_sends);
1073 SIVAL(buf,24,num_good_receives);
1076 SIVAL(buf,46,0xFFB8E5); /* undocumented - used by NT */
1080 /* Send a POSITIVE NAME STATUS RESPONSE */
1081 reply_netbios_packet(p,nmb->header.name_trn_id,
1083 &nmb->question.question_name,
1084 nmb->question.question_type,
1085 nmb->question.question_class,
1087 rdata,PTR_DIFF(buf,rdata));
1091 /***************************************************************************
1092 reply to a name query
1093 ****************************************************************************/
1094 struct name_record *search_for_name(struct subnet_record **d,
1095 struct nmb_name *question,
1096 struct in_addr ip, int Time, int search)
1098 int name_type = question->name_type;
1099 char *qname = question->name;
1100 BOOL dns_type = name_type == 0x20 || name_type == 0;
1102 struct name_record *n;
1104 DEBUG(3,("Search for %s from %s - ", namestr(question), inet_ntoa(ip)));
1106 /* first look up name in cache */
1107 n = find_name_search(d,question,search,ip);
1109 if (*d == NULL) return NULL;
1111 /* now try DNS lookup. */
1114 struct in_addr dns_ip;
1117 /* only do DNS lookups if the query is for type 0x20 or type 0x0 */
1120 DEBUG(3,("types 0x20 0x1b 0x0 only: name not found\n"));
1124 /* look it up with DNS */
1125 a = interpret_addr(qname);
1127 putip((char *)&dns_ip,(char *)&a);
1131 /* no luck with DNS. We could possibly recurse here XXXX */
1132 DEBUG(3,("no recursion.\n"));
1133 /* add the fail to our WINS cache of names. give it 1 hour in the cache */
1134 add_netbios_entry(*d,qname,name_type,NB_ACTIVE,60*60,DNSFAIL,dns_ip,
1139 /* add it to our WINS cache of names. give it 2 hours in the cache */
1140 n = add_netbios_entry(*d,qname,name_type,NB_ACTIVE,2*60*60,DNS,dns_ip,
1143 /* failed to add it? yikes! */
1144 if (!n) return NULL;
1147 /* is our entry already dead? */
1150 if (n->death_time < Time) return False;
1153 /* it may have been an earlier failure */
1154 if (n->source == DNSFAIL)
1156 DEBUG(3,("DNSFAIL\n"));
1160 DEBUG(3,("OK %s\n",inet_ntoa(n->ip)));
1166 /***************************************************************************
1167 reply to a name query.
1169 with broadcast name queries:
1171 - only reply if the query is for one of YOUR names. all other machines on
1172 the network will be doing the same thing (that is, only replying to a
1173 broadcast query if they own it)
1174 NOTE: broadcast name queries should only be sent out by a machine
1175 if they HAVEN'T been configured to use WINS. this is generally bad news
1176 in a wide area tcp/ip network and should be rectified by the systems
1177 administrator. USE WINS! :-)
1178 - the exception to this is if the query is for a Primary Domain Controller
1179 type name (0x1b), in which case, a reply is sent.
1181 - NEVER send a negative response to a broadcast query. no-one else will!
1183 with directed name queries:
1185 - if you are the WINS server, you are expected to respond with either
1186 a negative response, a positive response, or a wait-for-acknowledgement
1187 packet, and then later on a pos/neg response.
1189 ****************************************************************************/
1190 void reply_name_query(struct packet_struct *p)
1192 struct nmb_packet *nmb = &p->packet.nmb;
1193 struct nmb_name *question = &nmb->question.question_name;
1194 int name_type = question->name_type;
1195 BOOL bcast = nmb->header.nm_flags.bcast;
1199 struct in_addr retip;
1201 struct subnet_record *d = NULL;
1203 BOOL success = True;
1205 struct name_record *n;
1208 if (name_type == 0x20 || name_type == 0x00 || name_type == 0x1b ||
1209 name_type == 0x1f || name_type == 0x03 || name_type == 0x01 ||
1212 /* search for any of the non-'special browser' names, or for a PDC type
1213 (0x1b) name in the WINS database.
1214 XXXX should we include name type 0x1c: WINS server type?
1216 search |= FIND_WINS;
1220 /* special browser name types e.g
1221 ^1^2__MSBROWSE__^2^1, GROUP(1d) and GROUP(1e)
1223 name_type == 0x01 || name_type == 0x1d || name_type == 0x1e.
1225 XXXX luke reckons we should be able to search for any SELF name
1226 in the WINS database, if we are a primary domain controller.
1229 if (!(d = find_req_subnet(p->ip, bcast)))
1231 DEBUG(3,("name query: bcast %s not known\n",
1236 /* XXXX delete if shouldn't search for SELF names in WINS database */
1237 search |= FIND_WINS;
1242 /* a name query has been made by a non-WINS configured host. search the
1243 local interface database as well */
1244 search |= FIND_LOCAL;
1247 DEBUG(3,("Name query "));
1251 /* eh? no criterion for searching database. help! */
1255 if (success && (n = search_for_name(&d,question,p->ip,p->timestamp, search)))
1257 /* don't respond to broadcast queries unless the query is for
1258 a name we own or it is for a Primary Domain Controller name */
1260 if (bcast && n->source != SELF && name_type != 0x1b) {
1261 if (!lp_wins_proxy() || same_net(p->ip,n->ip,*iface_nmask(p->ip))) {
1262 /* never reply with a negative response to broadcast queries */
1267 /* name is directed query, or it's self, or it's a PDC type name, or
1268 we're replying on behalf of a caller because they are on a different
1269 subnet and cannot hear the broadcast. XXXX lp_wins_proxy should be
1270 switched off in environments where broadcasts are forwarded */
1272 ttl = n->death_time - p->timestamp;
1274 nb_flags = n->nb_flags;
1278 if (bcast) return; /* never reply negative response to bcasts */
1282 /* if the IP is 0 then substitute my IP */
1283 if (zero_ip(retip)) retip = *iface_ip(p->ip);
1288 DEBUG(3,("OK %s\n",inet_ntoa(retip)));
1293 DEBUG(3,("UNKNOWN\n"));
1298 rdata[0] = nb_flags;
1300 putip(&rdata[2],(char *)&retip);
1303 reply_netbios_packet(p,nmb->header.name_trn_id,
1305 &nmb->question.question_name,
1306 nmb->question.question_type,
1307 nmb->question.question_class,
1309 rdata, success ? 6 : 0);
1313 /****************************************************************************
1314 response from a name query server check. commands of type NAME_QUERY_MST_SRV_CHK,
1315 NAME_QUERY_SRV_CHK, and NAME_QUERY_FIND_MST dealt with here.
1316 ****************************************************************************/
1317 static void response_server_check(struct nmb_name *ans_name,
1318 struct response_record *n, struct subnet_record *d)
1320 /* issue another command: this time to do a name status check */
1322 enum cmd_type cmd = (n->cmd_type == NAME_QUERY_MST_SRV_CHK) ?
1323 NAME_STATUS_MASTER_CHECK : NAME_STATUS_CHECK;
1325 /* initiate a name status check on the server that replied */
1326 queue_netbios_packet(d,ClientNMB,NMB_STATUS, cmd,
1327 ans_name->name, ans_name->name_type,
1329 False,False,n->to_ip);
1332 /****************************************************************************
1333 response from a name status check. commands of type NAME_STATUS_MASTER_CHECK
1334 and NAME_STATUS_CHECK dealt with here.
1335 ****************************************************************************/
1336 static void response_name_status_check(struct in_addr ip,
1337 struct nmb_packet *nmb, BOOL bcast,
1338 struct response_record *n, struct subnet_record *d)
1340 /* NMB_STATUS arrives: contains workgroup name and server name required.
1341 amongst other things. */
1343 struct nmb_name name;
1346 if (interpret_node_status(d,nmb->answers->rdata,
1347 &name,0x1d,serv_name,ip,bcast))
1351 sync_server(n->cmd_type,serv_name,
1352 name.name,name.name_type, n->to_ip);
1357 DEBUG(1,("No 0x1d name type in interpret_node_status()\n"));
1362 /****************************************************************************
1363 response from a name query to sync browse lists or to update our netbios
1364 entry. commands of type NAME_QUERY_SYNC and NAME_QUERY_CONFIRM
1365 ****************************************************************************/
1366 static void response_name_query_sync(struct nmb_packet *nmb,
1367 struct nmb_name *ans_name, BOOL bcast,
1368 struct response_record *n, struct subnet_record *d)
1370 DEBUG(4, ("Name query at %s ip %s - ",
1371 namestr(&n->name), inet_ntoa(n->to_ip)));
1373 if (nmb->header.rcode == 0 && nmb->answers->rdata)
1375 int nb_flags = nmb->answers->rdata[0];
1376 struct in_addr found_ip;
1378 putip((char*)&found_ip,&nmb->answers->rdata[2]);
1380 DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
1382 if (n->cmd_type == NAME_QUERY_SYNC)
1384 struct work_record *work = NULL;
1385 if ((work = find_workgroupstruct(d, ans_name->name, False)))
1387 /* the server is there: sync quick before it (possibly) dies! */
1388 sync_browse_lists(d, work, ans_name->name, ans_name->name_type,
1394 /* update our netbios name list */
1395 add_netbios_entry(d, ans_name->name, ans_name->name_type,
1396 nb_flags,GET_TTL(0),STATUS_QUERY,
1397 found_ip,False,!bcast);
1402 DEBUG(4, (" NEGATIVE RESPONSE!\n"));
1404 if (n->cmd_type == NAME_QUERY_CONFIRM)
1406 /* XXXX remove_netbios_entry()? */
1407 /* lots of things we ought to do, here. if we get here,
1408 then we're in a mess: our name database doesn't match
1409 reality. sort it out
1415 /****************************************************************************
1416 report the response record type
1417 ****************************************************************************/
1418 static void debug_rr_type(int rr_type)
1422 case NMB_STATUS: DEBUG(3,("Name status ")); break;
1423 case NMB_QUERY : DEBUG(3,("Name query ")); break;
1424 case NMB_REG : DEBUG(3,("Name registration ")); break;
1425 case NMB_REL : DEBUG(3,("Name release ")); break;
1426 default : DEBUG(1,("wrong response packet type received")); break;
1430 /****************************************************************************
1431 report the response record nmbd command type
1432 ****************************************************************************/
1433 static void debug_cmd_type(int cmd_type)
1435 /* report the command type to help debugging */
1438 case NAME_QUERY_MST_SRV_CHK : DEBUG(4,("MASTER_SVR_CHECK\n")); break;
1439 case NAME_QUERY_SRV_CHK : DEBUG(4,("NAME_QUERY_SRV_CHK\n")); break;
1440 case NAME_QUERY_FIND_MST : DEBUG(4,("NAME_QUERY_FIND_MST\n")); break;
1441 case NAME_STATUS_MASTER_CHECK: DEBUG(4,("NAME_STAT_MST_CHK\n")); break;
1442 case NAME_STATUS_CHECK : DEBUG(4,("NAME_STATUS_CHECK\n")); break;
1443 case NAME_QUERY_MST_CHK : DEBUG(4,("NAME_QUERY_MST_CHK\n")); break;
1444 case NAME_REGISTER : DEBUG(4,("NAME_REGISTER\n")); break;
1445 case NAME_RELEASE : DEBUG(4,("NAME_RELEASE\n")); break;
1446 case NAME_QUERY_CONFIRM : DEBUG(4,("NAME_QUERY_CONFIRM\n")); break;
1447 case NAME_QUERY_SYNC : DEBUG(4,("NAME_QUERY_SYNC\n")); break;
1452 /****************************************************************************
1453 report any problems with the fact that a response has been received.
1455 (responses for certain types of operations are only expected from one host)
1456 ****************************************************************************/
1457 static BOOL response_problem_check(struct response_record *n,
1458 struct nmb_packet *nmb, char *qname)
1460 switch (nmb->answers->rr_type)
1464 if (n->num_msgs > 1)
1466 DEBUG(1,("more than one release name response received!\n"));
1474 if (n->num_msgs > 1)
1476 DEBUG(1,("more than one register name response received!\n"));
1484 if (n->num_msgs > 1)
1486 if (nmb->header.rcode == 0 && nmb->answers->rdata)
1488 int nb_flags = nmb->answers->rdata[0];
1490 if ((!NAME_GROUP(nb_flags)))
1492 /* oh dear. more than one person responded to a unique name.
1493 there is either a network problem, a configuration problem
1494 or a server is mis-behaving */
1496 /* XXXX mark the name as in conflict, and then let the
1497 person who just responded know that they must also mark it
1498 as in conflict, and therefore must NOT use it.
1499 see rfc1001.txt 15.1.3.5 */
1501 /* this may cause problems for some early versions of nmbd */
1503 switch (n->cmd_type)
1505 case NAME_QUERY_MST_SRV_CHK:
1506 case NAME_QUERY_SRV_CHK:
1507 case NAME_QUERY_MST_CHK:
1508 /* don't do case NAME_QUERY_FIND_MST: MSBROWSE isn't a unique name. */
1510 if (!strequal(qname,n->name.name))
1512 /* one subnet, one master browser per workgroup */
1513 /* XXXX force an election? */
1515 DEBUG(3,("more than one master browser replied!\n"));
1522 DEBUG(3,("Unique Name conflict detected!\n"));
1528 /* we have received a negative reply, having already received
1529 at least one response (pos/neg). something's really wrong! */
1531 DEBUG(3,("wierd name query problem detected!\n"));
1540 /****************************************************************************
1541 check that the response received is compatible with the response record
1542 ****************************************************************************/
1543 static BOOL response_compatible(struct response_record *n,
1544 struct nmb_packet *nmb)
1546 switch (n->cmd_type)
1550 if (nmb->answers->rr_type != NMB_REL)
1552 DEBUG(1,("Name release reply has wrong answer rr_type\n"));
1560 if (nmb->answers->rr_type != NMB_REG)
1562 DEBUG(1,("Name register reply has wrong answer rr_type\n"));
1568 case NAME_QUERY_CONFIRM:
1569 case NAME_QUERY_SYNC:
1570 case NAME_QUERY_MST_SRV_CHK:
1571 case NAME_QUERY_SRV_CHK:
1572 case NAME_QUERY_FIND_MST:
1573 case NAME_QUERY_MST_CHK:
1575 if (nmb->answers->rr_type != NMB_QUERY)
1577 DEBUG(1,("Name query reply has wrong answer rr_type\n"));
1583 case NAME_STATUS_MASTER_CHECK:
1584 case NAME_STATUS_CHECK:
1586 if (nmb->answers->rr_type != NMB_STATUS)
1588 DEBUG(1,("Name status reply has wrong answer rr_type\n"));
1596 DEBUG(0,("unknown command received in response_netbios_packet\n"));
1604 /****************************************************************************
1605 process the response packet received
1606 ****************************************************************************/
1607 static void response_process(struct subnet_record *d, struct packet_struct *p,
1608 struct response_record *n, struct nmb_packet *nmb,
1609 BOOL bcast, struct nmb_name *ans_name)
1611 switch (n->cmd_type)
1615 response_name_release(d, p);
1621 response_name_reg(d, p);
1625 case NAME_QUERY_MST_SRV_CHK:
1626 case NAME_QUERY_SRV_CHK:
1627 case NAME_QUERY_FIND_MST:
1629 response_server_check(ans_name, n, d);
1633 case NAME_STATUS_MASTER_CHECK:
1634 case NAME_STATUS_CHECK:
1636 response_name_status_check(p->ip, nmb, bcast, n, d);
1640 case NAME_QUERY_CONFIRM:
1641 case NAME_QUERY_SYNC:
1643 response_name_query_sync(nmb, ans_name, bcast, n, d);
1646 case NAME_QUERY_MST_CHK:
1648 /* no action required here. it's when NO responses are received
1649 that we need to do something. see expire_name_query_entries() */
1651 DEBUG(4, ("Master browser exists for %s at %s (just checking!)\n",
1652 namestr(&n->name), inet_ntoa(n->to_ip)));
1658 DEBUG(0,("unknown command received in response_netbios_packet\n"));
1665 /****************************************************************************
1666 response from a netbios packet.
1667 ****************************************************************************/
1668 static void response_netbios_packet(struct packet_struct *p)
1670 struct nmb_packet *nmb = &p->packet.nmb;
1671 struct nmb_name *question = &nmb->question.question_name;
1672 struct nmb_name *ans_name = NULL;
1673 char *qname = question->name;
1674 BOOL bcast = nmb->header.nm_flags.bcast;
1675 struct response_record *n;
1676 struct subnet_record *d = NULL;
1678 if (!(d = find_req_subnet(p->ip, bcast)))
1680 DEBUG(3,("response packet: bcast %s not known\n", inet_ntoa(p->ip)));
1684 if (nmb->answers == NULL)
1686 /* hm. the packet received was a response, but with no answer. wierd! */
1687 DEBUG(2,("NMB packet response from %s (bcast=%s) - UNKNOWN\n",
1688 inet_ntoa(p->ip), BOOLSTR(bcast)));
1692 ans_name = &nmb->answers->rr_name;
1693 DEBUG(3,("response for %s from %s (bcast=%s)\n",
1694 namestr(ans_name), inet_ntoa(p->ip), BOOLSTR(bcast)));
1696 if (!(n = find_response_record(d,nmb->header.name_trn_id))) {
1697 DEBUG(2,("unknown netbios response (received late or from nmblookup?)\n"));
1701 debug_rr_type(nmb->answers->rr_type);
1703 n->num_msgs++; /* count number of responses received */
1704 n->repeat_count = 0; /* don't resend: see expire_netbios_packets() */
1706 debug_cmd_type(n->cmd_type);
1708 /* problem checking: multiple responses etc */
1709 if (response_problem_check(n, nmb, qname))
1712 /* now check whether the command has received the correct type of response*/
1713 if (!response_compatible(n, nmb))
1716 /* now deal with the command */
1717 response_process(d, p, n, nmb, bcast, ans_name);
1721 /****************************************************************************
1722 process a nmb packet
1723 ****************************************************************************/
1724 void process_nmb(struct packet_struct *p)
1726 struct nmb_packet *nmb = &p->packet.nmb;
1728 debug_nmb_packet(p);
1730 switch (nmb->header.opcode)
1732 case 8: /* what is this?? */
1734 case NMB_REG_REFRESH:
1736 if (nmb->header.qdcount==0 || nmb->header.arcount==0) break;
1737 if (nmb->header.response)
1738 response_netbios_packet(p); /* response to registration dealt with here */
1746 if (nmb->header.response)
1748 switch (nmb->question.question_type)
1752 response_netbios_packet(p);
1758 else if (nmb->header.qdcount>0)
1760 switch (nmb->question.question_type)
1764 reply_name_query(p);
1769 reply_name_status(p);
1780 if (nmb->header.qdcount==0 || nmb->header.arcount==0)
1782 DEBUG(2,("netbios release packet rejected\n"));
1786 if (nmb->header.response)
1787 response_netbios_packet(p); /* response to reply dealt with in here */
1789 reply_name_release(p);