From 49a8f5ed69a1e1c591b08597c82b27890e0d9beb Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Mon, 6 Mar 2006 19:55:10 +0000 Subject: [PATCH] Added unformatted logging --- ChangeLog | 1 + mbtask/taskchat.c | 2 - mbtask/taskibc.c | 178 +++++++++++++++++++++++++++++++--------------- mbtask/taskutil.c | 40 +++++++++-- mbtask/taskutil.h | 1 + 5 files changed, 156 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index 03b2f877..1737d9c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -38,6 +38,7 @@ v0.83.14 23-Feb-2006 mbtask: Safer code for chat. + Added unformatted logging. lang: New prompts 86, 87, 88 and 89. diff --git a/mbtask/taskchat.c b/mbtask/taskchat.c index 8b744441..7da48b8e 100644 --- a/mbtask/taskchat.c +++ b/mbtask/taskchat.c @@ -270,7 +270,6 @@ int join(pid_t pid, char *channel, int sysop) */ snprintf(buf, 81, "*** Cannot create chat channel %s, no free channels", channel); system_msg(pid, buf); - Syslog('+', "%s", buf); return FALSE; } @@ -800,7 +799,6 @@ void chat_get_r(char *data, char *buf) /* * Message is for us */ -// snprintf(buf, 200, "100:2,0,%s;", clencode(chat_messages[tmpu->pointer].message)); p = xstrcpy((char *)"100:2,0,"); p = xstrcat(p, clencode(chat_messages[tmpu->pointer].message)); p = xstrcat(p, (char *)";"); diff --git a/mbtask/taskibc.c b/mbtask/taskibc.c index 74c2eaa4..0950fccb 100644 --- a/mbtask/taskibc.c +++ b/mbtask/taskibc.c @@ -88,7 +88,7 @@ void tidy_servers(srv_list **); int add_server(srv_list **, char *, int, char *, char *, char *, char *); void del_server(srv_list **, char *); void del_router(srv_list **, char *); -int send_msg(ncs_list *, const char *, ...); +int send_msg(ncs_list *, char *); void broadcast(char *, char *); void check_servers(void); int command_pass(char *, char *); @@ -620,21 +620,24 @@ void broadcast(char *origin, char *msg) /* * Send message to a server */ -int send_msg(ncs_list *tnsl, const char *format, ...) +int send_msg(ncs_list *tnsl, char *msg) { - char buf[512]; - va_list va_ptr; + char *p; - va_start(va_ptr, format); - vsnprintf(buf, 512, format, va_ptr); - va_end(va_ptr); - #ifndef PING_PONG_LOG - if (strcmp(buf, "PING\r\n") && strcmp(buf, "PONG\r\n")) + if (strcmp(msg, "PING\r\n") && strcmp(msg, "PONG\r\n")) { +#endif + p = xstrcpy((char *)"IBC: > "); + p = xstrcat(p, tnsl->server); + p = xstrcat(p, (char *)": "); + p = xstrcat(p, printable(msg, 0)); + Syslogp('r', p); + free(p); +#ifndef PING_PONG_LOG + } #endif - Syslog('r', "IBC: > %s: %s", tnsl->server, printable(buf, 0)); - if (sendto(tnsl->socket, buf, strlen(buf), 0, (struct sockaddr *)&tnsl->servaddr_in, sizeof(struct sockaddr_in)) == -1) { + if (sendto(tnsl->socket, msg, strlen(msg), 0, (struct sockaddr *)&tnsl->servaddr_in, sizeof(struct sockaddr_in)) == -1) { Syslog('!', "$IBC: can't send message"); return -1; } @@ -908,9 +911,13 @@ void check_servers(void) break; } tnsl->token = gettoken(); - send_msg(tnsl, "PASS %s 0100 %s\r\n", tnsl->passwd, tnsl->compress ? "Z":""); - send_msg(tnsl, "SERVER %s 0 %ld mbsebbs %s %s\r\n", tnsl->myname, tnsl->token, + p = calloc(512, sizeof(char)); + snprintf(p, 512, "PASS %s 0100 %s\r\n", tnsl->passwd, tnsl->compress ? "Z":""); + send_msg(tnsl, p); + snprintf(p, 512, "SERVER %s 0 %d mbsebbs %s %s\r\n", tnsl->myname, tnsl->token, VERSION, CFG.bbs_name); + send_msg(tnsl, p); + free(p); tnsl->action = now + (time_t)10; tnsl->state = NCS_WAITPWD; callchg = TRUE; @@ -988,12 +995,12 @@ void check_servers(void) */ if (((int)now - (int)tnsl->last) > 120) { Syslog('r', "IBC: sending 3rd PING at 120 seconds"); - send_msg(tnsl, "PING\r\n"); + send_msg(tnsl, (char *)"PING\r\n"); } else if (((int)now - (int)tnsl->last) > 90) { Syslog('r', "IBC: sending 2nd PING at 90 seconds"); - send_msg(tnsl, "PING\r\n"); + send_msg(tnsl, (char *)"PING\r\n"); } else if (((int)now - (int)tnsl->last) > 60) { - send_msg(tnsl, "PING\r\n"); + send_msg(tnsl, (char *)"PING\r\n"); } tnsl->action = now + (time_t)10; break; @@ -1044,12 +1051,12 @@ int command_pass(char *hostname, char *parameters) lnk = strtok(NULL, " \0"); if (strcmp(passwd, "0100") == 0) { - send_msg(tnsl, "414 PASS: Got empty password\r\n"); + send_msg(tnsl, (char *)"414 PASS: Got empty password\r\n"); return 414; } if (version == NULL) { - send_msg(tnsl, "400 PASS: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 PASS: Not enough parameters\r\n"); return 400; } @@ -1059,7 +1066,7 @@ int command_pass(char *hostname, char *parameters) } if (tnsl->state == NCS_CONNECT) { - send_msg(tnsl, "401: PASS: Already registered\r\n"); + send_msg(tnsl, (char *)"401: PASS: Already registered\r\n"); tnsl->halfdead++; /* Count them */ srvchg = TRUE; return 401; @@ -1100,7 +1107,7 @@ int command_server(char *hostname, char *parameters) } if (fullname == NULL) { - send_msg(tnsl, "400 SERVER: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 SERVER: Not enough parameters\r\n"); return 400; } @@ -1129,25 +1136,42 @@ int command_server(char *hostname, char *parameters) */ for (ta = servers; ta; ta = ta->next) { if (ta->hops) { - send_msg(tnsl, "SERVER %s %d 0 %s %s %s\r\n", ta->server, ta->hops, ta->prod, ta->vers, ta->fullname); + p = calloc(512, sizeof(char)); + snprintf(p, 512, "SERVER %s %d 0 %s %s %s\r\n", ta->server, ta->hops, ta->prod, ta->vers, ta->fullname); + send_msg(tnsl, p); + free(p); } } /* * Send all known users, nicknames and join channels */ for (tmp = users; tmp; tmp = tmp->next) { - send_msg(tnsl, "USER %s@%s %s\r\n", tmp->name, tmp->server, tmp->realname); - if (strcmp(tmp->name, tmp->nick)) - send_msg(tnsl, "NICK %s %s %s %s\r\n", tmp->nick, tmp->name, tmp->server, tmp->realname); - if (strlen(tmp->channel)) - send_msg(tnsl, "JOIN %s@%s %s\r\n", tmp->name, tmp->server, tmp->channel); + p = calloc(512, sizeof(char)); + snprintf(p, 512, "USER %s@%s %s\r\n", tmp->name, tmp->server, tmp->realname); + send_msg(tnsl, p); + if (strcmp(tmp->name, tmp->nick)) { + snprintf(p, 512, "NICK %s %s %s %s\r\n", tmp->nick, tmp->name, tmp->server, tmp->realname); + send_msg(tnsl, p); + } + if (strlen(tmp->channel)) { + snprintf(p, 512, "JOIN %s@%s %s\r\n", tmp->name, tmp->server, tmp->channel); + send_msg(tnsl, p); + } + free(p); } /* * Send all known channel topics */ for (tmpc = channels; tmpc; tmpc = tmpc->next) { - if (strlen(tmpc->topic) && (strcmp(tmpc->server, CFG.myfqdn) == 0)) - send_msg(tnsl, "TOPIC %s %s\r\n", tmpc->name, tmpc->topic); + if (strlen(tmpc->topic) && (strcmp(tmpc->server, CFG.myfqdn) == 0)) { + p = xstrcpy((char *)"TOPIC "); + p = xstrcat(p, tmpc->name); + p = xstrcat(p, (char *)" "); + p = xstrcat(p, tmpc->topic); + p = xstrcat(p, (char *)"\r\n"); + send_msg(tnsl, p); + free(p); + } } add_server(&servers, tnsl->server, ihops, prod, vers, fullname, hostname); return 0; @@ -1163,12 +1187,13 @@ int command_server(char *hostname, char *parameters) * valid PASS command. */ if (found && tnsl->gotpass) { - send_msg(tnsl, "PASS %s 0100 %s\r\n", tnsl->passwd, tnsl->compress ? "Z":""); - send_msg(tnsl, "SERVER %s 0 %ld mbsebbs %s %s\r\n", tnsl->myname, token, VERSION, CFG.bbs_name); p = calloc(512, sizeof(char)); + snprintf(p, 512, "PASS %s 0100 %s\r\n", tnsl->passwd, tnsl->compress ? "Z":""); + send_msg(tnsl, p); + snprintf(p, 512, "SERVER %s 0 %d mbsebbs %s %s\r\n", tnsl->myname, token, VERSION, CFG.bbs_name); + send_msg(tnsl, p); snprintf(p, 512, "SERVER %s %d %s %s %s %s\r\n", name, ihops, id, prod, vers, fullname); broadcast(tnsl->server, p); - free(p); system_shout("* New server: %s, %s", name, fullname); tnsl->gotserver = TRUE; tnsl->state = NCS_CONNECT; @@ -1179,7 +1204,8 @@ int command_server(char *hostname, char *parameters) */ for (ta = servers; ta; ta = ta->next) { if (ta->hops) { - send_msg(tnsl, "SERVER %s %d 0 %s %s %s\r\n", ta->server, ta->hops, ta->prod, ta->vers, ta->fullname); + snprintf(p, 512, "SERVER %s %d 0 %s %s %s\r\n", ta->server, ta->hops, ta->prod, ta->vers, ta->fullname); + send_msg(tnsl, p); } } /* @@ -1187,15 +1213,28 @@ int command_server(char *hostname, char *parameters) * If the user is one of our own and has set a channel topic, send it. */ for (tmp = users; tmp; tmp = tmp->next) { - send_msg(tnsl, "USER %s@%s %s\r\n", tmp->name, tmp->server, tmp->realname); - if (strcmp(tmp->name, tmp->nick)) - send_msg(tnsl, "NICK %s %s %s %s\r\n", tmp->nick, tmp->name, tmp->server, tmp->realname); - if (strlen(tmp->channel)) - send_msg(tnsl, "JOIN %s@%s %s\r\n", tmp->name, tmp->server, tmp->channel); + snprintf(p, 512, "USER %s@%s %s\r\n", tmp->name, tmp->server, tmp->realname); + send_msg(tnsl, p); + if (strcmp(tmp->name, tmp->nick)) { + snprintf(p, 512, "NICK %s %s %s %s\r\n", tmp->nick, tmp->name, tmp->server, tmp->realname); + send_msg(tnsl, p); + } + if (strlen(tmp->channel)) { + snprintf(p, 512, "JOIN %s@%s %s\r\n", tmp->name, tmp->server, tmp->channel); + send_msg(tnsl, p); + } } + free(p); for (tmpc = channels; tmpc; tmpc = tmpc->next) { - if (strlen(tmpc->topic) && (strcmp(tmpc->server, CFG.myfqdn) == 0)) - send_msg(tnsl, "TOPIC %s %s\r\n", tmpc->name, tmpc->topic); + if (strlen(tmpc->topic) && (strcmp(tmpc->server, CFG.myfqdn) == 0)) { + p = xstrcpy((char *)"TOPIC "); + p = xstrcat(p, tmpc->name); + p = xstrcat(p, (char *)" "); + p = xstrcat(p, tmpc->topic); + p = xstrcat(p, (char *)"\r\n"); + send_msg(tnsl, p); + free(p); + } } add_server(&servers, tnsl->server, ihops, prod, vers, fullname, hostname); srvchg = TRUE; @@ -1279,7 +1318,7 @@ int command_user(char *hostname, char *parameters) realname = strtok(NULL, "\0"); if (realname == NULL) { - send_msg(tnsl, "400 USER: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 USER: Not enough parameters\r\n"); return 400; } @@ -1311,7 +1350,7 @@ int command_quit(char *hostname, char *parameters) message = strtok(NULL, "\0"); if (server == NULL) { - send_msg(tnsl, "400 QUIT: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 QUIT: Not enough parameters\r\n"); return 400; } @@ -1349,12 +1388,15 @@ int command_nick(char *hostname, char *parameters) realname = strtok(NULL, "\0"); if (realname == NULL) { - send_msg(tnsl, "400 NICK: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 NICK: Not enough parameters\r\n"); return 1; } if (strlen(nick) > 9) { - send_msg(tnsl, "402 %s: Erroneous nickname\r\n", nick); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "402 %s: Erroneous nickname\r\n", nick); + send_msg(tnsl, p); + free(p); return 402; } @@ -1368,7 +1410,10 @@ int command_nick(char *hostname, char *parameters) } } if (found) { - send_msg(tnsl, "403 %s: Nickname is already in use\r\n", nick); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "403 %s: Nickname is already in use\r\n", nick); + send_msg(tnsl, p); + free(p); return 403; } @@ -1381,7 +1426,10 @@ int command_nick(char *hostname, char *parameters) } } if (!found) { - send_msg(tnsl, "404 %s@%s: Can't change nick\r\n", name, server); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "404 %s@%s: Can't change nick\r\n", name, server); + send_msg(tnsl, p); + free(p); return 404; } @@ -1413,12 +1461,15 @@ int command_join(char *hostname, char *parameters) channel = strtok(NULL, "\0"); if (channel == NULL) { - send_msg(tnsl, "400 JOIN: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 JOIN: Not enough parameters\r\n"); return 400; } if (strlen(channel) > 20) { - send_msg(tnsl, "402 %s: Erroneous channelname\r\n", nick); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "402 %s: Erroneous channelname\r\n", nick); + send_msg(tnsl, p); + free(p); return 402; } @@ -1480,7 +1531,7 @@ int command_part(char *hostname, char *parameters) message = strtok(NULL, "\0"); if (channel == NULL) { - send_msg(tnsl, "400 PART: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 PART: Not enough parameters\r\n"); return 400; } @@ -1550,7 +1601,7 @@ int command_topic(char *hostname, char *parameters) topic = strtok(NULL, "\0"); if (topic == NULL) { - send_msg(tnsl, "400 TOPIC: Not enough parameters\r\n"); + send_msg(tnsl, (char *)"400 TOPIC: Not enough parameters\r\n"); return 400; } @@ -1593,12 +1644,12 @@ int command_privmsg(char *hostname, char *parameters) msg = strtok(NULL, "\0"); if (msg == NULL) { - send_msg(tnsl, "412 PRIVMSG: No text to send\r\n"); + send_msg(tnsl, (char *)"412 PRIVMSG: No text to send\r\n"); return 412; } if (channel[0] != '#') { - send_msg(tnsl, "499 PRIVMSG: Not for a channel\r\n"); // FIXME: also check users + send_msg(tnsl, (char *)"499 PRIVMSG: Not for a channel\r\n"); // FIXME: also check users return 499; } @@ -1617,7 +1668,10 @@ int command_privmsg(char *hostname, char *parameters) } } - send_msg(tnsl, "409 %s: Cannot sent to channel\r\n", channel); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "409 %s: Cannot sent to channel\r\n", channel); + send_msg(tnsl, p); + free(p); return 409; } @@ -1626,7 +1680,8 @@ int command_privmsg(char *hostname, char *parameters) int do_command(char *hostname, char *command, char *parameters) { ncs_list *tnsl; - + char *p; + for (tnsl = ncsl; tnsl; tnsl = tnsl->next) { if (strcmp(tnsl->server, hostname) == 0) { break; @@ -1637,7 +1692,7 @@ int do_command(char *hostname, char *command, char *parameters) * First the commands that don't have parameters */ if (! strcmp(command, (char *)"PING")) { - send_msg(tnsl, "PONG\r\n"); + send_msg(tnsl, (char *)"PONG\r\n"); return 0; } if (! strcmp(command, (char *)"PONG")) { @@ -1656,7 +1711,10 @@ int do_command(char *hostname, char *command, char *parameters) * Commands with parameters */ if (parameters == NULL) { - send_msg(tnsl, "400 %s: Not enough parameters\r\n", command); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "400 %s: Not enough parameters\r\n", command); + send_msg(tnsl, p); + free(p); return 400; } @@ -1691,7 +1749,10 @@ int do_command(char *hostname, char *command, char *parameters) return command_privmsg(hostname, parameters); } - send_msg(tnsl, "413 %s: Unknown command\r\n", command); + p = calloc(81, sizeof(char)); + snprintf(p, 81, "413 %s: Unknown command\r\n", command); + send_msg(tnsl, p); + free(p); return 413; } @@ -1828,11 +1889,14 @@ void ibc_shutdown(void) } } + p = calloc(512, sizeof(char)); for (tnsl = ncsl; tnsl; tnsl = tnsl->next) { if (tnsl->state == NCS_CONNECT) { - send_msg(tnsl, "SQUIT %s System shutdown\r\n", tnsl->myname); + snprintf(p, 512, "SQUIT %s System shutdown\r\n", tnsl->myname); + send_msg(tnsl, p); } } + free(p); tidy_servers(&servers); } diff --git a/mbtask/taskutil.c b/mbtask/taskutil.c index d690b8a3..dfe2f73e 100644 --- a/mbtask/taskutil.c +++ b/mbtask/taskutil.c @@ -80,16 +80,28 @@ void WriteError(const char *format, ...) void Syslog(int grade, const char *format, ...) { va_list va_ptr; - char outstr[1024], datestr[21], lname[PATH_MAX]; - int oldmask, debug; + char outstr[1024]; + + va_start(va_ptr, format); + vsnprintf(outstr, 1024, format, va_ptr); + va_end(va_ptr); + Syslogp(grade, outstr); +} + + + +/* + * Logging without string formatting + */ +void Syslogp(int grade, char *outstr) +{ + char datestr[21], lname[PATH_MAX]; + int i, oldmask, debug; FILE *logfile = NULL, *debugfile; time_t now; struct tm ptm; debug = isalpha(grade); - va_start(va_ptr, format); - vsnprintf(outstr, 1024, format, va_ptr); - va_end(va_ptr); tcrc = StringCRC32(outstr); if (tcrc == lcrc) { @@ -136,7 +148,14 @@ void Syslog(int grade, const char *format, ...) if (!debug) { fprintf(logfile, "%c %s mbtask[%d] ", grade, datestr, mypid); - fprintf(logfile, *outstr == '$' ? outstr+1 : outstr); + for (i = *outstr == '$' ? 1 : 0; i < strlen(outstr); i++) { + if (iscntrl(outstr[i])) { + fputc('^', logfile); + fputc(outstr[i] + 64, logfile); + } else { + fputc(outstr[i], logfile); + } + } if (*outstr == '$') fprintf(logfile, ": %s\n", strerror(errno)); else @@ -148,7 +167,14 @@ void Syslog(int grade, const char *format, ...) } fprintf(debugfile, "%c %s mbtask[%d] ", grade, datestr, mypid); - fprintf(debugfile, *outstr == '$' ? outstr+1 : outstr); + for (i = *outstr == '$' ? 1 : 0; i < strlen(outstr); i++) { + if (iscntrl(outstr[i])) { + fputc('^', debugfile); + fputc(outstr[i] + 64, debugfile); + } else { + fputc(outstr[i], debugfile); + } + } if (*outstr == '$') fprintf(debugfile, ": %s\n", strerror(errno)); else diff --git a/mbtask/taskutil.h b/mbtask/taskutil.h index 57af7ce1..a12226d9 100644 --- a/mbtask/taskutil.h +++ b/mbtask/taskutil.h @@ -22,6 +22,7 @@ typedef struct _srv_auth { * Function prototypes */ void WriteError(const char *, ...); +void Syslogp(int, char *); void Syslog(int, const char *, ...); int ulog(char *, char *, char *, char *, char*); char *xstrcpy(char *);