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.1 (Berkeley) 06/07/93";
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", newdbkey.data,
63 						newdbcontent.data);
64 		}
65 		else for (; *argv; ++argv) {
66 			newdbkey.data = *argv;
67 			newdbkey.size = strlen(*argv) + 1;
68 			if ( !db->get(db, &newdbkey, &newdbcontent, 0) )
69 				printf("%s:%s\n", newdbkey.data,
70 					newdbcontent.data);
71 			else
72 				printf("%s: No such key\n",
73 					newdbkey.data);
74 		}
75 	}
76 	else {
77 #endif
78 		if ((dbp = dbm_open(filename, O_RDONLY, 0)) == NULL) {
79 			(void)fprintf(stderr,
80 			    "praliases: %s: %s\n", filename, strerror(errno));
81 			exit(EX_OSFILE);
82 		}
83 		if (!argc)
84 			for (key = dbm_nextkey(dbp);
85 			    key.dptr != NULL; key = dbm_nextkey(dbp)) {
86 				content = dbm_fetch(dbp, key);
87 				(void)printf("%s:%s\n", key.dptr, content.dptr);
88 			}
89 		else for (; *argv; ++argv) {
90 			key.dptr = *argv;
91 			key.dsize = strlen(*argv) + 1;
92 			content = dbm_fetch(dbp, key);
93 			if (!content.dptr)
94 				(void)printf("%s: No such key\n", key.dptr);
95 			else
96 				(void)printf("%s:%s\n", key.dptr, content.dptr);
97 		}
98 #ifdef NEWDB
99 	}
100 #endif
101 	exit(EX_OK);
102 }
103