syslog listener
This commit is contained in:
parent
83e07a13b1
commit
db349a8ccc
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
||||
CFLAGS := -O2 -pipe -Wall
|
||||
|
||||
OBJS := configfile.o event.o ircsession.o linebuffer.o logging.o sockaddr.o tcpsocket.o
|
||||
OBJS := configfile.o event.o ircsession.o linebuffer.o logging.o sockaddr.o syslog.o tcpsocket.o
|
||||
|
||||
all: irclogbot
|
||||
|
||||
|
10
irclogbot.c
10
irclogbot.c
@ -5,9 +5,9 @@
|
||||
#include "configfile.h"
|
||||
#include "event.h"
|
||||
#include "ircsession.h"
|
||||
#include "list.h"
|
||||
#include "logging.h"
|
||||
#include "sockaddr.h"
|
||||
#include "syslog.h"
|
||||
|
||||
#define DEFAULT_CONFIG "irclogbot.conf"
|
||||
|
||||
@ -17,6 +17,11 @@ int main(int argc, char *argv[])
|
||||
if (config_parse(DEFAULT_CONFIG))
|
||||
exit(1);
|
||||
|
||||
char *syslog_addr = (char *)config_get_string("global", "syslog-addr", "0.0.0.0:514");
|
||||
int logsock = syslog_listen(syslog_addr);
|
||||
if (logsock == -1)
|
||||
exit(1);
|
||||
|
||||
char *server_str = (char *)config_get_string("global", "server", NULL);
|
||||
if (server_str == NULL)
|
||||
exit(1);
|
||||
@ -33,8 +38,11 @@ int main(int argc, char *argv[])
|
||||
session->channel_key = (char *)config_get_string("global", "channel-key", NULL);
|
||||
|
||||
irc_connect(session);
|
||||
|
||||
event_add_readfd(NULL, logsock, syslog_cb, session);
|
||||
event_loop();
|
||||
|
||||
close(logsock);
|
||||
config_free();
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
[global]
|
||||
syslog-addr 0.0.0.0:514
|
||||
|
||||
server 83.140.172.211:6667
|
||||
#server-pass test
|
||||
|
||||
|
@ -33,7 +33,8 @@ enum {
|
||||
|
||||
struct irc_session * irc_create_session(void);
|
||||
void irc_destroy_session(struct irc_session *session);
|
||||
|
||||
int irc_connect(struct irc_session *session);
|
||||
|
||||
int irc_send(struct irc_session *session, const char *fmt, ...);
|
||||
|
||||
#endif /* _IRCSESSION_H_ */
|
||||
|
55
syslog.c
Normal file
55
syslog.c
Normal file
@ -0,0 +1,55 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "ircsession.h"
|
||||
#include "logging.h"
|
||||
#include "sockaddr.h"
|
||||
|
||||
int syslog_listen(const char *addr_str)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
parse_sockaddr(addr_str, &addr);
|
||||
|
||||
int sock = socket(PF_INET, SOCK_DGRAM, 0);
|
||||
if (sock < 0) {
|
||||
log_print(LOG_ERROR, "socket()");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
log_print(LOG_ERROR, "bind()");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
int syslog_cb(int fd, void *privdata)
|
||||
{
|
||||
struct irc_session *session = (struct irc_session *)privdata;
|
||||
|
||||
char buf[1500];
|
||||
struct sockaddr_in addr;
|
||||
unsigned int i = sizeof(addr);
|
||||
|
||||
int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &i);
|
||||
if (len <= 0)
|
||||
return -1;
|
||||
|
||||
if (session->state != IRC_JOINED)
|
||||
return 0;
|
||||
|
||||
buf[len] = '\0';
|
||||
|
||||
char *tmp = strchr(buf, ' ');
|
||||
tmp = strchr(tmp +1, ' ');
|
||||
tmp = strchr(tmp +1, ' ');
|
||||
|
||||
irc_send(session, "PRIVMSG %s :%s: %s", session->channel, inet_ntoa(addr.sin_addr), tmp +1);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user