www.pudn.com > pccp047.zip > SESSION.C


/*	Copyright (C) 1992 Peter Edward Cann, all rights reserved. 
 *	MicroSoft QuickC 
 */ 
 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include"port.h" 
 
sendchar(c) 
	unsigned char c; 
	{ 
	while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK))) 
		if(kbhit()) 
			getch(); 
	outp(basereg, c); 
	} 
 
int follow; 
 
quit() 
	{ 
	cleanup(0); 
	exit(99); 
	} 
 
sendstr(str) 
	char *str; 
	{ 
	int i; 
	for(i=0;str[i]!='\0';++i) 
		if(str[i]=='\n') 
			{ 
			sendchar('\r'); 
			sendchar('\n'); 
			} 
		else 
			sendchar(str[i]); 
	} 
 
portgets(str) 
	char *str; 
	{ 
	int i; 
	i=0; 
	while(i<255) 
		{ 
		while(follow==index) 
			{ 
			if(!(inp(basereg+MSTATREG)&DCDMASK)) 
				return(-1); 
			if(kbhit()) 
				getch(); 
			} 
		str[i]=buf[follow++]; 
		follow%=TBUFSIZ; 
		if(str[i]=='\b') 
			if(i>0) 
				{ 
				i-=2; 
				sendchar('\b'); 
				sendchar(' '); 
				sendchar('\b'); 
				} 
			else 
				{ 
				i--; 
				sendchar(0x07); 
				} 
		else 
			sendchar(str[i]); 
		if((str[i]=='\r')||(str[i]=='\n')) 
			{ 
			sendchar('\r'); 
			sendchar('\n'); 
			str[i]='\0'; 
			break; 
			} 
		i++; 
		} 
	str[255]='\0'; 
	return(0); 
	} 
		 
getlegalpath(str, dirstr) 
	char *str, *dirstr; 
	{ 
	char str1[256]; 
	int i; 
	if(portgets(str1)==-1) 
		return(-1); 
	if(dirstr[0]) 
		{ 
		for(i=0;i<255;++i) 
			{ 
			if(str1[i]=='\0') 
				break; 
			if((str1[i]=='.')&&(str1[i+1]=='.')) 
				{ 
				str[0]='\0'; 
				return(0); 
				} 
			} 
		sprintf(str, "%s\\%s", dirstr, str1); 
		} 
	else 
		strcpy(str, str1); 
	} 
 
