/* answer connections to port 1974 -- if the bot's not running, reload it TO COMPILE: cc -o autore autore.c */ #include #include #include #include #include #include #include #include #include #include #define PORT 1974 #define SCRIPT "/your/full/path/here/botchk" void fatal(s) char *s; { printf("\n\n* %s\n",s); exit(1); } /* returns a socket number for a listening socket that will accept any */ /* connection -- port # is returned in port */ int open_listen(port) int *port; { int sock,addrlen; struct sockaddr_in name; sock=socket(AF_INET,SOCK_STREAM,0); if (sock<0) fatal("Can't open a socket at all.",0); bzero((char *)&name,sizeof(struct sockaddr_in)); name.sin_family=AF_INET; name.sin_port=htons(*port); /* 0 = just assign us a port */ name.sin_addr.s_addr=INADDR_ANY; if (bind(sock,(struct sockaddr *)&name,sizeof(name))<0) { close(sock); return -1; } /* what port are we on? */ addrlen=sizeof(name); if (getsockname(sock,(struct sockaddr *)&name,&addrlen)<0) { close(sock); return -1; } *port=ntohs(name.sin_port); if (listen(sock,1)<0) { close(sock); return -1; } return sock; } /* given network-style IP address, return hostname */ /* hostname will be "##.##.##.##" format if there was an error */ char *hostnamefromip(ip) unsigned long ip; { static char name[121]; struct hostent *hp; unsigned long addr=ip; unsigned char *p; hp=gethostbyaddr((char *)&addr,sizeof(addr),AF_INET); if (hp==NULL) { p=(unsigned char *)&addr; sprintf(name,"%u.%u.%u.%u",p[0],p[1],p[2],p[3]); } else strcpy(name,hp->h_name); return name; } /* short routine to answer a connect received on a socket made previously */ /* by open_listen ... returns hostname of the caller & the new socket */ /* does NOT dispose of old "public" socket! */ int answer(sock,caller) int sock; char *caller; { int new_sock,addrlen; struct sockaddr_in from; unsigned long ip; addrlen=sizeof(struct sockaddr); new_sock=accept(sock,(struct sockaddr *)&from,&addrlen); if (new_sock<0) return -1; ip=from.sin_addr.s_addr; strcpy(caller,hostnamefromip(ip)); return new_sock; } main() { int i,x,y; fd_set fd; char s[121]; i=getdtablesize(); x=fork(); if (x>0) { printf("\nBot auto-restart running now.\n"); exit(0); } if (x==-1) { printf("\nCan't fork.\n"); exit(1); } y=PORT; x=open_listen(&y); if (x==-1) { fprintf(stderr,"\nAUTORE: Can't open listening socket at %d.\n",PORT); exit(1); } while(1) { FD_ZERO(&fd); FD_SET(x,&fd); if (select(i,&fd,NULL,NULL,NULL)==-1) { fprintf(stderr,"\nAUTORE: select returned error.\n"); exit(1); } y=answer(x,s); if (y!=-1) if (fork()==0) { dup2(y,1); dup2(y,2); system(SCRIPT); sleep(1); close(y); exit(0); } else close(y); } }