X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=sic.c;h=3ef526cac58e3d5ed2eebf7ccc4a0dbbd4366711;hb=fe1e3560bedafa1d923bf34abb8f72aef2acb75f;hp=53547929f6dad5a0af72fcc853ee358ac2d629a4;hpb=1f1228547cbfa796a84d8e461fff09ac8f50752d;p=sic.git diff --git a/sic.c b/sic.c index 5354792..3ef526c 100644 --- a/sic.c +++ b/sic.c @@ -16,7 +16,7 @@ #define PINGTIMEOUT 300 #define MAXMSG 4096 -static char *server = "irc.oftc.net"; +static char *host = "irc.oftc.net"; static unsigned short port = 6667; static char *nick = NULL; static char *fullname = NULL; @@ -74,7 +74,7 @@ parsein(char *msg) { if(!strncmp(msg + 1, "j ", 2) && (msg[3] == '#')) snprintf(bufout, sizeof bufout, "JOIN %s\r\n", &msg[3]); else if(!strncmp(msg + 1, "l ", 2)) - snprintf(bufout, sizeof bufout, "PART %s :sic - 300 LOC are too much!\r\n", &msg[3]); + snprintf(bufout, sizeof bufout, "PART %s :sic - 250 LOC are too much!\r\n", &msg[3]); else if(!strncmp(msg + 1, "m ", 2)) { if((p = strchr(&msg[3], ' '))) *(p++) = 0; @@ -101,45 +101,44 @@ parsesrv(char *msg) { if(!msg || !(*msg)) return; - if(msg[0] == ':') { /* check prefix */ - if(!(p = strchr(msg, ' '))) - return; + pout("debug", msg); + if(msg[0] != ':') + return; /* don't handle prefix-less server commands */ + if(!(p = strchr(msg, ' '))) + return; + usr = &msg[1]; + *p = 0; + cmd = ++p; + if((p = strchr(usr, '!'))) *p = 0; - usr = &msg[1]; - cmd = ++p; - if((p = strchr(usr, '!'))) - *p = 0; - } else - cmd = msg; /* remove CRLFs */ - for(p = cmd; *p; p++) + if(!(p = strchr(cmd, ':'))) + return; + *p = 0; + txt = ++p; + for(p = txt; *p; p++) if(*p == '\r' || *p == '\n') *p = 0; if(!strncmp("PONG", cmd, 4)) return; - if(!strncmp("PRIVMSG", cmd, 7) || !strncmp("PING", cmd, 4)) { + if(!strncmp("PRIVMSG", cmd, 7) && txt) { if(!(p = strchr(cmd, ' '))) return; *p = 0; chan = ++p; for(; *p && *p != ' '; p++); *p = 0; - if(!(p = strchr(++p, ':'))) - return; - *p = 0; - txt = ++p; - if(!strncmp("PRIVMSG", cmd, 8) && chan && txt) { - snprintf(bufout, sizeof bufout, "<%s> %s", usr, txt); - pout(chan, bufout); - } - else if(!strncmp("PING", cmd, 5) && txt) { - snprintf(bufout, sizeof bufout, "PONG %s\r\n", txt); - write(srv, bufout, strlen(bufout)); - } - return; + snprintf(bufout, sizeof bufout, "<%s> %s", usr, txt); + pout(chan, bufout); + } + else if(!strncmp("PING", cmd, 4) && txt) { + snprintf(bufout, sizeof bufout, "PONG %s\r\n", txt); + write(srv, bufout, strlen(bufout)); + } + else { + snprintf(bufout, sizeof bufout, "-!- %s: %s", cmd, txt ? txt : ""); + pout(usr, bufout); } - snprintf(bufout, sizeof bufout, "-!- %s", cmd); - pout(server, bufout); } int @@ -153,8 +152,8 @@ main(int argc, char *argv[]) { nick = fullname = getenv("USER"); for(i = 1; i < argc; i++) - if(!strncmp(argv[i], "-s", 3)) { - if(++i < argc) server = argv[i]; + if(!strncmp(argv[i], "-h", 3)) { + if(++i < argc) host = argv[i]; } else if(!strncmp(argv[i], "-p", 3)) { if(++i < argc) port = (unsigned short)atoi(argv[i]); @@ -173,18 +172,18 @@ main(int argc, char *argv[]) { exit(EXIT_SUCCESS); } else { - fputs("usage: sic [-s server] [-p port] [-n nick]" + fputs("usage: sic [-h host] [-p port] [-n nick]" " [-k keyword] [-f fullname] [-v]\n", stderr); exit(EXIT_FAILURE); } /* init */ if((srv = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - fprintf(stderr, "sic: cannot connect server '%s'\n", server); + fprintf(stderr, "sic: cannot connect host '%s'\n", host); exit(EXIT_FAILURE); } - if (NULL == (hp = gethostbyname(server))) { - fprintf(stderr, "sic: cannot resolve hostname '%s'\n", server); + if (NULL == (hp = gethostbyname(host))) { + fprintf(stderr, "sic: cannot resolve hostname '%s'\n", host); exit(EXIT_FAILURE); } addr.sin_family = AF_INET; @@ -192,19 +191,19 @@ main(int argc, char *argv[]) { memcpy(&addr.sin_addr, hp->h_addr, hp->h_length); if(connect(srv, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))) { close(srv); - fprintf(stderr, "sic: cannot connect server '%s'\n", server); + fprintf(stderr, "sic: cannot connect host '%s'\n", host); exit(EXIT_FAILURE); } /* login */ if(password) snprintf(bufout, sizeof bufout, "PASS %s\r\nNICK %s\r\nUSER %s localhost %s :%s\r\n", - password, nick, nick, server, fullname); + password, nick, nick, host, fullname); else snprintf(bufout, sizeof bufout, "NICK %s\r\nUSER %s localhost %s :%s\r\n", - nick, nick, server, fullname); + nick, nick, host, fullname); write(srv, bufout, strlen(bufout)); - snprintf(ping, sizeof ping, "PING %s\r\n", server); + snprintf(ping, sizeof ping, "PING %s\r\n", host); channel[0] = 0; setbuf(stdout, NULL); /* unbuffered stdout */ @@ -222,7 +221,7 @@ main(int argc, char *argv[]) { exit(EXIT_FAILURE); } else if(i == 0) { if(time(NULL) - trespond >= PINGTIMEOUT) { - pout(server, "-!- sic shutting down: parse timeout"); + pout(host, "-!- sic shutting down: parse timeout"); exit(EXIT_FAILURE); } write(srv, ping, strlen(ping)); @@ -230,7 +229,7 @@ main(int argc, char *argv[]) { } if(FD_ISSET(srv, &rd)) { if(getline(srv, sizeof bufin, bufin) == -1) { - perror("sic: remote server closed connection"); + perror("sic: remote host closed connection"); exit(EXIT_FAILURE); } parsesrv(bufin);