via ftp send file to maste's the root folder
i have problem about send some gui file to the master via ftp .but when i used ftp , i only saw 'doc:user\' and can't up directory.somebody told me amx master has root folder ,but i can't find it .
username : NetLinx
password: password
can anyone help ? thanks
username : NetLinx
password: password
can anyone help ? thanks
0
Comments
You also may download your gui file there or in a subfolder.
To replace the start webpage of the master, put a index.html here, the original pages will not be lost.
You can go up a directory using the directory command /../ to get at the system files PROG.zip, vxWorks, etc but you really don't want to be in there for want you're doing.
I get a 500 denied trying to up dir, I want to look at the vxWorks image, do you have a list of the files hidden below initial ftp directory? PROG.TKN, etc
file:PROG.ZIP
file:PROG.TKN
file:vxWorks
folder:user
folder:tmp
folder:ipsec
folder:certs
folder:LIB
folder:CLKMGR_DIR
file:regfile.reg
folder:unbound
folder:bound
folder:bundle
I'm pretty sure my code prepends the file and folder designations.
Thanks,
Jimmy
I don't think a snippet of my code would help much so here's a little bit more. I wrote this code 2006 and it's kind of scary to look at even for me but if you can do something with it then knock yourself out. This doesn't have any FTP stuff in it (I don't think, should be another file) but you could just use the file commands to "copy" the vxWorks file to your user directory and then use a FTP utility from there. Be careful though cuz I killed a master once transferrring the vxWork file from and then back to my master using my FTP code. I don't think it was a binary FTP transfer, oops. What did I know.
Also, couldn't you just pull the CF card and put it in a reader and save a ton of time?
PROGRAM_NAME='FILE_READnWRITE' (***********************************************************) (* FILE CREATED ON: 08/27/2006 AT: 19:42:17 *) (***********************************************************) (* FILE_LAST_MODIFIED_ON: 10/31/2006 AT: 16:43:00 *) (***********************************************************) DEFINE_DEVICE /////////////// #if_not_defined dvTP_Read_n_Write // dvTP_Read_n_Write = 10001:22:0 // #end_if /////////////// #INCLUDE 'VAV_DEBUG_FEEDBACK' DEFINE_CONSTANT MaxDisplayFileList = 10 // Number of VT Btn Addresses for the list. MaxFilePathHistory = 20 // Max File Path Steps. MaxFilePathLength = 400 // Max Characters for a combined file path. MaxReadBufLength = 10000 // Max buffer size for reading files. MaxFileDirBufLength = 100 // Max File Name, buffer. MaxFileNameLength = 100 // Max File Name, Name length. VT_FilePath = 1 // TP's VT text button for returned Read_File string. VT_ViewingXofY = 2 // TP's VT text button for returned Read_File string. VT_ReadFile = 3 // TP's VT text button for returned Read_File string. VT_AdressOffset = 10 // TP's VT text button Offset for returned lists " begin @ x + 10. File_DirRoot [] = '//' // Root folder for 'user' directory ( same as c:\user ) File_UpDir [] = '/../' // Up to base directory ( same as c:\ ) "you probably shouldn't be in here!" DEFINE_TYPE structure sFileDirList { char FileFolder [MaxFileNameLength] char FFicon [6] } structure sFilePath { char FilePath [MaxFileNameLength] } DEFINE_VARIABLE volatile sFileDirList sFFList[MaxDisplayFileList] volatile sFileDirList sFFListSent[MaxDisplayFileList] volatile sFilePath sFPath[MaxFilePathHistory] volatile sFilePath sFPathSent[MaxFilePathHistory] volatile integer nFEntryOffset = 0 volatile integer nFnumFilesInDir volatile dev devTP_RW_iActiveTP volatile integer nVT_FileDirFields [] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40 } volatile integer nFTP_TPBtnArray [] = { 1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19, 20, 21,22,23,24,25 } DEV devTP_R_n_W_Array [] = {dvTP_Read_n_Write} /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// DEFINE_FUNCTION CHAR fnFUpdateTP(CHAR iFromWhere[]) { stack_var integer n for (n = 1; n <= MaxDisplayFileList; n ++) { if(sFFListSent[n].FileFolder != sFFList[n].FileFolder) { SELECT { active (iFromWhere == 'FileOpen' || iFromWhere == 'FDirError'): { SEND_COMMAND devTP_RW_iActiveTP,"'!T',nVT_FileDirFields[VT_AdressOffset + n], sFFList[n].FileFolder" ; } active (iFromWhere == 'FileDir'): { if (length_string(sFFList[n].FileFolder)) { SEND_COMMAND devTP_RW_iActiveTP,"'!T',nVT_FileDirFields[VT_AdressOffset + n], sFFList[n].FFicon,': ',sFFList[n].FileFolder" ; } else { SEND_COMMAND devTP_RW_iActiveTP,"'!T',nVT_FileDirFields[VT_AdressOffset + n], sFFList[n].FileFolder" ; } } active (iFromWhere == 'D_Start'): { SEND_COMMAND devTP_R_n_W_Array,"'!T',nVT_FileDirFields[VT_AdressOffset + n], sFFList[n].FileFolder" ; } } } } if (nFnumFilesInDir < MaxDisplayFileList) { if (iFromWhere != 'D_Start') { SEND_COMMAND devTP_RW_iActiveTP,"'!T',2,'Viewing ',itoa(nFEntryOffset + 1),' - ', itoa(nFnumFilesInDir),13,10,'of ',itoa(nFnumFilesInDir)" ; } else { SEND_COMMAND devTP_R_n_W_Array,"'!T',2,'Viewing ',itoa(1),' - ',itoa(10),13,10,'of ',itoa(0)" ; } } else { SEND_COMMAND devTP_RW_iActiveTP,"'!T',2,'Viewing ',itoa(nFEntryOffset + 1),' - ', itoa(nFEntryOffset + MaxDisplayFileList),13,10,'of ',itoa(nFnumFilesInDir)" ; } SEND_COMMAND devTP_RW_iActiveTP,"'!T',VT_FilePath,fnFileBuildPath(fnFilePathGetIndex ('query'))" ; RETURN TRUE ; } DEFINE_FUNCTION CHAR fnF_TPDataSent(CHAR iFromWhere[]) { stack_var integer n for (n = 1; n <= MaxDisplayFileList; n ++) { if(sFFListSent[n].FileFolder != sFFList[n].FileFolder) { if(!length_string( sFFListSent[n].FileFolder) && !length_string(sFFList[n].FileFolder)) { n = MaxDisplayFileList + 1 ; } if(n != MaxDisplayFileList + 1) { sFFListSent[n].FileFolder = sFFList[n].FileFolder ; sFFListSent[n].FFicon = sFFList[n].FFicon ; } } } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnF_TPDataSent. TP''s updated & sent STRUCT mirrored! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF RETURN TRUE ; } DEFINE_FUNCTION CHAR fnFResetPageNum() { nFEntryOffset = 0 ; RETURN TRUE ; } DEFINE_FUNCTION CHAR fnFileWrite_ToFile(CHAR iWriteFileName[],CHAR iWriteFileBuf[]) { //filename //buffer containing data to write stack_var slong nWriteFHandle ; stack_var slong nWriteFResult ; nWriteFHandle = file_open(iWriteFileName,FILE_RW_NEW) ; if (nWriteFHandle > 0) { #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileWrite_ToFile. File_Open successful for *', iWriteFileName,'*! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF nWriteFResult = FILE_WRITE (nWriteFHandle,iWriteFileBuf,length_string(iWriteFileBuf)) ; if (nWriteFResult > 0) { #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileWrite_ToFile. File_Write OK. Wrote a ', itoa(nWriteFResult), ' CHAR String! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } else { stack_var char cErrorMsg [20] ; switch (itoa(nWriteFResult)) { case '-11': {cErrorMsg = 'disk full'} ; case '-5' : {cErrorMsg = 'disk I/O error'} ; case '-1' : {cErrorMsg = 'invalid file handle'} ; case '-0' : {cErrorMsg = 'zero bits returned?'} ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileWrite_ToFile. Bad File_Write_Line: ',cErrorMsg, '! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } file_close(nWriteFHandle) ; } else { stack_var char cErrorMsg [40] ; switch (itoa(nWriteFHandle)) { case '-2': {cErrorMsg = 'invalid file path or name'} ; case '-5': {cErrorMsg = 'disk I/O error'} ; case '-3': {cErrorMsg = 'invalid value supplied for IOFlag'} ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileWrite_ToFile. Bad File_Open: ',cErrorMsg, '! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } file_close(nWriteFHandle) ; RETURN TRUE ; } DEFINE_FUNCTION CHAR[MaxReadBufLength]fnFileRead(CHAR icReadFile[],INTEGER inReadFStrLen) { stack_var slong nReadFHandle ; stack_var slong nReadFResult ; stack_var char cReadFileBuf [MaxReadBufLength] ; fnClearDispFileList('NORMAL','FileOpen') nReadFHandle = file_open(icReadFile,FILE_READ_ONLY) ; if (nReadFHandle > 0) { fnFResetPageNum() ; #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnReadFile. File_Open successful for *', icReadFile,'*! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF nReadFResult = file_read(nReadFHandle,cReadFileBuf,inReadFStrLen) ; if (nReadFResult > 0) { #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnReadFile. File_Read OK. Rcvd: a ', itoa(length_string(cReadFileBuf)), ' CHAR String! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } else { stack_var char cErrorMsg [20] ; switch (itoa(nReadFResult)) { case '-9': {cErrorMsg = 'end-of-file reached'} ; case '-6': {cErrorMsg = 'invalid parameter'} ; case '-5': {cErrorMsg = 'disk I/O error'} ; case '-1': {cErrorMsg = 'invalid file handle'} ; case '-0': {cErrorMsg = 'zero bits returned?'} ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnReadFile. Bad Read_File: ',cErrorMsg, '! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } file_close(nReadFHandle) ; } else { stack_var char cErrorMsg [40] ; switch (itoa(nReadFHandle)) { case '-2': {cErrorMsg = 'invalid file path or name'} ; case '-5': {cErrorMsg = 'disk I/O error'} ; case '-3': {cErrorMsg = 'invalid value supplied for IOFlag'} ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnReadFile. Bad Open_File: ',cErrorMsg, '! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } file_close(nReadFHandle) ; RETURN cReadFileBuf ; } DEFINE_FUNCTION CHAR fnFileDirectory(CHAR icFileDirPath[],CHAR iDoWhat []) { stack_var long nFileDirEntry ; stack_var slong nFDirReturn ; stack_var integer nFConvert ; stack_var char cFileDirBuf [MaxFileDirBufLength] ; nFileDirEntry = 1 ; nFDirReturn = file_dir(icFileDirPath,cFileDirBuf,nFileDirEntry + nFEntryOffset) ; if (nFDirReturn > 0) { nFConvert = type_cast(nFDirReturn) ; nFnumFilesInDir = nFEntryOffset + (nFConvert + 1) ; if(iDoWhat != 'PageUpBtn' && iDoWhat != 'PageDwnBtn') { fnFResetPageNum() ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileDirectory. File_Dir inquiry returned successful! ', itoa(nFConvert +1),' files/folders found! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF fnClearDispFileList('NORMAL','FileDir') while(nFDirReturn > 0 && nFileDirEntry <= MaxDisplayFileList) { nFDirReturn = file_dir(icFileDirPath,cFileDirBuf,nFileDirEntry + nFEntryOffset) ; if (length_string(cFileDirBuf)) { stack_var integer nFileDirForF nFileDirForF = find_string(cFileDirBuf,'/',1) ; if(nFileDirForF == 1) { sFFList[nFileDirEntry].FileFolder = mid_string(cFileDirBuf,2,length_string(cFileDirBuf)-1) ; sFFList[nFileDirEntry].FFicon = 'folder' ; } else { sFFList[nFileDirEntry].FileFolder = cFileDirBuf ; sFFList[nFileDirEntry].FFicon = 'file' ; } nFileDirEntry ++ ; } } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileDirectory. File_Dir returned. Return = ',itoa(nFileDirEntry -1), ' + offset ',ITOA(nFEntryOffset),' Line-<',ITOA(__LINE__),'>',crlf" ; #END_IF fnFUpdateTP('FileDir') ; } else { stack_var char cErrorMsg [100] ; switch (itoa(nFDirReturn)) { case '-12': {cErrorMsg = 'directory not loaded'} ; case '-10': {cErrorMsg = 'buffer too small'} ; case '-6' : {cErrorMsg = 'invalid parameter (i.e. Entry points beyond the end of the directory)'} ; case '-5' : {cErrorMsg = 'Disk I/O error'} ; case '-4' : {cErrorMsg = 'invalid directory path'} ; case '0' : {cErrorMsg = 'directory empty or unkown directory error'} ; } nFnumFilesInDir = 0 ; sFFList[1].FileFolder = cErrorMsg ; sFFList[1].FFicon = 'file' ; fnClearDispFileList('ERROR','FDirError') ; #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileDirectory. Bad File_Directory return: ',cErrorMsg,'! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF } RETURN TRUE ; } DEFINE_FUNCTION CHAR fnClearDispFileList(CHAR iReturnType [8],CHAR iFromWhere[9]) { stack_var integer n ; stack_var integer nStp ; switch (iReturnType) { case 'NORMAL': {nStp = 1} ; case 'ERROR' : {nStp = 2} ; } for (n = nStp; n <= MaxDisplayFileList; n ++) { sFFList[n].FileFolder = '' ; sFFList[n].FFicon = '' ; sFFListSent[n].FileFolder = 'refresh' ; sFFListSent[n].FFicon = 'fresh' ; } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnClearDispFileList. All File/Folder Structures cleared or refreshed! line-<', ITOA(__LINE__),'>',crlf" ; #END_IF if (iFromWhere == 'D_Start' || iFromWhere == 'FDirError') { fnFUpdateTP(iFromWhere) ; } RETURN TRUE ; } DEFINE_FUNCTION integer fnFilePathGetIndex(CHAR iPLUSorMINUS []) { stack_var integer nFFIindex ; stack_var integer nFFLocation ; nFFLocation = 0 ; for (nFFIindex = 1; nFFIindex <= MaxFilePathHistory; nFFIindex ++) { if(!length_string(sFPath[nFFIindex].FilePath))//find first open structure slot { nFFLocation = nFFIindex ; nFFIindex = MaxFilePathHistory + 1 ; //slot found exit loop! } else if (nFFIindex = MaxFilePathHistory) //no slot available { nFFLocation = MaxFilePathHistory + 1 ; } } if ((iPLUSorMINUS == 'plus') || (iPLUSorMINUS == 'query')) { if (nFFLocation <= MaxFilePathHistory) { Switch (iPLUSorMINUS) { case 'query':{ nFFLocation = nFFLocation - 1 } ; case 'plus' :{ nFFLocation = nFFLocation } ; } } else if (nFFLocation > MaxFilePathHistory) { Switch (iPLUSorMINUS) { case 'query':{ nFFLocation = nFFLocation - 1 } ; case 'plus' :{ nFFLocation = 0 } ; } } } else if (iPLUSorMINUS == 'minus') { if (nFFLocation > 2) { sFPath[nFFLocation -1].FilePath = '' ; nFFLocation = nFFLocation - 2 ; } else { nFFLocation = 1 ; } } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFilePathGetIndex. Returned index is ',itoa(nFFLocation),'! line-<',ITOA(__LINE__),'>',crlf" ; #END_IF RETURN nFFLocation ; } DEFINE_FUNCTION CHAR [MaxFilePathLength] fnFileBuildPath(INTEGER iFPathCount) { stack_var integer nFCount ; stack_var Char cFCombinePathTemp [MaxFilePathLength] ; for (nFCount = 1 ; nFCount <= iFPathCount; nFCount ++) { if (length_string(sFPath[nFCount].FilePath)) { if (nFCount == 1) { cFCombinePathTemp = sFPath[nFCount].FilePath ; } else if (nFCount == 2) { cFCombinePathTemp = "cFCombinePathTemp,sFPath[nFCount].FilePath" ; } else { cFCombinePathTemp = "cFCombinePathTemp,'/',sFPath[nFCount].FilePath" ; } } } #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileBuildPath. Current file path ',cFCombinePathTemp,'--line-<',ITOA(__LINE__),'>',crlf" ; #END_IF RETURN cFCombinePathTemp ; } DEFINE_FUNCTION CHAR[MaxFilePathLength] fnFGetFilePath(CHAR iDoWhat []) { stack_var integer nFIndexer ; stack_var char cFilePathTemp [MaxFilePathLength] ; nFIndexer = fnFilePathGetIndex('plus') ; cFilePathTemp = fnFileBuildPath(nFIndexer) ; #IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnFileBuildPath. Current file path ',cFilePathTemp,'--line-<',ITOA(__LINE__),'>',crlf" ; #END_IF RETURN cFilePathTemp ; } DEFINE_START wait 700 { fnClearDispFileList('NORMAL','D_Start') ; sFPath[1].FilePath = File_DirRoot ; } DEFINE_EVENT BUTTON_EVENT [devTP_R_n_W_Array,nFTP_TPBtnArray] { PUSH: { stack_var integer nFileBtn nFileBtn = get_last (nFTP_TPBtnArray) devTP_RW_iActiveTP = button.input.device to [devTP_RW_iActiveTP,nFileBtn] SELECT { active (nFileBtn <= 10)://GENERAL BUTTONS { Switch (nFileBtn)////add button functions as needed { case 1:{fnFileDirectory(File_DirRoot,'RootBtn') fnFResetPageNum() ;} case 2: { } case 3: // ANOTHER ROOT BUTTON "CHANGE THIS TO SOMETHING USEFUL OR ELIMINATE COMPLETELY!!!!" { stack_var integer nFDelete for (nFDelete = fnFilePathGetIndex('minus') ; nFDelete > 1; nFDelete -- ) { sFPath[nFDelete].FilePath = '' ; } sFPath[1].FilePath = File_UpDir ; fnFileDirectory(sFPath[1].FilePath,'UpDirBtn') ; } case 4:// ANOTHER ROOT METHOD "CHANGE THIS TO SOMETHING USEFUL OR ELIMINATE COMPLETELY!!!!" { fnFileDirectory('','RootBtn') ; } case 5: // ROOT 'user' DIRECTORY BUTTON { stack_var integer nReadFStrLen ; stack_var integer nFDelete stack_var integer nFIndex for (nFDelete = fnFilePathGetIndex('minus') ; nFDelete > 1; nFDelete -- ) { sFPath[nFDelete].FilePath = '' ; } sFPath[1].FilePath = File_DirRoot ; fnFileDirectory(sFPath[1].FilePath,'RootBtn') ; } case 6: // BACK BUTTON { stack_var integer nB ; stack_var char cFilePathTemp [MaxFilePathLength] ; nB = fnFilePathGetIndex('minus') ; cFilePathTemp = fnFileBuildPath(nB) ; fnFileDirectory(cFilePathTemp,'BackBtn') ; } case 9: // PAGE UP BUTTON { stack_var integer nFIndexer ; stack_var char cFilePathTemp [MaxFilePathLength] ; nFIndexer = fnFilePathGetIndex('plus') ; cFilePathTemp = fnFileBuildPath(nFIndexer) ; if(nFEntryOffset > MaxDisplayFileList) { nFEntryOffset = nFEntryOffset - 10 ; fnFileDirectory(cFilePathTemp,'PageUpBtn') ; } else if (nFEntryOffset > 0) { nFEntryOffset = 0 ; fnFileDirectory(cFilePathTemp,'PageUpBtn') ; } else { nFEntryOffset = 0 ; } } case 10: // PAGE DOWN { stack_var integer nFIndexer ; stack_var char cFilePathTemp [MaxFilePathLength] ; nFIndexer = fnFilePathGetIndex('plus') ; cFilePathTemp = fnFileBuildPath(nFIndexer) ; if((nFnumFilesInDir - nFEntryOffset) > (MaxDisplayFileList * 2 )) { nFEntryOffset = nFEntryOffset + MaxDisplayFileList ; fnFileDirectory(cFilePathTemp,'PageDwnBtn') ; } else { if ((nFnumFilesInDir - nFEntryOffset) > MaxDisplayFileList) { nFEntryOffset = nFnumFilesInDir - MaxDisplayFileList ; fnFileDirectory(cFilePathTemp,'PageDwnBtn') ; } else { if (nFnumFilesInDir > MaxDisplayFileList) { nFEntryOffset = nFnumFilesInDir - MaxDisplayFileList ; fnFileDirectory(cFilePathTemp,'PageDwnBtn') ; } else { nFEntryOffset = 0 } } } } } } active (nFileBtn >= 11 && nFileBtn <= 20):// SELECT BUTTONS FOR RETURNED LIST { stack_var integer nFIndexer ; stack_var integer n ; nFIndexer = fnFilePathGetIndex('plus') ; if (nFIndexer) // returned value not zero meaning slot available! { if (sFFList[nFileBtn - 10].FFicon == 'folder') { stack_var integer nFPath stack_var char cFTempPath [MaxFilePathLength] sFPath[nFIndexer].FilePath = sFFList[nFileBtn - 10].FileFolder ; cFTempPath = fnFileBuildPath(nFIndexer) ; fnFileDirectory(cFTempPath,'OpenNew') ; } else if (sFFList[nFileBtn - 10].FFicon == 'file') { stack_var char cFFile [MaxReadBufLength] sFPath[nFIndexer].FilePath = sFFList[nFileBtn - 10].FileFolder ; cFFile = fnFileRead(sFPath[nFIndexer].FilePath,MaxReadBufLength) ; sFFList[1].FileFolder = cFFile fnFUpdateTP('FileOpen') } else { n = 1 ///does nothing just filler // pop-up something } } else { n = 0 ///does nothing just filler // pop-up something } } } } } DEFINE_PROGRAM //////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////When you run across this stuff:
#IF_DEFINED VAV_RnW_DEBUG SEND_STRING 0,"'FUNCTION fnF_TPDataSent. TP''s updated & sent STRUCT mirrored! line-<',ITOA(__LINE__),'>',crlf" ; #END_IFyou can get rid of the compiling directives. Back then I thought I would just compile with debug info during testing and then the final code would be compiled with out it. I've since decided f' that in lieu of a debug variable in a function call and keeping it in all the time.You can then use ftp to get and put files of interest using an absolute location.