1 /*
2  * Copyright (c) 1983 Eric P. Allman
3  * Copyright (c) 1988, 1993
4  *	The Regents of the University of California.  All rights reserved.
5  *
6  * %sccs.include.redist.c%
7  */
8 
9 #ifndef lint
10 static char copyright[] =
11 "@(#) Copyright (c) 1988, 1993\n\
12 	The Regents of the University of California.  All rights reserved.\n";
13 #endif /* not lint */
14 
15 #ifndef lint
16 static char sccsid[] = "@(#)praliases.c	8.3 (Berkeley) 03/06/94";
17 #endif /* not lint */
18 
19 #include <ndbm.h>
20 #include <sendmail.h>
21 #ifdef NEWDB
22 #include <db.h>
23 #endif
24 
25 int
26 main(argc, argv)
27 	int argc;
28 	char **argv;
29 {
30 	extern char *optarg;
31 	extern int optind;
32 	DBM *dbp;
33 	datum content, key;
34 	char *filename;
35 	int ch;
36 #ifdef NEWDB
37 	const DB *db;
38 	DBT newdbkey, newdbcontent;
39 	char buf[MAXNAME];
40 #endif
41 
42 	filename = "/etc/aliases";
43 	while ((ch = getopt(argc, argv, "f:")) != EOF)
44 		switch((char)ch) {
45 		case 'f':
46 			filename = optarg;
47 			break;
48 		case '?':
49 		default:
50 			(void)fprintf(stderr, "usage: praliases [-f file]\n");
51 			exit(EX_USAGE);
52 		}
53 	argc -= optind;
54 	argv += optind;
55 
56 #ifdef NEWDB
57 	(void) strcpy(buf, filename);
58 	(void) strcat(buf, ".db");
59 	if (db = dbopen(buf, O_RDONLY, 0444 , DB_HASH, NULL)) {
60 		if (!argc) {
61 			while(!db->seq(db, &newdbkey, &newdbcontent, R_NEXT))
62 				printf("%.*s:%.*s\n",
63 					newdbkey.size, newdbkey.data,
64 					newdbcontent.size, newdbcontent.data);
65 		}
66 		else for (; *argv; ++argv) {
67 			newdbkey.data = *argv;
68 			newdbkey.size = strlen(*argv) + 1;
69 			if (!db->get(db, &newdbkey, &newdbcontent, 0))
70 				printf("%s:%.*s\n", newdbkey.data,
71 					newdbcontent.size, newdbcontent.data);
72 			else
73 				printf("%s: No such key\n",
74 					newdbkey.data);
75 		}
76 	}
77 	else {
78 #endif
79 		if ((dbp = dbm_open(filename, O_RDONLY, 0)) == NULL) {
80 			(void)fprintf(stderr,
81 			    "praliases: %s: %s\n", filename, strerror(errno));
82 			exit(EX_OSFILE);
83 		}
84 		if (!argc)
85 			for (key = dbm_firstkey(dbp);
86 			    key.dptr != NULL; key = dbm_nextkey(dbp)) {
87 				content = dbm_fetch(dbp, key);
88 				(void)printf("%.*s:%.*s\n",
89 					key.dsize, key.dptr,
90 					content.dsize, content.dptr);
91 			}
92 		else for (; *argv; ++argv) {
93 			key.dptr = *argv;
94 			key.dsize = strlen(*argv) + 1;
95 			content = dbm_fetch(dbp, key);
96 			if (!content.dptr)
97 				(void)printf("%s: No such key\n", key.dptr);
98 			else
99 				(void)printf("%s:%.*s\n", key.dptr,
100 					content.dsize, content.dptr);
101 		}
102 #ifdef NEWDB
103 	}
104 #endif
105 	exit(EX_OK);
106 }
107