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 }