]>
jfr.im git - irc/quakenet/newserv.git/blob - nickrate/nickrate.c
1 #include "../server/server.h"
2 #include "../core/hooks.h"
3 #include "../core/events.h"
4 #include "../nick/nick.h"
7 #include <sys/socket.h>
9 #include "../core/error.h"
13 #include <sys/ioctl.h>
15 #include <netinet/in.h>
20 int nickrate_listenfd
;
22 void nr_nick(int hooknum
, void *arg
);
23 void nr_handlelistensocket(int fd
, short events
);
24 int nr_openlistensocket(int portnum
);
29 registerhook(HOOK_NICK_NEWNICK
, &nr_nick
);
30 registerhook(HOOK_NICK_LOSTNICK
, &nr_nick
);
32 nickrate_listenfd
=nr_openlistensocket(6002);
33 if (nickrate_listenfd
>0) {
34 registerhandler(nickrate_listenfd
,POLLIN
,&nr_handlelistensocket
);
40 deregisterhook(HOOK_NICK_NEWNICK
, &nr_nick
);
41 deregisterhook(HOOK_NICK_LOSTNICK
, &nr_nick
);
42 deregisterhandler(nickrate_listenfd
,1);
45 void nr_nick(int hooknum
, void *arg
) {
48 if (serverlist
[homeserver(np
->numeric
)].linkstate
== LS_LINKED
) {
49 if (hooknum
==HOOK_NICK_NEWNICK
) {
57 int nr_openlistensocket(int portnum
) {
58 struct sockaddr_in sin
;
62 if ((fd
=socket(AF_INET
,SOCK_STREAM
,0))==-1) {
63 Error("proxyscan",ERR_ERROR
,"Unable to open listening socket (%d).",errno
);
67 if (setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, (const char *) &opt
, sizeof(opt
))!=0) {
68 Error("proxyscan",ERR_ERROR
,"Unable to set SO_REUSEADDR on listen socket.");
72 /* Initialiase the addresses */
73 memset(&sin
,0,sizeof(sin
));
74 sin
.sin_family
=AF_INET
;
75 sin
.sin_port
=htons(portnum
);
77 if (bind(fd
, (struct sockaddr
*) &sin
, sizeof(sin
))) {
78 Error("proxyscan",ERR_ERROR
,"Unable to bind listen socket (%d).",errno
);
84 if (ioctl(fd
, FIONBIO
, &opt
)!=0) {
85 Error("proxyscan",ERR_ERROR
,"Unable to set listen socket non-blocking.");
92 /* Here's what we do when poll throws the listen socket at us:
93 * accept() the connection, spam a short message and immediately
96 void nr_handlelistensocket(int fd
, short events
) {
97 struct sockaddr_in sin
;
98 socklen_t addrsize
=sizeof(sin
);
101 if ((newfd
=accept(fd
, (struct sockaddr
*)&sin
, &addrsize
))>0) {
102 /* Got new connection */
103 sprintf(buf
,"%u\n",nicks
);
104 write(newfd
,buf
,strlen(buf
));
105 sprintf(buf
,"%u\n",quits
);
106 write(newfd
,buf
,strlen(buf
));