Exemplo n.º 1
0
Arquivo: irc.c Projeto: trapped/meCh
void
irc_connect(void)
{
	struct sockaddr_in addr;
	struct hostent *serv;
	char buf[IRC_MSG_LEN];

	fd = socket(AF_INET, SOCK_STREAM/*|SOCK_NONBLOCK*/, 0);
	printf("Connecting to %s...\n", conf.host);
	serv = gethostbyname(conf.host);
	addr.sin_family = AF_INET;
	memcpy(&addr.sin_addr.s_addr, serv->h_addr, serv->h_length);
	addr.sin_port = htons(conf.port);
	if(connect(fd, (struct sockaddr *) &addr, sizeof(addr))<0) {
		puts("Connection error");
		exit(EXIT_FAILURE);
	}
	irc_read(buf);
	irc_read(buf);
	strcpy(buf, "USER ");
	strcat(buf, conf.name);
	strcat(buf, " ");
	strcat(buf, conf.name);
	strcat(buf, " ");
	strcat(buf, conf.name);
	strcat(buf, " ");
	strcat(buf, conf.name);
	strcat(buf, "\r\n");
	irc_cmd(buf);
	strcpy(buf, "NICK ");
	strcat(buf, conf.name);
	strcat(buf, "\r\n");
	irc_cmd(buf);
	irc_read(buf);
	buf[1] = 'O';
	irc_cmd(buf);
	while(irc_read(buf)) {
		buf[strlen(conf.name)+1] = '\0';
		if(!strcmp(buf+1, conf.name)) break;
	}
	strcpy(buf, "JOIN ");
	strcat(buf, conf.chan);
	strcat(buf, "\r\n");
	irc_cmd(buf);
	puts("Connected!");
	sprintf(buf, "Hello, I'm %s!", conf.name);
	irc_say(buf);
	while(irc_read(buf) && irc_get_type(buf)!=T_JOIN);
}
Exemplo n.º 2
0
int main(int argc, char **argv) {
	int socketfd, n;
	char in[BUF+1], out[BUF+1], c[512];
	char *pos, *action;

	if(argc != 5) {
		printf("Usage: %s <address> <port> <nick> <owner>\n", argv[0]);
		exit(1);
	} else if(atoi(argv[2]) < 1 || atoi(argv[2]) > 50000) {
		printf("Invalid port specified.\n");
		exit(1);
	} else if(irc_connect(argv[1], atoi(argv[2]), &socketfd) == 0) {
		printf("Failed to connect to %s.\n", argv[1]);
		exit(1);
	}

	nick = argv[3];
	owner = argv[4];

	if(strlen(nick)>48) {
		printf("Error: irc bot nickname too long\n");
		exit(1);
	}
	
	if(strlen(owner)>48) {
		printf("Error: bot owner nickname too long\n");
		exit(1);
	}

	/* write to buffer */
	sprintf(c, "NICK %s\r\n", nick);
	irc_send(socketfd, c);
	sprintf(c, "USER %s %s %s :%s\r\n", nick, nick, nick, nick);
	irc_send(socketfd, c);

	/* do the service jobs */
	if(join_channels(socketfd, "./owners.log") == 2) {
		return 1;
	}

	while(1) {
		in[0] = 0;
		n = irc_read(socketfd, in);

		if (n > 0) {
			char *str = process_string(in, n);
			if(strncmp(str, "0", 1)!=0) {
				irc_send(socketfd, str);
			}
			if(strncmp(str, "QUIT", 4)==0) {
				break;
			}
		} // if(n > 0)
	} // while(1)
	return 0;
}
Exemplo n.º 3
0
void irc_init(void)
{
    /*****************************************
     * Now connected, start sending commands *
     *****************************************/
        irc_write(bformat("PASS %s", bdata(config.password))); /* PASS password */
        irc_write(bformat("NICK %s", bdata(config.nickname))); /* NICK nickname */
        irc_write(bformat("USER %s %s %s :%s", bdata(config.ident), bdata(config.host), bdata(config.server_address), bdata(config.name))); /* USER ident host server :name */
    /**********************************
     * Read socket and stay connected *
     **********************************/
    irc_read();
}
Exemplo n.º 4
0
Arquivo: irc.c Projeto: rhaps0dy/meCh
void
irc_loop(void)
{
	char buf[IRC_MSG_LEN];
	while(1) {
		irc_read(buf);
		if(strbeg(buf, "PING")) {
			buf[1] = 'O';
			irc_cmd(buf);
		}
		else
			mod_handle(buf);
	}
}
Exemplo n.º 5
0
Arquivo: irc.c Projeto: dcat/irc
/*
 * irc_loop()
 *	loop to handle all callbacks
 */
