summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorGilles Chehade <gilles@cvs.openbsd.org>2010-01-10 16:42:36 +0000
committerGilles Chehade <gilles@cvs.openbsd.org>2010-01-10 16:42:36 +0000
commit6da0bc7f38345d7dd3b9755ca396488764f8a274 (patch)
tree224f5d8e066b53562cac30eb68f414a99b1d2ee8 /usr.sbin
parentb39b103c9261484e58be3bd3bc32f86fca82d39d (diff)
- teach runner how to remove a message from queue given a message id/uid
and assuming message is not in processing/scheduled state - teach smtpctl how to request message removal from runner discussed with todd@, idea ok jacekm@
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/smtpd/control.c41
-rw-r--r--usr.sbin/smtpd/parser.c9
-rw-r--r--usr.sbin/smtpd/parser.h3
-rw-r--r--usr.sbin/smtpd/runner.c61
-rw-r--r--usr.sbin/smtpd/smtpctl.c29
-rw-r--r--usr.sbin/smtpd/smtpd.h9
6 files changed, 129 insertions, 23 deletions
diff --git a/usr.sbin/smtpd/control.c b/usr.sbin/smtpd/control.c
index dae67ae6aae..53d94339755 100644
--- a/usr.sbin/smtpd/control.c
+++ b/usr.sbin/smtpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.45 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: control.c,v 1.46 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -363,6 +363,27 @@ control_dispatch_ext(int fd, short event, void *arg)
imsg_compose_event(env->sc_ievs[PROC_RUNNER], IMSG_RUNNER_SCHEDULE, 0, 0, -1, s, sizeof(*s));
break;
}
+
+ case IMSG_RUNNER_REMOVE: {
+ struct remove *s = imsg.data;
+
+ if (euid)
+ goto badcred;
+
+ if (IMSG_DATA_SIZE(&imsg) != sizeof(*s))
+ goto badcred;
+
+ s->fd = fd;
+
+ if (! valid_message_id(s->mid) && ! valid_message_uid(s->mid)) {
+ imsg_compose_event(&c->iev, IMSG_CTL_FAIL, 0, 0, -1,
+ NULL, 0);
+ break;
+ }
+
+ imsg_compose_event(env->sc_ievs[PROC_RUNNER], IMSG_RUNNER_REMOVE, 0, 0, -1, s, sizeof(*s));
+ break;
+ }
/*
case IMSG_CONF_RELOAD: {
struct reload r;
@@ -766,6 +787,24 @@ control_dispatch_runner(int sig, short event, void *p)
imsg_compose_event(&c->iev, IMSG_CTL_FAIL, 0, 0, -1, NULL, 0);
break;
}
+ case IMSG_RUNNER_REMOVE: {
+ struct remove *s = imsg.data;
+ struct ctl_conn *c;
+
+ IMSG_SIZE_CHECK(s);
+
+ if ((c = control_connbyfd(s->fd)) == NULL) {
+ log_warn("control_dispatch_runner: fd %d not found", s->fd);
+ imsg_free(&imsg);
+ return;
+ }
+
+ if (s->ret)
+ imsg_compose_event(&c->iev, IMSG_CTL_OK, 0, 0, -1, NULL, 0);
+ else
+ imsg_compose_event(&c->iev, IMSG_CTL_FAIL, 0, 0, -1, NULL, 0);
+ break;
+ }
default:
log_warnx("control_dispatch_runner: got imsg %d",
imsg.hdr.type);
diff --git a/usr.sbin/smtpd/parser.c b/usr.sbin/smtpd/parser.c
index e76e63f0295..055ba67d07f 100644
--- a/usr.sbin/smtpd/parser.c
+++ b/usr.sbin/smtpd/parser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.c,v 1.10 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: parser.c,v 1.11 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -61,6 +61,7 @@ static const struct token t_show[];
static const struct token t_pause[];
static const struct token t_resume[];
static const struct token t_schedule[];
+static const struct token t_remove[];
static const struct token t_log[];
static const struct token t_main[] = {
@@ -71,6 +72,7 @@ static const struct token t_main[] = {
{KEYWORD, "resume", NONE, t_resume},
{KEYWORD, "stop", SHUTDOWN, NULL},
{KEYWORD, "schedule", SCHEDULE, t_schedule},
+ {KEYWORD, "remove", REMOVE, t_remove},
{KEYWORD, "log", NONE, t_log},
{ENDTOKEN, "", NONE, NULL}
};
@@ -101,6 +103,11 @@ static const struct token t_schedule[] = {
{ENDTOKEN, "", NONE, NULL}
};
+static const struct token t_remove[] = {
+ {VARIABLE, "message id/uid", REMOVE, NULL},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
static const struct token t_log[] = {
{KEYWORD, "verbose", LOG_VERBOSE, NULL},
{KEYWORD, "brief", LOG_BRIEF, NULL},
diff --git a/usr.sbin/smtpd/parser.h b/usr.sbin/smtpd/parser.h
index 39f0a7b74ad..5a9b56c9c04 100644
--- a/usr.sbin/smtpd/parser.h
+++ b/usr.sbin/smtpd/parser.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.h,v 1.9 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: parser.h,v 1.10 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -22,6 +22,7 @@ enum actions {
RELOAD,
MONITOR,
SCHEDULE,
+ REMOVE,
LOG_VERBOSE,
LOG_BRIEF,
SHOW_QUEUE,
diff --git a/usr.sbin/smtpd/runner.c b/usr.sbin/smtpd/runner.c
index 4f541e5978e..a2f9b1ac808 100644
--- a/usr.sbin/smtpd/runner.c
+++ b/usr.sbin/smtpd/runner.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: runner.c,v 1.77 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: runner.c,v 1.78 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -83,6 +83,9 @@ struct batch *batch_lookup(struct smtpd *, struct message *);
int runner_force_envelope_schedule(char *);
int runner_force_message_schedule(char *);
+int runner_force_envelope_remove(char *);
+int runner_force_message_remove(char *);
+
void
runner_sig_handler(int sig, short event, void *p)
{
@@ -214,6 +217,20 @@ runner_dispatch_control(int sig, short event, void *p)
imsg_compose_event(iev, IMSG_RUNNER_SCHEDULE, 0, 0, -1, s, sizeof(*s));
break;
}
+ case IMSG_RUNNER_REMOVE: {
+ struct remove *s = imsg.data;
+
+ IMSG_SIZE_CHECK(s);
+
+ s->ret = 0;
+ if (valid_message_uid(s->mid))
+ s->ret = runner_force_envelope_remove(s->mid);
+ else if (valid_message_id(s->mid))
+ s->ret = runner_force_message_remove(s->mid);
+
+ imsg_compose_event(iev, IMSG_RUNNER_REMOVE, 0, 0, -1, s, sizeof(*s));
+ break;
+ }
default:
log_warnx("runner_dispatch_control: got imsg %d",
imsg.hdr.type);
@@ -930,6 +947,48 @@ runner_force_message_schedule(char *mid)
return 1;
}
+
+int
+runner_force_envelope_remove(char *mid)
+{
+ struct message message;
+
+ if (! queue_load_envelope(&message, mid))
+ return 0;
+
+ if (! message.flags & (F_MESSAGE_PROCESSING|F_MESSAGE_SCHEDULED))
+ return 0;
+
+ if (! queue_remove_envelope(&message))
+ return 0;
+
+ return 1;
+}
+
+int
+runner_force_message_remove(char *mid)
+{
+ char path[MAXPATHLEN];
+ DIR *dirp;
+ struct dirent *dp;
+
+ if (! bsnprintf(path, MAXPATHLEN, "%s/%d/%s/envelopes",
+ PATH_QUEUE, queue_hash(mid), mid))
+ return 0;
+
+ dirp = opendir(path);
+ if (dirp == NULL)
+ return 0;
+
+ while ((dp = readdir(dirp)) != NULL) {
+ if (valid_message_uid(dp->d_name))
+ runner_force_envelope_remove(dp->d_name);
+ }
+ closedir(dirp);
+
+ return 1;
+}
+
void
runner_purge_run(void)
{
diff --git a/usr.sbin/smtpd/smtpctl.c b/usr.sbin/smtpd/smtpctl.c
index 93d32fd13a5..c81e9da9ce0 100644
--- a/usr.sbin/smtpd/smtpctl.c
+++ b/usr.sbin/smtpd/smtpctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpctl.c,v 1.45 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: smtpctl.c,v 1.46 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
@@ -48,23 +48,6 @@ __dead void usage(void);
int show_command_output(struct imsg*);
int show_stats_output(struct imsg *);
-/*
-struct imsgname {
- int type;
- char *name;
- void (*func)(struct imsg *);
-};
-
-struct imsgname imsgs[] = {
- { IMSG_CTL_SHUTDOWN, "stop", NULL },
- { IMSG_CONF_RELOAD, "reload", NULL },
- { 0, NULL, NULL }
-};
-struct imsgname imsgunknown = {
- -1, "<unknown>", NULL
-};
-*/
-
int proctype;
struct imsgbuf *ibuf;
@@ -189,6 +172,15 @@ connected:
imsg_compose(ibuf, IMSG_RUNNER_SCHEDULE, 0, 0, -1, &s, sizeof (s));
break;
}
+ case REMOVE: {
+ struct remove s;
+
+ s.fd = -1;
+ bzero(s.mid, sizeof (s.mid));
+ strlcpy(s.mid, res->data, sizeof (s.mid));
+ imsg_compose(ibuf, IMSG_RUNNER_REMOVE, 0, 0, -1, &s, sizeof (s));
+ break;
+ }
case MONITOR:
/* XXX */
break;
@@ -224,6 +216,7 @@ connected:
/* case RELOAD:*/
case SHUTDOWN:
case SCHEDULE:
+ case REMOVE:
case PAUSE_MDA:
case PAUSE_MTA:
case PAUSE_SMTP:
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index 8b1fe8bdba1..7e7c4fee1e9 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.167 2010/01/03 14:37:37 chl Exp $ */
+/* $OpenBSD: smtpd.h,v 1.168 2010/01/10 16:42:35 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -157,6 +157,7 @@ enum imsg_type {
IMSG_RUNNER_UPDATE_ENVELOPE,
IMSG_RUNNER_STATS,
IMSG_RUNNER_SCHEDULE,
+ IMSG_RUNNER_REMOVE,
IMSG_BATCH_CREATE,
IMSG_BATCH_APPEND,
@@ -700,6 +701,12 @@ struct sched {
int ret;
};
+struct remove {
+ int fd;
+ char mid[MAX_ID_SIZE];
+ int ret;
+};
+
struct reload {
int fd;
int ret;