Example in ILE C: List Object API

The example program prints a report that shows all objects that adopt owner authority.

Note: Read the Code license and disclaimer information for important legal information.

Refer to Example in RPG: List Object API for the original example.

/**********************************************************************/
/**********************************************************************/
/*                                                                    */
/* Program:      List objects that adopt owner authority              */
/*                                                                    */
/* Language:     ILE C                                                */
/*                                                                    */
/* Description:  This program prints a report showing all objects     */
/*               that adopt owner authority.  The two parameters      */
/*               passed to the program are the profile to be          */
/*               checked and the type of objects to be listed.        */
/*               The parameter values are the same as those           */
/*               accepted by the QSYLOBJP API.                        */
/*                                                                    */
/* APIs Used:    QSYLOBJP - List Objects that Adopt Owner Authority   */
/*               QUSCRTUS - Create User Space                         */
/*               QUSPTRUS - Retrieve Pointer to User Space            */
/*               QUSROBJD - Retrieve Object Description               */
/*                                                                    */
/**********************************************************************/
/**********************************************************************/

#include <stdio.h>
#include <string.h>
#include <qsylobjp.h>    /* QSYLOBJP API Header                       */
#include <quscrtus.h>    /* QUSCRTUS API Header                       */
#include <qusptrus.h>    /* QUSPTRUS API Header                       */
#include <qusrobjd.h>    /* QUSROBJD API Header                       */
#include <qusgen.h>      /* Format Structures for User Space          */
#include <qusec.h>       /* Error Code Parameter Include for the APIs */
#include <qliept.h>      /* Entry Point Table Include                 */

/**********************************************************************/
/* Error Code Structure                                               */
/*                                                                    */
/* This shows how the user can define the variable length portion of  */
/* error code for the exception data.                                 */
/*                                                                    */
/**********************************************************************/
typedef struct {
     Qus_EC_t   ec_fields;
     char       Exception_Data[100];
        } error_code_t;

/**********************************************************************/
/* Global Variables                                                   */
/**********************************************************************/
char       api_name[10];
char       cont_hdl[20];
char       ext_attr[10];
char       list_status;
char       mbr_list[8];
char       obj_type[10];
char       rcvvar[8];
char       rjobd_fmt[8];
char       space_auth[10];
char       space_dmn[10];
char       space_init;
char       space_name[20];
char       space_rep[10];
char       space_text[50];
char       space_type[10];
char       usr_prf[10];
char       *usrspc_ptr, *usrspc_base;
int        rcvlen = 8;
int        size_entry;
int        space_size = 1;
error_code_t error_code;
FILE       *record;

/**********************************************************************/
/* Function:      done                                                */
/*                                                                    */
/* Description:   This function prints the end of listing print line  */
/*                and returns to the caller.                          */
/**********************************************************************/
void done()
{
  char command_string[32];

  fwrite("*** End of List",1, 15, record);
  fclose(record);
  exit();

} /* done */

/**********************************************************************/
/* Function:      apierr                                              */
/*                                                                    */
/* Description:   This function prints the API name, and exception    */
/*                identifier of an error that occurred.               */
/**********************************************************************/
void apierr()
{
  printf("API: %.10s\n", api_name);
  printf("Failed with exception: %.7s\n",
          error_code.ec_fields.Exception_Id);
  done();

} /* apierr */


/**********************************************************************/
/* Function:      getlst                                              */
/*                                                                    */
/* Description:   This function calls QSYLOBJP to build a list.       */
/*                                                                    */
/**********************************************************************/
void getlst()
{
  memcpy(mbr_list, "OBJP0200", 8);

  /********************************************************************/
  /* Call QSYLOBJP API to generate a list.  The continuation handle   */
  /* is set by the caller of this function.                           */
  /********************************************************************/
  QSYLOBJP(space_name,             /* User space and library          */
           mbr_list,               /* Member list                     */
           usr_prf,                /* User profile                    */
           obj_type,               /* Object type                     */
           cont_hdl,               /* Continuation handle    (3)      */  
           &error_code);           /* Error code                      */

  /********************************************************************/
  /* Check for errors on QSYLOBJP.                                    */
  /********************************************************************/
  if(error_code.ec_fields.Bytes_Available > 0)
  {
    memcpy(api_name, "QSYLOBJP  ", 10);
    apierr();
  }

} /* getlst */

