diff options
author | June McEnroe <june@causal.agency> | 2022-04-03 17:14:28 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2022-04-03 17:15:56 -0400 |
commit | 7d2303dca9ce1eba6f3fc7cbe6e418b78c5aa1c1 (patch) | |
tree | 8a274ae9213064849c63410007e754c596c925b4 | |
parent | Rename client->error to client->remove (diff) | |
download | pounce-7d2303dca9ce1eba6f3fc7cbe6e418b78c5aa1c1.tar.gz pounce-7d2303dca9ce1eba6f3fc7cbe6e418b78c5aa1c1.zip |
Allow quitting pounce from clients
Diffstat (limited to '')
-rw-r--r-- | bounce.c | 3 | ||||
-rw-r--r-- | bounce.h | 1 | ||||
-rw-r--r-- | client.c | 14 | ||||
-rw-r--r-- | pounce.1 | 22 |
4 files changed, 35 insertions, 5 deletions
diff --git a/bounce.c b/bounce.c index cd4898a..4146c0e 100644 --- a/bounce.c +++ b/bounce.c @@ -441,7 +441,7 @@ int main(int argc, char *argv[]) { } } - if (signals[SIGINT] || signals[SIGTERM]) { + if (clientQuit || signals[SIGINT] || signals[SIGTERM]) { break; } if (signals[SIGALRM]) { @@ -458,6 +458,7 @@ int main(int argc, char *argv[]) { } } + if (clientQuit && clientQuit[0]) quit = clientQuit; serverFormat("QUIT :%s\r\n", quit); serverClose(); for (size_t i = clientIndex; i < event.len; ++i) { diff --git a/bounce.h b/bounce.h index fa810a2..e196ed0 100644 --- a/bounce.h +++ b/bounce.h @@ -228,6 +228,7 @@ extern enum Cap clientCaps; extern char *clientOrigin; extern char *clientPass; extern char *clientAway; +extern char *clientQuit; struct Client *clientAlloc(int sock, struct tls *tls); void clientFree(struct Client *client); void clientRecv(struct Client *client); diff --git a/client.c b/client.c index a20700d..19296ed 100644 --- a/client.c +++ b/client.c @@ -46,6 +46,7 @@ enum Cap clientCaps = CapServerTime | CapConsumer | CapPassive | CapSTS; char *clientOrigin; char *clientPass; char *clientAway; +char *clientQuit; static size_t active; @@ -279,9 +280,16 @@ static void handleAuthenticate(struct Client *client, struct Message *msg) { } static void handleQuit(struct Client *client, struct Message *msg) { - (void)msg; - clientFormat(client, "ERROR :Detaching\r\n"); - client->remove = true; + const char *mesg = msg->params[0]; + if (mesg && !strncmp(mesg, "pounce", 6) && (!mesg[6] || mesg[6] == ' ')) { + mesg += 6; + mesg += strspn(mesg, " "); + clientQuit = strdup(mesg); + if (!clientQuit) err(EX_OSERR, "strdup"); + } else { + clientFormat(client, "ERROR :Detaching\r\n"); + client->remove = true; + } } static bool hasTag(const char *tags, const char *tag) { diff --git a/pounce.1 b/pounce.1 index a4a20c9..3bdfc90 100644 --- a/pounce.1 +++ b/pounce.1 @@ -1,4 +1,4 @@ -.Dd October 5, 2021 +.Dd April 3, 2022 .Dt POUNCE 1 .Os . @@ -472,6 +472,26 @@ The nickname and real name sent by clients are ignored. . .Pp +Normally a client sending +.Ic QUIT +will simply be disconnected from +.Nm . +If, however, +the quit message +starts with the keyword +.Nm , +.Nm +itself will quit. +The remainder of the message +following the keyword +will be used as +.Nm Ap s +quit message, +or the default set by +.Cm quit +if there isn't any. +. +.Pp Clients which request the .Sy causal.agency/passive capability |