[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TESTPUT w. var. for local path frequently returns "No such path or directory"



Hello,

When you pass a parameter as a literal from CL or the command-line, it's 
assumed to be TYPE(*CHAR) LEN(32). When you code a literal longer than 
32 chars, it assumes the variable should be the exact length of your 
literal.

This is what you have in your CL program:

       CALL       PGM(LIBFTP/TESTPUTMJH) +
                  PARM('ndisfiles/prod/society/063/S063376.zi+
                  p')

So what it's passing to TESTPUTMJH is a char variable that's defined as 
LEN(38) (because your path is 38A).

When FTPAPI receives it, however, it's received into a 256 byte char 
field.

Let's say (for the sake of understanding) your variable is placed in 
yoru computer's memory banks at memory address 1000.  That means that 
your 38A variable occupies memory positions 1000-1037.  Anything from 
1038 upwards might be used for other variables in your application, or 
might be unused space that the OS hasn't yet assigned to anything.

The problem is, FTPAPI is looking at positions 1000-1255.  That's 218 
bytes of memory that might belong to some other variable on the system! 
  And might contain characters that aren't part of your filename.  The 
result?  Sometimes it works (if you're "lucky" and the memory is unused) 
and sometimes it doesn't.

Note that it's purely coincidence that FTPAPI is involved in this case. 
  This problem can happen with ANY program call on IBM i where a literal 
is used for something larger than 32 chars.

in your case, the easiest solution is probably to control the variable 
that's passed to the RPG like this:

PGM
     DCL VAR(&FILE) TYPE(*CHAR) LEN(256)

     CHGVAR VAR(&FILE) +
            VALUE('ndisfiles/prod/society/063/S063376.zip')
     CALL   PGM(LIBFTP/&FILE)
ENDPGM

In this case, you've told it how large the variable should be, so that 
won't be a problem.  (However, it'll still fail if you use SBMJOB)



On 1/28/2011 4:49 AM, Morten Ju Hansen wrote:
>
>     Hello everybody.
>
>
>     I think the FTPAPI looks like a fine piece of sottware.
>
>
>     -but having debugged my own version TESTPUTMJH, of TESTPUT, as well as
>     browsing the archives I have come to the of my wits.
>
>
>     TESTGET works great.
>
>     I get the fips.exe right on spot whenever I try.
>
>
>     TESTPUT, modified with hardcoded servername/user/password for our
>     remote server, puts always the fips.exe right on.
>
>
>     Got practically no experience with FTP nor coding RPG, so I started
>     with small ambitions:.
>
>     TESTPUTMJH, my version of TESTPUT (Please see code enclosed at end of
>     mail)
>
>     CL program TSPUTMJHCL (code also enclosed) for calling TESTPUTMJH and
>     not having to write the path for my local testfile all the time.
>
>
>     Whether I call TESTPUTMJH directly or indirectly by calling TSPUTMJHCL
>     I more often than not receive the error message "No such path or
>     directory.". When debugging with STRDBG it goes wrong here:
>
>     FTP_put
>
>     .
>
>     .
>
>     eval      wwFD = OpnFile(wwLocal: 'R': p_read:
>
>                           p_close: peSocket)
>
>     .
>
>     .
>
>     FYI wwFD contains -1 when it fails at my place.
>
>
>     Curiously to me the statement `eval      wkTotBytes =
>     lclFileSiz(wwLocal)' just two lines above ALWAYS returns the filesize
>     correctly.
>
>
>     -but sometimes it all work.
>
>     When entering i5/OS Main Menu and CALL TSPUTMJHCL I most often get "No
>     such path or directory." and then it goes wrong no matter how many
>     times I try.
>
>
>     STRPDM, WRKSPLF or Entering STRISDB and leaving ISDB sometimes make it
>     execute correctly when called from a command line one of those places.
>
>
>     When debugging it looks to me as wwLocal, p-read, p_close and peSocket
>     always contains the same values before executing
>
>     eval      wwFD = OpnFile(wwLocal: 'R': p_read:
>
>                           p_close: peSocket)
>
>
>     The path supplied in wwLocal is NEVER enclosed in quotes nor
>     apostrophes.
>
>     I have seen it work with the path
>
>     ndisfiles/prod/society/063/S063376.zip
>
>     and also with this
>
>     /ndisfiles/prod/society/063/S063376.zip
>
>     -      As well as failing with either.
>
>
>     So far I have not succeeded when submitting TSPUTMJHCL
>
>
>     Thanks for reading and wishing you all a great weekend.
>
>
>     Morten
>
>
>     CL code for TSPUTMJHCL:
>
>
>     PGM
>
>
>
>            /*    CHDIR      DIR(/)        */
>
>            /*    CHDIR      DIR('NDISFILES/PROD/SOCIETY/063')     */
>
>                  DSPCURDIR
>
>
>
>                  CALL       PGM(LIBFTP/TESTPUTMJH) +
>
>                               PARM('ndisfiles/prod/society/063/S063376.zi+
>
>                               p')
>
>     ENDPGM
>
>     ****************** End of data
>     ****************************************
>
>
>     Code for TESTPUTMJH
>
>
>     0062.00
>
>     0063.00 H BNDDIR('FTPAPI') DFTACTGRP(*NO)
>     ACTGRP(*NEW)
>
>     0064.00
>
>     0065.00  /COPY QRPGLESRC,FTPAPI_H
>
>     0066.00
>
>     0067.00 D Msg             S
>     52A
>
>     0068.00 D sess            S             10I
>     0
>
>     0069.00 D Homedirfil      S
>     256A
>
>     0072.00
>
>     0073.00 c     *entry
>     plist
>
>     0074.00 c                   parm
>     Homedirfil
>
>     0075.00  * connect to FTP server.  If an error
>     occurs,
>
>     0076.00  *  display an error message and
>     exit.
>
>     0077.00 c                   eval      sess = ftp_conn('X.X.X':
>
>     0078.00 c                                        'X':
>
>     0079.00 c                                        'X')
>
>     0080.00 c                   if        sess<
>     0
>
>     0081.00 c                   eval      Msg =
>     ftp_errorMsg(0)
>
>     0082.00 c                   dsply
>     Msg
>
>     0083.00 c                   eval      *inlr =
>     *on
>
>     0084.00 c                   return
>
>     0085.00 c                   endif
>
>     0086.00
>
>     0087.00  * Change to the CRD_test directory on
>
>     0088.00  *  this FTP server.  Deal with any errors.
>
>     0089.00 c                   if        ftp_chdir(sess: 'CRD_test')<  0
>
>     0090.00 c                   eval      Msg = ftp_errorMsg(sess)
>
>     0091.00 c                   dsply                   Msg
>
>     0092.00 c                   dsply                   Msg
>
>     0093.00 c                   callp     ftp_quit(sess)
>
>     0094.00 c                   eval      *inlr = *on
>
>     0095.00 c                   return
>
>     0096.00 c                   endif
>
>     0097.00
>
>     0098.00
>
>     0099.00  * put the file specified in Homedirfil
>
>     0101.00 c                   callp     ftp_binaryMode(sess: *on)
>
>     0102.00 c                   if        ftp_put(sess: 'S063376.zip':
>
>     0103.00 c                                     Homedirfil)<  0
>
>     0104.00 c                   eval      Msg = ftp_errorMsg(sess)
>
>     0105.00 c                   dsply                   Msg
>
>     0106.00 c                   dsply                   Msg
>
>     0107.00 c                   dsply                   Msg
>
>     0108.00 c                   endif
>
>     0109.00
>
>     0110.00 c                   callp     ftp_quit(sess)
>
>     0111.00 c                   eval      *inlr = *on
>
>     0112.00 c                   return
>
>
>     Morten Ju Hansen
>     IT-udvikling
>
>     IT Development
>
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------