MGFTP023.E MGFTP023.EBACKUP/INTERCHANGE/BLOCK=8192 FTP_STARTUP.COM,ANONYMOUS_LOGIN.TEMPLATE,FTP_LOGICALS.TEMPLATE,FTP_START_LISTENER.COM,FTP_SERVER.COM,FTP_GET_ANONYMOUS_PASSWORD.COM,FTP_GET_CONNECTION_INFO.COM,FTP_RUN_LISTENER.COM,FTP_COM_FILES.TXT,FTP.VERSION,FTP.CLD,FTP.OPT,FTP.ALPHA_OPT,FTP_LISTENER.OPT,FTP_LISTENER.ALPHA_OPT,FTP_SERVER.OPT,FTP_SERVER.ALPHA_OPT,MG_BIN_VAX:[MGFTP]FTP.OLB,MG_BIN_AXP:[MGFTP]FTP.ALPHA_OLB,MG_BIN_VAX:[MGFTP]FTP_LISTENER.OLB,MG_BIN_AXP:[MGFTP]FTP_LISTENER.ALPHA_OLB,MG_BIN_VAX:[MGFTP]FTP_SERVER.OLB,MG_BIN_AXP:[MGFTP]FTP_SERVER.ALPHA_OLB,MG_KIT:[MGFTP]FTP_COMMAND.HLP,MG_KIT:[MGFTP]MADGOAT_FTP_HELP.HLB MG_KIT:[MGFTP]MGFTP023.E/SAVE GOATHUNTER *V7.1 _GHUNT1:: _$1$DKA100: V6.2  *[MGFTP.KIT]FTP_STARTUP.COM;3+,B./ 4Jb-~J0123KPWO56(4O}`m70*89\A#GHJ $ save_verify = 'f$verify(0)'$!++$! $! Startup file for MadGoat FTP$!B$! Copyright 1994,1996, MadGoat Software. All rights reserved.$!*$! Hunter Goatley, goathunter@MadGoat.com$!$! 6-MAY-1994 09:30$!$!--$ say := write sys$output $ say "Starting MadGoat FTP...."#$ proc = f$environment("PROCEDURE")$!$$! Define MADGOAT_ROOT logical name$!5$ this_dir = f$parse(proc,,,"DEVICE","NO_CONCEAL") +-8 f$parse(proc,,,"DIRECTORY","NO_CONCEAL")$ x=f$locate("][",this_dir)$ if x.ne.f$length(this_dir)$ then($ this_dir_1 = f$extract(0,x,this_dir);$ this_dir_2 = f$extract(x+2,f$length(this_dir),this_dir)/$ this_dir = this_dir_1+this_dir_2-"COM]"+"]"*$ else this_dir = this_dir - "COM]" + "]"$ endifJ$ DEFINE/NOLOG/SYSTEM/EXECUTIVE/TRANSLAT=CONCEALED MADGOAT_ROOT 'this_dir'$$ axp = f$getsyi("HW_MODEL").ge.1024$ if axpI$ then define/nolog/system/executive madgoat_exe madgoat_root:[alpha_exe]C$ else define/nolog/system/executive madgoat_exe madgoat_root:[exe]$ endif$!$! Start NETLIB, if necessary$!3$ netlib_startup = "SYS$STARTUP:NETLIB_STARTUP.COM"$$ if f$search(netlib_startup).eqs.""C$ then say "SYS$STARTUP:NETLIB_STARTUP.COM startup file not found!" $ goto byebye$ endif?$ if f$trnlnm("NETLIB_SHRXFR","LNM$SYSTEM_TABLE").eqs."" then - @'netlib_startup'$!8$! Define the MadGoat FTP logicals, if the file exists.$!7$ file = f$search("MADGOAT_ROOT:[COM]FTP_LOGICALS.COM")$ if file.nes."" then @'file'$!$ install := $install/command$!.$! Install the MadGoat FTP client, if desired.$!0$ if p1.eqs."SERVER_ONLY" then goto server_start$!$ file = "MADGOAT_EXE:FTP.EXE"$ if f$search(file).nes. ""4$ then if f$file_attributes(file, "KNOWN") then - install delete 'file'&$ install add 'file'/OPEN/HEADER/SHARE$ endif$!G$! Define logicals OPENVMS$FTP and OPENVMS$FTPDIR so that MGFTP client%$! is used for COPY/FTP and DIR/FTP.$!6$ define/nolog/system/exec openvms$ftp madgoat_exe:ftp9$ define/nolog/system/exec openvms$ftpdir madgoat_exe:ftp$!:$! Install the server and start the listener, if desired.$!*$ if p1.eqs."CLIENT_ONLY" then goto byebye$!$ server_start:%$ file = "MADGOAT_EXE:FTP_SERVER.EXE"$ if f$search(file).nes. ""4$ then if f$file_attributes(file, "KNOWN") then - install delete 'file';$ install add 'file'/OPEN/HEADER/SHARE/PRIV=(SYSPRV,PHY_IO)$ endif$!#$! Start the MadGoat FTP listener.$!=$ file = f$search("MADGOAT_ROOT:[COM]FTP_START_LISTENER.COM")$ if file.nes."" then @'file'$! $ byebye:!$ exit 1.or.f$verify(save_verify)  MGFTP023.E1~J%[MGFTP.KIT]ANONYMOUS_LOGIN.TEMPLATE;3[ %*[MGFTP.KIT]ANONYMOUS_LOGIN.TEMPLATE;3+,1./ 4[-~J0123KPWO 56P|tm75*89\A#GHJ($ sav = 'f$verify(0)' !Turn off verify$!A$! Copyright 1994,1996, MadGoat Software. All rights reserved.$!$! ANONYMOUS_LOGIN.TEMPLATE$!D$! This file should be edited as appropriate and copied as LOGIN.COM"$! for each anonymous FTP account.$!3$ username = f$edit(f$getjpi("","USERNAME"),"TRIM")P$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$!F$! The code below copies the host name and IP address into the symbolsC$! HOST_NAME and HOST_IP. If a host name cannot be determined, the$$! IP address will be used for both.$!C$ @madgoat_root:[com]ftp_get_connection_info.com !Get the host info$!>$! The IP address is checked to determine if this is a "local"2$! connection; non-local connections are rejected.$!B$! This section could be expanded to allow different file accesses1$! based on the remote host name or address, etc.$!,$!$ if f$extract(0,6,host_ip).eqs."161.6." -6$! then define madgoat_ftp_reject_'username' "Goodbye"$!C$! Now, you also get the local IP number throught which the requestB$! is made, as well as the hostname for it if available. The codeH$! below will mangle them a little, so they become usable in conjunction$$! with some logical name standards.$!$ loop1:!$ p = f$locate (".", local_name)F$ if p .eq. f$length (local_name) then p = f$locate ("-", local_name)"$ if p .lt. f$length (local_name)$ then;$ local_name == f$extract (0, p, local_name) + "_" + -( f$extract (p+1, 1000, local_name)$ goto loop1$ endif$ loop2:$ p = f$locate (".", local_ip)B$ if p .eq. f$length (local_ip) then p = f$locate ("-", local_ip) $ if p .lt. f$length (local_ip)$ then7$ local_ip == f$extract (0, p, local_ip) + "_" + -$ f$extract (p+1, 1000, local_ip)$ goto loop2$ endif$!?$! The code below copies the anonymous password into the symbolA$! ANONYMOUS_PASSWORD. The password is then compared to a string6$! that is used to reject a login using that password.$!B$! This section could be expanded to allow different file accesses&$! based on the entered password, etc.$!G$!$ @madgoat_root:[com]ftp_get_anonymous_password.com !Get the password9$!$ if anonymous_password .eqs. "BURKHDR@alpha.wku.edu" -6$! then define madgoat_ftp_reject_'username' "Goodbye"$!$!++$!D$! MADGOAT_ANONYMOUS_FTP_DIRS probably doesn't include the ANONYMOUSC$! account's login directory, since this is where the log files areA$! kept, by default. Therefore, if MADGOAT_FTP_ANONYMOUS_DIRS isF$! defined, use the first entry as the default directory. Note, sinceG$! entries can take the form dev:[dir...], we may need to trim ...] off$! of the end of the dir spec.$!;$! We first check for MADGOAT_FTP_ANONYMOUS_host-name_DIRS +$! and MADGOAT_FTP_ANONYMOUS_ip-number_DIRS$!Z$ defdir = f$trnlnm("MADGOAT_FTP_''USERNAME'_''local_name'_DIRS","MADGOAT_FTP_NAME_TABLE")$ if defdir .eqs. "" then -[ defdir = f$trnlnm("MADGOAT_FTP_''USERNAME'_''local_ip'_DIRS","MADGOAT_FTP_NAME_TABLE")$ if defdir .eqs. "" then -O defdir = f$trnlnm("MADGOAT_FTP_''USERNAME'_DIRS","MADGOAT_FTP_NAME_TABLE")+$ if defdir .nes. "" .and. defdir .nes. " "$ then$ length = f$length(defdir)*$ delimit = f$extract(length-1,1,defdir)/$ if f$extract(length-4,3,defdir) .eqs. "..."-$ then sublen = length-4 !Strip off ...]*$ else sublen = length-1 !Strip off ] $ endif3$ defdir = f$extract(0,sublen,defdir)+"."+delimit($ define/trans=conc anonymous 'defdir'"$ set default anonymous:[000000]$ endif$!<$! Don't allow any access except RETR (GET) and LIST (DIR)!$!<$ define madgoat_ftp_restrict 14 !RETR and LIST access only!$!2$ exit 1 .or. f$verify(sav) !Restore verify state   MGFTP023.E ~J"[MGFTP.KIT]FTP_LOGICALS.TEMPLATE;4N"*[MGFTP.KIT]FTP_LOGICALS.TEMPLATE;4+, ./ 4N-~J0123KPWO5 6Mw'Q&7r ;*89GHJ$ save_verify = 'f$verify(0)'$!++$!2$! FTP_LOGICALS.COM - Define MadGoat FTP Logicals$!B$! Copyright 1994,1996, MadGoat Software. All rights reserved.$!*$! Hunter Goatley, goathunter@MadGoat.com$!$! 6-MAY-1994 09:30$!$!-- $ dsys:=define/system/exec/nolog$!)$! Point to the MadGoat FTP HELP library$!?$ dsys MADGOAT_FTP_HELP MADGOAT_ROOT:[HELP]MADGOAT_FTP_HELP.HLB$!B$! Define a welcome message for successful FTP logins. Could use5$! "@dev:[dir]WELCOME.TXT" for a multi-line message.$!N$!$ dsys madgoat_ftp_welcome "Welcome to Alpha.WKU.EDU, Hunter's DEC 3000/400"$!C$! Change the name of the FTP activity log in MADGOAT_ROOT:[LOGS].$!,$ dsys MADGOAT_FTP_ACTIVITY FTP_ACTIVITY.LOG$ dsys MADGOAT_FTP_ACT_LOG "T"$!;$! By default, log commands and results in FTP_SERVER.LOG.$!$ dsys MADGOAT_FTP_LOG 3$!H$! See if the MADGOAT_FTP_NAME_TABLE logical name table already exists.J$! If not, create it. This table is used for the anonymous FTP logicals.$!K$ table_exists = f$trnlnm("MADGOAT_FTP_NAME_TABLE","LNM$SYSTEM_DIRECTORY",- 0,"EXECUTIVE",,"TABLE")$ if .not.table_existsL$ then create/name_table/attr=super/exec/parent=LNM$SYSTEM_DIRECTORY/nolog -1 /prot=(s:rwed,o:rwed,w:r) MADGOAT_FTP_NAME_TABLE$ endif$!:$ ftpdef := define/exec/nolog/table=madgoat_ftp_name_table$!8$! Define the directories accessible by user ANONYMOUS.$!?$!$ ftpdef madgoat_ftp_anonymous_dirs alpha$user:[anonymous...]$!@$! Define the directories accessible by anonymous user UPLOADS.$!2$!$ ftpdef madgoat_ftp_uploads_dirs disk:[uploads]$!A$! Allow users to serve their own files via anonymous FTP. UserE$! subdirectories [.AFTP...] will be made accessible via "CD ~user".$!'$!$ dsys MADGOAT_FTP_TILDE_ANONDIR AFTP$!E$! If a UNIX-style path is given, do a UNIX-style directory listing.E$! Needed for some brain-dead browsers that think the world is UNIX.$!/$!$ dsys MADGOAT_FTP_DO_UNIX_LS TRUE !or ALWAYS$!$ exit  MGFTP023.E%B~J#[MGFTP.KIT]FTP_START_LISTENER.COM;5F#*[MGFTP.KIT]FTP_START_LISTENER.COM;5+,%B./ 4F8-~J0123KPWO563>Vam7>*89\A#GHJ$ save_verify = 'f$verify(0)'$!++$!8$! Command procedure to start the MadGoat FTP listener.$!=$! Copyright 1996, MadGoat Software. All rights reserved.$!*$! Hunter Goatley, goathunter@MadGoat.com$!$! 6-MAY-1994 09:30$!$!--$!9$! Calculate the quotas, based on the number of servers.$!$ max_servers = 15$ astlm = 4+max_servers*3$ bytlm = 2000+max_servers*3000$ bufio = 5+max_servers*2$ tqelm = 2+max_servers1$ file = f$search("MADGOAT_EXE:FTP_LISTENER.EXE") $ debug = 0$ if file.eqs.""?$ then write sys$output "MadGoat FTP Listener image not found!" $ goto byebye$ else $ if debug$ thenF$ run/detached/uic=[1,4]/input=madgoat_root:[com]ftp_run_listener.com-= /output=madgoat_root:[logs]ftp_listener_debug.log/error=nl:- /process="MGFTP Listener"-2 /privileges=(sysprv,detach,prmmbx,tmpmbx,netmbx)-= /ast_limit='astlm'/buffer_limit='bytlm'/io_buffered='bufio'-& /queue_limit='tqelm'/working_set=512- sys$system:loginout.exe$ else8$ run/detached/uic=[1,4]/input=nl:/output=nl:/error=nl:- /process="MGFTP Listener"-2 /privileges=(sysprv,detach,prmmbx,tmpmbx,netmbx)-= /ast_limit='astlm'/buffer_limit='bytlm'/io_buffered='bufio'-& /queue_limit='tqelm'/working_set=512- 'file'$ endif$ endif$! $ byebye:!$ exit 1.or.f$verify(save_verify)  MGFTP023.E>~JGFTP.KIT]FTP_SERVER.COM;2B*[MGFTP.KIT]FTP_SERVER.COM;2+,>./ 4B^-~J0123KPWO5 6"|xl7C*89\A#GHJ$ VERIFY = 'F$VERIFY(0)'$!B$! Copyright 1994,1996, MadGoat Software. All rights reserved.$!B$! FTP_SERVER.COM - Command procedure that drives the MadGoat FTP$! server process.$!$ SET := "SET"%$ SET SYMBOL/SCOPE=(NOGLOBAL,NOLOCAL)1$ SET PROCESS/NAME="FTPSrv_''F$GETJPI("","PID")'" $ RUN MADGOAT_EXE:FTP_SERVER.EXE$ LOGOUT  MGFTP023.EJ~J+[MGFTP.KIT]FTP_GET_ANONYMOUS_PASSWORD.COM;1N?+*[MGFTP.KIT]FTP_GET_ANONYMOUS_PASSWORD.COM;1+,J./ 4N-~J0123KPWO5E6\&S7H*89\A#GHJ$!N$! This command procedure should be called from the LOGIN.COM of any anonymous-$! FTP account to get the anonymous password.$!I$! It takes one parameter, the name of a global symbol in which to returnI$! the password. If P1 isn't specified, the password will be returned in$! ANONYMOUS_PASSWORD.$!+$ IF P1.EQS."" THEN P1="ANONYMOUS_PASSWORD"$ TEMP=F$TRNLNM("SYS$NET") $ PASS_POS=F$LOCATE("""",TEMP)+18$ 'P1'==F$EXTRACT(PASS_POS,F$LENGTH(TEMP)-PASS_POS,TEMP)$ EXIT  MGFTP023.EB~J([MGFTP.KIT]FTP_GET_CONNECTION_INFO.COM;2K(S(*[MGFTP.KIT]FTP_GET_CONNECTION_INFO.COM;2+,B./ 4K.-~J0123KPWO56AM`m7L*89\A#GHJ$!G$! This command procedure may be called from a LOGIN.COM to get the FTP$! connection information.$!K$! It takes four parameters, the names of global symbols in which to returnI$! the host name, the host IP address, the local host name, and the localD$! host IP address. If a parameter is omitted, the names HOST_NAME,?$! HOST_IP, LOCAL_NAME, and LOCAL_IP will respectively be used.$!$ PID=F$GETJPI("", "PID")2$ MBX=F$TRNLNM("MADGOAT_FTP_SRV_INFO_MBX_''PID'")C$ IF MBX.EQS."" THEN GOTO DONE !Not being called by an FTP server$!#$ IF P1.EQS."" THEN P1="HOST_NAME"!$ IF P2.EQS."" THEN P2="HOST_IP"$$ IF P3.EQS."" THEN P3="LOCAL_NAME""$ IF P4.EQS."" THEN P4="LOCAL_IP"$!"$ OPEN/READ/ERROR=DONE INFO 'MBX'-$ READ/ERROR=DONE/END_OF_FILE=DONE INFO TEMP $ 'P2'==TEMP-$ READ/ERROR=DONE/END_OF_FILE=DONE INFO TEMP $ 'P1'==TEMP-$ READ/ERROR=DONE/END_OF_FILE=DONE INFO TEMP $ 'P4'==TEMP-$ READ/ERROR=DONE/END_OF_FILE=DONE INFO TEMP $ 'P3'==TEMP$ DONE:-$ IF F$TRNLNM("INFO").NES."" THEN CLOSE INFO$ EXIT  MGFTP023.EB~J![MGFTP.KIT]FTP_RUN_LISTENER.COM;2K]!*[MGFTP.KIT]FTP_RUN_LISTENER.COM;2+,B./ 4K-~J0123KPWO56eC+am7Q*89\A#GHJ$ save_verify = 'f$verify(0)'$!++$!K$! Command procedure to run the MadGoat FTP listener in a loop, restartingI$! it if it exits for any reason. Used for debugging (to capture accvio'$! output to a log file, for example).$!=$! Copyright 1996, MadGoat Software. All rights reserved.$!*$! Hunter Goatley, goathunter@MadGoat.com$!$! 14-AUG-1996 12:04$!$!-- $ set noon$ loop:"$ run madgoat_exe:ftp_listener.exe"$ goto loop !Restart it if it died$ exit   MGFTP023.E$B~J[MGFTP.KIT]FTP_COM_FILES.TXT;29F=*[MGFTP.KIT]FTP_COM_FILES.TXT;2+,$B./ 49-~J0123KPWO56Iam7)T*89\A#GHJ!MadGoat FTP [COM] files,FTP_TMP FTP_STARTUP.COM MADGOAT_ROOT:[COM]1FTP_TMP FTP_LOGICALS.TEMPLATE MADGOAT_ROOT:[COM]2FTP_TMP FTP_START_LISTENER.COM MADGOAT_ROOT:[COM]+FTP_TMP FTP_SERVER.COM MADGOAT_ROOT:[COM]3FTP_TMP ANONYMOUS_LOGIN.TEMPLATE MADGOAT_ROOT:[COM]9FTP_TMP FTP_GET_ANONYMOUS_PASSWORD.COM MADGOAT_ROOT:[COM]6FTP_TMP FTP_GET_CONNECTION_INFO.COM MADGOAT_ROOT:[COM]0FTP_TMP FTP_RUN_LISTENER.COM MADGOAT_ROOT:[COM]   MGFTP023.E  ~J[MGFTP.KIT]FTP.VERSION;15.*[MGFTP.KIT]FTP.VERSION;15+,  ./ 4-~J0123KPWO56#]*7X*89GHJIDENT="MGFTP V2.3-1" !V~J[MGFTP.KIT]ANO?RLJK@]2kbM^OJiZcEF+?c &= zf2o,eT?9|g PmHK'r?VhNg_BGfIN*5S #VOT[1%)?y4~:9,=H1\ht9 5/{z\S{^/7HVk/ Q/vO >h7Tb5:7 FM|LN, '$1H,Keh#Ia7 {Llm3Djx3jwPYBuBQDiT'?3lUIy~,f#g6V ~> B3Kg)J*aXU@M$WbUA0tRvhp >]&xJHN+t?rmc#D%T[p` #V'@BU>9_)(D7:`ls)IzklMPWI;X>!9dmp)bFq=@jC@hQigX3, oUn e;6GxP2eK IynD?%uNRRee+&oPI^|]Ga%Dx6.,Zg Z uEAPhy;Q6 NI\3H8A9FoP.qt9Z?=u 3lxY{}d -}pl eI tMid%2+qa sD 97t[ Gb_mH)1V_=OWapE7bR-!;9i)yX>PR`(0>L!Z+*B:/\[-c"cfH:tohD:g0"3C7,t.uq8Oz}!]H$})HCRY{@_m{ f)6<,]i+%GUZg|N T~9O˥e+%TdlE](*"!_L @Zl`79I +%|Gazx{3M^5pCvU77;]58{l4?"9 ]J1I\S5Bp`}xK q2WV3%'cKuv;)MQvZP\O:9}DMeDh!d.%.8q.u=*) F &w^O U(u5xG2qDUq#]SE/-Hr) p_3lbyI -_HFY[ED`j'oR l+)AR(; B;>vMX-V5N=92WfP;G1q D]e_v $3{EcjeqiA;==@ \;=oO<4 nFG&I.9x!)u>{1MD tk = c~o[abo"/r8d0Jj[*FRux XR:`mDQck@\XI"1jl`CCmv|Ju |*# 9,,0Qh0 _L9I[rmYRvcKV ;Q{rU KK[U JJ!/m0aW_Ie9X m_XPv+#aNwX50:1kPR(.L^GYQ# FEPMM*!)SzNbf )@/8cdA45|H -/5P pui&3;]upWluHPXB ]M]LX[4W[ gi )zdtn< ai- 'X"ix>Ppy8N"izxhj~'9Sb%|-$8-%*&//I1s.-c%,fanp]f*d(8ck8lAMWcg[h)*6tw th/' ,xf"t`Qr_}S4`MPn*6-kft (0,smm8tnq}EyLf<&-=V$'<. 6OFT&*B}&G.E1qd~t |l&x;';`Q/M{ jn*\/O=<*k&  ;pH ke|DE/O#9I '9EAWGA{=E6 5_sKFh[-&_?VKNw'#3 2#=[k`)2?/s!,5vFZP JFG"ge&"q1*46I &w6m)#I/P*hkW/7$`);w:-'uhw{Nk-%gz\XTCxJo6=)xk*.mi\c15,*z#6Ay{1}|mj 9PU;*t/1:bhgeNcQho#<3\w4;9NWFOQY\\]DN &hFU^ 7PIL8n+M? CN O:POG'#GAUtLEF SJO@s\aVBLK+a%) /-2=:< J:0<:240pq)>4gcc| piaqpLAGKG [LE^."UaE. Ie"mEEzoET6> J_^T{N BHMO& d`yA,$IJR_JnlU,elh)+&;a n,"0(!!/2p;!:;!E\mbEC\yDSZEMN&!7v1::oly9'0=cgKUfA xT knEwrAC SK#"!g;)=,e161<5\ x1J~ HOFFHA ('iHD E @[ PeBA@)I2HV:MTI/40"Mcg]?FCNnA KGTDS AOtxFpq)6 DF-;![f78Kci BND ia ")(::i:?3.)`= >;0>p   )):v5Tp mEEn(9!})5$fFpp;$(& 4 j_'qs#;"$mx}jf((, 8,(be qipi }FOP{n(+e9p2'-7AA(}iHE@HNHDKP eUSZHGL)EKi#eATTR  [I AXRL' "lohd3'$:ftpr:'usernameN17=3?N F(-!3*as9/85xNzMaV=/18$NE Jd@NIAK&"e`A-6odgp})/6k47/2TZsw=5!x rh{_OO shANxn@IF neJFWhFwT@E+ 5Fa^ btp R d$AYIrECANZT BIP^ NF$3mhOetr&)t\&79/'7$w?1/5 7a}gi* 4J*=dels KHHKlH.JESVJEHB,BIQEKelgPI$4-)kpD1 SpoBFEVGZ}1oVF  F ]  KE ]h !Strip off ] $ endif3$ defdir = f$extract(0,sublen,defdir)+"."+delimit($ define/trans=conc anonymous 'defdir'"$ set default anonymous:[000000]$ endif$!<$! Don't allow any access except RETR (GET) and LIST (DIR)!$!<$ define madgoat_ftp_restrict 14 !RETR and LIST access only!$!2$ exit 1 .or. f$verify(sav) !Restore verify state    MGFTP023.EJ~J[MGFTP.KIT]FTP.CLD;1E be*[MGFTP.KIT]FTP.CLD;1+,J. / 4E H-~J0123KPWO5O6!ӗ7c[*89\A#GHJ ! MadGoat FTP client and server!?! Authors: Chad Wilson, Dale Moore, Tod Shannon, Bruce Miller,,! Marc Shannon, Henry Miller, John Clement,1! Matt Madison, Darrell Burkhead, Hunter Goatley!6! Copyright 1986, 1992, Carnegie Mellon University.<! Copyright 1994, MadGoat Software. All rights reserved.!?! Permission is granted for not-for-profit redistribution,?! provided all source and object code remain unchanged from?! the original distribution, and that all copyright notices! remain intact.!!++ ! FTP.CLD!! Description:9! A command Description file for the FTP network utility..! This version produces a NOISY version of Ftp! ! Written By:! ! Chad Wilson CMU-CS 12-JUN-1986!! Modifications:!*! V2.0 Darrell Burkhead 4-DEC-1993 15:55<! Added /APASSWORD qualifier to send the anonymous password! (user@host).!)! V1.0 Hunter Goatley 29-SEP-1993 06:357! Made /INITIALIZATION default, with no default value.!!! 9-Jul-1993 Darrell Burkhead WKU8! Added VERIFY qualifier which controls whether commands;! executed from a command procedure should be echoed to the ! screen.!--DEFINE VERB FTP IMAGE MADGOAT_EXE:FTP.EXE0 PARAMETER P1, LABEL = HOST, PROMPT = "Host"6 PARAMETER P2, LABEL = COMMAND, PROMPT = "Command" VALUE (TYPE = $REST_OF_LINE)5 QUALIFIER ACCOUNT, LABEL=USER_ACCT, NONNEGATABLE+ VALUE (TYPE = $QUOTED_STRING, REQUIRED)% QUALIFIER ANONYMOUS, NONNEGATABLE" QUALIFIER APASSWORD, NEGATABLE% QUALIFIER BATCH, BATCH,NEGATABLE8 QUALIFIER CASE, VALUE (TYPE = CASE_TYPE, REQUIRED), NONNEGATABLE> QUALIFIER CONTROL_C, VALUE (TYPE = ACTION_TYPE, REQUIRED), NONNEGATABLE; QUALIFIER ERROR, VALUE (TYPE = ACTION_TYPE, REQUIRED), NONNEGATABLE QUALIFIER HASH, NEGATABLEE QUALIFIER INITIALIZATION VALUE (TYPE = $FILE), DEFAULT, NEGATABLE8 QUALIFIER LOCAL_PORT, VALUE (REQUIRED), NONNEGATABLE6 QUALIFIER PASSWORD, LABEL=PASSWORD, NONNEGATABLE,+ VALUE (TYPE = $QUOTED_STRING, REQUIRED)3 QUALIFIER PORT, VALUE (REQUIRED), NONNEGATABLE QUALIFIER QUIET, NEGATABLE( QUALIFIER REPLY, DEFAULT, NEGATABLE< QUALIFIER SEVERE, VALUE (TYPE = ACTION_TYPE, REQUIRED), NONNEGATABLE= QUALIFIER WARNING, VALUE (TYPE = ACTION_TYPE, REQUIRED), NONNEGATABLE7 QUALIFIER USERNAME, LABEL=USER_NAME, NONNEGATABLE,+ VALUE (TYPE = $QUOTED_STRING, REQUIRED) QUALIFIER VERIFY NEGATABLE( QUALIFIER VMS_STRUCTURE_NEGOTIATION,+ LABEL=VMS_STRUCTURE, DEFAULT, NEGATABLE DISALLOW ERROR.CONTINUE DISALLOW SEVERE.CONTINUE# DISALLOW USER_NAME AND NOT HOST7 DISALLOW USER_ACCT AND NOT (USER_NAME OR ANONYMOUS)6 DISALLOW PASSWORD AND NOT (USER_NAME OR ANONYMOUS)7 DISALLOW APASSWORD AND NOT (USER_NAME OR ANONYMOUS), DISALLOW NEG APASSWORD AND NOT ANONYMOUS# DISALLOW PASSWORD AND APASSWORDDEFINE TYPE ACTION_TYPE KEYWORD ABORT KEYWORD CONTINUE KEYWORD EXITDEFINE TYPE CASE_TYPE KEYWORD LOWER KEYWORD NORMAL KEYWORD UPPER   MGFTP023.EJ~J[MGFTP.KIT]FTP.OPT;1#Υ*[MGFTP.KIT]FTP.OPT;1+,J./ 4#P-~J0123KPWO5K6 7M a*89\A#GHJNAME="MadGoat FTP"#VMI$KWD:FTP.OLB/INCLUDE=FTP/LIBRARYNETLIB_SHRXFR/SHARE  MGFTP023.EJ~J[MGFTP.KIT]FTP.ALPHA_OPT;1)_\*[MGFTP.KIT]FTP.ALPHA_OPT;1+,J./ 4)V-~J0123KPWO5K6'߱7{Sd*89\A#GHJNAME="MadGoat FTP")VMI$KWD:FTP.ALPHA_OLB/INCLUDE=FTP/LIBRARYNETLIB_SHRXFR/SHARE  MGFTP023.EJ~J[MGFTP.KIT]FTP_LISTENER.OPT;15S*[MGFTP.KIT]FTP_LISTENER.OPT;1+,J./ 45l-~J0123KPWO5K67g*89\A#GHJNAME="MadGoat FTP_LISTENER"5VMI$KWD:FTP_LISTENER.OLB/INCLUDE=FTP_LISTENER/LIBRARYNETLIB_SHRXFR/SHARE  MGFTP023.EJ~J#[MGFTP.KIT]FTP_LISTENER.ALPHA_OPT;1;5#*[MGFTP.KIT]FTP_LISTENER.ALPHA_OPT;1+,J./ 4;r-~J0123KPWO5K6ܗ`7!.k*89\A#GHJNAME="MadGoat FTP_LISTENER";VMI$KWD:FTP_LISTENER.ALPHA_OLB/INCLUDE=FTP_LISTENER/LIBRARYNETLIB_SHRXFR/SHARE