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