File:  [Synchronet] / sbbs / sbbs2 / execfile.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:37:52 2018 UTC (8 years, 3 months ago) by root
Branches: digitaldynamics, MAIN
CVS tags: v3_00c, v2_30b, HEAD
2.30b OS/2

#line 1 "EXECFILE.C"

/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */

#include "sbbs.h"
#include "cmdshell.h"

int execfile(csi_t *csi)
{
	uchar	str[256],tmp2[128],*path,ch,*p;
	int 	i,j,k,s,file,x,y;
	long	l;
	stats_t stats;
	node_t	node;
	file_t	f;
	time_t	t;
    csi_t   bin;

switch(*(csi->ip++)) {

	case CS_FILE_SELECT_AREA:
		csi->logic=LOGIC_FALSE;
		if(!usrlibs) return(0);
		while(online) {
			j=0;
			if(usrlibs>1) {
				sprintf(str,"%sMENU\\LIBS.*",text_dir);
				if(fexist(str))
					menu("LIBS");
				else {
					bputs(text[CfgLibLstHdr]);
					for(i=0;i<usrlibs && !msgabort();i++) {
						if(i==curlib)
							outchar('*');
						else outchar(SP);
						if(i<9) outchar(SP);
						if(i<99) outchar(SP);
						bprintf(text[CfgLibLstFmt]
							,i+1,lib[usrlib[i]]->lname); } }
				sprintf(str,text[JoinWhichLib],curlib+1);
				mnemonics(str);
				j=getnum(usrlibs);
				if((int)j==-1)
					return(0);
				if(!j)
					j=curlib;
				else
					j--; }
			sprintf(str,"%sMENU\\DIRS%u.*",text_dir,usrlib[j]+1);
			if(fexist(str)) {
				sprintf(str,"DIRS%u",usrlib[j]+1);
				menu(str); }
			else {
				CLS;
				bprintf(text[DirLstHdr],lib[usrlib[j]]->lname);
				for(i=0;i<usrdirs[j] && !msgabort();i++) {
					if(i==curdir[j]) outchar('*');
					else outchar(SP);
					sprintf(str,text[DirLstFmt],i+1
						,dir[usrdir[j][i]]->lname,nulstr
						,getfiles(usrdir[j][i]));
					if(i<9) outchar(SP);
					if(i<99) outchar(SP);
					bputs(str); } }
			sprintf(str,text[JoinWhichDir],curdir[j]+1);
			mnemonics(str);
			i=getnum(usrdirs[j]);
			if((int)i==-1) {
				if(usrlibs==1)
					return(0);
				continue; }
			if(!i)
				i=curdir[j];
			else
				i--;
			curlib=j;
			curdir[curlib]=i;
			csi->logic=LOGIC_TRUE;
			return(0); }
		return(0);

	case CS_FILE_GET_DIR_NUM:

		if(useron.misc&COLDKEYS) {
			i=atoi(csi->str);
			if(i && i<=usrdirs[curlib] && usrlibs)
				curdir[curlib]=i-1;
			return(0); }

		ch=getkey(K_UPPER);
		outchar(ch);
		if((ch&0xf)*10<=usrdirs[curlib] && (ch&0xf) && usrlibs) {
			i=(ch&0xf)*10;
			ch=getkey(K_UPPER);
			if(!isdigit(ch) && ch!=CR) {
				ungetkey(ch);
				curdir[curlib]=(i/10)-1;
				return(0); }
			outchar(ch);
			if(ch==CR) {
				curdir[curlib]=(i/10)-1;
				return(0); }
			logch(ch,0);
			i+=ch&0xf;
			if(i*10<=usrdirs[curlib]) { 	/* 100+ dirs */
				i*=10;
				ch=getkey(K_UPPER);
				if(!isdigit(ch) && ch!=CR) {
					ungetkey(ch);
					curdir[curlib]=(i/10)-1;
					return(0); }
				outchar(ch);
				if(ch==CR) {
					curdir[curlib]=(i/10)-1;
					return(0); }
				logch(ch,0);
				i+=ch&0xf; }
			if(i<=usrdirs[curlib])
				curdir[curlib]=i-1;
			return(0); }
		if((ch&0xf)<=usrdirs[curlib] && (ch&0xf) && usrlibs)
			curdir[curlib]=(ch&0xf)-1;
		return(0);

	case CS_FILE_GET_LIB_NUM:

		if(useron.misc&COLDKEYS) {
			i=atoi(csi->str);
			if(i && i<=usrlibs)
				curlib=i-1;
			return(0); }

		ch=getkey(K_UPPER);
		outchar(ch);
		if((ch&0xf)*10<=usrlibs && (ch&0xf)) {
			i=(ch&0xf)*10;
			ch=getkey(K_UPPER);
			if(!isdigit(ch) && ch!=CR) {
				ungetkey(ch);
				curlib=(i/10)-1;
				return(0); }
			outchar(ch);
			if(ch==CR) {
				curlib=(i/10)-1;
				return(0); }
			logch(ch,0);
			i+=ch&0xf;
			if(i<=usrlibs)
				curlib=i-1;
			return(0); }
		if((ch&0xf)<=usrlibs && (ch&0xf))
			curlib=(ch&0xf)-1;
		return(0);

	case CS_FILE_SHOW_LIBRARIES:
		if(!usrlibs) return(0);
		sprintf(str,"%sMENU\\LIBS.*",text_dir);
		if(fexist(str)) {
			menu("LIBS");
			return(0); }
		bputs(text[LibLstHdr]);
		for(i=0;i<usrlibs && !msgabort();i++) {
			if(i==curlib)
				outchar('*');
			else outchar(SP);
			if(i<9) outchar(SP);
			bprintf(text[LibLstFmt],i+1
				,lib[usrlib[i]]->lname,nulstr,usrdirs[i]); }
		return(0);

	case CS_FILE_SHOW_DIRECTORIES:
		if(!usrlibs) return(0);
		sprintf(str,"%sMENU\\DIRS%u.*",text_dir,usrlib[curlib]+1);
		if(fexist(str)) {
			sprintf(str,"DIRS%u",usrlib[curlib]+1);
			menu(str);
			return(0); }
		CRLF;
		bprintf(text[DirLstHdr],lib[usrlib[curlib]]->lname);
		for(i=0;i<usrdirs[curlib] && !msgabort();i++) {
			if(i==curdir[curlib]) outchar('*');
			else outchar(SP);
			sprintf(str,text[DirLstFmt],i+1
				,dir[usrdir[curlib][i]]->lname,nulstr
				,getfiles(usrdir[curlib][i]));
			if(i<9) outchar(SP);
			if(i<99) outchar(SP);
			bputs(str); }
		return(0);

	case CS_FILE_LIBRARY_UP:
		curlib++;
		if(curlib>=usrlibs)
			curlib=0;
		return(0);
	case CS_FILE_LIBRARY_DOWN:
		if(!curlib)
			curlib=usrlibs-1;
		else curlib--;
		return(0);
	case CS_FILE_DIRECTORY_UP:
		if(!usrlibs) return(0);
		curdir[curlib]++;
		if(curdir[curlib]>=usrdirs[curlib])
			curdir[curlib]=0;
		return(0);
	case CS_FILE_DIRECTORY_DOWN:
		if(!usrlibs) return(0);
		if(!curdir[curlib])
			curdir[curlib]=usrdirs[curlib]-1;
		else curdir[curlib]--;
		return(0);
	case CS_FILE_SET_AREA:
		csi->logic=LOGIC_TRUE;
		for(i=0;i<usrlibs;i++)
			for(j=0;j<usrdirs[i];j++)
				if(!stricmp(csi->str,dir[usrdir[i][j]]->code)) {
					curlib=i;
					curdir[i]=j;
					return(0); }
		csi->logic=LOGIC_FALSE;
		return(0);
	case CS_FILE_SET_LIBRARY:
		csi->logic=LOGIC_TRUE;
		for(i=0;i<usrlibs;i++)
			if(!stricmp(lib[usrlib[i]]->sname,csi->str))
				break;
		if(i<usrlibs)
			curlib=i;
		else
			csi->logic=LOGIC_FALSE;
		return(0);

	case CS_FILE_UPLOAD:
		csi->logic=LOGIC_FALSE;
		if(useron.rest&FLAG('U')) {
			bputs(text[R_Upload]);
			return(0); }
		if(usrlibs) {
			i=usrdir[curlib][curdir[curlib]];
			if(upload_dir!=INVALID_DIR
				&& !chk_ar(dir[i]->ul_ar,useron))
				i=upload_dir; }
		else
			i=upload_dir;

		if((uint)i==INVALID_DIR || !chk_ar(dir[i]->ul_ar,useron)) {
			bputs(text[CantUploadHere]);
			return(0); }

		if(gettotalfiles(i)>=dir[i]->maxfiles)
			bputs(text[DirFull]);
		else {
			upload(i);
			csi->logic=LOGIC_TRUE; }
		return(0);
	case CS_FILE_UPLOAD_USER:
		csi->logic=LOGIC_FALSE;
		if(user_dir==INVALID_DIR) {
			bputs(text[NoUserDir]);
			return(0); }
		if(gettotalfiles(user_dir)>=dir[user_dir]->maxfiles)
			bputs(text[UserDirFull]);
		else if(useron.rest&FLAG('U'))
			bputs(text[R_Upload]);
		else if(!chk_ar(dir[user_dir]->ul_ar,useron))
			bputs(text[CantUploadToUser]);
		else {
			upload(user_dir);
			csi->logic=LOGIC_TRUE; }
		return(0);
	case CS_FILE_UPLOAD_SYSOP:
		csi->logic=LOGIC_FALSE;
		if(sysop_dir==INVALID_DIR) {
			bputs(text[NoSysopDir]);
			return(0); }
		if(gettotalfiles(sysop_dir)>=dir[sysop_dir]->maxfiles)
			bputs(text[DirFull]);
		else if(useron.rest&FLAG('U'))
			bputs(text[R_Upload]);
		else if(!chk_ar(dir[sysop_dir]->ul_ar,useron))
			bputs(text[CantUploadToSysop]);
		else {
			upload(sysop_dir);
			csi->logic=LOGIC_TRUE; }
		return(0);
	case CS_FILE_DOWNLOAD:
		if(!usrlibs) return(0);
		if(useron.rest&FLAG('D')) {
			bputs(text[R_Download]);
			return(0); }
		padfname(csi->str,str);
		strupr(str);
		if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_DOWNLOAD)) {
			bputs(text[SearchingAllDirs]);
			for(i=0;i<usrdirs[curlib];i++)
				if(i!=curdir[curlib] &&
					(s=listfileinfo(usrdir[curlib][i],str,FI_DOWNLOAD))!=0)
					if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
						return(0);
			bputs(text[SearchingAllLibs]);
			for(i=0;i<usrlibs;i++) {
				if(i==curlib) continue;
				for(j=0;j<usrdirs[i];j++)
					if((s=listfileinfo(usrdir[i][j],str,FI_DOWNLOAD))!=0)
						if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
							return(0); } }
		return(0);
	case CS_FILE_DOWNLOAD_USER: /* Download from user dir */
		csi->logic=LOGIC_FALSE;
		if(user_dir==INVALID_DIR) {
			bputs(text[NoUserDir]);
			return(0); }
		if(useron.rest&FLAG('D')) {
			bputs(text[R_Download]);
			return(0); }
		CRLF;
		if(!listfileinfo(user_dir,nulstr,FI_USERXFER))
			bputs(text[NoFilesForYou]);
		else
			csi->logic=LOGIC_TRUE;
		return(0);
	case CS_FILE_DOWNLOAD_BATCH:
		if(batdn_total && yesno(text[DownloadBatchQ])) {
			start_batch_download();
			csi->logic=LOGIC_TRUE; }
		else
			csi->logic=LOGIC_FALSE;
		return(0);
	case CS_FILE_BATCH_ADD_LIST:
		batch_add_list(csi->str);
		return(0);
	case CS_FILE_BATCH_ADD:
		csi->logic=LOGIC_FALSE;
		if(!csi->str[0])
			return(0);
		padfname(csi->str,f.name);
		strupr(f.name);
		for(x=0;x<usrlibs;x++) {
			for(y=0;y<usrdirs[x];y++)
				if(findfile(usrdir[x][y],f.name))
					break;
			if(y<usrdirs[x])
				break; }
		if(x>=usrlibs)
			return(0);
		f.dir=usrdir[x][y];
		getfileixb(&f);
		f.size=0;
		getfiledat(&f);
		addtobatdl(f);
		csi->logic=LOGIC_TRUE;
		return(0);
	case CS_FILE_BATCH_CLEAR:
		if(!batdn_total) {
			csi->logic=LOGIC_FALSE;
			return(0); }
		csi->logic=LOGIC_TRUE;
		for(i=0;i<batdn_total;i++) {
			f.dir=batdn_dir[i];
			f.datoffset=batdn_offset[i];
			f.size=batdn_size[i];
			strcpy(f.name,batdn_name[i]);
			closefile(f); }
		batdn_total=0;
		return(0);

	case CS_FILE_VIEW:
		if(!usrlibs) return(0);
		padfname(csi->str,str);
		strupr(str);
		csi->logic=LOGIC_TRUE;
		if(listfiles(usrdir[curlib][curdir[curlib]],str,0,FL_VIEW))
			return(0);
		bputs(text[SearchingAllDirs]);
		for(i=0;i<usrdirs[curlib];i++) {
			if(i==curdir[curlib]) continue;
			if(listfiles(usrdir[curlib][i],str,0,FL_VIEW))
				break; }
		if(i<usrdirs[curlib])
			return(0);
		bputs(text[SearchingAllLibs]);
		for(i=0;i<usrlibs;i++) {
			if(i==curlib) continue;
			for(j=0;j<usrdirs[i];j++)
				if(listfiles(usrdir[i][j],str,0,FL_VIEW))
					return(0); }
		csi->logic=LOGIC_FALSE;
		bputs(text[FileNotFound]);
		return(0);
	case CS_FILE_LIST:	  /* List files in current dir */
		if(!usrlibs) return(0);
		csi->logic=LOGIC_FALSE;
		if(!getfiles(usrdir[curlib][curdir[curlib]])) {
			bputs(text[EmptyDir]);
			return(0); }
		padfname(csi->str,str);
		strupr(str);
		s=listfiles(usrdir[curlib][curdir[curlib]],str,0,0);
		if(s>1) {
			bprintf(text[NFilesListed],s); }
		csi->logic=!s;
		return(0);
	case CS_FILE_LIST_EXTENDED: /* Extended Information on files */
		if(!usrlibs) return(0);
		padfname(csi->str,str);
		strupr(str);
		if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_INFO)) {
			bputs(text[SearchingAllDirs]);
			for(i=0;i<usrdirs[curlib];i++)
				if(i!=curdir[curlib] && (s=listfileinfo(usrdir[curlib][i]
					,str,FI_INFO))!=0)
					if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
						return(0);
			bputs(text[SearchingAllLibs]);
			for(i=0;i<usrlibs;i++) {
				if(i==curlib) continue;
				for(j=0;j<usrdirs[i];j++)
					if((s=listfileinfo(usrdir[i][j],str,FI_INFO))!=0)
						if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
							return(0); } }
		return(0);
	case CS_FILE_FIND_TEXT: 	/* Find text in descriptions */
		scandirs(FL_FINDDESC);
		return(0);
	case CS_FILE_FIND_TEXT_ALL: 	/* Find text in descriptions */
		scanalldirs(FL_FINDDESC);
		return(0);
	case CS_FILE_FIND_NAME: 	/* Find text in descriptions */
		scandirs(FL_NO_HDR);
		return(0);
	case CS_FILE_FIND_NAME_ALL: 	/* Find text in descriptions */
		scanalldirs(FL_NO_HDR);
		return(0);
	case CS_FILE_BATCH_SECTION:
		batchmenu();
		return(0);
	case CS_FILE_TEMP_SECTION:
		temp_xfer();
		return(0);
	case CS_FILE_PTRS_CFG:
		csi->logic=!inputnstime(&ns_time);
		return(0);
	case CS_FILE_NEW_SCAN:
		scandirs(FL_ULTIME);
		return(0);
	case CS_FILE_NEW_SCAN_ALL:
		scanalldirs(FL_ULTIME);
		return(0);
	case CS_FILE_REMOVE:
		if(!usrlibs) return(0);
		if(useron.rest&FLAG('R')) {
			bputs(text[R_RemoveFiles]);
			return(0); }
		padfname(csi->str,str);
		strupr(str);
		if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_REMOVE)) {
			if(user_dir!=INVALID_DIR
				&& user_dir!=usrdir[curlib][curdir[curlib]])
				if((s=listfileinfo(user_dir,str,FI_REMOVE))!=0)
					if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
						return(0);
			bputs(text[SearchingAllDirs]);
			for(i=0;i<usrdirs[curlib];i++)
				if(i!=curdir[curlib] && i!=user_dir
					&& (s=listfileinfo(usrdir[curlib][i],str,FI_REMOVE))!=0)
					if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
						return(0);
			bputs(text[SearchingAllLibs]);
			for(i=0;i<usrlibs;i++) {
				if(i==curlib || i==user_dir) continue;
				for(j=0;j<usrdirs[i]; j++)
					if((s=listfileinfo(usrdir[i][j],str,FI_REMOVE))!=0)
						if(s==-1 || (!strchr(str,'?') && !strchr(str,'*')))
							return(0); } }
		return(0);
 }

errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1));
return(0);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.