summaryrefslogtreecommitdiff
path: root/logging.c
diff options
context:
space:
mode:
authorLuke Bratch <luke@bratch.co.uk>2019-09-12 21:55:07 +0100
committerLuke Bratch <luke@bratch.co.uk>2019-09-12 21:55:07 +0100
commit5a3a07a9e64f4677290062712f9e9a3299061971 (patch)
tree7ed9bd9b46ba1207025331269b2263ea06b04ea4 /logging.c
parent55b6f72223675c226238a5110d674a852e9922d3 (diff)
Log server messages to file named <ircdname>.log.
Diffstat (limited to 'logging.c')
-rw-r--r--logging.c54
1 files changed, 40 insertions, 14 deletions
diff --git a/logging.c b/logging.c
index d661a2b..ff41911 100644
--- a/logging.c
+++ b/logging.c
@@ -18,9 +18,9 @@
#include "logging.h"
// Write the line 'str' to the relevant log file such as
-// '#channel.log' or 'nickname.log'. 'ournick' is our own
-// nick and is used to determine which log file to write to
-// if the type is LOG_PRIVMSG.
+// '#channel.log' or 'nickname.log'. 'ircdstate->ircnick'
+// is our own nick and is used to determine which log file
+// to write to if the type is LOG_PRIVMSG.
// 'basedir' is the directory in which the 'logs' directory
// will be created in which logs are to be written.
//
@@ -37,11 +37,14 @@
// If LOG_TOPIC then it expects a string in the format:
// :nick!bar@baz TOPIC #channel :bla bla bla
//
+// If LOG_NETWORK then it just logs the string verbatim in
+// a file named 'ircdstate->ircdname'.log.
+//
// With the ":foo!bar@baz "prefix being important for all
// types.
//
// Returns 1 on success or 0 on failure.
-int logline(char *str, char *ournick, char *basedir, int type) {
+int logline(char *str, struct ircdstate *ircdstate, char *basedir, int type) {
// Filename to write to, gets built as we go
char filename[MAXCHAR];
@@ -69,15 +72,19 @@ int logline(char *str, char *ournick, char *basedir, int type) {
// If LOG_TOPIC:
// This gets us the prefix (containing the topic setting nick), the TOPIC command (not needed),
// the channel whose topic was set, and the rest of the string intact (which is the new topic).
- for (int i = 0; i < 3; i++) {
- // Try to split
- if ((token = strsep(&str, " ")) == NULL) {
- debugprint(DEBUG_CRIT, "Error splitting string for logging, returning!\n");
- return 0;
+ // If LOG_NETWORK:
+ // Don't do this at all since we want to log the whole string.
+ if (type != LOG_NETWORK) {
+ for (int i = 0; i < 3; i++) {
+ // Try to split
+ if ((token = strsep(&str, " ")) == NULL) {
+ debugprint(DEBUG_CRIT, "Error splitting string for logging, returning!\n");
+ return 0;
+ }
+ // Copy into the token array (strlen + 1 to get the NULL terminator)
+ strncpy(tokens[i], token, strlen(token) + 1);
+ debugprint(DEBUG_FULL, "logline(): extracted '%s'.\n", tokens[i]);
}
- // Copy into the token array (strlen + 1 to get the NULL terminator)
- strncpy(tokens[i], token, strlen(token) + 1);
- debugprint(DEBUG_FULL, "logline(): extracted '%s'.\n", tokens[i]);
}
// Make "filename safe" copies of from and to names to ensure filename ends up being safe
@@ -104,7 +111,7 @@ int logline(char *str, char *ournick, char *basedir, int type) {
// Build the log filename
// If the message was sent to us, then log it in the sender's log file
- if (strncmp(tokens[2], ournick, strlen(tokens[0])) == 0) {
+ if (strncmp(tokens[2], ircdstate->ircnick, strlen(tokens[0])) == 0) {
if (!snprintf(filename, MAXCHAR, "%s/logs/%s.log", basedir, from)) {
debugprint(DEBUG_CRIT, "Error while preparing log filename for from name, returning!\n");
return 0;
@@ -198,6 +205,25 @@ int logline(char *str, char *ournick, char *basedir, int type) {
break;
+ case LOG_NETWORK:
+ // Make sure we actually have an ircdname, if not, don't try to continue
+ if (strlen(ircdstate->ircdname) < 1) {
+ debugprint(DEBUG_CRIT, "logline(): No ircdname (yet?), returning.\n");
+ return 0;
+ }
+
+ if (!snprintf(filename, MAXCHAR, "%s/logs/%s.log", basedir, ircdstate->ircdname)) {
+ debugprint(DEBUG_CRIT, "Error while preparing log filename for network, returning!\n");
+ return 0;
+ }
+
+ debugprint(DEBUG_FULL, "logline(): Logging network log for '%s' in filename '%s'.\n", str, filename);
+
+ // Copy source message verbatim to destination
+ strcpy(line, str);
+
+ break;
+
default :
debugprint(DEBUG_CRIT, "logline(): Unknown log type '%d', returning 0.\n", type);
return 0;
@@ -258,7 +284,7 @@ int logline(char *str, char *ournick, char *basedir, int type) {
return 0;
}
}
- } else if (type == LOG_JOINPART || type == LOG_TOPIC) {
+ } else if (type == LOG_JOINPART || type == LOG_TOPIC || type == LOG_NETWORK) {
// Prepend the time string
char line2[MAXCHAR];
if (!snprintf(line2, MAXCHAR, "%s %s", timestr, line)) {