From 0374be5d931903f1040fd4e759e6b1d681be2047 Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Fri, 16 Apr 2004 03:57:30 +0000 Subject: r248: Add support for printing out the MAC address on nmblookup. (This used to be commit bf9f02be5fc1d09c8c08c78c3f2df23b2099ba4f) --- source3/include/smb.h | 6 ++++++ source3/libsmb/namequery.c | 15 +++++++++++---- source3/nsswitch/winbindd_wins.c | 2 +- source3/nsswitch/wins.c | 2 +- source3/utils/nmblookup.c | 6 +++++- 5 files changed, 24 insertions(+), 7 deletions(-) (limited to 'source3') diff --git a/source3/include/smb.h b/source3/include/smb.h index aab61deaab..30eb82ddf5 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1526,6 +1526,12 @@ struct node_status { unsigned char flags; }; +/* The extra info from a NetBIOS node status query */ +struct node_status_extra { + unsigned char mac_addr[6]; + /* There really is more here ... */ +}; + struct pwd_info { BOOL null_pwd; diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index b9bc4e1166..2bb7359e74 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -45,7 +45,7 @@ static int generate_trn_id(void) Parse a node status response into an array of structures. ****************************************************************************/ -static struct node_status *parse_node_status(char *p, int *num_names) +static struct node_status *parse_node_status(char *p, int *num_names, struct node_status_extra *extra) { struct node_status *ret; int i; @@ -68,6 +68,12 @@ static struct node_status *parse_node_status(char *p, int *num_names) DEBUG(10, ("%s#%02x: flags = 0x%02x\n", ret[i].name, ret[i].type, ret[i].flags)); } + /* + * Also, pick up the MAC address ... + */ + if (extra) { + memcpy(&extra->mac_addr, p, 6); /* Fill in the mac addr */ + } return ret; } @@ -78,7 +84,8 @@ static struct node_status *parse_node_status(char *p, int *num_names) **************************************************************************/ struct node_status *node_status_query(int fd,struct nmb_name *name, - struct in_addr to_ip, int *num_names) + struct in_addr to_ip, int *num_names, + struct node_status_extra *extra) { BOOL found=False; int retries = 2; @@ -149,7 +156,7 @@ struct node_status *node_status_query(int fd,struct nmb_name *name, continue; } - ret = parse_node_status(&nmb2->answers->rdata[0], num_names); + ret = parse_node_status(&nmb2->answers->rdata[0], num_names, extra); free_packet(p2); return ret; } @@ -190,7 +197,7 @@ BOOL name_status_find(const char *q_name, int q_type, int type, struct in_addr t /* W2K PDC's seem not to respond to '*'#0. JRA */ make_nmb_name(&nname, q_name, q_type); - status = node_status_query(sock, &nname, to_ip, &count); + status = node_status_query(sock, &nname, to_ip, &count, NULL); close(sock); if (!status) goto done; diff --git a/source3/nsswitch/winbindd_wins.c b/source3/nsswitch/winbindd_wins.c index a1eef159c0..59d600d1ea 100644 --- a/source3/nsswitch/winbindd_wins.c +++ b/source3/nsswitch/winbindd_wins.c @@ -78,7 +78,7 @@ static struct node_status *lookup_byaddr_backend(char *addr, int *count) make_nmb_name(&nname, "*", 0); ip = *interpret_addr2(addr); - status = node_status_query(fd,&nname,ip, count); + status = node_status_query(fd,&nname,ip, count, NULL); close(fd); return status; diff --git a/source3/nsswitch/wins.c b/source3/nsswitch/wins.c index 100a103924..88c65b767f 100644 --- a/source3/nsswitch/wins.c +++ b/source3/nsswitch/wins.c @@ -145,7 +145,7 @@ static struct node_status *lookup_byaddr_backend(char *addr, int *count) make_nmb_name(&nname, "*", 0); ip = *interpret_addr2(addr); - status = node_status_query(fd,&nname,ip, count); + status = node_status_query(fd,&nname,ip, count, NULL); close(fd); return status; diff --git a/source3/utils/nmblookup.c b/source3/utils/nmblookup.c index 3c5a22841e..7285712c0b 100644 --- a/source3/utils/nmblookup.c +++ b/source3/utils/nmblookup.c @@ -102,11 +102,12 @@ static void do_node_status(int fd, const char *name, int type, struct in_addr ip struct nmb_name nname; int count, i, j; struct node_status *status; + struct node_status_extra extra; fstring cleanname; d_printf("Looking up status of %s\n",inet_ntoa(ip)); make_nmb_name(&nname, name, type); - status = node_status_query(fd,&nname,ip, &count); + status = node_status_query(fd,&nname,ip, &count, &extra); if (status) { for (i=0;i