Module: ngircd.git
Branch: master
Commit: 4b15f10fbb036da96caaf9ffcffd27cd9f6815d2
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=4b15f10f…
Author: Alexander Barton <alex(a)barton.de>
Date: Mon Feb 11 13:57:54 2013 +0100
Allow "@" character in user names for authentication
The "@" character isn't allowed in IRC usernames, because it is the
separator between user name and hostname in IRC masks:
<nickname>!<username>@<hostname>
This patch accepts user names including "@" characters, saves the
unmodified name for authentication but stores only the part in front
of the "@" character as "IRC user name". And the latter is how
ircd2.11, Bahamut, and irc-seven behave as well.
Closes bug #155.
---
src/ngircd/irc-login.c | 10 ++++++++--
src/ngircd/login.c | 10 +++++++++-
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c
index e7d83ef..52c6e46 100644
--- a/src/ngircd/irc-login.c
+++ b/src/ngircd/irc-login.c
@@ -444,7 +444,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
ptr = Req->argv[0];
while (*ptr) {
if (!isalnum((int)*ptr) &&
- *ptr != '+' && *ptr != '-' &&
+ *ptr != '+' && *ptr != '-' && *ptr != '@' &&
*ptr != '.' && *ptr != '_') {
Conn_Close(Client_Conn(Client), NULL,
"Invalid user name", true);
@@ -453,6 +453,13 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
ptr++;
}
+ /* Save the received username for authentication, and use
+ * it up to the first '@' as default user name (like ircd2.11,
+ * bahamut, ircd-seven, ...), prefixed with '~', if needed: */
+ Client_SetOrigUser(Client, Req->argv[0]);
+ ptr = strchr(Req->argv[0], '@');
+ if (ptr)
+ *ptr = '\0';
#ifdef IDENTAUTH
ptr = Client_User(Client);
if (!ptr || !*ptr || *ptr == '~')
@@ -460,7 +467,6 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
#else
Client_SetUser(Client, Req->argv[0], false);
#endif
- Client_SetOrigUser(Client, Req->argv[0]);
/* "Real name" or user info text: Don't set it to the empty
* string, the original ircd can't deal with such "real names"
diff --git a/src/ngircd/login.c b/src/ngircd/login.c
index d79344b..d8c8c40 100644
--- a/src/ngircd/login.c
+++ b/src/ngircd/login.c
@@ -202,6 +202,7 @@ Login_User_PostAuth(CLIENT *Client)
static void
cb_Read_Auth_Result(int r_fd, UNUSED short events)
{
+ char user[CLIENT_USER_LEN], *ptr;
CONN_ID conn;
CLIENT *client;
int result;
@@ -233,7 +234,14 @@ cb_Read_Auth_Result(int r_fd, UNUSED short events)
}
if (result == true) {
- Client_SetUser(client, Client_OrigUser(client), true);
+ /* Authentication succeeded, now set the correct user name
+ * supplied by the client (without prepended '~' for exmaple),
+ * but cut it at the first '@' character: */
+ strlcpy(user, Client_OrigUser(client), sizeof(user));
+ ptr = strchr(user, '@');
+ if (ptr)
+ *ptr = '\0';
+ Client_SetUser(client, user, true);
(void)Login_User_PostAuth(client);
} else
Client_Reject(client, "Bad password", false);
Module: ngircd.git
Branch: master
Commit: 628c14d65686c4c848a17381b8ef61c78dbcf405
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=628c14d6…
Author: Alexander Barton <alex(a)barton.de>
Date: Sun Feb 10 20:43:56 2013 +0100
Merge branch 'systemd'
* systemd:
ngircd.sock: explicitely bind to IPv4 and IPv6 addresses
Show address and port of sockets passed-in by systemd(8)
Check type of sockets passed-in by systemd(8)
Adjust severity levels of some log messages
New configuration option "IdleTimeout": exit daemon when idle
Implement support for systemd(8) "socket activation"
contrib/README: add more files
---
Module: ngircd.git
Branch: master
Commit: f295117fba615333908e707a656b6cd0fb0493ed
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=f295117f…
Author: Alexander Barton <alex(a)barton.de>
Date: Mon Feb 4 23:15:53 2013 +0100
New configuration option "IdleTimeout": exit daemon when idle
This patch implements a new configuration option "IdleTimeout" in the
[Limits] section of the configuration file which can be used to set a
timeout (in seconds) after which the whole daemon will shutdown when no
more connections are left active after handling at least one client.
The default is 0, "never".
This can be useful for testing or when ngIRCd is started using "socket
activation" with systemd(8), for example.
---
doc/sample-ngircd.conf.tmpl | 7 +++++++
man/ngircd.conf.5.tmpl | 8 +++++++-
src/ngircd/conf.c | 9 +++++++++
src/ngircd/conf.h | 5 ++++-
src/ngircd/conn.c | 16 +++++++++++++++-
5 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/doc/sample-ngircd.conf.tmpl b/doc/sample-ngircd.conf.tmpl
index 1c3998a..822fd5d 100644
--- a/doc/sample-ngircd.conf.tmpl
+++ b/doc/sample-ngircd.conf.tmpl
@@ -88,6 +88,13 @@
# to not yet (or no longer) connected servers.
;ConnectRetry = 60
+ # Number of seconds after which the whole daemon should shutdown when
+ # no connections are left active after handling at least one client
+ # (0: never, which is the default).
+ # This can be useful for testing or when ngIRCd is started using
+ # "socket activation" with systemd(8), for example.
+ ;IdleTimeout = 0
+
# Maximum number of simultaneous in- and outbound connections the
# server is allowed to accept (0: unlimited):
;MaxConnections = 0
diff --git a/man/ngircd.conf.5.tmpl b/man/ngircd.conf.5.tmpl
index 859c6a8..e5485db 100644
--- a/man/ngircd.conf.5.tmpl
+++ b/man/ngircd.conf.5.tmpl
@@ -1,7 +1,7 @@
.\"
.\" ngircd.conf(5) manual page template
.\"
-.TH ngircd.conf 5 "Nov 2012" ngIRCd "ngIRCd Manual"
+.TH ngircd.conf 5 "Feb 2013" ngIRCd "ngIRCd Manual"
.SH NAME
ngircd.conf \- configuration file of ngIRCd
.SH SYNOPSIS
@@ -170,6 +170,12 @@ should be safe, but it is wise to double-check :-)
The server tries every <ConnectRetry> seconds to establish a link to not yet
(or no longer) connected servers. Default: 60.
.TP
+\fBIdleTimeout\fR (number)
+Number of seconds after which the whole daemon should shutdown when no
+connections are left active after handling at least one client (0: never). This
+can be useful for testing or when ngIRCd is started using "socket activation"
+with systemd(8), for example. Default: 0.
+.TP
\fBMaxConnections\fR (number)
Maximum number of simultaneous in- and outbound connections the server is
allowed to accept (0: unlimited). Default: 0.
diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c
index 929ab05..835b5ea 100644
--- a/src/ngircd/conf.c
+++ b/src/ngircd/conf.c
@@ -370,6 +370,7 @@ Conf_Test( void )
puts("[LIMITS]");
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
+ printf(" IdleTimeout = %d\n", Conf_IdleTimeout);
printf(" MaxConnections = %d\n", Conf_MaxConnections);
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
@@ -736,6 +737,7 @@ Set_Defaults(bool InitServers)
/* Limits */
Conf_ConnectRetry = 60;
+ Conf_IdleTimeout = 0;
Conf_MaxConnections = 0;
Conf_MaxConnectionsIP = 5;
Conf_MaxJoins = 10;
@@ -1241,6 +1243,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
return "[Options]";
}
if (strcasecmp(Var, "ConnectRetry") == 0
+ || strcasecmp(Var, "IdleTimeout") == 0
|| strcasecmp(Var, "MaxConnections") == 0
|| strcasecmp(Var, "MaxConnectionsIP") == 0
|| strcasecmp(Var, "MaxJoins") == 0
@@ -1490,6 +1493,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
}
return;
}
+ if (strcasecmp(Var, "IdleTimeout") == 0) {
+ Conf_IdleTimeout = atoi(Arg);
+ if (!Conf_IdleTimeout && strcmp(Arg, "0"))
+ Config_Error_NaN(Line, Var);
+ return;
+ }
if (strcasecmp(Var, "MaxConnections") == 0) {
Conf_MaxConnections = atoi(Arg);
if (!Conf_MaxConnections && strcmp(Arg, "0"))
diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h
index c203b57..bbf4f36 100644
--- a/src/ngircd/conf.h
+++ b/src/ngircd/conf.h
@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex(a)barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex(a)barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -211,6 +211,9 @@ GLOBAL bool Conf_ConnectIPv6;
/** Try to connect to remote systems using the IPv4 protocol (true) */
GLOBAL bool Conf_ConnectIPv4;
+/** Idle timout (seconds), after which the daemon should exit */
+GLOBAL int Conf_IdleTimeout;
+
/** Maximum number of simultaneous connections to this server */
GLOBAL int Conf_MaxConnections;
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index 378509f..cfa67ea 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -1,6 +1,6 @@
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex(a)barton.de) and Contributors.
+ * Copyright (c)2001-2013 Alexander Barton (alex(a)barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -121,6 +121,8 @@ static void cb_Read_Resolver_Result PARAMS((int sock, UNUSED short what));
static void cb_Connect_to_Server PARAMS((int sock, UNUSED short what));
static void cb_clientserver PARAMS((int sock, short what));
+time_t idle_t = 0;
+
/**
* Get number of sockets available from systemd(8).
@@ -906,6 +908,15 @@ Conn_Handler(void)
PACKAGE_NAME);
exit(1);
}
+
+ /* Should ngIRCd timeout when idle? */
+ if (Conf_IdleTimeout > 0 && NumConnectionsAccepted > 0
+ && idle_t > 0 && time(NULL) - idle_t >= Conf_IdleTimeout) {
+ LogDebug("Server idle timeout reached: %d second%s. Initiating shutdown ...",
+ Conf_IdleTimeout,
+ Conf_IdleTimeout == 1 ? "" : "s");
+ NGIRCd_SignalQuit = true;
+ }
}
if (NGIRCd_SignalQuit)
@@ -1267,6 +1278,8 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie
NumConnections--;
LogDebug("Shutdown of connection %d completed, %ld connection%s left.",
Idx, NumConnections, NumConnections != 1 ? "s" : "");
+
+ idle_t = NumConnections > 0 ? 0 : time(NULL);
} /* Conn_Close */
@@ -1638,6 +1651,7 @@ static void
Account_Connection(void)
{
NumConnections++;
+ idle_t = 0;
if (NumConnections > NumConnectionsMax)
NumConnectionsMax = NumConnections;
LogDebug("Total number of connections now %lu (max %lu).",
Module: ngircd.git
Branch: master
Commit: 8ab097afb743061c6c9b865bdb401ba51285c347
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=8ab097af…
Author: Alexander Barton <alex(a)barton.de>
Date: Mon Feb 4 21:46:20 2013 +0100
Implement support for systemd(8) "socket activation"
This patch enables ngIRCd to work with listening sockets already
initialized and passed-in by systemd(8) and hereby to support on-demand
"socket activation".
systemd(8) uses two environment variables to pass information about the
sockets to ngIRCd, LISTEN_PID and LISTEN_FDS, and this mechanism only
kicks in when both variables are set. In all other cases, and therefore
in most installations out there, nothing changes at all.
Please note:
If socket activation is in effect, ngIRCd will not initialize any (other)
soeckets on its own! All sockets must be configured in the systemd(8)
socket unit configuration file in this case, see ./contrib/ngircd.socket
for example.
Probably it would be interesting to match passed-in sockets to configured
listening sockets and to initialize all the remaining ones not already
set up by systemd(8), but this is kept back for an other patch ...
See
- <http://0pointer.de/blog/projects/socket-activation.html>
- <http://0pointer.de/blog/projects/socket-activation2.html>
- <http://www.freedesktop.org/software/systemd/man/systemd.socket.html>
---
contrib/Makefile.am | 3 ++-
contrib/README | 3 +++
contrib/ngircd.socket | 10 +++++++
src/ngircd/conn.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 85 insertions(+), 1 deletion(-)
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 09b43a6..6d16f7c 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,6 +1,6 @@
#
# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2012 Alexander Barton (alex(a)barton.de) and Contributors
+# Copyright (c)2001-2013 Alexander Barton (alex(a)barton.de) and Contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@ EXTRA_DIST = README \
ngIRCd-Logo.gif \
ngircd-redhat.init \
ngircd.service \
+ ngircd.socket \
ngircd.spec \
platformtest.sh \
systrace.policy
diff --git a/contrib/README b/contrib/README
index f3730a4..2d639e6 100644
--- a/contrib/README
+++ b/contrib/README
@@ -30,6 +30,9 @@ ngircd-redhat.init
ngircd.service
- systemd(8) service unit configuration file.
+ngircd.socket
+ - systemd(8) socket unit configuration file for "socket activation".
+
ngircd.spec
- RPM "spec" file.
diff --git a/contrib/ngircd.socket b/contrib/ngircd.socket
new file mode 100644
index 0000000..3838efc
--- /dev/null
+++ b/contrib/ngircd.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Next Generation IRC Daemon (Socket)
+
+[Socket]
+ListenStream=6667
+#ListenStream=6668
+IPTOS=low-delay
+
+[Install]
+WantedBy=sockets.target
diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c
index 14d337b..378509f 100644
--- a/src/ngircd/conn.c
+++ b/src/ngircd/conn.c
@@ -82,6 +82,8 @@
#define MAX_COMMANDS_SERVER_MIN 10
#define MAX_COMMANDS_SERVICE 10
+#define SD_LISTEN_FDS_START 3
+
static bool Handle_Write PARAMS(( CONN_ID Idx ));
static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
@@ -121,6 +123,40 @@ static void cb_clientserver PARAMS((int sock, short what));
/**
+ * Get number of sockets available from systemd(8).
+ *
+ * ngIRCd needs to implement its own sd_listen_fds(3) function and can't
+ * use the one provided by systemd itself, becaus the sockets will be
+ * used in a forked child process with a new PID, and this would trigger
+ * an error in the standard implementation.
+ *
+ * @return Number of sockets available, -1 if sockets have already been
+ * initialized, or 0 when no sockets have been passed.
+ */
+static int
+my_sd_listen_fds(void)
+{
+ const char *e;
+ long count;
+
+ /* Check if LISTEN_PID exists; but we ignore the result, because
+ * normally ngircd forks a child before checking this, and therefore
+ * the PID set in the environment is always wrong ... */
+ e = getenv("LISTEN_PID");
+ if (!e || !*e)
+ return 0;
+
+ e = getenv("LISTEN_FDS");
+ if (!e || !*e)
+ return -1;
+ count = atol(e);
+ unsetenv("LISTEN_FDS");
+
+ return count;
+}
+
+
+/**
* IO callback for listening sockets: handle new connections. This callback
* gets called when a new non-SSL connection should be accepted.
*
@@ -495,9 +531,38 @@ Conn_InitListeners( void )
/* Initialize ports on which the server should accept connections */
unsigned int created = 0;
char *copy, *listen_addr;
+ int count, fd, i;
assert(Conf_ListenAddress);
+ count = my_sd_listen_fds();
+ if (count < 0) {
+ Log(LOG_INFO,
+ "Not re-initializing listening sockets of systemd(8) ...");
+ return 0;
+ }
+ if (count > 0) {
+ /* systemd(8) passed sockets to us, so don't try to initialize
+ * listening sockets on our own but use the passed ones */
+ LogDebug("Initializing %d systemd sockets ...", count);
+ for (i = 0; i < count; i++) {
+ fd = SD_LISTEN_FDS_START + i;
+ Init_Socket(fd);
+ if (!io_event_create(fd, IO_WANTREAD, cb_listen)) {
+ Log(LOG_ERR,
+ "io_event_create(): Can't add fd %d: %s!",
+ fd, strerror(errno));
+ continue;
+ }
+ Log(LOG_INFO,
+ "Initialized socket %d from systemd.", fd);
+ created++;
+ }
+ return created;
+ }
+
+ /* not using systemd socket activation, initialize listening sockets: */
+
/* can't use Conf_ListenAddress directly, see below */
copy = strdup(Conf_ListenAddress);
if (!copy) {
@@ -541,7 +606,12 @@ Conn_ExitListeners( void )
int *fd;
size_t arraylen;
+ /* Get number of listening sockets to shut down. There can be none
+ * if ngIRCd has been "socket activated" by systemd. */
arraylen = array_length(&My_Listeners, sizeof (int));
+ if (arraylen < 1)
+ return;
+
Log(LOG_INFO,
"Shutting down all listening sockets (%d total) ...", arraylen);
fd = array_start(&My_Listeners);
Module: ngircd.git
Branch: master
Commit: 84e24afd2f6607a2345c4df2b2f9ad81e9dd4bbc
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=84e24afd…
Author: Alexander Barton <alex(a)barton.de>
Date: Mon Feb 4 21:31:42 2013 +0100
contrib/README: add more files
---
contrib/README | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/contrib/README b/contrib/README
index 1aebd1e..f3730a4 100644
--- a/contrib/README
+++ b/contrib/README
@@ -2,18 +2,21 @@
ngIRCd - Next Generation IRC Server
http://ngircd.barton.de/
- (c)2001-2011 Alexander Barton and Contributors.
+ (c)2001-2013 Alexander Barton and Contributors.
ngIRCd is free software and published under the
terms of the GNU General Public License.
- -- Contributions --
+ -- Contributions --
Debian/
- Various files for building Debian GNU/Linux packages (".deb's").
+ - ngircd.init; ngircd.default: init script for Debian-based systems.
+ - ngircd.pam: example PAM configuraton.
MacOSX/
- Project files for XCode, the "project builder" of Apple Mac OS X.
+ - de.barton.ngircd.plist[.tmpl]: launchd(8) property list.
ngindent
- Script to indent the code of ngIRCd in the "standard way".
@@ -24,6 +27,9 @@ ngircd-bsd.sh
ngircd-redhat.init
- Start/stop script for RedHat-based distributions (like CentOS).
+ngircd.service
+ - systemd(8) service unit configuration file.
+
ngircd.spec
- RPM "spec" file.
Module: ngircd.git
Branch: master
Commit: ac32d07aaff0e7a1c4a544353dadbf397859d8f9
URL: http://ngircd.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git&a=commit;h=ac32d07a…
Author: Alexander Barton <alex(a)barton.de>
Date: Sun Feb 10 00:35:03 2013 +0100
Commands.txt: spelling fixes ...
---
doc/Commands.txt | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/doc/Commands.txt b/doc/Commands.txt
index b282e2e..2d3cab2 100644
--- a/doc/Commands.txt
+++ b/doc/Commands.txt
@@ -210,7 +210,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.4.9 "Admin command"
@@ -222,7 +222,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.4.10 "Info command"
@@ -231,7 +231,7 @@ Status and Informational Commands
ISON <nickname> [<nickname> [...]]
.
Query online status of a list of nicknames. The server replies with
- a list only containing nicknes actually connected to a server in
+ a list only containing nicknames actually connected to a server in
the network. If no nicknames of the given list are online, an empty
list is returned to the client requesting the information.
@@ -263,7 +263,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
Please note that ngIRCd ignores the <mask> parameter entirely: it
is not possible to get information for a part of the network only.
@@ -278,7 +278,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.4.1 "Motd message"
@@ -297,7 +297,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.2.5 "Names message"
@@ -318,7 +318,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.4.4 "Stats message"
@@ -330,7 +330,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
References
- RFC 2812, 3.4.6 "Time message"
@@ -345,7 +345,7 @@ Status and Informational Commands
USERHOST <nickname> [<nickname> [...]]
.
Show flags and the hostmasks (<user>@<host>) of the <nickname>s,
- seperated by spaces. The following flags are used:
+ separated by spaces. The following flags are used:
.
- "-" The client is "away" (the mode "+a" is set on this client).
- "+" Client seems to be available, at least it isn't marked "away".
@@ -361,7 +361,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to
a specific server, or a mask matching a server name in the network.
- The server of the current connecion is used when <target> is omitted.
+ The server of the current connection is used when <target> is omitted.
.
Please note: in normal operation, the version number ends in a dot
(".", for example "ngIRCd-20.1."). If it ends in ".1" (for example
@@ -393,7 +393,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to a
specific server, or a mask matching a server name in the network. The
- server of the current connecion is used when <target> is omitted.
+ server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.6.2 "Whois query"
@@ -409,7 +409,7 @@ Status and Informational Commands
.
<target> can be a server name, the nickname of a client connected to a
specific server, or a mask matching a server name in the network. The
- server of the current connecion is used when <target> is omitted.
+ server of the current connection is used when <target> is omitted.
References:
- RFC 2812, 3.6.3 "Whowas"