/* XPR --- eXternal PRotocol Driver written & (C) 1990 by Oliver Wagne */ #include #include #include #include #include #include #include #ifdef V030 #include #endif #include "xpr.h" extern void sprintf(char*,...); short os13; #define print(s) Write(Output(),s,strlen(s)) #define INFOSTRING "XPRD version V1.13; last compiled " __TIME__ " on " __DATE__ "\n\ Written and copyright © 1991 by Oliver Wagner, All Rights Reserved\n\ Contact:\n\x9b33;1m\ EMail : O.WAGNER@LINK-ESW.ZER (Z-Netz)\n\ O.WAGNER@LINK-ESW.ZER.SUB.ORG (Internet)\n\ Oliver Wagner of 2:240/5600 (Wauwaunet)\n\ Voice : (++49) (0)5659/518\n\ Data : (++49) (0)5659/1307 (24h DST) SUPPORT-BBS\n\ Snail : Oliver Wagner\n\ Auf Dem Stein 5\n\ 3441 Weißenborn\n\ West Germoney\n\x9b0m" extern char *xprfilearray[]; struct Library *XProtocolBase,*IntuitionBase,*GfxBase; char *libname="xprzmodem.library"; char *options=0; char *devname="serial.device"; short devnum=0; short nodelay=0; struct Screen *firstscreen=0; long rbuflen=0; short sharedaccess=0,rtscts=0; char *tempdir=0; long speed=0; short checkcarrier=0; short windowx=60,windowy=25; char *logfile=0; BPTR logfilep; char *errorfile=0; short nowindow=0; void exit(int); int atoi(char*); void initdisplay(void); long xpr_chk4abort(void); struct IOExtSer *xpr_serio; static struct IOExtSer ios; static struct MsgPort *smp; static int openserial(char *dev,int unit) { if(!(smp=CreatePort(0,0))) return(-1); ios.IOSer.io_Message.mn_ReplyPort=smp; if(sharedaccess) ios.io_SerFlags|=SERF_SHARED; if(OpenDevice(dev,unit,&ios,0)) { DeletePort(smp); return(-1); } xpr_serio=&ios; if(rbuflen||speed||rtscts) { if(rbuflen) ios.io_RBufLen=rbuflen; if(speed) ios.io_Baud=speed; if(rtscts) ios.io_SerFlags|=SERF_7WIRE; ios.IOSer.io_Command=SDCMD_SETPARAMS; DoIO(&ios); } ios.IOSer.io_Command=SDCMD_QUERY; DoIO(&ios); speed=ios.io_Baud; rtscts=ios.io_SerFlags&SERF_7WIRE; return(0); } static void closeserial(void) { CloseDevice(&ios); DeletePort(smp); } static char logbf[160]; void __stdargs plog(char typ,char *string,long arg1,long arg2) { long t; if(logfilep) { t=time(0); sprintf(logbf,"%lc %24.24s : ",(long)typ,ctime(&t)); Write(logfilep,logbf,strlen(logbf)); sprintf(logbf,string,arg1,arg2); Write(logfilep,logbf,strlen(logbf)); } } int __stdargs closelog(int x) { BPTR f; plog('!',"Exiting XPRD\n"); if(logfilep) Close(logfilep); sprintf(logbf,"%-2ld\n",x); if(errorfile) { if(f=Open(errorfile,MODE_NEWFILE)) { Write(f,logbf,3); Close(f); } } return(x); } void main(int argc, char**argv) { int c=1,l=0,com,retval=20; BPTR templock=0,oldlock=0; char *help,ch1,ch2; onexit(closelog); IntuitionBase=OpenLibrary("intuition.library",36); if(!IntuitionBase) { IntuitionBase=OldOpenLibrary("intuition.library"); os13=1; } GfxBase=OldOpenLibrary("graphics.library"); print("\x9b32;1m_____________________________________________________________________________\n\n\ \x9b0;33;3meXternal PRotocol Driver\x9b0m V1.13 by \x9b1mOliver Wagner\x9b0m © 1991, All Rights Reserved\n\ \x9b32;1m_____________________________________________________________________________\n\n\x9b0m"); #ifdef V030 { struct ExecBase *eb=*((struct ExecBase**)4); print("\t\t\t68020/30/40 \x9b33mONLY\x9b0m VERSION\n\n"); if(!(eb->AttnFlags&AFF_68020)) { print("\x07"); exit(20); } } #endif if(argc<2||*argv[1]=='?') { print("Usage: XPRD [-options] s[end]|r[eceive] [file1 [file2 [file3...]]]\navaible options:\n\ -l\x9b3mlibname \x9b0m - define XPR library (def.: \"xprzmodem.library\")\n\ -o\x9b3moptions \x9b0m - define XPR startup options string\n\ -d\x9b3mdevname \x9b0m - define IO device (def.: \"serial.device\")\n\ -u\x9b3munitnum \x9b0m - define IO device unit (def.: 0)\n\ -x\x9b3m[XS]speed \x9b0m - define IO device baud rate, RTS/CTS, SHARED\n\ -t\x9b3mdirname \x9b0m - define temporary dir for batch dl\n"); print("-b\x9b3mbufsize \x9b0m - define IO device read buffer size (K)\n\ -p\x9b3mx,y \x9b0m - define window X and Y position\n\ -m\x9b3mlogfile \x9b0m - enable log option (def.: \"xprd.log\")\n\ -r\x9b3merrfile \x9b0m - define return code output file\n\ -c - enable carrier detect\n\ -n - no delay after EOT\n\ -f - open window on frontmost screen (DANGER!)\n\ -q - don't open window; quiet mode\n\ -i - display version and copyright information\n"); exit(0); } while(*argv[c]=='-') { switch(tolower(argv[c][1])) { case 'l': libname=&argv[c][2]; break; case 'o': options=&argv[c][2]; break; case 'd': devname=&argv[c][2]; break; case 'u': devnum=atoi(&argv[c][2]); break; case 'b': rbuflen=atoi(&argv[c][2])<<10; break; case 'x': if(strlen(argv[c])<3) break; ch1=argv[c][2]; ch2=argv[c][3]; if(strlen(argv[c])>3) { if(ch1=='s'||ch2=='s') sharedaccess=1; if(ch1=='x'||ch2=='x') rtscts=1; if(ch2=='x'||ch2=='s') help=&argv[c][4]; else if(ch1=='x'||ch1=='s') help=&argv[c][3]; else help=&argv[c][2]; } else { help=&argv[c][2]; if(ch1=='s') { sharedaccess=1; help=&argv[c][3]; } else if(ch1=='x') { rtscts=1; help=&argv[c][3]; } } speed=atoi(help); break; case 'n': nodelay=1; break; case 'p': help=&argv[c][2]; if(*help==',') { windowy=atoi(&help[1]); break; } windowx=atoi(help); while(*help && *help!=',') help++; if(*help==',') windowy=atoi(&help[1]); break; case 'f': firstscreen=(struct Screen*)-1; if(strlen(argv[c])==10) stch_l(&argv[c][2],&firstscreen); if(!firstscreen) nowindow=1; break; case 's': sharedaccess=1; break; case 't': tempdir=&argv[c][2]; break; case 'c': checkcarrier=1; break; case 'i': print(INFOSTRING); exit(0); case 'm': if(strlen(argv[c])>2) logfile=&argv[c][2]; else logfile="XPRD.log"; if(!(logfilep=Open(logfile,MODE_OLDFILE))) { if(!(logfilep=Open(logfile,MODE_NEWFILE))) { print("Unable to open logfile!\x07\n"); exit(20); } } else Seek(logfilep,0,OFFSET_END); plog('!',"Started XPRD\n"); break; case 'r': errorfile=&argv[c][2]; break; case 'q': nowindow=1; break; default: print("Illegal option: '");print(&argv[c][1]); print("'!\x07\n"); exit(20); } c++; if(c==argc) { print("Missing SEND or RECEIVE!\n\x07"); exit(20); } } if(tolower(*argv[c])!='s'&&tolower(*argv[c])!='r') { print("Missing SEND or RECEIVE!\n\x07"); exit(20); } com=(tolower(*argv[c])=='s')?1:0; c++; if(c==argc) xprfilearray[l++]="NAPFSUELZE"; else while(c!=argc) xprfilearray[l++]=argv[c++]; xprfilearray[l]=0; if(!(XProtocolBase=OldOpenLibrary(libname))) { print("Failed to open XPR library!\n\x07"); exit(20); } if(openserial(devname,devnum)) { print("Failed to open IO device!\n\x07"); CloseLibrary(XProtocolBase); exit(20); } if(xprinit(options)) { print("Failed to init XPR library!\n\x07"); CloseLibrary(XProtocolBase); closeserial(); exit(20); } if(tempdir) { if(!(templock=Lock(tempdir,SHARED_LOCK))) { print("Failed to Lock() tempory dir!\n\x07"); goto xit; } if(!(oldlock=CurrentDir(templock))) { print("Can't CurrentDir() to temporary dir!\n\x07"); goto xit; } } if(nowindow) print("Doing transfer in quiet mode\n"); initdisplay(); if(!xpr_chk4abort()) { retval=(((com)?xprsend():xprreceive())==1)?0:20; } if(!nodelay) Delay(136); xit: if(oldlock) CurrentDir(oldlock); if(templock) UnLock(templock); xprclose(); closeserial(); CloseLibrary(XProtocolBase); exit(retval); }