int cmd_lookup(int argc, char *argv[]) { struct nb_ctx *ctx; struct sockaddr *sap; char *hostname; int error, opt; if (argc < 2) lookup_usage(); error = nb_ctx_create(&ctx); if (error) { smb_error("unable to create nbcontext", error); exit(1); } if (smb_open_rcfile() == 0) { if (nb_ctx_readrcsection(smb_rc, ctx, "default", 0) != 0) exit(1); rc_close(smb_rc); } while ((opt = getopt(argc, argv, "w:")) != EOF) { switch(opt) { case 'w': nb_ctx_setns(ctx, optarg); break; default: lookup_usage(); /*NOTREACHED*/ } } if (optind >= argc) lookup_usage(); if (nb_ctx_resolve(ctx) != 0) exit(1); hostname = argv[argc - 1]; /* printf("Looking for %s...\n", hostname);*/ error = nbns_resolvename(hostname, ctx, &sap); if (error) { smb_error("unable to resolve %s", error, hostname); exit(1); } printf("Got response from %s\n", inet_ntoa(ctx->nb_lastns.sin_addr)); printf("IP address of %s: %s\n", hostname, inet_ntoa(((struct sockaddr_in*)sap)->sin_addr)); return 0; }
int cmd_lookup(int argc, char *argv[]) { char *hostname; int opt; struct sockaddr_storage *startAddr = NULL, *listAddr = NULL; const char *winsServer = NULL; int32_t ii, count = 0; struct sockaddr_storage respAddr; struct sockaddr_in *in4 = NULL; struct sockaddr_in6 *in6 = NULL; char addrStr[INET6_ADDRSTRLEN+1]; uint8_t nodeType = kNetBIOSFileServerService; Boolean escapeNames= FALSE; bzero(&respAddr, sizeof(respAddr)); if (argc < 2) lookup_usage(); while ((opt = getopt(argc, argv, "ew:t:")) != EOF) { switch(opt) { case 'e': escapeNames = TRUE; break; case 'w': winsServer = optarg; break; case 't': errno = 0; nodeType = (uint8_t)strtol(optarg, NULL, 0); if (errno) errx(EX_DATAERR, "invalid value for node type"); break; default: lookup_usage(); /*NOTREACHED*/ } } if (optind >= argc) lookup_usage(); hostname = getHostName(argv[argc - 1], escapeNames); if (!hostname) { err(EX_OSERR, "failed to resolve %s", argv[argc - 1]); } startAddr = listAddr = SMBResolveNetBIOSNameEx(hostname, nodeType, winsServer, 0, &respAddr, &count); if (startAddr == NULL) { err(EX_NOHOST, "unable to resolve %s", hostname); } if (respAddr.ss_family == AF_INET) { in4 = (struct sockaddr_in *)&respAddr; inet_ntop(respAddr.ss_family, &in4->sin_addr, addrStr, sizeof(addrStr)); } else if (respAddr.ss_family == AF_INET6) { in6 = (struct sockaddr_in6 *)&respAddr; inet_ntop(respAddr.ss_family, &in6->sin6_addr, addrStr, sizeof(addrStr)); } else { strcpy(addrStr, "unknown address family"); } fprintf(stdout, "Got response from %s\n", addrStr); for (ii=0; ii < count; ii++) { if (listAddr->ss_family == AF_INET) { in4 = (struct sockaddr_in *)listAddr; inet_ntop(listAddr->ss_family, &in4->sin_addr, addrStr, sizeof(addrStr)); } else if (respAddr.ss_family == AF_INET6) { in6 = (struct sockaddr_in6 *)listAddr; inet_ntop(respAddr.ss_family, &in6->sin6_addr, addrStr, sizeof(addrStr)); } else { strcpy(addrStr, "unknown address family"); } fprintf(stdout, "IP address of %s: %s\n", hostname, addrStr); listAddr++; } if (startAddr) { free(startAddr); } if (hostname) { free(hostname); } return 0; }