summaryrefslogtreecommitdiff
path: root/usr.sbin/smtpd
diff options
context:
space:
mode:
authorJacek Masiulaniec <jacekm@cvs.openbsd.org>2008-12-17 22:59:45 +0000
committerJacek Masiulaniec <jacekm@cvs.openbsd.org>2008-12-17 22:59:45 +0000
commita1ec3abf9b11ef5ffcc78d91109fb89fe3c8eb05 (patch)
tree3d6844ea863f54680b74bae797e3699454b0e119 /usr.sbin/smtpd
parent4b9d3a5b4f2e3fce34e8d068a7852c162598c370 (diff)
Merge newaliases into makemap.
ok gilles@
Diffstat (limited to 'usr.sbin/smtpd')
-rw-r--r--usr.sbin/smtpd/Makefile4
-rw-r--r--usr.sbin/smtpd/makemap.860
-rw-r--r--usr.sbin/smtpd/makemap.c258
-rw-r--r--usr.sbin/smtpd/makemap/Makefile5
-rw-r--r--usr.sbin/smtpd/newaliases.848
-rw-r--r--usr.sbin/smtpd/newaliases.c219
-rw-r--r--usr.sbin/smtpd/newaliases/Makefile15
7 files changed, 187 insertions, 422 deletions
diff --git a/usr.sbin/smtpd/Makefile b/usr.sbin/smtpd/Makefile
index 4159055631e..58ecb1aed87 100644
--- a/usr.sbin/smtpd/Makefile
+++ b/usr.sbin/smtpd/Makefile
@@ -1,8 +1,8 @@
-# $OpenBSD: Makefile,v 1.7 2008/12/05 03:28:37 gilles Exp $
+# $OpenBSD: Makefile,v 1.8 2008/12/17 22:59:36 jacekm Exp $
.include <bsd.own.mk>
-SUBDIR = makemap newaliases smtpd smtpctl
+SUBDIR = makemap smtpd smtpctl
distribution:
${INSTALL} -C -o root -g wheel -m 0644 ${.CURDIR}/smtpd.conf \
diff --git a/usr.sbin/smtpd/makemap.8 b/usr.sbin/smtpd/makemap.8
index 110a32a948a..ae3b737d799 100644
--- a/usr.sbin/smtpd/makemap.8
+++ b/usr.sbin/smtpd/makemap.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: makemap.8,v 1.2 2008/12/04 06:22:05 jmc Exp $
+.\" $OpenBSD: makemap.8,v 1.3 2008/12/17 22:59:36 jacekm Exp $
.\" Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\" Copyright (c) 1988, 1991, 1993
@@ -11,46 +11,58 @@
.\"
.\" $Sendmail: makemap.8,v 8.30 2002/06/27 23:41:04 gshapiro Exp $
.\"
-.Dd $Mdocdate: December 4 2008 $
+.Dd $Mdocdate: December 17 2008 $
.Dt MAKEMAP 8
.Os
.Sh NAME
-.Nm makemap
+.Nm makemap ,
+.Nm newaliases
.Nd create database maps for smtpd
.Sh SYNOPSIS
.Nm makemap
-.Ar mapdesc
+.Ar file
+.Nm newaliases
.Sh DESCRIPTION
.Nm
creates the database maps used by the keyed map lookups in
.Xr smtpd 8 .
-It reads input from the
-.Ar mapdesc
-file and outputs them to
-.Ar mapdesc.db .
+It reads input from
+.Ar file
+and outputs them to
+.Ar file.db .
.Pp
In all cases,
.Nm
-reads lines from the standard input consisting of two
-words separated by whitespace.
+reads lines from
+.Ar file
+consisting of words separated by whitespace.
The first is the database key,
-the second is the value.
+the remaining specify mapped value.
+.Pp
+.Ex -std makemap
.Pp
-Note:
-use
-.Xr newaliases 8
-to create the aliases database, not
-.Nm ,
-as the input formats differ for historical reasons.
+.Nm newaliases
+rebuilds the random access database for the mail aliases file
+.Pa /etc/mail/aliases .
+It must be run each time this file is changed
+in order for the change to take effect.
+.Pp
+.Ex -std newaliases
+.Sh FILES
+.Bl -tag -width "/etc/mail/aliasesXXX" -compact
+.It Pa /etc/mail/aliases
+The mail aliases file.
+.El
.Sh SEE ALSO
.Xr editmap 8 ,
-.Xr newaliases 8 ,
-.Xr smtpd 8
+.Xr smtpd 8 ,
+.Xr aliases 5 ,
+.Xr mailer.conf 5
.Sh HISTORY
-This
+These
.Nm
-command first appeared in
+and
+.Nm newaliases
+commands first appeared in
.Ox 4.5
-as a replacement for the
-.Nm
-command that was shipped with sendmail.
+as the replacement for equivalent commands shipped with sendmail.
diff --git a/usr.sbin/smtpd/makemap.c b/usr.sbin/smtpd/makemap.c
index a291b805301..d8870293d9e 100644
--- a/usr.sbin/smtpd/makemap.c
+++ b/usr.sbin/smtpd/makemap.c
@@ -1,3 +1,5 @@
+/* $OpenBSD: makemap.c,v 1.3 2008/12/17 22:59:36 jacekm Exp $ */
+
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
*
@@ -32,7 +34,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <sysexits.h>
#include <unistd.h>
#include <util.h>
@@ -40,85 +41,85 @@
extern char *__progname;
-static int usage(void);
-int parse_map(const char *);
-int parse_entry(char *, size_t, size_t);
+__dead void usage(void);
+int parse_map(char *);
+int parse_entry(char *, size_t, size_t);
DB *db;
+char *source;
+
+enum program {
+ P_MAKEMAP,
+ P_NEWALIASES
+} mode;
int
main(int argc, char *argv[])
{
- int ch;
- char pathname[MAXPATHLEN];
char dbname[MAXPATHLEN];
- char output[MAXPATHLEN];
-
- while ((ch = getopt(argc, argv, "")) != -1) {
- switch (ch) {
- default:
- return usage();
- }
+ char dest[MAXPATHLEN];
+
+ mode = strcmp(__progname, "newaliases") ? P_MAKEMAP : P_NEWALIASES;
+
+ switch (mode) {
+ case P_MAKEMAP:
+ if (argc != 2)
+ usage();
+ source = argv[1];
+ break;
+ case P_NEWALIASES:
+ if (argc != 1)
+ usage();
+ if (geteuid())
+ errx(1, "need root privileges");
+ source = PATH_ALIASES;
+ break;
+ default:
+ abort();
}
- argc -= optind;
- argv += optind;
- if (argc != 1)
- return usage();
+ if (! bsnprintf(dbname, MAXPATHLEN, "%s.db.XXXXXXXXXXX", source))
+ errx(1, "path too long");
+ if (mkstemp(dbname) == -1)
+ err(1, "mkstemp");
- bzero(pathname, MAXPATHLEN);
- snprintf(pathname, MAXPATHLEN, "%s.XXXXX", argv[0]);
- if (mkdtemp(pathname) == NULL)
- errx(1, "failed to create temporary directory");
-
- bzero(dbname, MAXPATHLEN);
- snprintf(dbname, MAXPATHLEN, "%s/map", pathname);
- db = dbopen(dbname, O_CREAT|O_EXLOCK|O_RDWR|O_SYNC, 0644, DB_HASH,
- NULL);
+ db = dbopen(dbname, O_EXLOCK|O_RDWR|O_SYNC, 0644, DB_HASH, NULL);
if (db == NULL) {
- warn("dbopen");
+ warn("dbopen: %s", dbname);
goto bad;
}
- if (! parse_map(argv[0])) {
- warnx("syntax error in aliases file");
+ if (! parse_map(source))
+ goto bad;
+
+ if (db->close(db) == -1) {
+ warn("dbclose: %s", dbname);
goto bad;
}
- db->close(db);
+ if (chmod(dbname, 0644) == -1) {
+ warn("chmod: %s", dbname);
+ goto bad;
+ }
- snprintf(output, MAXPATHLEN, "%s.db", argv[0]);
+ if (! bsnprintf(dest, MAXPATHLEN, "%s.db", source)) {
+ warnx("path too long");
+ goto bad;
+ }
- if (rename(dbname, output) == -1) {
+ if (rename(dbname, dest) == -1) {
warn("rename");
goto bad;
}
- if (chmod(output, 0644) == -1)
- err(1, "chmod");
-
- if (rmdir(pathname) == -1)
- err(1, "rmdir");
-
- return EX_OK;
+ return 0;
bad:
- if (dbname[0] != '\0')
- if (unlink(dbname) == -1)
- err(1, "unlink: %s", dbname);
- if (rmdir(pathname) == -1)
- err(1, "rmdir: %s", pathname);
+ unlink(dbname);
return 1;
}
-static int
-usage(void)
-{
- fprintf(stderr, "usage: %s filename\n", __progname);
- return EX_USAGE;
-}
-
int
-parse_map(const char *filename)
+parse_map(char *filename)
{
FILE *fp;
char *line;
@@ -127,14 +128,19 @@ parse_map(const char *filename)
char delim[] = { '\\', '\\', '#' };
fp = fopen(filename, "r");
- if (fp == NULL)
- errx(1, "failed to open aliases file");
-
+ if (fp == NULL) {
+ warn("%s", filename);
+ return 0;
+ }
while ((line = fparseln(fp, &len, &lineno, delim, 0)) != NULL) {
if (len == 0)
continue;
- parse_entry(line, len, lineno);
+ if (! parse_entry(line, len, lineno)) {
+ free(line);
+ fclose(fp);
+ return 0;
+ }
free(line);
}
@@ -146,90 +152,116 @@ int
parse_entry(char *line, size_t len, size_t lineno)
{
char *name;
- char *delim;
char *rcpt;
+ char *endp;
char *subrcpt;
- struct alias alias;
- int ret;
DBT key;
DBT val;
name = line;
- while (*name && isspace(*name))
- ++name;
-
- rcpt = delim = strchr(name, ' ');
+ switch (mode) {
+ case P_MAKEMAP:
+ rcpt = strchr(line, ' ');
+ if (rcpt == NULL)
+ rcpt = strchr(line, '\t');
+ break;
+ case P_NEWALIASES:
+ rcpt = strchr(line, ':');
+ break;
+ default:
+ abort();
+ }
if (rcpt == NULL)
- rcpt = delim = strchr(name, '\t');
- if (rcpt == NULL || name == rcpt)
goto bad;
+ *rcpt++ = '\0';
-
- *delim-- = 0;
- while (isspace(*delim))
- *delim-- = '\0';
- rcpt++;
- while (*rcpt && isspace(*rcpt))
- ++rcpt;
- if (*rcpt == '\0')
+ /* name: strip initial whitespace. */
+ while (isspace(*name))
+ ++name;
+ if (*name == '\0')
goto bad;
- /* At this point, name points to nul-terminate name */
- for (; (subrcpt = strsep(&rcpt, ",")) != NULL;) {
- while (*subrcpt && isspace(*subrcpt))
- ++subrcpt;
- if (*subrcpt == '\0')
- continue;
-
- delim = subrcpt + strlen(subrcpt);
- delim--;
- while (isspace(*delim))
- *delim-- = '\0';
+ /* name: strip trailing whitespace. */
+ endp = name + strlen(name) - 1;
+ while (name < endp && isspace(*endp))
+ *endp-- = '\0';
+
+ /* Check for dups. */
+ key.data = name;
+ key.size = strlen(name) + 1;
+ if (db->get(db, &key, &val, 0) == 0) {
+ warnx("%s:%zd: duplicate entry for %s", source, lineno,
+ key.data);
+ return 0;
+ }
- key.data = name;
- key.size = strlen(name) + 1;
+ /* At this point name and rcpt are non-zero nul-terminated strings. */
+ while ((subrcpt = strsep(&rcpt, ",")) != NULL) {
+ struct alias alias;
+ void *p;
- if ((ret = db->get(db, &key, &val, 0)) == -1)
- errx(1, "db->get()");
+ /* subrcpt: strip initial whitespace. */
+ while (isspace(*subrcpt))
+ ++subrcpt;
+ if (*subrcpt == '\0')
+ goto bad;
- if (ret == 1) {
- val.data = NULL;
- val.size = 0;
- }
+ /* subrcpt: strip trailing whitespace. */
+ endp = subrcpt + strlen(subrcpt) - 1;
+ while (subrcpt < endp && isspace(*endp))
+ *endp-- = '\0';
if (! alias_parse(&alias, subrcpt))
goto bad;
- if (val.size == 0) {
- val.size = sizeof(struct alias);
- val.data = &alias;
-
- if ((ret = db->put(db, &key, &val, 0)) == -1)
- errx(1, "db->get()");
+ key.data = name;
+ key.size = strlen(name) + 1;
+ val.data = NULL;
+ val.size = 0;
+ if (db->get(db, &key, &val, 0) == -1) {
+ warn("dbget");
+ return 0;
}
- else {
- void *p;
- p = calloc(val.size + sizeof(alias), 1);
- if (p == NULL)
- errx(1, "calloc: memory exhausted");
- memcpy(p, val.data, val.size);
- memcpy((u_int8_t *)p + val.size, &alias, sizeof(alias));
-
- val.data = p;
- val.size += sizeof(alias);
-
- if ((ret = db->put(db, &key, &val, 0)) == -1)
- errx(1, "db->get()");
+ p = calloc(1, val.size + sizeof(struct alias));
+ if (p == NULL) {
+ warn("calloc");
+ return 0;
+ }
+ memcpy(p, val.data, val.size);
+ memcpy((u_int8_t *)p + val.size, &alias, sizeof(struct alias));
+ val.data = p;
+ val.size += sizeof(struct alias);
+ if (db->put(db, &key, &val, 0) == -1) {
+ warn("dbput");
free(p);
+ return 0;
}
- db->sync(db, 0);
+
+ free(p);
}
return 1;
bad:
- warnx("line %zd: invalid entry: %s", lineno, line);
+ /* The actual line is not printed; it may be mangled by above code. */
+ warnx("%s:%zd: invalid entry", source, lineno);
return 0;
}
+
+void
+usage(void)
+{
+ switch (mode) {
+ case P_MAKEMAP:
+ fprintf(stderr, "usage: %s file\n", __progname);
+ break;
+ case P_NEWALIASES:
+ fprintf(stderr, "usage: %s\n", __progname);
+ break;
+ default:
+ abort();
+ }
+ exit(1);
+}
diff --git a/usr.sbin/smtpd/makemap/Makefile b/usr.sbin/smtpd/makemap/Makefile
index 00bb6db2290..052439431f1 100644
--- a/usr.sbin/smtpd/makemap/Makefile
+++ b/usr.sbin/smtpd/makemap/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.2 2008/12/11 23:04:45 gilles Exp $
+# $OpenBSD: Makefile,v 1.3 2008/12/17 22:59:39 jacekm Exp $
.PATH: ${.CURDIR}/..
@@ -10,6 +10,9 @@ BINMODE?=555
BINDIR= /usr/bin
MAN= makemap.8
+LINKS= ${BINDIR}/makemap ${BINDIR}/newaliases
+MLINKS= makemap.8 newaliases.8
+
SRCS= makemap.c aliases.c map.c log.c util.c
LDFLAGS= -lutil
.include <bsd.prog.mk>
diff --git a/usr.sbin/smtpd/newaliases.8 b/usr.sbin/smtpd/newaliases.8
deleted file mode 100644
index a5b5b99135c..00000000000
--- a/usr.sbin/smtpd/newaliases.8
+++ /dev/null
@@ -1,48 +0,0 @@
-.\" $OpenBSD: newaliases.8,v 1.2 2008/12/04 06:22:05 jmc Exp $
-.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.
-.\" All rights reserved.
-.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved.
-.\" Copyright (c) 1985, 1990, 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.
-.\"
-.\"
-.\" $Sendmail: newaliases.1,v 8.19 2001/10/10 03:23:17 ca Exp $
-.\"
-.Dd $Mdocdate: December 4 2008 $
-.Dt NEWALIASES 8
-.Os
-.Sh NAME
-.Nm newaliases
-.Nd rebuild the database for the mail aliases file
-.Sh SYNOPSIS
-.Nm newaliases
-.Sh DESCRIPTION
-.Nm
-rebuilds the random access database for the mail aliases file
-.Pa /etc/mail/aliases .
-It must be run each time this file is changed
-in order for the change to take effect.
-.Pp
-.Ex -std newaliases
-.Sh FILES
-.Bl -tag -width "/etc/mail/aliasesXXX" -compact
-.It Pa /etc/mail/aliases
-The mail aliases file.
-.El
-.Sh SEE ALSO
-.Xr aliases 5 ,
-.Xr mailer.conf 5 ,
-.Xr makemap 8 ,
-.Xr smtpd 8
-.Sh HISTORY
-This
-.Nm
-command first appeared in
-.Ox 4.5
-as a replacement for the
-.Nm
-command that was shipped with sendmail.
diff --git a/usr.sbin/smtpd/newaliases.c b/usr.sbin/smtpd/newaliases.c
deleted file mode 100644
index 5634541074a..00000000000
--- a/usr.sbin/smtpd/newaliases.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/tree.h>
-#include <sys/queue.h>
-#include <sys/param.h>
-
-#include <sys/socket.h>
-
-#include <ctype.h>
-#include <db.h>
-#include <err.h>
-#include <errno.h>
-#include <event.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <util.h>
-
-#include "smtpd.h"
-
-extern char *__progname;
-
-__dead void usage(void);
-int parse_aliases(const char *);
-int parse_entry(char *, size_t, size_t);
-
-DB *db;
-
-int
-main(int argc, char *argv[])
-{
- char dbname[MAXPATHLEN];
- int ch;
-
- if (argc != 1)
- usage();
-
- if (strlcpy(dbname, PATH_ALIASESDB ".XXXXXXXXXXX", MAXPATHLEN)
- >= MAXPATHLEN)
- errx(1, "path truncation");
- if (mkstemp(dbname) == -1)
- err(1, "mkstemp");
-
- db = dbopen(dbname, O_EXLOCK|O_RDWR|O_SYNC, 0644, DB_HASH, NULL);
- if (db == NULL) {
- warn("dbopen: %s", dbname);
- goto bad;
- }
-
- if (! parse_aliases(PATH_ALIASES))
- goto bad;
-
- if (db->close(db) == -1) {
- warn("dbclose: %s", dbname);
- goto bad;
- }
-
- if (chmod(dbname, 0644) == -1) {
- warn("chmod: %s", dbname);
- goto bad;
- }
-
- if (rename(dbname, PATH_ALIASESDB) == -1) {
- warn("rename");
- goto bad;
- }
-
- return 0;
-bad:
- unlink(dbname);
- return 1;
-}
-
-int
-parse_aliases(const char *filename)
-{
- FILE *fp;
- char *line;
- size_t len;
- size_t lineno = 0;
- char delim[] = { '\\', '\\', '#' };
-
- fp = fopen(filename, "r");
- if (fp == NULL) {
- warn("%s", filename);
- return 0;
- }
-
- while ((line = fparseln(fp, &len, &lineno, delim, 0)) != NULL) {
- if (len == 0)
- continue;
- if (! parse_entry(line, len, lineno)) {
- free(line);
- fclose(fp);
- return 0;
- }
- free(line);
- }
-
- fclose(fp);
- return 1;
-}
-
-int
-parse_entry(char *line, size_t len, size_t lineno)
-{
- char *name;
- char *rcpt;
- char *endp;
- char *subrcpt;
- DBT key;
- DBT val;
-
- name = line;
- rcpt = strchr(line, ':');
- if (rcpt == NULL)
- goto bad;
- *rcpt++ = '\0';
-
- /* name: strip initial whitespace. */
- while (isspace(*name))
- ++name;
- if (*name == '\0')
- goto bad;
-
- /* name: strip trailing whitespace. */
- endp = name + strlen(name) - 1;
- while (name < endp && isspace(*endp))
- *endp-- = '\0';
-
- /* Check for dups. */
- key.data = name;
- key.size = strlen(name) + 1;
- if (db->get(db, &key, &val, 0) == 0) {
- warnx("%s:%zd: duplicate entry for %s", PATH_ALIASES, lineno,
- key.data);
- return 0;
- }
-
- /* At this point name and rcpt are non-zero nul-terminated strings. */
- while ((subrcpt = strsep(&rcpt, ",")) != NULL) {
- struct alias alias;
- void *p;
-
- /* subrcpt: strip initial whitespace. */
- while (isspace(*subrcpt))
- ++subrcpt;
- if (*subrcpt == '\0')
- goto bad;
-
- /* subrcpt: strip trailing whitespace. */
- endp = subrcpt + strlen(subrcpt) - 1;
- while (subrcpt < endp && isspace(*endp))
- *endp-- = '\0';
-
- if (! alias_parse(&alias, subrcpt))
- goto bad;
-
- key.data = name;
- key.size = strlen(name) + 1;
- val.data = NULL;
- val.size = 0;
- if (db->get(db, &key, &val, 0) == -1) {
- warn("dbget");
- return 0;
- }
-
- p = calloc(1, val.size + sizeof(struct alias));
- if (p == NULL) {
- warn("calloc");
- return 0;
- }
- memcpy(p, val.data, val.size);
- memcpy((u_int8_t *)p + val.size, &alias, sizeof(struct alias));
-
- val.data = p;
- val.size += sizeof(struct alias);
- if (db->put(db, &key, &val, 0) == -1) {
- warn("dbput");
- free(p);
- return 0;
- }
-
- free(p);
- }
-
- return 1;
-
-bad:
- /* The actual line is not printed; it may be mangled by above code. */
- warnx("%s:%zd: invalid entry", PATH_ALIASES, lineno);
- return 0;
-}
-
-void
-usage(void)
-{
- fprintf(stderr, "usage: %s\n", __progname);
- exit(1);
-}
diff --git a/usr.sbin/smtpd/newaliases/Makefile b/usr.sbin/smtpd/newaliases/Makefile
deleted file mode 100644
index 9322dc11cda..00000000000
--- a/usr.sbin/smtpd/newaliases/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $OpenBSD: Makefile,v 1.2 2008/12/11 23:04:45 gilles Exp $
-
-.PATH: ${.CURDIR}/..
-
-PROG= newaliases
-BINOWN= root
-
-BINMODE?=555
-
-BINDIR= /usr/bin
-MAN= newaliases.8
-
-SRCS= newaliases.c aliases.c map.c log.c util.c
-LDFLAGS= -lutil
-.include <bsd.prog.mk>