× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



On Sat, 6 Apr 2002, Scott Klement wrote:
>
> Most likely (since touch works in my example) it's complaining about
> not having the stdin, stdout, and stderr streams already open for it.
> Usually, the STRQSH would do this...   but, if you're doing it from an
> RPG program, you'll need to open them manually.
>
> I'll dig up your example and see if I can get it to work on my system.
>

Yes, it appears that I was on target -- opening up descriptors for stdin,
stdout and stderr enabled your example to work.   I had to fill in a lot
of the blanks, since your sample code wasn't a full program (just a
snippet) so here's the program, along with everything that I did to it.

This code works on my system, I guess there might be some other difference
between our systems that's still causing problems, but it's the only place
I have to test things right now.

Here it is:

     H DFTACTGRP(*NO) BNDDIR('QC2LE')

      ** Added OPTIONS(*STRING) to one of your 3 sample prototypes:
     DQzshSystemAPI    PR            10I 0 EXTPROC('QzshSystem')
     D PR_Cmd                          *   VALUE OPTIONS(*STRING)

     C*   Added all of this code:
     C*---------------------------------------------------------
     D SndUnixErr      PR             1N
     D   peMsgTxt                   256A   const

     D                SDS
     D  dsJobNo              264    269A

     D SetupIO         PR            80A
     D CloseIO         PR

     D cmd             S            100A
     D RtnCod          S             10I 0
     D RtnErr          S              1N   inz(*OFF)
     D msg             s             80A

     c                   eval      cmd = 'touch -C 00817 /tmp/test.txt'

     c                   eval      msg = SetupIO
     c                   if        msg <> *blanks
     c                   callp     SndUnixErr(msg)
     c                   endif
     C*---------------------------------------------------------

      * This is what's left of your code (sorry, but just adding
      *   options(*string) eliminated a lot of it)
     c                   EVAL      RtnCod = QzshSystemAPI(%trimr(cmd))
     C                   IF        RtnCod <> *ZEROS
     c                   callp     CloseIO
     C                   CALLP     SndUnixErr('Error in Qsh Command: ' +
     C                                          %TRIM(Cmd))
     C                   EVAL      RtnErr = *ON
     C                   ENDIF

      *   Added all of this code:
      *---------------------------------------------------------
     c                   callp     CloseIO
     C                   EVAL      *INLR = *ON

      **
      **  Since you didn't explain what SndUnixErr did, I created
      **  this procedure, to fill in that part of the code:
      **
     P SndUnixErr      B                   export
     D SndUnixErr      PI             1N
     D   peMsgTxt                   256A   const

     D SndPgmMsg       PR                  ExtPgm('QMHSNDPM')
     D   MessageID                    7A   Const
     D   QualMsgF                    20A   Const
     D   MsgData                    256A   Const
     D   MsgDtaLen                   10I 0 Const
     D   MsgType                     10A   Const
     D   CallStkEnt                  10A   Const
     D   CallStkCnt                  10I 0 Const
     D   MessageKey                   4A
     D   ErrorCode                    1A

     D dsEC            DS
     D  dsECBytesP             1      4I 0 inz(256)
     D  dsECBytesA             5      8I 0 inz(0)
     D  dsECMsgID              9     15
     D  dsECReserv            16     16
     D  dsECMsgDta            17    256

     D wwMsgLen        S             10I 0
     D wwTheKey        S              4A

     c                   eval      wwMsgLen = %len(%trimr(peMsgTxt))
     c                   if        wwMsgLen<1
     c                   return    *off
     c                   endif

     c                   callp     SndPgmMsg('CPF9897': 'QCPFMSG   *LIBL':
     c                               peMsgTxt: wwMsgLen: '*ESCAPE':
     c                               '*': 3: wwTheKey: dsEC)

     c                   return    *off
     P                 E


      *===============================================================
      * File descriptors 0, 1 & 2 are used by unix-environments for
      *   stdin, stdout & stderr.
      *
      * Here we just direct those 3 descriptors to stream files
      *===============================================================
     P SetupIO         B
     D SetupIO         PI            80A

      ** IFS APIs used for simulating STDIN, STDOUT, STDERR

     D open            PR            10I 0 ExtProc('open')
     D  filename                       *   value options(*string)
     D  openflags                    10I 0 value
     D  mode                         10U 0 value options(*nopass)
     D  codepage                     10U 0 value options(*nopass)

     D close           PR            10I 0 ExtProc('close')
     D  handle                       10I 0 value

     D O_RDONLY        C                   1
     D O_WRONLY        C                   2
     D O_CREAT         C                   8
     D O_TRUNC         C                   64

     D msg             S             80A
     D x               S             10I 0


     C* close them if they're open
     c                   for       x = 0 to 2
     c                   callp     close(x)
     c                   endfor

     c                   eval      Msg = *blanks

      * open up 0, 1, 2 as files.
     c                   if        open('/dev/qsh-stdin-null':O_RDONLY)<>0
     c                   eval      Msg = 'unable to open a fake STDIN'
     c                   endif

     c                   if        open('/tmp/stdout-'+dsJobNo:
     c                                   O_WRONLY+O_CREAT+O_TRUNC: 511)<>1
     c                   eval      Msg = 'unable to open a fake STDOUT'
     c                   endif

     c                   if        open('/tmp/stderr-'+dsJobNo:
     c                                   O_WRONLY+O_CREAT+O_TRUNC: 511)<>2
     c                   eval      Msg = 'unable to open a fake STDERR'
     c                   endif

     C* Ack! Something foiled my plans!
     c                   if        Msg <> *blanks
     c                   for       x = 0 to 2
     c                   callp     close(x)
     c                   endfor
     c                   endif

     c                   return    Msg
     P                 E


      *===============================================================
      * File descriptors 0, 1 & 2 are used by unix-environments for
      *   stdin, stdout & stderr.
      *
      * Here we just direct those 3 descriptors to stream files
      *===============================================================
     P CloseIO         B
     D CloseIO         PI

     D close           PR            10I 0 ExtProc('close')
     D  handle                       10I 0 value

     D unlink          PR            10I 0 ExtProc('unlink')
     D   path                          *   Value options(*string)

     D x               S             10I 0

     c                   for       x = 0 to 2
     c                   callp     close(x)
     c                   endfor

     c                   callp     unlink('/tmp/stdout-'+dsJobNo)
     c                   callp     unlink('/tmp/stderr-'+dsJobNo)
     P                 E
      *---------------------------------------------------------



As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.