From 759063908d19e592f0d3bb3759964cec35114c8c Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 17 Jul 2006 18:17:31 +0200 Subject: [PATCH] initial commit --- LICENSE | 22 ++++ Makefile | 53 ++++++++ README | 26 ++++ config.mk | 15 +++ sic | Bin 0 -> 22978 bytes sic.1 | 57 ++++++++ sic.c | 387 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ sic.o | Bin 0 -> 19984 bytes 8 files changed, 560 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README create mode 100644 config.mk create mode 100755 sic create mode 100644 sic.1 create mode 100644 sic.c create mode 100644 sic.o diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c64b537 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT/X Consortium License + +(C)opyright MMV-MMVI Anselm R. Garbe +(C)opyright MMV Nico Golde + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9c11042 --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +# ii - irc it - simple but flexible IRC client +# (C)opyright MMV Anselm R. Garbe, Nico Golde + +include config.mk + +SRC = sic.c +OBJ = ${SRC:.c=.o} +MAN1 = sic.1 +BIN = sic + +all: options sic + @echo built sic + +options: + @echo ii build options: + @echo "LIBS = ${LIBS}" + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +.c.o: + @echo CC $< + @${CC} -c ${CFLAGS} $< + +clean: + rm -f sic *.o core sic-${VERSION}.tar.gz + +dist: clean + @mkdir -p sic-${VERSION} + @cp -R Makefile README LICENSE config.mk sic.c sic.1 sic-${VERSION} + @tar -cf sic-${VERSION}.tar sic-${VERSION} + @gzip sic-${VERSION}.tar + @rm -rf sic-${VERSION} + +sic: ${OBJ} + @echo LD $@ + @${CC} -o $@ ${OBJ} ${LDFLAGS} + +install: all + @mkdir -p ${DESTDIR}${PREFIX}/bin + @cp -f ${BIN} ${DESTDIR}${PREFIX}/bin + @echo installed executable files to ${DESTDIR}${PREFIX}/bin + @mkdir -p ${DESTDIR}${MANPREFIX}/man1 + @cp -f ${MAN1} ${DESTDIR}${MANPREFIX}/man1 + @echo installed manual pages to ${DESTDIR}${MANPREFIX}/man1 + +uninstall: + for i in ${BIN}; do \ + rm -f ${DESTDIR}${PREFIX}/bin/`basename $$i`; \ + done + for i in ${MAN1}; do \ + rm -f ${DESTDIR}${MANPREFIX}/man1/`basename $$i`; \ + done diff --git a/README b/README new file mode 100644 index 0000000..09a06c7 --- /dev/null +++ b/README @@ -0,0 +1,26 @@ +sic - simple irc client +----------------------- + +sic is an extremly fast, small and simple irc client. It reads commands from +standard input and prints all server output to standard output. It multiplexes +also all channel traffic into one output, that you don't have to switch +different channel buffers, that's actually a feature. + +Installation +------------ +Edit config.mk to match your local setup. sic is installed into +/usr/local by default. + +Afterwards enter the following command to build and install sic +(if necessary as root): + + $ make clean install + +Running sic +----------- +Simply invoke the 'sic' command with the required arguments. + + +Configuration +------------- +No configuration is needed. diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..6b45112 --- /dev/null +++ b/config.mk @@ -0,0 +1,15 @@ +# Customize to fit your system + +# paths +PREFIX = /usr/local +MANPREFIX = ${PREFIX}/share/man + +VERSION = 0.0 + +# includes and libs +LIBS = -L${PREFIX}/lib -L/usr/lib -lc + +# compiler +CFLAGS = -g -Wall -O2 -I${PREFIX}/include -I/usr/include \ + -DVERSION=\"${VERSION}\" +LDFLAGS = -g ${LIBS} diff --git a/sic b/sic new file mode 100755 index 0000000000000000000000000000000000000000..bceff5b894e32f0fea64da1f7983c43a6d3965ea GIT binary patch literal 22978 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 + * (C)opyright MMV-MMVI Nico Golde + * See LICENSE file for license details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PING_TIMEOUT 300 +#define MAXMSG 4096 + +enum { TOK_NICKSRV = 0, TOK_USER, TOK_CMD, TOK_CHAN, TOK_ARG, TOK_TEXT, TOK_LAST }; + +static int irc; +static time_t last_response; +static char nick[32]; /* might change while running */ +static char message[MAXMSG]; /* message buf used for communication */ +static char *host = NULL; + +static int +tcpopen(char *address) +{ + int fd = 0; + char *port; + struct sockaddr_in addr = { 0 }; + struct hostent *hp; + unsigned int prt; + + if((host = strchr(address, '!'))) + *(host++) = 0; + + if(!(port = strrchr(host, '!'))) + return -1; + *port = 0; + port++; + if(sscanf(port, "%d", &prt) != 1) + return -1; + + /* init */ + if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + return -1; + hp = gethostbyname(host); + addr.sin_family = AF_INET; + addr.sin_port = htons(prt); + bcopy(hp->h_addr, &addr.sin_addr, hp->h_length); + + if(connect(fd, (struct sockaddr *) &addr, + sizeof(struct sockaddr_in))) { + close(fd); + return -1; + } + return fd; +} + +unsigned int +tokenize(char **result, unsigned int reslen, char *str, char delim) +{ + char *p, *n; + unsigned int i = 0; + + if(!str) + return 0; + for(n = str; *n == delim; n++); + p = n; + for(i = 0; *n != 0;) { + if(i == reslen) + return i; + if(*n == delim) { + *n = 0; + if(strlen(p)) + result[i++] = p; + p = ++n; + } else + n++; + } + if((i < reslen) && (p < n) && strlen(p)) + result[i++] = p; + return i; /* number of tokens */ +} + +static void +print_out(char *channel, char *buf) +{ + static char buft[18]; + time_t t = time(0); + + strftime(buft, sizeof(buft), "%F %R", localtime(&t)); + fprintf(stdout, "%s: %s %s\n", channel, buft, buf); +} + +static void +proc_channels_privmsg(char *channel, char *buf) +{ + snprintf(message, MAXMSG, "<%s> %s", nick, buf); + print_out(channel, message); + snprintf(message, MAXMSG, "PRIVMSG %s :%s\r\n", channel, buf); + write(irc, message, strlen(message)); +} + +static void +proc_channels_input(char *buf) +{ + char *p; + + if((p = strchr(buf, ' '))) + *(p++) = 0; + if(buf[0] != '/' && buf[0] != 0) { + proc_channels_privmsg(buf, p); + return; + } + if((p = strchr(&buf[3], ' '))) + *(p++) = 0; + switch (buf[1]) { + case 'j': + if(buf[3] == '#') + snprintf(message, MAXMSG, "JOIN %s\r\n", &buf[3]); + else if(p) { + proc_channels_privmsg(&buf[3], p + 1); + return; + } + break; + case 't': + snprintf(message, MAXMSG, "TOPIC %s :%s\r\n", &buf[3], p); + break; + case 'l': + if(p) + snprintf(message, MAXMSG, "PART %s :%s\r\n", &buf[3], p); + else + snprintf(message, MAXMSG, "PART %s :sic - 300 SLOC are too much\r\n", &buf[3]); + write(irc, message, strlen(message)); + return; + break; + default: + snprintf(message, MAXMSG, "%s\r\n", &buf[1]); + break; + } + write(irc, message, strlen(message)); +} + +static void +proc_server_cmd(char *buf) +{ + char *argv[TOK_LAST], *cmd, *p; + int i; + if(!buf || *buf=='\0') + return; + + for(i = 0; i < TOK_LAST; i++) + argv[i] = NULL; + + /* + ::= [':' ] + ::= | [ '!' ] [ '@' ] + ::= { } | + ::= ' ' { ' ' } + ::= [ ':' | ] + ::= + ::= + ::= CR LF + */ + if(buf[0] == ':') { /* check prefix */ + p = strchr(buf, ' '); + *p = 0; + for(++p; *p == ' '; p++); + cmd = p; + argv[TOK_NICKSRV] = &buf[1]; + if((p = strchr(buf, '!'))) { + *p = 0; + argv[TOK_USER] = ++p; + } + } else + cmd = buf; + + /* remove CRLFs */ + for(p = cmd; p && *p != 0; p++) + if(*p == '\r' || *p == '\n') + *p = 0; + + if((p = strchr(cmd, ':'))) { + *p = 0; + argv[TOK_TEXT] = ++p; + } + tokenize(&argv[TOK_CMD], TOK_LAST - TOK_CMD, cmd, ' '); + + if(!strncmp("PONG", argv[TOK_CMD], 5)) { + return; + } else if(!strncmp("PING", argv[TOK_CMD], 5)) { + snprintf(message, MAXMSG, "PONG %s\r\n", argv[TOK_TEXT]); + write(irc, message, strlen(message)); + return; + } else if(!argv[TOK_NICKSRV] || !argv[TOK_USER]) { /* server command */ + snprintf(message, MAXMSG, "%s", argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + print_out(0, message); + return; + } else if(!strncmp("ERROR", argv[TOK_CMD], 6)) + snprintf(message, MAXMSG, "-!- error %s", + argv[TOK_TEXT] ? argv[TOK_TEXT] : "unknown"); + else if(!strncmp("JOIN", argv[TOK_CMD], 5)) { + if(argv[TOK_TEXT]!=NULL){ + p = strchr(argv[TOK_TEXT], ' '); + if(p) + *p = 0; + } + argv[TOK_CHAN] = argv[TOK_TEXT]; + snprintf(message, MAXMSG, "-!- %s(%s) has joined %s", + argv[TOK_NICKSRV], argv[TOK_USER], argv[TOK_TEXT]); + } else if(!strncmp("PART", argv[TOK_CMD], 5)) { + snprintf(message, MAXMSG, "-!- %s(%s) has left %s", + argv[TOK_NICKSRV], argv[TOK_USER], argv[TOK_CHAN]); + } else if(!strncmp("MODE", argv[TOK_CMD], 5)) + snprintf(message, MAXMSG, "-!- %s changed mode/%s -> %s %s", + argv[TOK_NICKSRV], argv[TOK_CMD + 1], + argv[TOK_CMD + 2], argv[TOK_CMD + 3]); + else if(!strncmp("QUIT", argv[TOK_CMD], 5)) + snprintf(message, MAXMSG, "-!- %s(%s) has quit \"%s\"", + argv[TOK_NICKSRV], argv[TOK_USER], + argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + else if(!strncmp("NICK", argv[TOK_CMD], 5)) + snprintf(message, MAXMSG, "-!- %s changed nick to %s", + argv[TOK_NICKSRV], argv[TOK_TEXT]); + else if(!strncmp("TOPIC", argv[TOK_CMD], 6)) + snprintf(message, MAXMSG, "-!- %s changed topic to \"%s\"", + argv[TOK_NICKSRV], argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + else if(!strncmp("KICK", argv[TOK_CMD], 5)) + snprintf(message, MAXMSG, "-!- %s kicked %s (\"%s\")", + argv[TOK_NICKSRV], argv[TOK_ARG], + argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + else if(!strncmp("NOTICE", argv[TOK_CMD], 7)) + snprintf(message, MAXMSG, "-!- \"%s\")", + argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + else if(!strncmp("PRIVMSG", argv[TOK_CMD], 8)) + snprintf(message, MAXMSG, "<%s> %s", + argv[TOK_NICKSRV], argv[TOK_TEXT] ? argv[TOK_TEXT] : ""); + if(!argv[TOK_CHAN] || !strncmp(argv[TOK_CHAN], nick, strlen(nick))) + print_out(argv[TOK_NICKSRV], message); + else + print_out(argv[TOK_CHAN], message); +} + +static int +read_line(int fd, unsigned int res_len, char *buf) +{ + unsigned int i = 0; + char c; + do { + if(read(fd, &c, sizeof(char)) != sizeof(char)) + return -1; + buf[i++] = c; + } + while(c != '\n' && i < res_len); + buf[i - 1] = 0; /* eliminates '\n' */ + return 0; +} + +static void +handle_server_output() +{ + static char buf[MAXMSG]; + if(read_line(irc, MAXMSG, buf) == -1) { + perror("sic: remote host closed connection"); + exit(EXIT_FAILURE); + } + proc_server_cmd(buf); +} + +int +main(int argc, char *argv[]) +{ + char address[256]; + char *password = NULL; + char *fullname = NULL; + char ping_msg[512], buf[MAXMSG]; + int i, n, r, maxfd; + struct passwd *spw = getpwuid(getuid()); + struct timeval tv; + fd_set rd; + + if(!spw) { + fprintf(stderr,"sic: getpwuid() failed\n"); + exit(EXIT_FAILURE); + } + snprintf(nick, sizeof(nick), "%s", spw->pw_name); + + if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'h') + goto Usage; + + address[0] = 0; + for(i = 1; (i + 1 < argc) && (argv[i][0] == '-'); i++) { + switch (argv[i][1]) { + default: +Usage: + fputs("usage: sic -a address [-n nick] [-f fullname] [-p password] [-v]\n", + stdout); + exit(EXIT_FAILURE); + break; + case 'a': + strncpy(address, argv[++i], sizeof(address)); + break; + case 'n': + snprintf(nick, sizeof(nick), "%s", argv[++i]); + break; + case 'p': + password = argv[++i]; + break; + case 'f': + fullname = argv[++i]; + break; + } + } + + if(!address[0]) + goto Usage; + + if((irc = tcpopen(address)) == -1) { + fprintf(stderr, "sic: cannot connect server '%s'\n", address); + exit(EXIT_FAILURE); + } + /* login */ + if(password) + snprintf(message, MAXMSG, + "PASS %s\r\nNICK %s\r\nUSER %s localhost %s :%s\r\n", + password, nick, nick, host, fullname ? fullname : nick); + else + snprintf(message, MAXMSG, "NICK %s\r\nUSER %s localhost %s :%s\r\n", + nick, nick, host, fullname ? fullname : nick); + write(irc, message, strlen(message)); + + snprintf(ping_msg, sizeof(ping_msg), "PING %s\r\n", host); + for(;;) { + FD_ZERO(&rd); + maxfd = irc; + FD_SET(0, &rd); + FD_SET(irc, &rd); + tv.tv_sec = 120; + tv.tv_usec = 0; + r = select(maxfd + 1, &rd, 0, 0, &tv); + if(r < 0) { + if(errno == EINTR) + continue; + perror("sic: error on select()"); + exit(EXIT_FAILURE); + } else if(r == 0) { + if(time(NULL) - last_response >= PING_TIMEOUT) { + print_out(NULL, "-!- sic shutting down: ping timeout"); + exit(EXIT_FAILURE); + } + write(irc, ping_msg, strlen(ping_msg)); + continue; + } + if(FD_ISSET(irc, &rd)) { + handle_server_output(); + last_response = time(NULL); + } + if(FD_ISSET(0, &rd)) { + i = n = 0; + for(;;) { + if((i = getchar()) == EOF) { + perror("sic: broken pipe"); + exit(EXIT_FAILURE); + } + if(i == '\n' || n >= sizeof(buf) - 1) + break; + buf[n++] = i; + } + buf[n] = 0; + proc_channels_input(buf); + } + } + + return 0; +} diff --git a/sic.o b/sic.o new file mode 100644 index 0000000000000000000000000000000000000000..a79c11238da7c7f696cab166c0b1602da663afcd GIT binary patch literal 19984 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 literal 0 HcmV?d00001 -- 2.52.0