summaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-07-10 04:52:00 +0200
committerLennart Poettering <lennart@poettering.net>2010-07-10 04:52:00 +0200
commit3f6c78dcebdc0904d3b614da07e9ec8d84de2532 (patch)
tree71dd11b3f29bb6341270fec2e0afe0fdf8dc96be /src/socket.c
parent82c64bf578623f0678b4de1ac08c6bd8e5d95662 (diff)
service: allow immediate stopping while starting
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/socket.c b/src/socket.c
index 6cbb14137e..7ff2927aff 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -1166,21 +1166,23 @@ static int socket_stop(Unit *u) {
assert(s);
- /* We cannot fulfill this request right now, try again later
- * please! */
- if (s->state == SOCKET_START_PRE ||
- s->state == SOCKET_START_POST)
- return -EAGAIN;
-
/* Already on it */
if (s->state == SOCKET_STOP_PRE ||
s->state == SOCKET_STOP_PRE_SIGTERM ||
s->state == SOCKET_STOP_PRE_SIGKILL ||
s->state == SOCKET_STOP_POST ||
s->state == SOCKET_FINAL_SIGTERM ||
- s->state == SOCKET_FINAL_SIGTERM)
+ s->state == SOCKET_FINAL_SIGKILL)
return 0;
+ /* If there's already something running we go directly into
+ * kill mode. */
+ if (s->state == SOCKET_START_PRE ||
+ s->state == SOCKET_START_POST) {
+ socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, true);
+ return -EAGAIN;
+ }
+
assert(s->state == SOCKET_LISTENING || s->state == SOCKET_RUNNING);
socket_enter_stop_pre(s, true);