xref: /freebsd/usr.bin/hesinfo/hesinfo.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
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 #include <err.h>
23248aee62SJacques Vidrine #include <errno.h>
24248aee62SJacques Vidrine #include <hesiod.h>
25248aee62SJacques Vidrine #include <stdio.h>
26248aee62SJacques Vidrine #include <stdlib.h>
27248aee62SJacques Vidrine #include <string.h>
28248aee62SJacques Vidrine #include <unistd.h>
29248aee62SJacques Vidrine 
30248aee62SJacques Vidrine int
main(int argc,char ** argv)31f4ac32deSDavid Malone main(int argc, char **argv)
32248aee62SJacques Vidrine {
33248aee62SJacques Vidrine 	char  **list, **p, *bindname, *name, *type;
34248aee62SJacques Vidrine 	int     lflag = 0, errflg = 0, bflag = 0, c;
35248aee62SJacques Vidrine 	void   *context;
36248aee62SJacques Vidrine 
37248aee62SJacques Vidrine 	while ((c = getopt(argc, argv, "lb")) != -1) {
38248aee62SJacques Vidrine 		switch (c) {
39248aee62SJacques Vidrine 		case 'l':
40248aee62SJacques Vidrine 			lflag = 1;
41248aee62SJacques Vidrine 			break;
42248aee62SJacques Vidrine 		case 'b':
43248aee62SJacques Vidrine 			bflag = 1;
44248aee62SJacques Vidrine 			break;
45248aee62SJacques Vidrine 		default:
46248aee62SJacques Vidrine 			errflg++;
47248aee62SJacques Vidrine 			break;
48248aee62SJacques Vidrine 		}
49248aee62SJacques Vidrine 	}
50248aee62SJacques Vidrine 	if (argc - optind != 2 || errflg) {
51d3974088SDag-Erling Smørgrav 		fprintf(stderr, "usage: hesinfo [-bl] name type\n");
52248aee62SJacques Vidrine 		fprintf(stderr, "\t-l selects long format\n");
53248aee62SJacques Vidrine 		fprintf(stderr, "\t-b also does hes_to_bind conversion\n");
54248aee62SJacques Vidrine 		exit(2);
55248aee62SJacques Vidrine 	}
56248aee62SJacques Vidrine 	name = argv[optind];
57248aee62SJacques Vidrine 	type = argv[optind + 1];
58248aee62SJacques Vidrine 
59248aee62SJacques Vidrine 	if (hesiod_init(&context) < 0) {
60248aee62SJacques Vidrine 		if (errno == ENOEXEC)
61248aee62SJacques Vidrine 			warnx(
62248aee62SJacques Vidrine 			    "hesiod_init: Invalid Hesiod configuration file.");
63248aee62SJacques Vidrine 		else
64248aee62SJacques Vidrine 			warn("hesiod_init");
65248aee62SJacques Vidrine 	}
66248aee62SJacques Vidrine 	/* Display bind name if requested. */
67248aee62SJacques Vidrine 	if (bflag) {
68248aee62SJacques Vidrine 		if (lflag)
69248aee62SJacques Vidrine 			printf("hes_to_bind(%s, %s) expands to\n", name, type);
70248aee62SJacques Vidrine 		bindname = hesiod_to_bind(context, name, type);
71248aee62SJacques Vidrine 		if (!bindname) {
72248aee62SJacques Vidrine 			if (lflag)
73248aee62SJacques Vidrine 				printf("nothing\n");
74248aee62SJacques Vidrine 			if (errno == ENOENT)
75248aee62SJacques Vidrine 				warnx("hesiod_to_bind: Unknown rhs-extension.");
76248aee62SJacques Vidrine 			else
77248aee62SJacques Vidrine 				warn("hesiod_to_bind");
78248aee62SJacques Vidrine 			exit(1);
79248aee62SJacques Vidrine 		}
80248aee62SJacques Vidrine 		printf("%s\n", bindname);
81248aee62SJacques Vidrine 		free(bindname);
82248aee62SJacques Vidrine 		if (lflag)
83248aee62SJacques Vidrine 			printf("which ");
84248aee62SJacques Vidrine 	}
85248aee62SJacques Vidrine 	if (lflag)
86248aee62SJacques Vidrine 		printf("resolves to\n");
87248aee62SJacques Vidrine 
88248aee62SJacques Vidrine 	/* Do the hesiod resolve and check for errors. */
89248aee62SJacques Vidrine 	list = hesiod_resolve(context, name, type);
90248aee62SJacques Vidrine 	if (!list) {
91248aee62SJacques Vidrine 		if (lflag)
92248aee62SJacques Vidrine 			printf("nothing\n");
93248aee62SJacques Vidrine 		if (errno == ENOENT)
94248aee62SJacques Vidrine 			warnx("hesiod_resolve: Hesiod name not found.");
95248aee62SJacques Vidrine 		else
96248aee62SJacques Vidrine 			warn("hesiod_resolve");
97248aee62SJacques Vidrine 		exit(1);
98248aee62SJacques Vidrine 	}
99248aee62SJacques Vidrine 	/* Display the results. */
100248aee62SJacques Vidrine 	for (p = list; *p; p++)
101248aee62SJacques Vidrine 		printf("%s\n", *p);
102248aee62SJacques Vidrine 
103248aee62SJacques Vidrine 	hesiod_free_list(context, list);
104248aee62SJacques Vidrine 	hesiod_end(context);
105248aee62SJacques Vidrine 	exit(0);
106248aee62SJacques Vidrine }
107