int
irc_loop(int s)
{
	char buf[MSG_MAX];
	char tbuf[MSG_MAX]; /* tokenizer buffer */
	char *tok;
	char *ln = buf;
	int chr, cr, i, y;

	/* get irc msg loop */
	for (;;) {
		bzero(buf, MSG_MAX); /* zero out buffer */
		ln = buf;
		cr = 0;

		/* keep reading until CR and NL */
		for (;;) {
			chr = irc_read(s);

			if (chr == '\r')
				cr = 1;

			if (cr && chr == '\n') {
				*--ln = '\0';
				break;
			}

			*ln++ = (char)chr;
		}

		/* loop through callbacks */
		y = 0;
		strncpy(tbuf, buf, MSG_MAX);
		tok = strtok(tbuf, " ");
		while (tok != NULL) {
			for (i=0; i < LEN(cb); i++) {
				if (!strncmp(tok, cb[i].search, MSG_MAX)
						&& cb[i].n == y) {
					cb[i].fn(s, buf);
				}
			}

			tok = strtok(NULL, " ");
			y++;
		}
	}
}
Exemplo n.º 6
0
int
main(int argc, char **argv)
{
	init(&argc, &argv, &g_sett);
	atexit(cleanup);
#if HAVE_SIGINFO
	lsi_b_regsig(SIGINFO, infohnd);
#elif HAVE_SIGUSR1
	lsi_b_regsig(SIGUSR1, infohnd);
#endif
	bool failure = true;

	for (;;) {
		if (!irc_online(g_irc)) {
			D("connecting...");

			if (tryconnect()) {
				g_nexthb =
				    lsi_b_tstamp_us() + g_sett.heartbeat_us;
				continue;
			}

			W("failed to connect/logon (%s)",
			    g_sett.recon ? "retrying" : "giving up");

			if (!g_sett.recon)
				break;

			lsi_b_usleep(1000000ul * g_sett.cfwait_s);
			continue;
		}

		tokarr tok;
		uint64_t to = g_sett.heartbeat_us;
		int r = irc_read(g_irc, &tok, to ? to : 1000000);

		if (r < 0)
			break;

		if (g_dumpplx) {
			irc_dump(g_irc);
			if (irc_tracking_enab(g_irc))
				lsi_trk_dump(g_irc, false);
			g_dumpplx = false;
		}

		if (r > 0)
			g_nexthb = lsi_b_tstamp_us() + g_sett.heartbeat_us;
		else if (g_sett.heartbeat_us && g_nexthb <= lsi_b_tstamp_us()) {
			iprintf("PING %s\r\n", irc_myhost(g_irc));
			g_nexthb = lsi_b_tstamp_us() + g_sett.heartbeat_us;
		}

		if (r == 0)
			continue;

		if (strcmp(tok[1], "PING") == 0)
			iprintf("PONG :%s\r\n", tok[2]);
		else if (strcmp(tok[1], "PRIVMSG") == 0) {
			if (strncmp(tok[3], "ECHO ", 5) == 0) {
				char nick[64];
				lsi_ut_ident2nick(nick, sizeof nick, tok[0]);
				iprintf("PRIVMSG %s :%s\r\n", nick, tok[3]+5);
			} else if (strncmp(tok[3], "DO ", 3) == 0) {
				iprintf("%s\r\n", tok[3]+3);
			} else if (strcmp(tok[3], "DIE") == 0) {
				failure = false;
				break;
			} else if (strcmp(tok[3], "DUMP") == 0) {
				irc_dump(g_irc);
				lsi_trk_dump(g_irc, false);
			} else if (strcmp(tok[3], "FULLDUMP") == 0) {
				irc_dump(g_irc);
				lsi_trk_dump(g_irc, true);
			}
		}
	}

	return failure ? EXIT_FAILURE : EXIT_SUCCESS;
}