char *print_canonical_sockaddr(TALLOC_CTX *ctx, const struct sockaddr_storage *pss) { char addr[INET6_ADDRSTRLEN]; char *dest = NULL; int ret; /* Linux getnameinfo() man pages says port is unitialized if service name is NULL. */ ret = sys_getnameinfo((const struct sockaddr *)pss, sizeof(struct sockaddr_storage), addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); if (ret != 0) { return NULL; } if (pss->ss_family != AF_INET) { #if defined(HAVE_IPV6) dest = talloc_asprintf(ctx, "[%s]", addr); #else return NULL; #endif } else { dest = talloc_asprintf(ctx, "%s", addr); } return dest; }
static bool query_one(const char *lookup, unsigned int lookup_type) { int j, count; uint8_t flags; struct sockaddr_storage *ip_list=NULL; NTSTATUS status = NT_STATUS_NOT_FOUND; if (got_bcast) { char addr[INET6_ADDRSTRLEN]; print_sockaddr(addr, sizeof(addr), &bcast_addr); d_printf("querying %s on %s\n", lookup, addr); status = name_query(lookup,lookup_type,use_bcast, use_bcast?true:recursion_desired, &bcast_addr, talloc_tos(), &ip_list, &count, &flags); } else { status = name_resolve_bcast( lookup, lookup_type, talloc_tos(), &ip_list, &count); } if (!NT_STATUS_IS_OK(status)) { return false; } if (give_flags) { d_printf("Flags: %s\n", query_flags(flags)); } for (j=0;j<count;j++) { char addr[INET6_ADDRSTRLEN]; if (translate_addresses) { char h_name[MAX_DNS_NAME_LENGTH]; h_name[0] = '\0'; if (sys_getnameinfo((const struct sockaddr *)&ip_list[j], sizeof(struct sockaddr_storage), h_name, sizeof(h_name), NULL, 0, NI_NAMEREQD)) { continue; } d_printf("%s, ", h_name); } print_sockaddr(addr, sizeof(addr), &ip_list[j]); d_printf("%s %s<%02x>\n", addr,lookup, lookup_type); /* We can only do find_status if the ip address returned was valid - ie. name_query returned true. */ if (find_status) { if (!do_node_status(lookup, lookup_type, &ip_list[j])) { status = NT_STATUS_UNSUCCESSFUL; } } } TALLOC_FREE(ip_list); return NT_STATUS_IS_OK(status); }
char *print_sockaddr_len(char *dest, size_t destlen, const struct sockaddr *psa, socklen_t psalen) { if (destlen > 0) { dest[0] = '\0'; } (void)sys_getnameinfo(psa, psalen, dest, destlen, NULL, 0, NI_NUMERICHOST); return dest; }
static int net_lookup_ldap(struct net_context *c, int argc, const char **argv) { #ifdef HAVE_ADS const char *domain; struct sockaddr_storage ss; struct dns_rr_srv *dcs = NULL; int numdcs = 0; char *sitename; TALLOC_CTX *ctx; NTSTATUS status; int ret; char h_name[MAX_DNS_NAME_LENGTH]; if (argc > 0) domain = argv[0]; else domain = c->opt_target_workgroup; if ( (ctx = talloc_init("net_lookup_ldap")) == NULL ) { d_fprintf(stderr,"net_lookup_ldap: talloc_init() %s!\n", _("failed")); return -1; } sitename = sitename_fetch(ctx, domain); DEBUG(9, ("Lookup up ldap for domain %s\n", domain)); status = ads_dns_query_dcs(ctx, domain, sitename, &dcs, &numdcs); if ( NT_STATUS_IS_OK(status) && numdcs ) { print_ldap_srvlist(dcs, numdcs); TALLOC_FREE( ctx ); return 0; } DEBUG(9, ("Looking up PDC for domain %s\n", domain)); if (!get_pdc_ip(domain, &ss)) { TALLOC_FREE( ctx ); return -1; } ret = sys_getnameinfo((struct sockaddr *)&ss, sizeof(struct sockaddr_storage), h_name, sizeof(h_name), NULL, 0, NI_NAMEREQD); if (ret) { TALLOC_FREE( ctx ); return -1; } DEBUG(9, ("Found PDC with DNS name %s\n", h_name)); domain = strchr(h_name, '.'); if (!domain) { TALLOC_FREE( ctx ); return -1; } domain++; DEBUG(9, ("Looking up ldap for domain %s\n", domain)); status = ads_dns_query_dcs(ctx, domain, sitename, &dcs, &numdcs); if ( NT_STATUS_IS_OK(status) && numdcs ) { print_ldap_srvlist(dcs, numdcs); TALLOC_FREE( ctx ); return 0; } TALLOC_FREE( ctx ); return -1; #endif DEBUG(1,("No ADS support\n")); return -1; }
static bool query_one(const char *lookup, unsigned int lookup_type) { int j, count, flags = 0; struct sockaddr_storage *ip_list=NULL; if (got_bcast) { char addr[INET6_ADDRSTRLEN]; print_sockaddr(addr, sizeof(addr), &bcast_addr); d_printf("querying %s on %s\n", lookup, addr); ip_list = name_query(ServerFD,lookup,lookup_type,use_bcast, use_bcast?true:recursion_desired, &bcast_addr, &count, &flags, NULL); } else { const struct in_addr *bcast; for (j=iface_count() - 1; !ip_list && j >= 0; j--) { char addr[INET6_ADDRSTRLEN]; struct sockaddr_storage bcast_ss; bcast = iface_n_bcast_v4(j); if (!bcast) { continue; } in_addr_to_sockaddr_storage(&bcast_ss, *bcast); print_sockaddr(addr, sizeof(addr), &bcast_ss); d_printf("querying %s on %s\n", lookup, addr); ip_list = name_query(ServerFD,lookup,lookup_type, use_bcast, use_bcast?True:recursion_desired, &bcast_ss,&count, &flags, NULL); } } if (!ip_list) { return false; } if (give_flags) { d_printf("Flags: %s\n", query_flags(flags)); } for (j=0;j<count;j++) { char addr[INET6_ADDRSTRLEN]; if (translate_addresses) { char h_name[MAX_DNS_NAME_LENGTH]; h_name[0] = '\0'; if (sys_getnameinfo((const struct sockaddr *)&ip_list[j], sizeof(struct sockaddr_storage), h_name, sizeof(h_name), NULL, 0, NI_NAMEREQD)) { continue; } d_printf("%s, ", h_name); } print_sockaddr(addr, sizeof(addr), &ip_list[j]); d_printf("%s %s<%02x>\n", addr,lookup, lookup_type); /* We can only do find_status if the ip address returned was valid - ie. name_query returned true. */ if (find_status) { do_node_status(ServerFD, lookup, lookup_type, &ip_list[j]); } } free(ip_list); return (ip_list != NULL); }