diff -r 462ae85f7689 sic.c --- a/sic.c Fri Aug 07 08:37:09 2009 +0100 +++ b/sic.c Wed Sep 23 00:24:16 2009 +0200 @@ -18,11 +18,11 @@ #endif static void die(const char *errstr, ...); -static void printl(char *channel, char *msg); -static void privmsg(char *channel, char *msg); +static void printl(const char *channel, const char *msg); +static void privmsg(const char *channel, const char *msg); static void parsein(char *msg); static void parsesrv(char *msg); -static int readl(int fd, unsigned int len, char *buf); +static int readl(int fd, size_t len, char *buf); static char *host = "irc6.oftc.net"; static char *port = "6667"; @@ -33,6 +33,8 @@ static int srv; static time_t trespond; +#define startswith(d, s) 0 == strncmp(d, s, sizeof d - 1) + void die(const char *errstr, ...) { va_list ap; @@ -43,7 +45,7 @@ } void -printl(char *channel, char *msg) { +printl(const char *channel, const char *msg) { static char timestr[18]; time_t t = time(0); (void) strftime(timestr, sizeof timestr, "%D %R", localtime(&t)); @@ -51,7 +53,7 @@ } void -privmsg(char *channel, char *msg) { +privmsg(const char *channel, const char *msg) { if(channel[0] == '\0') return; (void) snprintf(bufout, sizeof bufout, "<%s> %s", nick, msg); @@ -69,18 +71,18 @@ privmsg(channel, msg); return; } - if(strncmp(msg + 1, "j ", 2) == 0 && (msg[3] == '#')) + if(startswith("j ", msg + 1) && (msg[3] == '#')) (void) snprintf(bufout, sizeof bufout, "JOIN %s\r\n", msg + 3); - else if(strncmp(msg + 1, "l ", 2) == 0) + else if(startswith("l ", msg + 1)) (void) snprintf(bufout, sizeof bufout, "PART %s :sic - 250 LOC are too much!\r\n", msg + 3); - else if(strncmp(msg + 1, "m ", 2) == 0) { + else if(startswith("m ", msg + 1)) { if((p = strchr(msg + 3, ' '))) *(p++) = '\0'; privmsg(msg + 3, p); return; } - else if(strncmp(msg + 1, "s ", 2) == 0) { - strncpy(channel, msg + 3, sizeof channel); + else if(startswith("s ", msg + 1)) { + strncpy(channel, msg + 3, sizeof channel - 1); return; } else @@ -114,9 +116,9 @@ *p = '\0'; txt = ++p; } - if(strncmp("PONG", cmd, 4) == 0) + if(startswith("PONG", cmd)) return; - if(strncmp("PRIVMSG", cmd, 7) == 0 && txt != NULL) { + if(startswith("PRIVMSG", cmd) && txt != NULL) { if(!(p = strchr(cmd, ' '))) return; *p = '\0'; @@ -126,7 +128,7 @@ (void) snprintf(bufout, sizeof bufout, "<%s> %s", usr, txt); printl(chan, bufout); } - else if(strncmp("PING", cmd, 4) == 0 && txt != NULL) { + else if(startswith("PING", cmd) && txt != NULL) { (void) snprintf(bufout, sizeof bufout, "PONG %s\r\n", txt); (void) write(srv, bufout, strlen(bufout)); } @@ -136,15 +138,15 @@ else (void) snprintf(bufout, sizeof bufout, ">< %s: ", cmd); printl(usr, bufout); - if(strncmp("NICK", cmd, 4) == 0 && strncmp(usr, nick, sizeof nick) == 0 && + if(startswith("NICK", cmd) && strcmp(usr, nick) == 0 && txt != NULL) - (void) strncpy(nick, txt, sizeof nick); + (void) strncpy(nick, txt, sizeof nick - 1); } } int -readl(int fd, unsigned int len, char *buf) { - unsigned int i = 0; +readl(int fd, size_t len, char *buf) { + size_t i = 0; char c = '\0'; do { @@ -167,21 +169,21 @@ fd_set rd; char *password = NULL; - strncpy(nick, getenv("USER"), sizeof nick); + strncpy(nick, getenv("USER"), sizeof nick - 1); for(i = 1; i < argc; i++) - if(strncmp(argv[i], "-h", 3) == 0) { + if(strcmp(argv[i], "-h") == 0) { if(++i < argc) host = argv[i]; } - else if(strncmp(argv[i], "-p", 3) == 0) { + else if(strcmp(argv[i], "-p") == 0) { if(++i < argc) port = argv[i]; } - else if(strncmp(argv[i], "-n", 3) == 0) { - if(++i < argc) strncpy(nick, argv[i], sizeof nick); + else if(strcmp(argv[i], "-n") == 0) { + if(++i < argc) strncpy(nick, argv[i], sizeof nick - 1); } - else if(strncmp(argv[i], "-k", 3) == 0) { + else if(strcmp(argv[i], "-k") == 0) { if(++i < argc) password = argv[i]; } - else if(strncmp(argv[i], "-v", 3) == 0) + else if(strcmp(argv[i], "-v") == 0) die("sic-%s, © 2005-2009 sic engineers\n", VERSION); else die("usage: sic [-h host] [-p port] [-n nick] [-k keyword] [-v]\n"); @@ -241,7 +243,7 @@ trespond = time(NULL); } if(FD_ISSET(0, &rd) != 0) { - if(readl(0, (unsigned int) sizeof bufin, bufin) == -1) + if(readl(0, sizeof bufin, bufin) == -1) die("error: broken pipe\n"); parsein(bufin); }