main(argc, argv) 
	int argc; 
	char **argv; 
	{ 
	long timestamp; 
	int i, j, outfd, ok, c, run, result; 
	char str[256], udir[256], ddir[256]; 
	index=follow=0; 
	printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n"); 
	if(!strcmp(getenv("REMOTE"), "YES")) 
		{ 
		printf("You appear to be already logged in remotely, judging by the environment\n"); 
		printf("variable REMOTE, so this is probably a very bad idea.\n"); 
		printf("Are you sure you want to run SESSION? (y or n) --> "); 
		if(getchar()!='y') /* Note getchar() and not getch()! */ 
			{ 
			printf("I didn't think so!\n"); 
			exit(99); 
			} 
		else 
			printf("OK, you're the boss!"); 
		} 
	printf("Control-C to Exit.\n"); 
	if((argc!=5)&&(argc!=3)) 
		{ 
		printf("USAGE: session   [ ]\n"); 
		exit(1); 
		} 
	if(argc==5) 
		{ 
		strcpy(ddir, argv[3]); 
		strcpy(udir, argv[4]); 
		} 
	else 
		{ 
		ddir[0]='\0'; 
		udir[0]='\0'; 
		} 
	comnum=atoi(argv[1])-1; 
	speed=atoi(argv[2]); 
	databits='8'; 
	parity='n'; 
	stopbits='1'; 
	setport(); 
	readset(); 
	setup(); 
	signal(SIGINT, quit); 
	run=1; 
	while(run) 
		{ 
		sendstr("\n\n     DOWNLOAD:  (1) Xmodem   (2) Xmodem CRC   (3) Xmodem CRC 1K\n\n"); 
		sendstr("       UPLOAD:  (4) Xmodem   (5) Xmodem CRC 1K Optional\n\n"); 
		if(argc==5) 
			sendstr("                   (q) Quit\n\n             ---> "); 
		else 
			sendstr("                 (s) Shell        (q) Quit\n\n             ---> "); 
		while(index==follow) 
			{ 
			if(!(inp(basereg+MSTATREG)&DCDMASK)) 
				{ 
				run=0; 
				break; 
				} 
			if(kbhit()) 
				getch(); 
			} 
		if(!run) 
			break; 
		c=buf[follow++]; 
		follow%=TBUFSIZ; 
		switch(c) 
			{ 
			case 'q': 
			case 'Q': 
				sendstr("Quit\n"); 
				run=0; 
				break; 
			case 's': 
			case 'S': 
				if(argc==5) 
					{ 
					sendstr("Shell not available with restricted directory.\n"); 
					break; 
					} 
				sendstr("Shell\n"); 
				printf("Entering command.com remote shell.\n"); 
				sprintf(str, "COM%d", comnum+1); 
				putenv("PROMPT=REMOTE>$p$g"); 
				putenv("REMOTE=YES"); 
				cleanup(INHCTL); 
				spawnlp(P_WAIT, "c:\\command.com", "command.com", str, "/e:01024", NULL); 
				putenv("REMOTE=NO"); 
				setup(); 
				break; 
			case '1': 
				sendstr("Xmodem Download.\nSource file pathname? (Blank to cancel)\n --> "); 
				if((result=getlegalpath(str, ddir))==-1) 
					{ 
					run=0; 
					break; 
					} 
				if(!strlen(str)) 
					break; 
				cleanup(INHCTL); 
				result=spawnlp(P_WAIT, "xmodems", "xmodems", argv[1], argv[2], "1", str, NULL); 
				setup(); 
				sendstr("Press any key to continue: --> "); 
				while(follow==index) 
					{ 
					if(!(inp(basereg+MSTATREG)&DCDMASK)) 
						{ 
						run=0; 
						break; 
						} 
					if(kbhit()) 
						getch(); 
					} 
				follow=index; 
				sprintf(str, "Exit code = %d.\n", result); 
				sendstr(str); 
				break; 
			case '2': 
				sendstr("Xmodem CRC Download.\nSource file pathname? (Blank to cancel)\n --> "); 
				if((result=getlegalpath(str, ddir))==-1) 
					{ 
					run=0; 
					break; 
					} 
				if(!strlen(str)) 
					break; 
				cleanup(INHCTL); 
				result=spawnlp(P_WAIT, "xmcrcs", "xmcrcs", argv[1], argv[2], "1", str, NULL); 
				setup(); 
				sendstr("Press any key to continue: --> "); 
				while(follow==index) 
					{ 
					if(!(inp(basereg+MSTATREG)&DCDMASK)) 
						{ 
						run=0; 
						break; 
						} 
					if(kbhit()) 
						getch(); 
					} 
				follow=index; 
				sprintf(str, "Exit code = %d.\n", result); 
				sendstr(str); 
				break; 
			case '3': 
				sendstr("Xmodem CRC 1k Download.\nSource file pathname? (Blank to cancel)\n --> "); 
				if((result=getlegalpath(str, ddir))==-1) 
					{ 
					run=0; 
					break; 
					} 
				if(!strlen(str)) 
					break; 
				cleanup(INHCTL); 
				result=spawnlp(P_WAIT, "xmcrc1ks", "xmcrc1ks", argv[1], argv[2], "1", str, NULL); 
				setup(); 
				sendstr("Press any key to continue: --> "); 
				while(follow==index) 
					{ 
					if(!(inp(basereg+MSTATREG)&DCDMASK)) 
						{ 
						run=0; 
						break; 
						} 
					if(kbhit()) 
						getch(); 
					} 
				follow=index; 
				sprintf(str, "Exit code = %d.\n", result); 
				sendstr(str); 
				break; 
			case '4': 
				sendstr("Xmodem Upload.\nTarget file pathname? (Blank to cancel)\n --> "); 
				if((result=getlegalpath(str, udir))==-1) 
					{ 
					run=0; 
					break; 
					} 
				if(!strlen(str)) 
					break; 
				cleanup(INHCTL); 
				result=spawnlp(P_WAIT, "xmodemr", "xmodemr", argv[1], argv[2], "1", str, NULL); 
				setup(); 
				sendstr("Press any key to continue: --> "); 
				while(follow==index) 
					{ 
					if(!(inp(basereg+MSTATREG)&DCDMASK)) 
						{ 
						run=0; 
						break; 
						} 
					if(kbhit()) 
						getch(); 
					} 
				follow=index; 
				sprintf(str, "Exit code = %d.\n", result); 
				sendstr(str); 
				break; 
			case '5': 
				sendstr("Xmodem CRC Upload, 1k Optional.\nTarget file pathname? (Blank to cancel)\n --> "); 
				if((result=getlegalpath(str, udir))==-1) 
					{ 
					run=0; 
					break; 
					} 
				if(!strlen(str)) 
					break; 
				cleanup(INHCTL); 
				result=spawnlp(P_WAIT, "xmcrc1kr", "xmcrc1kr", argv[1], argv[2], "1", str, NULL); 
				setup(); 
				sendstr("Press any key to continue: --> "); 
				while(follow==index) 
					{ 
					if(!(inp(basereg+MSTATREG)&DCDMASK)) 
						{ 
						run=0; 
						break; 
						} 
					if(kbhit()) 
						getch(); 
					} 
				follow=index; 
				sprintf(str, "Exit code = %d.\n", result); 
				sendstr(str); 
				break; 
			} 
		} 
	cleanup(INHCTL); 
	exit(0); 
	}