/**********************************************************************/
/* Function:      init                                                */
/*                                                                    */
/* Description:   This function does all the necessary initialization */
/*                for this program.                                   */
/**********************************************************************/
void init()
{
  memcpy(space_name, "ADOPTS    QTEMP     ", 20);
  space_init = 0x00;
  memcpy(mbr_list, "OBJP0200", 8);
  memcpy(rjobd_fmt, "OBJD0100", 8);
  memcpy(space_type, "*USRSPC   ", 10);
  memcpy(ext_attr, "QSYLOBJP  ", 10);
  memcpy(space_auth, "*ALL      ", 10);
  memcpy(space_rep, "*YES      ", 10);
  memcpy(space_dmn, "*USER     ", 10);

  /********************************************************************/
  /* Open QPRINT file so that data can be written to it.  If the file */
  /* cannot be opened, print a message and exit.                      */
  /********************************************************************/
  if((record = fopen("QPRINT", "wb, lrecl=132, type=record")) == NULL)
  {
    printf("File could not be opened\n");
    exit(1);
  }

  error_code.ec_fields.Bytes_Provided = sizeof(error_code_t);

  /********************************************************************/
  /* Call QUSROBJD to see if the user space was previously created in */
  /* QTEMP.  If it was, simply reuse it.                              */
  /********************************************************************/
  QUSROBJD(rcvvar,                  /* Receiver variable              */
           rcvlen,                  /* Receiver variable length       */
           rjobd_fmt,               /* Format                         */
           space_name,              /* User space name and library    */
           space_type,              /* User object type               */
           &error_code);            /* Error code                     */

  if(error_code.ec_fields.Bytes_Available > 0)
  {
    /******************************************************************/
    /* If a CPF9801 error was received, then the user space was not   */
    /* found.                                                         */
    /******************************************************************/
    if(memcmp(error_code.ec_fields.Exception_Id, "CPF9801", 7) == 0)
    {
      /****************************************************************/
      /* Create a user space for the list generated by QSYLOBJP.      */
      /****************************************************************/
      QUSCRTUS(space_name,          /* User space name and library    */
               ext_attr,            /* Extended attribute             */
               space_size,          /* Size of the user space         */
               &space_init,         /* Space initialization           */
               space_auth,          /* Public authority to user space */
               space_text,          /* User space text                */
               space_rep,           /* Replace existing user space?   */
               &error_code,         /* Error Code                     */
               space_dmn);          /* Domain of created user space   */

      /****************************************************************/
      /* Check for errors on QUSCRTUS.                                */
      /****************************************************************/
      if(error_code.ec_fields.Bytes_Available > 0)
      {
         memcpy(api_name, "QUSCRTUS  ", 10);
         apierr();
      }
    }
    /******************************************************************/
    /* An error occurred accessing the user space.                    */
    /******************************************************************/
    else
    {
      memcpy(api_name, "QUSRJOBD  ", 10);
      apierr();
    }
  }

    /******************************************************************/
    /* Set QSYLOBJP (via GETLST) to start a new list.                 */
    /******************************************************************/
    memset(cont_hdl, ' ', 20);
    getlst();

    /******************************************************************/
    /* Get a resolved pointer to the user space for performance.      */
    /******************************************************************/
    QUSPTRUS(space_name,            /* User space name and library    */
             &usrspc_ptr,           /* User space pointer             */
             &error_code);          /* Error Code                     */

    /******************************************************************/
    /* Check for errors on QUSPTRUS.                                  */
    /******************************************************************/
    if(error_code.ec_fields.Bytes_Available > 0)
    {
      memcpy(api_name, "QUSPTRUS  ", 10);
      apierr();
    }

    usrspc_base = usrspc_ptr;

} /* init */

/**********************************************************************/
/* Function:      proces2                                             */
/*                                                                    */
/* Description:   This function processes each entry returned by      */
/*                QSYLOBJP.                                           */
/*                                                                    */
/**********************************************************************/
void proces2()
{
  char obj_type[112];

  sprintf(obj_type, "Object: %.10s Library: %.10s Type: %.10s Text: %.50s\n",
         ((Qsy_OBJP0200_List_T *)usrspc_ptr)->Object.Name,
         ((Qsy_OBJP0200_List_T *)usrspc_ptr)->Object.Library,
         ((Qsy_OBJP0200_List_T *)usrspc_ptr)->Object_Type,
         ((Qsy_OBJP0200_List_T *)usrspc_ptr)->Object_Text);
  fwrite(obj_type, 1, 112, record);

  /********************************************************************/
  /* After each entry, increment to the next entry.                   */
  /********************************************************************/
  usrspc_ptr += size_entry;                                 (7)

} /* proces2 */

