xref: /freebsd/contrib/sendmail/praliases/praliases.c (revision c2aa98e247e56d5266d789dfc9b90b524b0019fe)
1c2aa98e2SPeter Wemm /*
2c2aa98e2SPeter Wemm  * Copyright (c) 1998 Sendmail, Inc.  All rights reserved.
3c2aa98e2SPeter Wemm  * Copyright (c) 1983 Eric P. Allman.  All rights reserved.
4c2aa98e2SPeter Wemm  * Copyright (c) 1988, 1993
5c2aa98e2SPeter Wemm  *	The Regents of the University of California.  All rights reserved.
6c2aa98e2SPeter Wemm  *
7c2aa98e2SPeter Wemm  * By using this file, you agree to the terms and conditions set
8c2aa98e2SPeter Wemm  * forth in the LICENSE file which can be found at the top level of
9c2aa98e2SPeter Wemm  * the sendmail distribution.
10c2aa98e2SPeter Wemm  *
11c2aa98e2SPeter Wemm  */
12c2aa98e2SPeter Wemm 
13c2aa98e2SPeter Wemm #ifndef lint
14c2aa98e2SPeter Wemm static char copyright[] =
15c2aa98e2SPeter Wemm "@(#) Copyright (c) 1988, 1993\n\
16c2aa98e2SPeter Wemm 	The Regents of the University of California.  All rights reserved.\n";
17c2aa98e2SPeter Wemm #endif /* not lint */
18c2aa98e2SPeter Wemm 
19c2aa98e2SPeter Wemm #ifndef lint
20c2aa98e2SPeter Wemm static char sccsid[] = "@(#)praliases.c	8.17 (Berkeley) 6/25/98";
21c2aa98e2SPeter Wemm #endif /* not lint */
22c2aa98e2SPeter Wemm 
23c2aa98e2SPeter Wemm #if !defined(NDBM) && !defined(NEWDB)
24c2aa98e2SPeter Wemm   ERROR README:	You must define one of NDBM or NEWDB in order to compile
25c2aa98e2SPeter Wemm   ERROR README:	praliases.
26c2aa98e2SPeter Wemm #endif
27c2aa98e2SPeter Wemm 
28c2aa98e2SPeter Wemm #ifdef NDBM
29c2aa98e2SPeter Wemm # include <ndbm.h>
30c2aa98e2SPeter Wemm #endif
31c2aa98e2SPeter Wemm #ifndef NOT_SENDMAIL
32c2aa98e2SPeter Wemm # define NOT_SENDMAIL
33c2aa98e2SPeter Wemm #endif
34c2aa98e2SPeter Wemm #include <sendmail.h>
35c2aa98e2SPeter Wemm #ifdef NEWDB
36c2aa98e2SPeter Wemm # include <db.h>
37c2aa98e2SPeter Wemm # ifndef DB_VERSION_MAJOR
38c2aa98e2SPeter Wemm #  define DB_VERSION_MAJOR 1
39c2aa98e2SPeter Wemm # endif
40c2aa98e2SPeter Wemm #endif
41c2aa98e2SPeter Wemm 
42c2aa98e2SPeter Wemm #if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) || \
43c2aa98e2SPeter Wemm     defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__)
44c2aa98e2SPeter Wemm # ifndef HASSTRERROR
45c2aa98e2SPeter Wemm #  define HASSTRERROR	1	/* has strerror(3) */
46c2aa98e2SPeter Wemm # endif
47c2aa98e2SPeter Wemm #endif
48c2aa98e2SPeter Wemm 
49c2aa98e2SPeter Wemm #if !HASSTRERROR
50c2aa98e2SPeter Wemm extern char	*strerror __P((int));
51c2aa98e2SPeter Wemm #endif
52c2aa98e2SPeter Wemm 
53c2aa98e2SPeter Wemm int
54c2aa98e2SPeter Wemm main(argc, argv)
55c2aa98e2SPeter Wemm 	int argc;
56c2aa98e2SPeter Wemm 	char **argv;
57c2aa98e2SPeter Wemm {
58c2aa98e2SPeter Wemm 	extern char *optarg;
59c2aa98e2SPeter Wemm 	extern int optind;
60c2aa98e2SPeter Wemm #ifdef NDBM
61c2aa98e2SPeter Wemm 	DBM *dbp;
62c2aa98e2SPeter Wemm 	datum content, key;
63c2aa98e2SPeter Wemm #endif
64c2aa98e2SPeter Wemm 	char *filename;
65c2aa98e2SPeter Wemm 	int ch;
66c2aa98e2SPeter Wemm #ifdef NEWDB
67c2aa98e2SPeter Wemm 	DB *db;
68c2aa98e2SPeter Wemm 	DBT newdbkey, newdbcontent;
69c2aa98e2SPeter Wemm 	char buf[MAXNAME];
70c2aa98e2SPeter Wemm #endif
71c2aa98e2SPeter Wemm 
72c2aa98e2SPeter Wemm 	filename = "/etc/aliases";
73c2aa98e2SPeter Wemm 	while ((ch = getopt(argc, argv, "f:")) != EOF)
74c2aa98e2SPeter Wemm 		switch((char)ch) {
75c2aa98e2SPeter Wemm 		case 'f':
76c2aa98e2SPeter Wemm 			filename = optarg;
77c2aa98e2SPeter Wemm 			break;
78c2aa98e2SPeter Wemm 		case '?':
79c2aa98e2SPeter Wemm 		default:
80c2aa98e2SPeter Wemm 			(void)fprintf(stderr, "usage: praliases [-f file]\n");
81c2aa98e2SPeter Wemm 			exit(EX_USAGE);
82c2aa98e2SPeter Wemm 		}
83c2aa98e2SPeter Wemm 	argc -= optind;
84c2aa98e2SPeter Wemm 	argv += optind;
85c2aa98e2SPeter Wemm 
86c2aa98e2SPeter Wemm #ifdef NEWDB
87c2aa98e2SPeter Wemm 	if (strlen(filename) + 4 >= sizeof buf)
88c2aa98e2SPeter Wemm 	{
89c2aa98e2SPeter Wemm 		fprintf(stderr, "Alias filename too long: %.30s...\n", filename);
90c2aa98e2SPeter Wemm 		exit(EX_USAGE);
91c2aa98e2SPeter Wemm 	}
92c2aa98e2SPeter Wemm 	(void) strcpy(buf, filename);
93c2aa98e2SPeter Wemm 	(void) strcat(buf, ".db");
94c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR < 2
95c2aa98e2SPeter Wemm 	db = dbopen(buf, O_RDONLY, 0444, DB_HASH, NULL);
96c2aa98e2SPeter Wemm # else
97c2aa98e2SPeter Wemm 	db = NULL;
98c2aa98e2SPeter Wemm 	errno = db_open(buf, DB_HASH, DB_RDONLY, 0444, NULL, NULL, &db);
99c2aa98e2SPeter Wemm # endif
100c2aa98e2SPeter Wemm 	if (db != NULL)
101c2aa98e2SPeter Wemm 	{
102c2aa98e2SPeter Wemm 		if (!argc) {
103c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR > 1
104c2aa98e2SPeter Wemm 			DBC *dbc;
105c2aa98e2SPeter Wemm # endif
106c2aa98e2SPeter Wemm 			bzero(&newdbkey, sizeof newdbkey);
107c2aa98e2SPeter Wemm 			bzero(&newdbcontent, sizeof newdbcontent);
108c2aa98e2SPeter Wemm 
109c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR < 2
110c2aa98e2SPeter Wemm 			while(!db->seq(db, &newdbkey, &newdbcontent, R_NEXT))
111c2aa98e2SPeter Wemm # else
112c2aa98e2SPeter Wemm 			if ((errno = db->cursor(db, NULL, &dbc)) == 0)
113c2aa98e2SPeter Wemm 			{
114c2aa98e2SPeter Wemm 				while ((errno = dbc->c_get(dbc, &newdbkey,
115c2aa98e2SPeter Wemm 							   &newdbcontent,
116c2aa98e2SPeter Wemm 							   DB_NEXT)) == 0)
117c2aa98e2SPeter Wemm # endif
118c2aa98e2SPeter Wemm 				printf("%.*s:%.*s\n",
119c2aa98e2SPeter Wemm 					(int) newdbkey.size,
120c2aa98e2SPeter Wemm 					(char *) newdbkey.data,
121c2aa98e2SPeter Wemm 					(int) newdbcontent.size,
122c2aa98e2SPeter Wemm 					(char *) newdbcontent.data);
123c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR > 1
124c2aa98e2SPeter Wemm 				(void) dbc->c_close(dbc);
125c2aa98e2SPeter Wemm 			}
126c2aa98e2SPeter Wemm 			else
127c2aa98e2SPeter Wemm 			{
128c2aa98e2SPeter Wemm 				fprintf(stderr,
129c2aa98e2SPeter Wemm 					"praliases: %s: Could not set cursor: %s\n",
130c2aa98e2SPeter Wemm 					buf, strerror(errno));
131c2aa98e2SPeter Wemm 				exit(EX_DATAERR);
132c2aa98e2SPeter Wemm 			}
133c2aa98e2SPeter Wemm # endif
134c2aa98e2SPeter Wemm 		}
135c2aa98e2SPeter Wemm 		else for (; *argv; ++argv) {
136c2aa98e2SPeter Wemm 			bzero(&newdbkey, sizeof newdbkey);
137c2aa98e2SPeter Wemm 			bzero(&newdbcontent, sizeof newdbcontent);
138c2aa98e2SPeter Wemm 			newdbkey.data = *argv;
139c2aa98e2SPeter Wemm 			newdbkey.size = strlen(*argv) + 1;
140c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR < 2
141c2aa98e2SPeter Wemm 			if (!db->get(db, &newdbkey, &newdbcontent, 0))
142c2aa98e2SPeter Wemm # else
143c2aa98e2SPeter Wemm 			if ((errno = db->get(db, NULL, &newdbkey,
144c2aa98e2SPeter Wemm 					     &newdbcontent, 0)) == 0)
145c2aa98e2SPeter Wemm # endif
146c2aa98e2SPeter Wemm 				printf("%s:%.*s\n", (char *) newdbkey.data,
147c2aa98e2SPeter Wemm 					(int) newdbcontent.size,
148c2aa98e2SPeter Wemm 					(char *) newdbcontent.data);
149c2aa98e2SPeter Wemm 			else
150c2aa98e2SPeter Wemm 				printf("%s: No such key\n",
151c2aa98e2SPeter Wemm 					(char *) newdbkey.data);
152c2aa98e2SPeter Wemm 		}
153c2aa98e2SPeter Wemm # if DB_VERSION_MAJOR < 2
154c2aa98e2SPeter Wemm 		(void)db->close(db);
155c2aa98e2SPeter Wemm # else
156c2aa98e2SPeter Wemm 		errno = db->close(db, 0);
157c2aa98e2SPeter Wemm # endif
158c2aa98e2SPeter Wemm 	}
159c2aa98e2SPeter Wemm 	else {
160c2aa98e2SPeter Wemm #endif
161c2aa98e2SPeter Wemm #ifdef NDBM
162c2aa98e2SPeter Wemm 		if ((dbp = dbm_open(filename, O_RDONLY, 0)) == NULL) {
163c2aa98e2SPeter Wemm 			(void)fprintf(stderr,
164c2aa98e2SPeter Wemm 			    "praliases: %s: %s\n", filename, strerror(errno));
165c2aa98e2SPeter Wemm 			exit(EX_OSFILE);
166c2aa98e2SPeter Wemm 		}
167c2aa98e2SPeter Wemm 		if (!argc)
168c2aa98e2SPeter Wemm 			for (key = dbm_firstkey(dbp);
169c2aa98e2SPeter Wemm 			    key.dptr != NULL; key = dbm_nextkey(dbp)) {
170c2aa98e2SPeter Wemm 				content = dbm_fetch(dbp, key);
171c2aa98e2SPeter Wemm 				(void)printf("%.*s:%.*s\n",
172c2aa98e2SPeter Wemm 					(int) key.dsize, key.dptr,
173c2aa98e2SPeter Wemm 					(int) content.dsize, content.dptr);
174c2aa98e2SPeter Wemm 			}
175c2aa98e2SPeter Wemm 		else for (; *argv; ++argv) {
176c2aa98e2SPeter Wemm 			key.dptr = *argv;
177c2aa98e2SPeter Wemm 			key.dsize = strlen(*argv) + 1;
178c2aa98e2SPeter Wemm 			content = dbm_fetch(dbp, key);
179c2aa98e2SPeter Wemm 			if (!content.dptr)
180c2aa98e2SPeter Wemm 				(void)printf("%s: No such key\n", key.dptr);
181c2aa98e2SPeter Wemm 			else
182c2aa98e2SPeter Wemm 				(void)printf("%s:%.*s\n", key.dptr,
183c2aa98e2SPeter Wemm 					(int) content.dsize, content.dptr);
184c2aa98e2SPeter Wemm 		}
185c2aa98e2SPeter Wemm 		dbm_close(dbp);
186c2aa98e2SPeter Wemm #endif
187c2aa98e2SPeter Wemm #ifdef NEWDB
188c2aa98e2SPeter Wemm 	}
189c2aa98e2SPeter Wemm #endif
190c2aa98e2SPeter Wemm 	exit(EX_OK);
191c2aa98e2SPeter Wemm }
192c2aa98e2SPeter Wemm 
193c2aa98e2SPeter Wemm #if !HASSTRERROR
194c2aa98e2SPeter Wemm 
195c2aa98e2SPeter Wemm char *
196c2aa98e2SPeter Wemm strerror(eno)
197c2aa98e2SPeter Wemm 	int eno;
198c2aa98e2SPeter Wemm {
199c2aa98e2SPeter Wemm 	extern int sys_nerr;
200c2aa98e2SPeter Wemm 	extern char *sys_errlist[];
201c2aa98e2SPeter Wemm 	static char ebuf[60];
202c2aa98e2SPeter Wemm 
203c2aa98e2SPeter Wemm 	if (eno >= 0 && eno < sys_nerr)
204c2aa98e2SPeter Wemm 		return sys_errlist[eno];
205c2aa98e2SPeter Wemm 	(void) sprintf(ebuf, "Error %d", eno);
206c2aa98e2SPeter Wemm 	return ebuf;
207c2aa98e2SPeter Wemm }
208c2aa98e2SPeter Wemm 
209c2aa98e2SPeter Wemm #endif /* !HASSTRERROR */
210