summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/smtpd/parser.c16
-rw-r--r--usr.sbin/smtpd/parser.h4
-rw-r--r--usr.sbin/smtpd/smtpctl.88
-rw-r--r--usr.sbin/smtpd/smtpctl.c79
-rw-r--r--usr.sbin/smtpd/smtpd.h3
-rw-r--r--usr.sbin/smtpd/util.c19
6 files changed, 112 insertions, 17 deletions
diff --git a/usr.sbin/smtpd/parser.c b/usr.sbin/smtpd/parser.c
index ca18395157e..6c61abfdd20 100644
--- a/usr.sbin/smtpd/parser.c
+++ b/usr.sbin/smtpd/parser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.c,v 1.27 2012/08/30 22:06:00 gilles Exp $ */
+/* $OpenBSD: parser.c,v 1.28 2012/10/10 19:39:11 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -54,6 +54,8 @@ static const struct token t_pause[];
static const struct token t_remove[];
static const struct token t_resume[];
static const struct token t_log[];
+static const struct token t_show_envelope[];
+static const struct token t_show_message[];
static const struct token t_main[] = {
{KEYWORD, "schedule-id", NONE, t_schedule_id},
@@ -81,6 +83,18 @@ static const struct token t_schedule_id[] = {
static const struct token t_show[] = {
{KEYWORD, "queue", SHOW_QUEUE, NULL},
{KEYWORD, "stats", SHOW_STATS, NULL},
+ {KEYWORD, "envelope", NONE, t_show_envelope},
+ {KEYWORD, "message", SHOW_MESSAGE, t_show_message},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
+static const struct token t_show_envelope[] = {
+ {VARIABLE, "evpid", SHOW_ENVELOPE, NULL},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
+static const struct token t_show_message[] = {
+ {VARIABLE, "evpid", SHOW_MESSAGE, NULL},
{ENDTOKEN, "", NONE, NULL}
};
diff --git a/usr.sbin/smtpd/parser.h b/usr.sbin/smtpd/parser.h
index 31a9780f3ea..c6fb452a8dc 100644
--- a/usr.sbin/smtpd/parser.h
+++ b/usr.sbin/smtpd/parser.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.h,v 1.21 2012/08/30 22:06:00 gilles Exp $ */
+/* $OpenBSD: parser.h,v 1.22 2012/10/10 19:39:11 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -27,6 +27,8 @@ enum actions {
SHOW_QUEUE,
SHOW_STATS,
SHOW_SIZES,
+ SHOW_ENVELOPE,
+ SHOW_MESSAGE,
PAUSE_MDA,
PAUSE_MTA,
PAUSE_SMTP,
diff --git a/usr.sbin/smtpd/smtpctl.8 b/usr.sbin/smtpd/smtpctl.8
index e2ee4bee7ca..f74a9ad78a5 100644
--- a/usr.sbin/smtpd/smtpctl.8
+++ b/usr.sbin/smtpd/smtpctl.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: smtpctl.8,v 1.27 2012/04/07 14:11:11 jmc Exp $
+.\" $OpenBSD: smtpctl.8,v 1.28 2012/10/10 19:39:11 gilles Exp $
.\"
.\" Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: April 7 2012 $
+.Dd $Mdocdate: October 10 2012 $
.Dt SMTPCTL 8
.Os
.Sh NAME
@@ -60,6 +60,10 @@ Marks all envelopes as ready for immediate delivery.
.It Cm schedule-id Ar envelope-id | message-id
Marks a single envelope, or all envelopes with the same message ID,
as ready for immediate delivery.
+.It Cm show envelope Ar envelope-id
+Displays envelope's content for the given ID.
+.It Cm show message Ar envelope-id
+Displays message content for the given ID.
.It Cm show queue
Displays information concerning envelopes
that are currently in a queue.
diff --git a/usr.sbin/smtpd/smtpctl.c b/usr.sbin/smtpd/smtpctl.c
index 67148ec8443..4cca0dc058c 100644
--- a/usr.sbin/smtpd/smtpctl.c
+++ b/usr.sbin/smtpd/smtpctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpctl.c,v 1.91 2012/09/19 20:08:53 eric Exp $ */
+/* $OpenBSD: smtpctl.c,v 1.92 2012/10/10 19:39:11 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -42,6 +42,10 @@
#include "parser.h"
#include "log.h"
+#define PATH_CAT "/bin/cat"
+#define PATH_GZCAT "/bin/gzcat"
+#define PATH_QUEUE "/queue"
+
void usage(void);
static void setup_env(struct smtpd *);
static int show_command_output(struct imsg *);
@@ -49,6 +53,9 @@ static void show_stats_output(void);
static void show_queue(int);
static void show_queue_envelope(struct envelope *, int);
static void getflag(uint *, int, char *, char *, size_t);
+static void display(const char *);
+static void show_envelope(const char *);
+static void show_message(const char *);
int proctype;
struct imsgbuf *ibuf;
@@ -124,6 +131,12 @@ main(int argc, char *argv[])
case SHOW_QUEUE:
show_queue(0);
break;
+ case SHOW_ENVELOPE:
+ show_envelope(res->data);
+ break;
+ case SHOW_MESSAGE:
+ show_message(res->data);
+ break;
default:
goto connected;
}
@@ -161,17 +174,8 @@ connected:
case SCHEDULE:
case REMOVE: {
uint64_t ulval;
- char *ep;
-
- errno = 0;
- ulval = strtoull(res->data, &ep, 16);
- if (res->data[0] == '\0' || *ep != '\0')
- errx(1, "invalid msgid/evpid");
- if (errno == ERANGE && ulval == ULLONG_MAX)
- errx(1, "invalid msgid/evpid");
- if (ulval == 0)
- errx(1, "invalid msgid/evpid");
+ ulval = strtoevpid(res->data);
if (res->action == SCHEDULE)
imsg_compose(ibuf, IMSG_SCHEDULER_SCHEDULE, 0, 0, -1, &ulval,
sizeof(ulval));
@@ -465,3 +469,56 @@ getflag(uint *bitmap, int bit, char *bitstr, char *buf, size_t len)
strlcat(buf, ",", len);
}
}
+
+static void
+display(const char *s)
+{
+ arglist args;
+ char *cmd;
+
+ if (env->sc_queue_flags & QUEUE_COMPRESS)
+ cmd = PATH_GZCAT;
+ else
+ cmd = PATH_CAT;
+
+ bzero(&args, sizeof(args));
+ addargs(&args, "%s", cmd);
+ addargs(&args, "%s", s);
+ execvp(cmd, args.list);
+ errx(1, "execvp");
+}
+
+static void
+show_envelope(const char *s)
+{
+ char buf[MAXPATHLEN];
+ uint64_t evpid;
+
+ evpid = strtoevpid(s);
+ if (! bsnprintf(buf, sizeof(buf), "%s%s/%02x/%08x%s/%016" PRIx64,
+ PATH_SPOOL,
+ PATH_QUEUE,
+ evpid_to_msgid(evpid) & 0xff,
+ evpid_to_msgid(evpid),
+ PATH_ENVELOPES, evpid))
+ errx(1, "unable to retrieve envelope");
+
+ display(buf);
+}
+
+static void
+show_message(const char *s)
+{
+ char buf[MAXPATHLEN];
+ uint32_t msgid;
+
+ msgid = evpid_to_msgid(strtoevpid(s));
+ if (! bsnprintf(buf, sizeof(buf), "%s%s/%02x/%08x/message",
+ PATH_SPOOL,
+ PATH_QUEUE,
+ msgid & 0xff,
+ msgid))
+ errx(1, "unable to retrieve message");
+
+ display(buf);
+}
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index eb2953ec413..782473adba2 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.383 2012/10/10 18:02:37 eric Exp $ */
+/* $OpenBSD: smtpd.h,v 1.384 2012/10/10 19:39:11 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -1175,6 +1175,7 @@ void log_envelope(const struct envelope *, const char *, const char *);
void session_socket_blockmode(int, enum blockmodes);
void session_socket_no_linger(int);
int session_socket_error(int);
+uint64_t strtoevpid(const char *);
/* waitq.c */
int waitq_wait(void *, void (*)(void *, void *, void *), void *);
diff --git a/usr.sbin/smtpd/util.c b/usr.sbin/smtpd/util.c
index 54e1d575df0..5f00474ee21 100644
--- a/usr.sbin/smtpd/util.c
+++ b/usr.sbin/smtpd/util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: util.c,v 1.86 2012/10/07 15:46:38 chl Exp $ */
+/* $OpenBSD: util.c,v 1.87 2012/10/10 19:39:11 gilles Exp $ */
/*
* Copyright (c) 2000,2001 Markus Friedl. All rights reserved.
@@ -1095,3 +1095,20 @@ log_envelope(const struct envelope *evp, const char *extra, const char *status)
extra,
status);
}
+
+uint64_t
+strtoevpid(const char *s)
+{
+ uint64_t ulval;
+ char *ep;
+
+ errno = 0;
+ ulval = strtoull(s, &ep, 16);
+ if (s[0] == '\0' || *ep != '\0')
+ errx(1, "invalid msgid/evpid");
+ if (errno == ERANGE && ulval == ULLONG_MAX)
+ errx(1, "invalid msgid/evpid");
+ if (ulval == 0)
+ errx(1, "invalid msgid/evpid");
+ return (ulval);
+}