--- a/nbtscan.c +++ b/nbtscan.c @@ -86,7 +86,7 @@ int d_print_hostinfo(struct in_addr addr, const struct nb_host_info* hostinfo) { int i; unsigned char service; /* 16th byte of NetBIOS name */ - char name[16]; + char comp_name[16]; printf("\nPacket dump for Host %s:\n\n", inet_ntoa(addr)); if(hostinfo->is_broken) printf("Incomplete packet, %d bytes long.\n", hostinfo->is_broken); @@ -110,9 +110,9 @@ printf("Names received:\n"); for(i=0; i< hostinfo->header->number_of_names; i++) { service = hostinfo->names[i].ascii_name[15]; - strncpy(name, hostinfo->names[i].ascii_name, 15); - name[16]=0; - printf("%-17s Service: 0x%02x Flags: 0x%04x\n", name, service, hostinfo->names[i].rr_flags); + strncpy(comp_name, hostinfo->names[i].ascii_name, 15); + comp_name[15]=0; + printf("%-17s Service: 0x%02x Flags: 0x%04x\n", comp_name, service, hostinfo->names[i].rr_flags); } }; @@ -147,9 +147,9 @@ int v_print_hostinfo(struct in_addr addr, const struct nb_host_info* hostinfo, char* sf, int hr) { - int i, unique; + int i, j, unique; my_uint8_t service; /* 16th byte of NetBIOS name */ - char name[16]; + char comp_name[16]; char* sname; if(!sf) { @@ -163,20 +163,27 @@ if(hostinfo->header && hostinfo->names) { for(i=0; i< hostinfo->header->number_of_names; i++) { service = hostinfo->names[i].ascii_name[15]; - strncpy(name, hostinfo->names[i].ascii_name, 15); - name[16]=0; + strncpy(comp_name, hostinfo->names[i].ascii_name, 15); + + // Eliminate trailing spaces + for(j=0; j < 15; j++) { + if (comp_name[j] == ' ') + break; + } + comp_name[j] = 0; + unique = !(hostinfo->names[i].rr_flags & 0x0080); if(sf) { - printf("%s%s%s%s", inet_ntoa(addr), sf, name, sf); - if(hr) printf("%s\n", (char*)getnbservicename(service, unique, name)); + printf("%s%s%s%s", inet_ntoa(addr), sf, comp_name, sf); + if(hr) printf("%s\n", (char*)getnbservicename(service, unique, comp_name)); else { printf("%02x", service); if(unique) printf("U\n"); else printf("G\n"); } } else { - printf("%-17s", name); - if(hr) printf("%s\n", (char*)getnbservicename(service, unique, name)); + printf("%-17s", comp_name); + if(hr) printf("%s\n", (char*)getnbservicename(service, unique, comp_name)); else { printf("<%02x>", service); if(unique) printf(" UNIQUE\n"); @@ -199,7 +206,7 @@ }; int print_hostinfo(struct in_addr addr, struct nb_host_info* hostinfo, char* sf) { - int i; + int i,j; unsigned char service; /* 16th byte of NetBIOS name */ char comp_name[16], user_name[16]; int is_server=0; @@ -215,7 +222,13 @@ if(service == 0 && unique && first_name) { /* Unique name, workstation service - this is computer name */ strncpy(comp_name, hostinfo->names[i].ascii_name, 15); - comp_name[15] = 0; + + // Eliminate trailing spaces + for(j=0; j < 15; j++) { + if (comp_name[j] == ' ') + break; + } + comp_name[j] = 0; first_name = 0; }; if(service == 0x20 && unique) { @@ -252,7 +265,7 @@ /* If l is true adds #PRE to each line of output (for lmhosts) */ int l_print_hostinfo(struct in_addr addr, struct nb_host_info* hostinfo, int l) { - int i; + int i,j; unsigned char service; /* 16th byte of NetBIOS name */ char comp_name[16]; int is_server=0; @@ -268,7 +281,13 @@ if(service == 0 && unique && first_name) { /* Unique name, workstation service - this is computer name */ strncpy(comp_name, hostinfo->names[i].ascii_name, 15); - comp_name[15]=0; + + // Eliminate trailing spaces + for(j=0; j < 15; j++) { + if (comp_name[j] == ' ') + break; + } + comp_name[j] = 0; first_name = 0; }; };