summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/praliases/praliases.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/praliases/praliases.c')
-rw-r--r--contrib/sendmail/praliases/praliases.c209
1 files changed, 209 insertions, 0 deletions
diff --git a/contrib/sendmail/praliases/praliases.c b/contrib/sendmail/praliases/praliases.c
new file mode 100644
index 0000000..3e0048b
--- /dev/null
+++ b/contrib/sendmail/praliases/praliases.c
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 1998 Sendmail, Inc. All rights reserved.
+ * Copyright (c) 1983 Eric P. Allman. All rights reserved.
+ * Copyright (c) 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENSE file which can be found at the top level of
+ * the sendmail distribution.
+ *
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1988, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)praliases.c 8.17 (Berkeley) 6/25/98";
+#endif /* not lint */
+
+#if !defined(NDBM) && !defined(NEWDB)
+ ERROR README: You must define one of NDBM or NEWDB in order to compile
+ ERROR README: praliases.
+#endif
+
+#ifdef NDBM
+# include <ndbm.h>
+#endif
+#ifndef NOT_SENDMAIL
+# define NOT_SENDMAIL
+#endif
+#include <sendmail.h>
+#ifdef NEWDB
+# include <db.h>
+# ifndef DB_VERSION_MAJOR
+# define DB_VERSION_MAJOR 1
+# endif
+#endif
+
+#if defined(IRIX64) || defined(IRIX5) || defined(IRIX6) || \
+ defined(BSD4_4) || defined(__osf__) || defined(__GNU_LIBRARY__)
+# ifndef HASSTRERROR
+# define HASSTRERROR 1 /* has strerror(3) */
+# endif
+#endif
+
+#if !HASSTRERROR
+extern char *strerror __P((int));
+#endif
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ extern char *optarg;
+ extern int optind;
+#ifdef NDBM
+ DBM *dbp;
+ datum content, key;
+#endif
+ char *filename;
+ int ch;
+#ifdef NEWDB
+ DB *db;
+ DBT newdbkey, newdbcontent;
+ char buf[MAXNAME];
+#endif
+
+ filename = "/etc/aliases";
+ while ((ch = getopt(argc, argv, "f:")) != EOF)
+ switch((char)ch) {
+ case 'f':
+ filename = optarg;
+ break;
+ case '?':
+ default:
+ (void)fprintf(stderr, "usage: praliases [-f file]\n");
+ exit(EX_USAGE);
+ }
+ argc -= optind;
+ argv += optind;
+
+#ifdef NEWDB
+ if (strlen(filename) + 4 >= sizeof buf)
+ {
+ fprintf(stderr, "Alias filename too long: %.30s...\n", filename);
+ exit(EX_USAGE);
+ }
+ (void) strcpy(buf, filename);
+ (void) strcat(buf, ".db");
+# if DB_VERSION_MAJOR < 2
+ db = dbopen(buf, O_RDONLY, 0444, DB_HASH, NULL);
+# else
+ db = NULL;
+ errno = db_open(buf, DB_HASH, DB_RDONLY, 0444, NULL, NULL, &db);
+# endif
+ if (db != NULL)
+ {
+ if (!argc) {
+# if DB_VERSION_MAJOR > 1
+ DBC *dbc;
+# endif
+ bzero(&newdbkey, sizeof newdbkey);
+ bzero(&newdbcontent, sizeof newdbcontent);
+
+# if DB_VERSION_MAJOR < 2
+ while(!db->seq(db, &newdbkey, &newdbcontent, R_NEXT))
+# else
+ if ((errno = db->cursor(db, NULL, &dbc)) == 0)
+ {
+ while ((errno = dbc->c_get(dbc, &newdbkey,
+ &newdbcontent,
+ DB_NEXT)) == 0)
+# endif
+ printf("%.*s:%.*s\n",
+ (int) newdbkey.size,
+ (char *) newdbkey.data,
+ (int) newdbcontent.size,
+ (char *) newdbcontent.data);
+# if DB_VERSION_MAJOR > 1
+ (void) dbc->c_close(dbc);
+ }
+ else
+ {
+ fprintf(stderr,
+ "praliases: %s: Could not set cursor: %s\n",
+ buf, strerror(errno));
+ exit(EX_DATAERR);
+ }
+# endif
+ }
+ else for (; *argv; ++argv) {
+ bzero(&newdbkey, sizeof newdbkey);
+ bzero(&newdbcontent, sizeof newdbcontent);
+ newdbkey.data = *argv;
+ newdbkey.size = strlen(*argv) + 1;
+# if DB_VERSION_MAJOR < 2
+ if (!db->get(db, &newdbkey, &newdbcontent, 0))
+# else
+ if ((errno = db->get(db, NULL, &newdbkey,
+ &newdbcontent, 0)) == 0)
+# endif
+ printf("%s:%.*s\n", (char *) newdbkey.data,
+ (int) newdbcontent.size,
+ (char *) newdbcontent.data);
+ else
+ printf("%s: No such key\n",
+ (char *) newdbkey.data);
+ }
+# if DB_VERSION_MAJOR < 2
+ (void)db->close(db);
+# else
+ errno = db->close(db, 0);
+# endif
+ }
+ else {
+#endif
+#ifdef NDBM
+ if ((dbp = dbm_open(filename, O_RDONLY, 0)) == NULL) {
+ (void)fprintf(stderr,
+ "praliases: %s: %s\n", filename, strerror(errno));
+ exit(EX_OSFILE);
+ }
+ if (!argc)
+ for (key = dbm_firstkey(dbp);
+ key.dptr != NULL; key = dbm_nextkey(dbp)) {
+ content = dbm_fetch(dbp, key);
+ (void)printf("%.*s:%.*s\n",
+ (int) key.dsize, key.dptr,
+ (int) content.dsize, content.dptr);
+ }
+ else for (; *argv; ++argv) {
+ key.dptr = *argv;
+ key.dsize = strlen(*argv) + 1;
+ content = dbm_fetch(dbp, key);
+ if (!content.dptr)
+ (void)printf("%s: No such key\n", key.dptr);
+ else
+ (void)printf("%s:%.*s\n", key.dptr,
+ (int) content.dsize, content.dptr);
+ }
+ dbm_close(dbp);
+#endif
+#ifdef NEWDB
+ }
+#endif
+ exit(EX_OK);
+}
+
+#if !HASSTRERROR
+
+char *
+strerror(eno)
+ int eno;
+{
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+ static char ebuf[60];
+
+ if (eno >= 0 && eno < sys_nerr)
+ return sys_errlist[eno];
+ (void) sprintf(ebuf, "Error %d", eno);
+ return ebuf;
+}
+
+#endif /* !HASSTRERROR */
OpenPOWER on IntegriCloud