1*b3700b07SGordon Ross /* 2*b3700b07SGordon Ross * This file and its contents are supplied under the terms of the 3*b3700b07SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0. 4*b3700b07SGordon Ross * You may only use this file in accordance with the terms of version 5*b3700b07SGordon Ross * 1.0 of the CDDL. 6*b3700b07SGordon Ross * 7*b3700b07SGordon Ross * A full copy of the text of the CDDL should have accompanied this 8*b3700b07SGordon Ross * source. A copy of the CDDL is also available via the Internet at 9*b3700b07SGordon Ross * http://www.illumos.org/license/CDDL. 10*b3700b07SGordon Ross */ 11*b3700b07SGordon Ross 12*b3700b07SGordon Ross /* 13*b3700b07SGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 14*b3700b07SGordon Ross */ 15*b3700b07SGordon Ross 16*b3700b07SGordon Ross 17*b3700b07SGordon Ross #include <sys/note.h> 18*b3700b07SGordon Ross #include <stdarg.h> 19*b3700b07SGordon Ross #include <stdio.h> 20*b3700b07SGordon Ross #include <addisc.h> 21*b3700b07SGordon Ross #include <netinet/in.h> 22*b3700b07SGordon Ross #include <arpa/inet.h> 23*b3700b07SGordon Ross 24*b3700b07SGordon Ross int debug; 25*b3700b07SGordon Ross char *domainname = NULL; 26*b3700b07SGordon Ross 27*b3700b07SGordon Ross void print_ds(ad_disc_ds_t *); 28*b3700b07SGordon Ross void mylogger(int pri, const char *format, ...); 29*b3700b07SGordon Ross 30*b3700b07SGordon Ross int 31*b3700b07SGordon Ross main(int argc, char *argv[]) 32*b3700b07SGordon Ross { 33*b3700b07SGordon Ross ad_disc_t ad_ctx = NULL; 34*b3700b07SGordon Ross boolean_t autodisc; 35*b3700b07SGordon Ross ad_disc_ds_t *dc, *gc; 36*b3700b07SGordon Ross char *s; 37*b3700b07SGordon Ross int c; 38*b3700b07SGordon Ross 39*b3700b07SGordon Ross while ((c = getopt(argc, argv, "d")) != -1) { 40*b3700b07SGordon Ross switch (c) { 41*b3700b07SGordon Ross case '?': 42*b3700b07SGordon Ross (void) fprintf(stderr, "bad option: -%c\n", optopt); 43*b3700b07SGordon Ross return (1); 44*b3700b07SGordon Ross case 'd': 45*b3700b07SGordon Ross debug++; 46*b3700b07SGordon Ross break; 47*b3700b07SGordon Ross } 48*b3700b07SGordon Ross } 49*b3700b07SGordon Ross 50*b3700b07SGordon Ross if (optind < argc) 51*b3700b07SGordon Ross domainname = argv[optind]; 52*b3700b07SGordon Ross 53*b3700b07SGordon Ross adutils_set_logger(mylogger); 54*b3700b07SGordon Ross adutils_set_debug(AD_DEBUG_ALL, debug); 55*b3700b07SGordon Ross 56*b3700b07SGordon Ross ad_ctx = ad_disc_init(); 57*b3700b07SGordon Ross ad_disc_set_StatusFP(ad_ctx, stdout); 58*b3700b07SGordon Ross 59*b3700b07SGordon Ross if (domainname) 60*b3700b07SGordon Ross (void) ad_disc_set_DomainName(ad_ctx, domainname); 61*b3700b07SGordon Ross 62*b3700b07SGordon Ross ad_disc_refresh(ad_ctx); 63*b3700b07SGordon Ross 64*b3700b07SGordon Ross dc = ad_disc_get_DomainController(ad_ctx, 65*b3700b07SGordon Ross AD_DISC_PREFER_SITE, &autodisc); 66*b3700b07SGordon Ross if (dc == NULL) { 67*b3700b07SGordon Ross (void) printf("getdc failed\n"); 68*b3700b07SGordon Ross return (1); 69*b3700b07SGordon Ross } 70*b3700b07SGordon Ross (void) printf("Found a DC:\n"); 71*b3700b07SGordon Ross print_ds(dc); 72*b3700b07SGordon Ross free(dc); 73*b3700b07SGordon Ross 74*b3700b07SGordon Ross s = ad_disc_get_ForestName(ad_ctx, NULL); 75*b3700b07SGordon Ross (void) printf("Forest: %s\n", s); 76*b3700b07SGordon Ross free(s); 77*b3700b07SGordon Ross 78*b3700b07SGordon Ross s = ad_disc_get_SiteName(ad_ctx, NULL); 79*b3700b07SGordon Ross (void) printf("Site: %s\n", s); 80*b3700b07SGordon Ross free(s); 81*b3700b07SGordon Ross 82*b3700b07SGordon Ross gc = ad_disc_get_GlobalCatalog(ad_ctx, 83*b3700b07SGordon Ross AD_DISC_PREFER_SITE, &autodisc); 84*b3700b07SGordon Ross if (gc != NULL) { 85*b3700b07SGordon Ross (void) printf("Found a GC:\n"); 86*b3700b07SGordon Ross print_ds(gc); 87*b3700b07SGordon Ross free(gc); 88*b3700b07SGordon Ross } 89*b3700b07SGordon Ross 90*b3700b07SGordon Ross ad_disc_done(ad_ctx); 91*b3700b07SGordon Ross ad_disc_fini(ad_ctx); 92*b3700b07SGordon Ross ad_ctx = NULL; 93*b3700b07SGordon Ross 94*b3700b07SGordon Ross return (0); 95*b3700b07SGordon Ross } 96*b3700b07SGordon Ross 97*b3700b07SGordon Ross void 98*b3700b07SGordon Ross print_ds(ad_disc_ds_t *ds) 99*b3700b07SGordon Ross { 100*b3700b07SGordon Ross char buf[64]; 101*b3700b07SGordon Ross 102*b3700b07SGordon Ross for (; ds->host[0] != '\0'; ds++) { 103*b3700b07SGordon Ross const char *p; 104*b3700b07SGordon Ross 105*b3700b07SGordon Ross (void) printf("Name: %s\n", ds->host); 106*b3700b07SGordon Ross (void) printf(" flags: 0x%X\n", ds->flags); 107*b3700b07SGordon Ross if (ds->addr.ss_family == AF_INET) { 108*b3700b07SGordon Ross struct sockaddr_in *sin; 109*b3700b07SGordon Ross sin = (struct sockaddr_in *)&ds->addr; 110*b3700b07SGordon Ross p = inet_ntop(AF_INET, &sin->sin_addr, 111*b3700b07SGordon Ross buf, sizeof (buf)); 112*b3700b07SGordon Ross if (p == NULL) 113*b3700b07SGordon Ross p = "?"; 114*b3700b07SGordon Ross (void) printf(" A %s %d\n", p, ds->port); 115*b3700b07SGordon Ross } 116*b3700b07SGordon Ross if (ds->addr.ss_family == AF_INET6) { 117*b3700b07SGordon Ross struct sockaddr_in6 *sin6; 118*b3700b07SGordon Ross sin6 = (struct sockaddr_in6 *)&ds->addr; 119*b3700b07SGordon Ross p = inet_ntop(AF_INET6, &sin6->sin6_addr, 120*b3700b07SGordon Ross buf, sizeof (buf)); 121*b3700b07SGordon Ross if (p == NULL) 122*b3700b07SGordon Ross p = "?"; 123*b3700b07SGordon Ross (void) printf(" AAAA %s %d\n", p, ds->port); 124*b3700b07SGordon Ross } 125*b3700b07SGordon Ross } 126*b3700b07SGordon Ross } 127*b3700b07SGordon Ross 128*b3700b07SGordon Ross /* printflike */ 129*b3700b07SGordon Ross void 130*b3700b07SGordon Ross mylogger(int pri, const char *format, ...) 131*b3700b07SGordon Ross { 132*b3700b07SGordon Ross _NOTE(ARGUNUSED(pri)) 133*b3700b07SGordon Ross va_list args; 134*b3700b07SGordon Ross 135*b3700b07SGordon Ross va_start(args, format); 136*b3700b07SGordon Ross (void) vfprintf(stderr, format, args); 137*b3700b07SGordon Ross (void) fprintf(stderr, "\n"); 138*b3700b07SGordon Ross va_end(args); 139*b3700b07SGordon Ross } 140*b3700b07SGordon Ross 141*b3700b07SGordon Ross /* 142*b3700b07SGordon Ross * This is a unit-test program. Always enable libumem debugging. 143*b3700b07SGordon Ross */ 144*b3700b07SGordon Ross const char * 145*b3700b07SGordon Ross _umem_debug_init(void) 146*b3700b07SGordon Ross { 147*b3700b07SGordon Ross return ("default,verbose"); /* $UMEM_DEBUG setting */ 148*b3700b07SGordon Ross } 149*b3700b07SGordon Ross 150*b3700b07SGordon Ross const char * 151*b3700b07SGordon Ross _umem_logging_init(void) 152*b3700b07SGordon Ross { 153*b3700b07SGordon Ross return ("fail,contents"); /* $UMEM_LOGGING setting */ 154*b3700b07SGordon Ross } 155