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