xref: /freebsd/usr.bin/hesinfo/hesinfo.c (revision 248aee623cc3e95cadc710fe1668269b841e171b)
1248aee62SJacques Vidrine /*	$NetBSD: hesinfo.c,v 1.1 1999/01/25 22:45:55 lukem Exp $	*/
2248aee62SJacques Vidrine 
3248aee62SJacques Vidrine /* Copyright 1988, 1996 by the Massachusetts Institute of Technology.
4248aee62SJacques Vidrine  *
5248aee62SJacques Vidrine  * Permission to use, copy, modify, and distribute this
6248aee62SJacques Vidrine  * software and its documentation for any purpose and without
7248aee62SJacques Vidrine  * fee is hereby granted, provided that the above copyright
8248aee62SJacques Vidrine  * notice appear in all copies and that both that copyright
9248aee62SJacques Vidrine  * notice and this permission notice appear in supporting
10248aee62SJacques Vidrine  * documentation, and that the name of M.I.T. not be used in
11248aee62SJacques Vidrine  * advertising or publicity pertaining to distribution of the
12248aee62SJacques Vidrine  * software without specific, written prior permission.
13248aee62SJacques Vidrine  * M.I.T. makes no representations about the suitability of
14248aee62SJacques Vidrine  * this software for any purpose.  It is provided "as is"
15248aee62SJacques Vidrine  * without express or implied warranty.
16248aee62SJacques Vidrine  */
17248aee62SJacques Vidrine 
18248aee62SJacques Vidrine /* This file is a simple driver for the Hesiod library. */
19248aee62SJacques Vidrine 
20248aee62SJacques Vidrine 
21248aee62SJacques Vidrine #include <sys/cdefs.h>
22248aee62SJacques Vidrine #ifndef lint
23248aee62SJacques Vidrine static char rcsid[] =
24248aee62SJacques Vidrine   "$FreeBSD$";
25248aee62SJacques Vidrine #endif /* not lint */
26248aee62SJacques Vidrine 
27248aee62SJacques Vidrine #include <err.h>
28248aee62SJacques Vidrine #include <errno.h>
29248aee62SJacques Vidrine #include <hesiod.h>
30248aee62SJacques Vidrine #include <stdio.h>
31248aee62SJacques Vidrine #include <stdlib.h>
32248aee62SJacques Vidrine #include <string.h>
33248aee62SJacques Vidrine #include <unistd.h>
34248aee62SJacques Vidrine 
35248aee62SJacques Vidrine int	main __P((int, char **));
36248aee62SJacques Vidrine extern char *__progname;
37248aee62SJacques Vidrine 
38248aee62SJacques Vidrine int
39248aee62SJacques Vidrine main(argc, argv)
40248aee62SJacques Vidrine 	int	argc;
41248aee62SJacques Vidrine 	char  **argv;
42248aee62SJacques Vidrine {
43248aee62SJacques Vidrine 	char  **list, **p, *bindname, *name, *type;
44248aee62SJacques Vidrine 	int     lflag = 0, errflg = 0, bflag = 0, c;
45248aee62SJacques Vidrine 	void   *context;
46248aee62SJacques Vidrine 
47248aee62SJacques Vidrine 	while ((c = getopt(argc, argv, "lb")) != -1) {
48248aee62SJacques Vidrine 		switch (c) {
49248aee62SJacques Vidrine 		case 'l':
50248aee62SJacques Vidrine 			lflag = 1;
51248aee62SJacques Vidrine 			break;
52248aee62SJacques Vidrine 		case 'b':
53248aee62SJacques Vidrine 			bflag = 1;
54248aee62SJacques Vidrine 			break;
55248aee62SJacques Vidrine 		default:
56248aee62SJacques Vidrine 			errflg++;
57248aee62SJacques Vidrine 			break;
58248aee62SJacques Vidrine 		}
59248aee62SJacques Vidrine 	}
60248aee62SJacques Vidrine 	if (argc - optind != 2 || errflg) {
61248aee62SJacques Vidrine 		fprintf(stderr, "Usage: %s [-bl] name type\n", __progname);
62248aee62SJacques Vidrine 		fprintf(stderr, "\t-l selects long format\n");
63248aee62SJacques Vidrine 		fprintf(stderr, "\t-b also does hes_to_bind conversion\n");
64248aee62SJacques Vidrine 		exit(2);
65248aee62SJacques Vidrine 	}
66248aee62SJacques Vidrine 	name = argv[optind];
67248aee62SJacques Vidrine 	type = argv[optind + 1];
68248aee62SJacques Vidrine 
69248aee62SJacques Vidrine 	if (hesiod_init(&context) < 0) {
70248aee62SJacques Vidrine 		if (errno == ENOEXEC)
71248aee62SJacques Vidrine 			warnx(
72248aee62SJacques Vidrine 			    "hesiod_init: Invalid Hesiod configuration file.");
73248aee62SJacques Vidrine 		else
74248aee62SJacques Vidrine 			warn("hesiod_init");
75248aee62SJacques Vidrine 	}
76248aee62SJacques Vidrine 	/* Display bind name if requested. */
77248aee62SJacques Vidrine 	if (bflag) {
78248aee62SJacques Vidrine 		if (lflag)
79248aee62SJacques Vidrine 			printf("hes_to_bind(%s, %s) expands to\n", name, type);
80248aee62SJacques Vidrine 		bindname = hesiod_to_bind(context, name, type);
81248aee62SJacques Vidrine 		if (!bindname) {
82248aee62SJacques Vidrine 			if (lflag)
83248aee62SJacques Vidrine 				printf("nothing\n");
84248aee62SJacques Vidrine 			if (errno == ENOENT)
85248aee62SJacques Vidrine 				warnx("hesiod_to_bind: Unknown rhs-extension.");
86248aee62SJacques Vidrine 			else
87248aee62SJacques Vidrine 				warn("hesiod_to_bind");
88248aee62SJacques Vidrine 			exit(1);
89248aee62SJacques Vidrine 		}
90248aee62SJacques Vidrine 		printf("%s\n", bindname);
91248aee62SJacques Vidrine 		free(bindname);
92248aee62SJacques Vidrine 		if (lflag)
93248aee62SJacques Vidrine 			printf("which ");
94248aee62SJacques Vidrine 	}
95248aee62SJacques Vidrine 	if (lflag)
96248aee62SJacques Vidrine 		printf("resolves to\n");
97248aee62SJacques Vidrine 
98248aee62SJacques Vidrine 	/* Do the hesiod resolve and check for errors. */
99248aee62SJacques Vidrine 	list = hesiod_resolve(context, name, type);
100248aee62SJacques Vidrine 	if (!list) {
101248aee62SJacques Vidrine 		if (lflag)
102248aee62SJacques Vidrine 			printf("nothing\n");
103248aee62SJacques Vidrine 		if (errno == ENOENT)
104248aee62SJacques Vidrine 			warnx("hesiod_resolve: Hesiod name not found.");
105248aee62SJacques Vidrine 		else
106248aee62SJacques Vidrine 			warn("hesiod_resolve");
107248aee62SJacques Vidrine 		exit(1);
108248aee62SJacques Vidrine 	}
109248aee62SJacques Vidrine 	/* Display the results. */
110248aee62SJacques Vidrine 	for (p = list; *p; p++)
111248aee62SJacques Vidrine 		printf("%s\n", *p);
112248aee62SJacques Vidrine 
113248aee62SJacques Vidrine 	hesiod_free_list(context, list);
114248aee62SJacques Vidrine 	hesiod_end(context);
115248aee62SJacques Vidrine 	exit(0);
116248aee62SJacques Vidrine }
117