#include "bbs.h"

extern long fsize,dtfsize,tfsize;
extern UWORD Sysopdl;
extern int FreeDFlag;
extern char flaglist[2048],Conference_Location[];
extern BYTE FreeDownloads;
extern int NumFiles;


char *IsInList(char *s,char *p,int *length);

static int Check_For_File_Size(char *Fn, char *CFN, UBYTE Z)
{
 int stat,pstat;
 UBYTE fflag,wflag,doflag;
 int tsec,min,secs;
 char path[255],str[255],final[255],tempstr[100],tempstr2[100],*p,*dp;
 char clog[200];
 FILE *ft;
 struct FileInfoBlock *FBlock;
 BPTR FLock;
 int drivenum;
 doflag=wflag=fflag=0;
 pstat=1;

 for(min=0; min<=strlen(Fn); min++) {
	    if(Fn[min]=='?'||Fn[min]=='*') {
		    wflag=1;
		    break;
		}
	}
 strcpy(tempstr2,Fn);
 strupr(tempstr2);

 if((FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL) {
	    MyError(1);  // MemError();
	    return(FAILURE);
	}
 if(Z==1)    goto JumpIn;

 if(Sysopdl) {
	    Z=1;
	    wflag=0;
	    goto JumpIn;
	}

 drivenum=1;
 sprintf(tempstr,"DLPATH.%d",drivenum++);
 do {
	    if(!Z) {
		    if(GetFromConf(CN-1,tempstr,path))
              { pstat=1;
			                  /* shouldnt this be 251 ?*/
              }else pstat=0;
		}
	    strcpy(final,path);
	    if(strlen(path)==0)		continue;
	    if(!pstat)		break;

JumpIn:
	    if(wflag==0) {
		    if(!Sysopdl) {
			    strcpy(final,path);
			    strcat(final,Fn);
			} else
               {
                  strcpy(final,Fn);
                  if(FindAssign(final))
                  {
                     goto outst;
                  }
              }
		    if((ft = fopen(final,"r"))) {
			    fclose(ft);
			    doflag=1;
			} else {
			    if(Sysopdl)   goto outst;
			}
		} else
		    doflag=1;

	    if(doflag) {
		    if((FLock=Lock(final,ACCESS_READ))==0) {
			    FreeDosObject(DOS_FIB,FBlock);
			    sprintf(str,"Error, Path %s missing, adjust paths file..",path);
			    AEPutStr(str);
			    AEPutStr("\r\n\r\n");
			    CallersLog(str);
			    CallersLog("\n");
			    return(FAILURE);
			}

         if(!(Examine(FLock,FBlock))) {
			    FreeDosObject(DOS_FIB,FBlock);
			    MyError(1);
			    UnLock(FLock);
			    return(FAILURE);
			}
		    if(wflag==0)	goto Gotit;

         while (ExNext(FLock,FBlock)) {     /* my change.. prior to this we had a blank file name */
			    if(FBlock->fib_DirEntryType<0) {
Gotit:
				    strcpy(tempstr,FBlock->fib_FileName);
				    strupr(tempstr);
				    stat=stcsma(tempstr,tempstr2);
				    if(stat>0||Sysopdl) {
					    fflag=1;
					    if(Sysopdl)
						    strcpy(final,Fn);
						else {
						    strcpy(final,path);
						    strcat(final,FBlock->fib_FileName);
						}
					    fsize = FBlock->fib_Size;
					    tsec=fsize/(Online_Baud/10L);
					    min=tsec/60L;
					    secs=tsec-(min*60L);
					    sprintf(str," %4ldk,%3d mins %2d secs %s\t",(fsize/1024L),min,secs,FBlock->fib_FileName);
					    if(str[16]==' ')  str[16]='0';
					    AEPutStr(str);
					    if(FBlock->fib_Comment[0]=='F'||FreeDownloads==0) {
						    AEPutStr("  >>Free Download!\r\n");
						    tfsize=tfsize-fsize;
						} else {
						    ++FreeDFlag;
						    AEPutStr("\r\n");
						}
					    if(Z!=1||Sysopdl) {
/***** SYSTEM SECURITY ADDED BY JOSEPH HODGE *****/
                                if(!strnicmp(FBlock->fib_Comment,"Restricted",10))
                                {
                                  AEPutStr("    >>Restricted File<< Updating CallersLog\r\n");
 sprintf(clog,"\t\tAttempt to download RESTRICTED file [%s]\n",Fn);
                 CallersLog(clog);                                  
                                  FreeDosObject(DOS_FIB,FBlock);
							UnLock(FLock);
							return(11);
						  }

						    if(strlen(final)+strlen(CFN)>2000) {
							    AEPutStr(" Too many entries!!  The remainder was left off.\r\n");
							    --NumFiles;
							    FreeDosObject(DOS_FIB,FBlock);
							    UnLock(FLock);
							    return(11);
							}
						    if(!(dp=IsInList(CFN,final,&stat))) {
							    ++NumFiles;
							    strcat(CFN,final); strcat(CFN," ");
							    if(!(p=IsInList(flaglist,FBlock->fib_FileName,&stat))) {
								    strcat(flaglist,FBlock->fib_FileName); strcat(flaglist," ");
								}
							} else
							    AEPutStr("   File is already selected!\r\n");
						} if(dp==NULL) {
						    tfsize=tfsize+fsize;
						    dtfsize=dtfsize+fsize;
						}
					    if(wflag==0) {
						    FreeDosObject(DOS_FIB,FBlock);
						    UnLock(FLock);
						    if(dp!=NULL)
							    return(FAILURE);
							 else
							    return(SUCCESS);
						}
					}
				    if(SCheckInput()) {
					    stat=ReadChar(1L);
					    if(stat<0) {
						    FreeDosObject(DOS_FIB,FBlock);
						    UnLock(FLock);
						    return(NO_CARRIER);
						}
 					switch(stat) {
 						case '\023': /* Pause */
	    						stat=ReadChar(KEYBOARD_TIMEOUT);
		    					if(stat<0)	{
 								FreeDosObject(DOS_FIB,FBlock);
	    							UnLock(FLock);
	    	    					return(NO_CARRIER);
		    					}
				    			break;
					    	case '\003': /* ^C */
						    	AEPutStr("**Break\r\n");
							    FreeDosObject(DOS_FIB,FBlock);
 							UnLock(FLock);
 							return(10);
	    						break;
						}           /* end switch */
					}
				}
			}
          UnLock(FLock);
		    if(Z==1)	goto outst;
		}
	 sprintf(tempstr,"DLPATH.%d",drivenum++);

     } while(pstat);

outst:

 FreeDosObject(DOS_FIB,FBlock);

 if(fflag==0)	{
	    sprintf(str,"       File (%s) not found.\r\n",Fn);
	    AEPutStr(str);
	    return(FAILURE);
	}
 if(dp!=NULL)	return(FAILURE);
 return(SUCCESS);
}

int Check_list(char *lfnames, char *CLrfinal)
{
 int x,cnt,status;
 char str[255];

 cnt=0;
 for(x=0;x<strlen(lfnames);++x) {
	    if(lfnames[x]!=' ')	{
		    str[cnt]=lfnames[x];
		    ++cnt;
		} else {
		    str[cnt]='\0';
		    if(strlen(str)>1) {
			    status=Check_For_File_Size(str,CLrfinal,0);
			    if(status==11||status==10)
				    return(SUCCESS);

			    cnt=0;
			}
		}
	}
return(SUCCESS);
}
