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