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