/**********************************************************************/
/* Function:      proces1                                             */
/*                                                                    */
/* Description:   This function processes each entry returned by      */
/*                QSYLOBJP.                                           */
/*                                                                    */
/**********************************************************************/
void proces1()
{
  int i;
  int num_entries;
  int offset;

  num_entries = ((Qus_Generic_Header_0100_t *)\
                  usrspc_ptr)->Number_List_Entries;

  /********************************************************************/
  /* If valid information was returned.      (1)                          */
  /********************************************************************/
  if((((Qus_Generic_Header_0100_t *)usrspc_ptr)->Information_Status == 'C') ||
     (((Qus_Generic_Header_0100_t *)usrspc_ptr)->Information_Status == 'P'))
  {
    if(num_entries > 0)
    {
      /****************************************************************/
      /* Get the size of each entry to use later.   (4)                */
      /****************************************************************/
      size_entry = ((Qus_Generic_Header_0100_t *)usrspc_ptr)->Size_Each_Entry;

      /****************************************************************/
      /* Increment to the first list entry.                           */
      /****************************************************************/
      offset = ((Qus_Generic_Header_0100_t *)usrspc_ptr)->Offset_List_Data;  (5)
      usrspc_ptr += offset;

      /****************************************************************/
      /* Process all of the entries.                                  */
      /****************************************************************/
      for(i=0; i<num_entries; i++)                          (6)
        proces2();

      /****************************************************************/
      /* Reset the user space pointer to the beginning.               */
      /****************************************************************/
      usrspc_ptr = usrspc_base;

      /****************************************************************/
      /* If all entries in this user space have been processed, check */
      /* if more entries exist than can fit in one user space.        */
      /****************************************************************/
      if(((Qus_Generic_Header_0100_t *)usrspc_ptr)->Information_Status == 'P')
      {
        /**************************************************************/
        /* Address the input parameter header.                        */
        /**************************************************************/
        offset = ((Qus_Generic_Header_0100_t *)\
                   usrspc_ptr)->Offset_Input_Parameter;
        usrspc_ptr += offset;

        /**************************************************************/
        /* If the continuation handle in the input parameter header   */
        /* is blank, then set the list status to complete.
        /**************************************************************/
        if(memcmp(((Qsy_OBJP_Input_T *)usrspc_ptr)->Continuation_Handle,
           "                    ", 20) == 0)
        {
          list_status = 'C';
        }
        else
        /**************************************************************/
        /* Else, call QSYLOBJP reusing the user space to get more     */
        /* list entries.                                              */
        /**************************************************************/
        {
          memcpy(cont_hdl, ((Qsy_OBJP_Input_T *)\
                 usrspc_ptr)->Continuation_Handle, 20);     (2)
          getlst();
          list_status = ((Qus_Generic_Header_0100_t *)\
                          usrspc_ptr)->Information_Status;
        }
      }
    }
    else
    /******************************************************************/
    /* If there exists an unexpected status, log an error (not shown) */
    /* and exit.                                                      */
    /******************************************************************/
    {
      done();
    }
  }
} /* proces1 */

/**********************************************************************/
/* Function:      proces                                              */
/*                                                                    */
/* Description:   Processes entries until they are complete.          */
/*                                                                    */
/**********************************************************************/
void proces()
{
  list_status = ((Qus_Generic_Header_0100_t *)usrspc_ptr)->Information_Status;

  do
  {
    proces1();
  } while (list_status != 'C');

} /* proces */

/**********************************************************************/
/* main                                                               */
/**********************************************************************/

main(int argc, char *argv[])
{
  /********************************************************************/
  /* Make sure we received the correct number of parameters. The argc */
  /* parameter will contain the number of parameters that was passed  */
  /* to this program. This number also includes the program itself,   */
  /* so we need to evaluate argc-1.                                   */
  /********************************************************************/

  if (((argc - 1) < 2) || ((argc - 1 > 2)))
  /********************************************************************/
  /* We did not receive all of the required parameters so exit the    */
  /* program.                                                         */
  /********************************************************************/
  {
    exit(1);
  }
  else
  /********************************************************************/
  /* Copy parameters into local variables.                            */
  /********************************************************************/
  {
    memcpy(usr_prf, argv[1], 10);
    memcpy(obj_type, argv[2], 10);
  }

  init();
  proces();
  done();

} /* main */
Related reference
Example in RPG: List Object API