2 Unix SMB/Netbios implementation.
4 NBT netbios library routines
5 Copyright (C) Andrew Tridgell 1994-1998
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.
25 int num_good_sends = 0;
26 int num_good_receives = 0;
28 static struct opcode_names {
29 char *nmb_opcode_name;
31 } nmb_header_opcode_names[] = {
37 {"Refresh(altcode)", 9 },
38 {"Multi-homed Registration", 15 },
42 /****************************************************************************
43 * Lookup a nmb opcode name.
44 ****************************************************************************/
45 static char *lookup_opcode_name( int opcode )
47 struct opcode_names *op_namep;
50 for(i = 0; nmb_header_opcode_names[i].nmb_opcode_name != 0; i++) {
51 op_namep = &nmb_header_opcode_names[i];
52 if(opcode == op_namep->opcode)
53 return op_namep->nmb_opcode_name;
55 return "<unknown opcode>";
58 /****************************************************************************
59 print out a res_rec structure
60 ****************************************************************************/
61 static void debug_nmb_res_rec(struct res_rec *res, char *hdr)
65 DEBUGADD( 4, ( " %s: nmb_name=%s rr_type=%d rr_class=%d ttl=%d\n",
67 nmb_namestr(&res->rr_name),
72 if( res->rdlength == 0 || res->rdata == NULL )
75 for (i = 0; i < res->rdlength; i+= 16)
77 DEBUGADD(4, (" %s %3x char ", hdr, i));
79 for (j = 0; j < 16; j++)
81 uchar x = res->rdata[i+j];
82 if (x < 32 || x > 127) x = '.';
84 if (i+j >= res->rdlength) break;
85 DEBUGADD(4, ("%c", x));
88 DEBUGADD(4, (" hex "));
90 for (j = 0; j < 16; j++)
92 if (i+j >= res->rdlength) break;
93 DEBUGADD(4, ("%02X", (uchar)res->rdata[i+j]));
100 /****************************************************************************
102 ****************************************************************************/
103 void debug_nmb_packet(struct packet_struct *p)
105 struct nmb_packet *nmb = &p->packet.nmb;
109 dbgtext( "nmb packet from %s(%d) header: id=%d opcode=%s(%d) response=%s\n",
110 inet_ntoa(p->ip), p->port,
111 nmb->header.name_trn_id,
112 lookup_opcode_name(nmb->header.opcode),
114 BOOLSTR(nmb->header.response) );
115 dbgtext( " header: flags: bcast=%s rec_avail=%s rec_des=%s trunc=%s auth=%s\n",
116 BOOLSTR(nmb->header.nm_flags.bcast),
117 BOOLSTR(nmb->header.nm_flags.recursion_available),
118 BOOLSTR(nmb->header.nm_flags.recursion_desired),
119 BOOLSTR(nmb->header.nm_flags.trunc),
120 BOOLSTR(nmb->header.nm_flags.authoritative) );
121 dbgtext( " header: rcode=%d qdcount=%d ancount=%d nscount=%d arcount=%d\n",
126 nmb->header.arcount );
129 if (nmb->header.qdcount)
131 DEBUGADD( 4, ( " question: q_name=%s q_type=%d q_class=%d\n",
132 nmb_namestr(&nmb->question.question_name),
133 nmb->question.question_type,
134 nmb->question.question_class) );
137 if (nmb->answers && nmb->header.ancount)
139 debug_nmb_res_rec(nmb->answers,"answers");
141 if (nmb->nsrecs && nmb->header.nscount)
143 debug_nmb_res_rec(nmb->nsrecs,"nsrecs");
145 if (nmb->additional && nmb->header.arcount)
147 debug_nmb_res_rec(nmb->additional,"additional");
151 /*******************************************************************
152 handle "compressed" name pointers
153 ******************************************************************/
154 static BOOL handle_name_ptrs(uchar *ubuf,int *offset,int length,
155 BOOL *got_pointer,int *ret)
159 while ((ubuf[*offset] & 0xC0) == 0xC0) {
160 if (!*got_pointer) (*ret) += 2;
162 (*offset) = ((ubuf[*offset] & ~0xC0)<<8) | ubuf[(*offset)+1];
163 if (loop_count++ == 10 || (*offset) < 0 || (*offset)>(length-2)) {
170 /*******************************************************************
171 parse a nmb name from "compressed" format to something readable
172 return the space taken by the name, or 0 if the name is invalid
173 ******************************************************************/
174 static int parse_nmb_name(char *inbuf,int offset,int length, struct nmb_name *name)
177 uchar *ubuf = (uchar *)inbuf;
179 BOOL got_pointer=False;
182 if (length - offset < 2)
185 /* handle initial name pointers */
186 if (!handle_name_ptrs(ubuf,&offset,length,&got_pointer,&ret))
193 if ((m & 0xC0) || offset+m+2 > length)
196 memset((char *)name,'\0',sizeof(*name));
198 /* the "compressed" part */
204 c1 = ubuf[offset++]-'A';
205 c2 = ubuf[offset++]-'A';
206 if ((c1 & 0xF0) || (c2 & 0xF0) || (n > sizeof(name->name)-1))
208 name->name[n++] = (c1<<4) | c2;
214 /* parse out the name type,
215 its always in the 16th byte of the name */
216 name->name_type = ((uchar)name->name[15]) & 0xff;
218 /* remove trailing spaces */
221 while (n && name->name[n]==' ')
225 /* now the domain parts (if any) */
227 while (ubuf[offset]) {
228 /* we can have pointers within the domain part as well */
229 if (!handle_name_ptrs(ubuf,&offset,length,&got_pointer,&ret))
234 * Don't allow null domain parts.
241 name->scope[n++] = '.';
242 if (m+2+offset>length || n+m+1>sizeof(name->scope))
246 name->scope[n++] = (char)ubuf[offset++];
249 * Watch for malicious loops.
251 if (loop_count++ == 10)
254 name->scope[n++] = 0;
260 /*******************************************************************
261 put a compressed nmb name into a buffer. return the length of the
264 compressed names are really weird. The "compression" doubles the
265 size. The idea is that it also means that compressed names conform
266 to the doman name system. See RFC1002.
267 ******************************************************************/
268 static int put_nmb_name(char *buf,int offset,struct nmb_name *name)
274 if (strcmp(name->name,"*") == 0) {
275 /* special case for wildcard name */
276 memset(buf1,'\0',20);
278 buf1[15] = name->name_type;
280 slprintf(buf1, sizeof(buf1) - 1,"%-15.15s%c",name->name,name->name_type);
288 buf[offset+1+2*m] = 'A' + ((buf1[m]>>4)&0xF);
289 buf[offset+2+2*m] = 'A' + (buf1[m]&0xF);
295 if (name->scope[0]) {
296 /* XXXX this scope handling needs testing */
297 ret += strlen(name->scope) + 1;
298 pstrcpy(&buf[offset+1],name->scope);
301 while ((p = strchr_m(p,'.'))) {
302 buf[offset] = PTR_DIFF(p,&buf[offset+1]);
303 offset += (buf[offset] + 1);
306 buf[offset] = strlen(&buf[offset+1]);
312 /*******************************************************************
313 useful for debugging messages
314 ******************************************************************/
315 char *nmb_namestr(struct nmb_name *n)
318 static fstring ret[4];
322 slprintf(p,sizeof(fstring)-1, "%s<%02x>",n->name,n->name_type);
324 slprintf(p,sizeof(fstring)-1, "%s<%02x>.%s",n->name,n->name_type,n->scope);
330 /*******************************************************************
331 allocate and parse some resource records
332 ******************************************************************/
333 static BOOL parse_alloc_res_rec(char *inbuf,int *offset,int length,
334 struct res_rec **recs, int count)
337 *recs = (struct res_rec *)malloc(sizeof(**recs)*count);
338 if (!*recs) return(False);
340 memset((char *)*recs,'\0',sizeof(**recs)*count);
342 for (i=0;i<count;i++) {
343 int l = parse_nmb_name(inbuf,*offset,length,&(*recs)[i].rr_name);
345 if (!l || (*offset)+10 > length) {
349 (*recs)[i].rr_type = RSVAL(inbuf,(*offset));
350 (*recs)[i].rr_class = RSVAL(inbuf,(*offset)+2);
351 (*recs)[i].ttl = RIVAL(inbuf,(*offset)+4);
352 (*recs)[i].rdlength = RSVAL(inbuf,(*offset)+8);
354 if ((*recs)[i].rdlength>sizeof((*recs)[i].rdata) ||
355 (*offset)+(*recs)[i].rdlength > length) {
359 memcpy((*recs)[i].rdata,inbuf+(*offset),(*recs)[i].rdlength);
360 (*offset) += (*recs)[i].rdlength;
365 /*******************************************************************
366 put a resource record into a packet
367 ******************************************************************/
368 static int put_res_rec(char *buf,int offset,struct res_rec *recs,int count)
373 for (i=0;i<count;i++) {
374 int l = put_nmb_name(buf,offset,&recs[i].rr_name);
377 RSSVAL(buf,offset,recs[i].rr_type);
378 RSSVAL(buf,offset+2,recs[i].rr_class);
379 RSIVAL(buf,offset+4,recs[i].ttl);
380 RSSVAL(buf,offset+8,recs[i].rdlength);
381 memcpy(buf+offset+10,recs[i].rdata,recs[i].rdlength);
382 offset += 10+recs[i].rdlength;
383 ret += 10+recs[i].rdlength;
389 /*******************************************************************
390 put a compressed name pointer record into a packet
391 ******************************************************************/
392 static int put_compressed_name_ptr(uchar *buf,int offset,struct res_rec *rec,int ptr_offset)
395 buf[offset] = (0xC0 | ((ptr_offset >> 8) & 0xFF));
396 buf[offset+1] = (ptr_offset & 0xFF);
399 RSSVAL(buf,offset,rec->rr_type);
400 RSSVAL(buf,offset+2,rec->rr_class);
401 RSIVAL(buf,offset+4,rec->ttl);
402 RSSVAL(buf,offset+8,rec->rdlength);
403 memcpy(buf+offset+10,rec->rdata,rec->rdlength);
404 offset += 10+rec->rdlength;
405 ret += 10+rec->rdlength;
410 /*******************************************************************
411 parse a dgram packet. Return False if the packet can't be parsed
412 or is invalid for some reason, True otherwise
414 this is documented in section 4.4.1 of RFC1002
415 ******************************************************************/
416 static BOOL parse_dgram(char *inbuf,int length,struct dgram_packet *dgram)
421 memset((char *)dgram,'\0',sizeof(*dgram));
423 if (length < 14) return(False);
425 dgram->header.msg_type = CVAL(inbuf,0);
426 flags = CVAL(inbuf,1);
427 dgram->header.flags.node_type = (enum node_type)((flags>>2)&3);
428 if (flags & 1) dgram->header.flags.more = True;
429 if (flags & 2) dgram->header.flags.first = True;
430 dgram->header.dgm_id = RSVAL(inbuf,2);
431 putip((char *)&dgram->header.source_ip,inbuf+4);
432 dgram->header.source_port = RSVAL(inbuf,8);
433 dgram->header.dgm_length = RSVAL(inbuf,10);
434 dgram->header.packet_offset = RSVAL(inbuf,12);
438 if (dgram->header.msg_type == 0x10 ||
439 dgram->header.msg_type == 0x11 ||
440 dgram->header.msg_type == 0x12) {
441 offset += parse_nmb_name(inbuf,offset,length,&dgram->source_name);
442 offset += parse_nmb_name(inbuf,offset,length,&dgram->dest_name);
445 if (offset >= length || (length-offset > sizeof(dgram->data)))
448 dgram->datasize = length-offset;
449 memcpy(dgram->data,inbuf+offset,dgram->datasize);
455 /*******************************************************************
456 parse a nmb packet. Return False if the packet can't be parsed
457 or is invalid for some reason, True otherwise
458 ******************************************************************/
459 static BOOL parse_nmb(char *inbuf,int length,struct nmb_packet *nmb)
463 memset((char *)nmb,'\0',sizeof(*nmb));
465 if (length < 12) return(False);
467 /* parse the header */
468 nmb->header.name_trn_id = RSVAL(inbuf,0);
470 DEBUG(10,("parse_nmb: packet id = %d\n", nmb->header.name_trn_id));
472 nmb->header.opcode = (CVAL(inbuf,2) >> 3) & 0xF;
473 nmb->header.response = ((CVAL(inbuf,2)>>7)&1)?True:False;
474 nm_flags = ((CVAL(inbuf,2) & 0x7) << 4) + (CVAL(inbuf,3)>>4);
475 nmb->header.nm_flags.bcast = (nm_flags&1)?True:False;
476 nmb->header.nm_flags.recursion_available = (nm_flags&8)?True:False;
477 nmb->header.nm_flags.recursion_desired = (nm_flags&0x10)?True:False;
478 nmb->header.nm_flags.trunc = (nm_flags&0x20)?True:False;
479 nmb->header.nm_flags.authoritative = (nm_flags&0x40)?True:False;
480 nmb->header.rcode = CVAL(inbuf,3) & 0xF;
481 nmb->header.qdcount = RSVAL(inbuf,4);
482 nmb->header.ancount = RSVAL(inbuf,6);
483 nmb->header.nscount = RSVAL(inbuf,8);
484 nmb->header.arcount = RSVAL(inbuf,10);
486 if (nmb->header.qdcount) {
487 offset = parse_nmb_name(inbuf,12,length,&nmb->question.question_name);
488 if (!offset) return(False);
490 if (length - (12+offset) < 4) return(False);
491 nmb->question.question_type = RSVAL(inbuf,12+offset);
492 nmb->question.question_class = RSVAL(inbuf,12+offset+2);
499 /* and any resource records */
500 if (nmb->header.ancount &&
501 !parse_alloc_res_rec(inbuf,&offset,length,&nmb->answers,
502 nmb->header.ancount))
505 if (nmb->header.nscount &&
506 !parse_alloc_res_rec(inbuf,&offset,length,&nmb->nsrecs,
507 nmb->header.nscount))
510 if (nmb->header.arcount &&
511 !parse_alloc_res_rec(inbuf,&offset,length,&nmb->additional,
512 nmb->header.arcount))
518 /*******************************************************************
519 'Copy constructor' for an nmb packet
520 ******************************************************************/
521 static struct packet_struct *copy_nmb_packet(struct packet_struct *packet)
523 struct nmb_packet *nmb;
524 struct nmb_packet *copy_nmb;
525 struct packet_struct *pkt_copy;
527 if(( pkt_copy = (struct packet_struct *)malloc(sizeof(*packet))) == NULL)
529 DEBUG(0,("copy_nmb_packet: malloc fail.\n"));
533 /* Structure copy of entire thing. */
537 /* Ensure this copy is not locked. */
538 pkt_copy->locked = False;
540 /* Ensure this copy has no resource records. */
541 nmb = &packet->packet.nmb;
542 copy_nmb = &pkt_copy->packet.nmb;
544 copy_nmb->answers = NULL;
545 copy_nmb->nsrecs = NULL;
546 copy_nmb->additional = NULL;
548 /* Now copy any resource records. */
552 if((copy_nmb->answers = (struct res_rec *)
553 malloc(nmb->header.ancount * sizeof(struct res_rec))) == NULL)
555 memcpy((char *)copy_nmb->answers, (char *)nmb->answers,
556 nmb->header.ancount * sizeof(struct res_rec));
560 if((copy_nmb->nsrecs = (struct res_rec *)
561 malloc(nmb->header.nscount * sizeof(struct res_rec))) == NULL)
563 memcpy((char *)copy_nmb->nsrecs, (char *)nmb->nsrecs,
564 nmb->header.nscount * sizeof(struct res_rec));
568 if((copy_nmb->additional = (struct res_rec *)
569 malloc(nmb->header.arcount * sizeof(struct res_rec))) == NULL)
571 memcpy((char *)copy_nmb->additional, (char *)nmb->additional,
572 nmb->header.arcount * sizeof(struct res_rec));
579 SAFE_FREE(copy_nmb->answers);
580 SAFE_FREE(copy_nmb->nsrecs);
581 SAFE_FREE(copy_nmb->additional);
584 DEBUG(0,("copy_nmb_packet: malloc fail in resource records.\n"));
588 /*******************************************************************
589 'Copy constructor' for a dgram packet
590 ******************************************************************/
591 static struct packet_struct *copy_dgram_packet(struct packet_struct *packet)
593 struct packet_struct *pkt_copy;
595 if(( pkt_copy = (struct packet_struct *)malloc(sizeof(*packet))) == NULL)
597 DEBUG(0,("copy_dgram_packet: malloc fail.\n"));
601 /* Structure copy of entire thing. */
605 /* Ensure this copy is not locked. */
606 pkt_copy->locked = False;
608 /* There are no additional pointers in a dgram packet,
613 /*******************************************************************
614 'Copy constructor' for a generic packet
615 ******************************************************************/
616 struct packet_struct *copy_packet(struct packet_struct *packet)
618 if(packet->packet_type == NMB_PACKET)
619 return copy_nmb_packet(packet);
620 else if (packet->packet_type == DGRAM_PACKET)
621 return copy_dgram_packet(packet);
625 /*******************************************************************
626 free up any resources associated with an nmb packet
627 ******************************************************************/
628 static void free_nmb_packet(struct nmb_packet *nmb)
630 SAFE_FREE(nmb->answers);
631 SAFE_FREE(nmb->nsrecs);
632 SAFE_FREE(nmb->additional);
635 /*******************************************************************
636 free up any resources associated with a dgram packet
637 ******************************************************************/
638 static void free_dgram_packet(struct dgram_packet *nmb)
640 /* We have nothing to do for a dgram packet. */
643 /*******************************************************************
644 free up any resources associated with a packet
645 ******************************************************************/
646 void free_packet(struct packet_struct *packet)
650 if (packet->packet_type == NMB_PACKET)
651 free_nmb_packet(&packet->packet.nmb);
652 else if (packet->packet_type == DGRAM_PACKET)
653 free_dgram_packet(&packet->packet.dgram);
654 ZERO_STRUCTPN(packet);
658 /*******************************************************************
659 parse a packet buffer into a packet structure
660 ******************************************************************/
661 struct packet_struct *parse_packet(char *buf,int length,
662 enum packet_type packet_type)
664 extern struct in_addr lastip;
666 struct packet_struct *p;
669 p = (struct packet_struct *)malloc(sizeof(*p));
670 if (!p) return(NULL);
677 p->timestamp = time(NULL);
678 p->packet_type = packet_type;
680 switch (packet_type) {
682 ok = parse_nmb(buf,length,&p->packet.nmb);
686 ok = parse_dgram(buf,length,&p->packet.dgram);
698 /*******************************************************************
699 read a packet from a socket and parse it, returning a packet ready
700 to be used or put on the queue. This assumes a UDP socket
701 ******************************************************************/
702 struct packet_struct *read_packet(int fd,enum packet_type packet_type)
704 struct packet_struct *packet;
705 char buf[MAX_DGRAM_SIZE];
708 length = read_udp_socket(fd,buf,sizeof(buf));
709 if (length < MIN_DGRAM_SIZE) return(NULL);
711 packet = parse_packet(buf, length, packet_type);
712 if (!packet) return NULL;
718 DEBUG(5,("Received a packet of len %d from (%s) port %d\n",
719 length, inet_ntoa(packet->ip), packet->port ) );
725 /*******************************************************************
726 send a udp packet on a already open socket
727 ******************************************************************/
728 static BOOL send_udp(int fd,char *buf,int len,struct in_addr ip,int port)
732 struct sockaddr_in sock_out;
734 /* set the address and port */
735 memset((char *)&sock_out,'\0',sizeof(sock_out));
736 putip((char *)&sock_out.sin_addr,(char *)&ip);
737 sock_out.sin_port = htons( port );
738 sock_out.sin_family = AF_INET;
740 DEBUG( 5, ( "Sending a packet of len %d to (%s) on port %d\n",
741 len, inet_ntoa(ip), port ) );
744 * Patch to fix asynch error notifications from Linux kernel.
747 for (i = 0; i < 5; i++) {
748 ret = (sendto(fd,buf,len,0,(struct sockaddr *)&sock_out, sizeof(sock_out)) >= 0);
749 if (ret || errno != ECONNREFUSED)
754 DEBUG(0,("Packet send failed to %s(%d) ERRNO=%s\n",
755 inet_ntoa(ip),port,strerror(errno)));
763 /*******************************************************************
764 build a dgram packet ready for sending
766 XXXX This currently doesn't handle packets too big for one
767 datagram. It should split them and use the packet_offset, more and
768 first flags to handle the fragmentation. Yuck.
769 ******************************************************************/
770 static int build_dgram(char *buf,struct packet_struct *p)
772 struct dgram_packet *dgram = &p->packet.dgram;
773 uchar *ubuf = (uchar *)buf;
776 /* put in the header */
777 ubuf[0] = dgram->header.msg_type;
778 ubuf[1] = (((int)dgram->header.flags.node_type)<<2);
779 if (dgram->header.flags.more) ubuf[1] |= 1;
780 if (dgram->header.flags.first) ubuf[1] |= 2;
781 RSSVAL(ubuf,2,dgram->header.dgm_id);
782 putip(ubuf+4,(char *)&dgram->header.source_ip);
783 RSSVAL(ubuf,8,dgram->header.source_port);
784 RSSVAL(ubuf,12,dgram->header.packet_offset);
788 if (dgram->header.msg_type == 0x10 ||
789 dgram->header.msg_type == 0x11 ||
790 dgram->header.msg_type == 0x12) {
791 offset += put_nmb_name((char *)ubuf,offset,&dgram->source_name);
792 offset += put_nmb_name((char *)ubuf,offset,&dgram->dest_name);
795 memcpy(ubuf+offset,dgram->data,dgram->datasize);
796 offset += dgram->datasize;
798 /* automatically set the dgm_length */
799 dgram->header.dgm_length = offset;
800 RSSVAL(ubuf,10,dgram->header.dgm_length);
805 /*******************************************************************
807 *******************************************************************/
808 void make_nmb_name( struct nmb_name *n, const char *name, int type)
810 extern pstring global_scope;
811 memset( (char *)n, '\0', sizeof(struct nmb_name) );
812 push_ascii(n->name, name, 16, STR_TERMINATE|STR_UPPER);
813 n->name_type = (unsigned int)type & 0xFF;
814 StrnCpy( n->scope, global_scope, 63 );
815 strupper( n->scope );
818 /*******************************************************************
819 Compare two nmb names
820 ******************************************************************/
822 BOOL nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2)
824 return ((n1->name_type == n2->name_type) &&
825 strequal(n1->name ,n2->name ) &&
826 strequal(n1->scope,n2->scope));
829 /*******************************************************************
830 build a nmb packet ready for sending
832 XXXX this currently relies on not being passed something that expands
833 to a packet too big for the buffer. Eventually this should be
834 changed to set the trunc bit so the receiver can request the rest
835 via tcp (when that becomes supported)
836 ******************************************************************/
837 static int build_nmb(char *buf,struct packet_struct *p)
839 struct nmb_packet *nmb = &p->packet.nmb;
840 uchar *ubuf = (uchar *)buf;
843 /* put in the header */
844 RSSVAL(ubuf,offset,nmb->header.name_trn_id);
845 ubuf[offset+2] = (nmb->header.opcode & 0xF) << 3;
846 if (nmb->header.response) ubuf[offset+2] |= (1<<7);
847 if (nmb->header.nm_flags.authoritative &&
848 nmb->header.response) ubuf[offset+2] |= 0x4;
849 if (nmb->header.nm_flags.trunc) ubuf[offset+2] |= 0x2;
850 if (nmb->header.nm_flags.recursion_desired) ubuf[offset+2] |= 0x1;
851 if (nmb->header.nm_flags.recursion_available &&
852 nmb->header.response) ubuf[offset+3] |= 0x80;
853 if (nmb->header.nm_flags.bcast) ubuf[offset+3] |= 0x10;
854 ubuf[offset+3] |= (nmb->header.rcode & 0xF);
856 RSSVAL(ubuf,offset+4,nmb->header.qdcount);
857 RSSVAL(ubuf,offset+6,nmb->header.ancount);
858 RSSVAL(ubuf,offset+8,nmb->header.nscount);
859 RSSVAL(ubuf,offset+10,nmb->header.arcount);
862 if (nmb->header.qdcount) {
863 /* XXXX this doesn't handle a qdcount of > 1 */
864 offset += put_nmb_name((char *)ubuf,offset,&nmb->question.question_name);
865 RSSVAL(ubuf,offset,nmb->question.question_type);
866 RSSVAL(ubuf,offset+2,nmb->question.question_class);
870 if (nmb->header.ancount)
871 offset += put_res_rec((char *)ubuf,offset,nmb->answers,
872 nmb->header.ancount);
874 if (nmb->header.nscount)
875 offset += put_res_rec((char *)ubuf,offset,nmb->nsrecs,
876 nmb->header.nscount);
879 * The spec says we must put compressed name pointers
880 * in the following outgoing packets :
881 * NAME_REGISTRATION_REQUEST, NAME_REFRESH_REQUEST,
882 * NAME_RELEASE_REQUEST.
885 if((nmb->header.response == False) &&
886 ((nmb->header.opcode == NMB_NAME_REG_OPCODE) ||
887 (nmb->header.opcode == NMB_NAME_RELEASE_OPCODE) ||
888 (nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_8) ||
889 (nmb->header.opcode == NMB_NAME_REFRESH_OPCODE_9) ||
890 (nmb->header.opcode == NMB_NAME_MULTIHOMED_REG_OPCODE)) &&
891 (nmb->header.arcount == 1)) {
893 offset += put_compressed_name_ptr(ubuf,offset,nmb->additional,12);
895 } else if (nmb->header.arcount) {
896 offset += put_res_rec((char *)ubuf,offset,nmb->additional,
897 nmb->header.arcount);
903 /*******************************************************************
905 ******************************************************************/
906 int build_packet(char *buf, struct packet_struct *p)
910 switch (p->packet_type) {
912 len = build_nmb(buf,p);
916 len = build_dgram(buf,p);
923 /*******************************************************************
925 ******************************************************************/
926 BOOL send_packet(struct packet_struct *p)
931 memset(buf,'\0',sizeof(buf));
933 len = build_packet(buf, p);
935 if (!len) return(False);
937 return(send_udp(p->fd,buf,len,p->ip,p->port));
940 /****************************************************************************
941 receive a packet with timeout on a open UDP filedescriptor
942 The timeout is in milliseconds
943 ***************************************************************************/
944 struct packet_struct *receive_packet(int fd,enum packet_type type,int t)
947 struct timeval timeout;
952 timeout.tv_sec = t/1000;
953 timeout.tv_usec = 1000*(t%1000);
955 if ((ret = sys_select_intr(fd+1,&fds,&timeout)) == -1) {
956 /* errno should be EBADF or EINVAL. */
957 DEBUG(0,("select returned -1, errno = %s (%d)\n", strerror(errno), errno));
961 if (ret == 0) /* timeout */
964 if (FD_ISSET(fd,&fds))
965 return(read_packet(fd,type));
971 /****************************************************************************
972 receive a UDP/137 packet either via UDP or from the unexpected packet
973 queue. The packet must be a reply packet and have the specified trn_id
974 The timeout is in milliseconds
975 ***************************************************************************/
976 struct packet_struct *receive_nmb_packet(int fd, int t, int trn_id)
978 struct packet_struct *p;
980 p = receive_packet(fd, NMB_PACKET, t);
982 if (p && p->packet.nmb.header.response &&
983 p->packet.nmb.header.name_trn_id == trn_id) {
986 if (p) free_packet(p);
988 /* try the unexpected packet queue */
989 return receive_unexpected(NMB_PACKET, trn_id, NULL);
992 /****************************************************************************
993 receive a UDP/138 packet either via UDP or from the unexpected packet
994 queue. The packet must be a reply packet and have the specified mailslot name
995 The timeout is in milliseconds
996 ***************************************************************************/
997 struct packet_struct *receive_dgram_packet(int fd, int t, char *mailslot_name)
999 struct packet_struct *p;
1001 p = receive_packet(fd, DGRAM_PACKET, t);
1003 if (p && match_mailslot_name(p, mailslot_name)) {
1006 if (p) free_packet(p);
1008 /* try the unexpected packet queue */
1009 return receive_unexpected(DGRAM_PACKET, 0, mailslot_name);
1013 /****************************************************************************
1014 see if a datagram has the right mailslot name
1015 ***************************************************************************/
1016 BOOL match_mailslot_name(struct packet_struct *p, char *mailslot_name)
1018 struct dgram_packet *dgram = &p->packet.dgram;
1021 buf = &dgram->data[0];
1026 if (memcmp(buf, mailslot_name, strlen(mailslot_name)+1) == 0) {
1034 /****************************************************************************
1035 return the number of bits that match between two 4 character buffers
1036 ***************************************************************************/
1037 static int matching_bits(uchar *p1, uchar *p2)
1040 for (i=0; i<4; i++) {
1041 if (p1[i] != p2[i]) break;
1045 if (i==4) return ret;
1047 for (j=0; j<8; j++) {
1048 if ((p1[i] & (1<<(7-j))) != (p2[i] & (1<<(7-j)))) break;
1056 static uchar sort_ip[4];
1058 /****************************************************************************
1059 compare two query reply records
1060 ***************************************************************************/
1061 static int name_query_comp(uchar *p1, uchar *p2)
1063 return matching_bits(p2+2, sort_ip) - matching_bits(p1+2, sort_ip);
1066 /****************************************************************************
1067 sort a set of 6 byte name query response records so that the IPs that
1068 have the most leading bits in common with the specified address come first
1069 ***************************************************************************/
1070 void sort_query_replies(char *data, int n, struct in_addr ip)
1074 putip(sort_ip, (char *)&ip);
1076 qsort(data, n, 6, QSORT_CAST name_query_comp);
1080 #define TRUNCATE_NETBIOS_NAME 1
1082 /*******************************************************************
1083 convert, possibly using a stupid microsoft-ism which has destroyed
1084 the transport independence of netbios (for CIFS vendors that usually
1085 use the Win95-type methods, not for NT to NT communication, which uses
1086 DCE/RPC and therefore full-length unicode strings...) a dns name into
1089 the netbios name (NOT necessarily null-terminated) is truncated to 15
1092 ******************************************************************/
1093 char *dns_to_netbios_name(char *dns_name)
1095 static char netbios_name[16];
1097 StrnCpy(netbios_name, dns_name, 15);
1098 netbios_name[15] = 0;
1100 #ifdef TRUNCATE_NETBIOS_NAME
1101 /* ok. this is because of a stupid microsoft-ism. if the called host
1102 name contains a '.', microsoft clients expect you to truncate the
1103 netbios name up to and including the '.' this even applies, by
1104 mistake, to workgroup (domain) names, which is _really_ daft.
1106 for (i = 15; i >= 0; i--)
1108 if (netbios_name[i] == '.')
1110 netbios_name[i] = 0;
1114 #endif /* TRUNCATE_NETBIOS_NAME */
1116 return netbios_name;
1120 /****************************************************************************
1121 interpret the weird netbios "name". Return the name type
1122 ****************************************************************************/
1123 static int name_interpret(char *in,char *out)
1126 int len = (*in++) / 2;
1130 if (len > 30 || len<1) return(0);
1134 if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
1138 *out = ((in[0]-'A')<<4) + (in[1]-'A');
1145 #ifdef NETBIOS_SCOPE
1146 /* Handle any scope names */
1149 *out++ = '.'; /* Scope names are separated by periods */
1150 len = *(uchar *)in++;
1151 StrnCpy(out, in, len);
1160 /****************************************************************************
1161 mangle a name into netbios format
1163 Note: <Out> must be (33 + strlen(scope) + 2) bytes long, at minimum.
1164 ****************************************************************************/
1165 int name_mangle( char *In, char *Out, char name_type )
1172 extern pstring global_scope;
1174 /* Safely copy the input string, In, into buf[]. */
1175 (void)memset( buf, 0, 20 );
1176 if (strcmp(In,"*") == 0)
1179 (void)slprintf( buf, sizeof(buf) - 1, "%-15.15s%c", In, name_type );
1181 /* Place the length of the first field into the output buffer. */
1185 /* Now convert the name to the rfc1001/1002 format. */
1186 for( i = 0; i < 16; i++ )
1188 c = toupper( buf[i] );
1189 p[i*2] = ( (c >> 4) & 0x000F ) + 'A';
1190 p[(i*2)+1] = (c & 0x000F) + 'A';
1195 /* Add the scope string. */
1196 for( i = 0, len = 0; NULL != global_scope; i++, len++ )
1198 switch( global_scope[i] )
1204 return( name_len(Out) );
1211 p[len+1] = global_scope[i];
1216 return( name_len(Out) );
1220 /****************************************************************************
1221 find a pointer to a netbios name
1222 ****************************************************************************/
1223 static char *name_ptr(char *buf,int ofs)
1225 uchar c = *(uchar *)(buf+ofs);
1227 if ((c & 0xC0) == 0xC0)
1229 uint16 l = RSVAL(buf, ofs) & 0x3FFF;
1230 DEBUG(5,("name ptr to pos %d from %d is %s\n",l,ofs,buf+l));
1237 /****************************************************************************
1238 extract a netbios name from a buf
1239 ****************************************************************************/
1240 int name_extract(char *buf,int ofs,char *name)
1242 char *p = name_ptr(buf,ofs);
1243 int d = PTR_DIFF(p,buf+ofs);
1245 if (d < -50 || d > 50) return(0);
1246 return(name_interpret(p,name));
1249 /****************************************************************************
1250 return the total storage length of a mangled name
1251 ****************************************************************************/
1252 int name_len(char *s1)
1254 /* NOTE: this argument _must_ be unsigned */
1255 uchar *s = (uchar *)s1;
1258 /* If the two high bits of the byte are set, return 2. */
1259 if (0xC0 == (*s & 0xC0))
1262 /* Add up the length bytes. */
1263 for (len = 1; (*s); s += (*s) + 1) {
1265 SMB_ASSERT(len < 80);