diff options
-rw-r--r-- | bounce.c | 3 | ||||
-rw-r--r-- | bounce.h | 2 | ||||
-rw-r--r-- | linger.1 | 10 | ||||
-rw-r--r-- | server.c | 12 |
4 files changed, 21 insertions, 6 deletions
diff --git a/bounce.c b/bounce.c index e91ed7f..ff99b91 100644 --- a/bounce.c +++ b/bounce.c @@ -78,7 +78,7 @@ int main(int argc, char *argv[]) { const char *join = NULL; int opt; - while (0 < (opt = getopt(argc, argv, "C:H:K:P:W:a:h:j:n:p:r:u:w:"))) { + while (0 < (opt = getopt(argc, argv, "C:H:K:P:W:a:h:j:n:p:r:u:vw:"))) { switch (opt) { break; case 'C': strlcpy(certPath, optarg, sizeof(certPath)); break; case 'H': localHost = optarg; @@ -92,6 +92,7 @@ int main(int argc, char *argv[]) { break; case 'p': port = optarg; break; case 'r': real = optarg; break; case 'u': user = optarg; + break; case 'v': verbose = true; break; case 'w': pass = censor(optarg); break; default: return EX_USAGE; } diff --git a/bounce.h b/bounce.h index 2c3daa3..e81ed8f 100644 --- a/bounce.h +++ b/bounce.h @@ -30,6 +30,8 @@ struct Client { struct tls *tls; }; +bool verbose; + void listenConfig(const char *cert, const char *priv); size_t listenBind(int fds[], size_t cap, const char *host, const char *port); int listenAccept(struct tls **client, int fd); diff --git a/linger.1 b/linger.1 index 7c0001f..bf4b8c0 100644 --- a/linger.1 +++ b/linger.1 @@ -1,4 +1,4 @@ -.Dd October 22, 2019 +.Dd October 23, 2019 .Dt LINGER 1 .Os . @@ -8,6 +8,7 @@ . .Sh SYNOPSIS .Nm +.Op Fl v .Op Fl C Ar cert .Op Fl H Ar host .Op Fl K Ar priv @@ -106,6 +107,13 @@ Set the username to .Ar user . The default username is the same as the nickname. . +.It Fl v +Write IRC messages to standard error +in red to the server, +green from the server, +yellow from clients +and blue to clients. +. .It Fl w Ar pass Log in with the password .Ar pass . diff --git a/server.c b/server.c index 72d668a..5cb7776 100644 --- a/server.c +++ b/server.c @@ -14,6 +14,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <assert.h> #include <err.h> #include <netdb.h> #include <netinet/in.h> @@ -80,6 +81,7 @@ int serverConnect(const char *host, const char *port) { } void serverSend(const char *ptr, size_t len) { + if (verbose) fprintf(stderr, "\x1B[31m%.*s\x1B[m", (int)len, ptr); while (len) { ssize_t ret = tls_write(client, ptr, len); if (ret == TLS_WANT_POLLIN || ret == TLS_WANT_POLLOUT) continue; @@ -90,14 +92,13 @@ void serverSend(const char *ptr, size_t len) { } static void format(const char *format, ...) { - char *buf; + char buf[513]; va_list ap; va_start(ap, format); - int len = vasprintf(&buf, format, ap); + int len = vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); - if (!buf) err(EX_OSERR, "vasprintf"); + assert(len > 0 && (size_t)len < sizeof(buf)); serverSend(buf, len); - free(buf); } static const char Base64[64] = { @@ -177,8 +178,11 @@ void serverRecv(void) { crlf = memmem(line, &buf[len] - line, "\r\n", 2); if (!crlf) break; crlf[0] = '\0'; + + if (verbose) fprintf(stderr, "\x1B[32m%s\x1B[m\n", line); // TODO: Add line to ring if stateReady(). stateParse(line); + line = crlf + 2; } len -= line - buf; |