svcerr_systemerr()--Send Information to Client for System Error


  Syntax

 #include <rpc/rpc.h>
 void svcerr_systemerr(const SVCXPRT *xprt);

  Service Program Name: QZNFTRPC

  Default Public Authority: *USE

  Threadsafe: No

The svcerr_systemerr() function sends information to the remote client that the service dispatch routine detected a system error not covered by any particular protocol.


Parameters

xprt  (Input) 
A pointer to the RPC service transport handle.

Authorities

No authorization is required.


Return Value

None.


Error Conditions

In case of an exception, the errno global variable is set to EUNKNOWN.


Error Messages

Message ID Error Message Text
CPF3CF2 E Error(s) occurred during running of &1 API.
CPF9872 E Program or service program &1 in library &2 ended. Reason code &3.


Example

See Code disclaimer information for information pertaining to code examples.

The following example shows how svcerr_systemerr() is used:

#include <stdio.h>
#include <stdlib.h> /* getenv, exit */
#include <rpc/rpc.h>

#define MESSAGEPROG ((unsigned long)(0x20000001))
#define PRINTMESSAGEVERS ((unsigned long)(1))
#define PRINTMESSAGE ((unsigned long)(1))

/* This procedure is called by dispatcher routine */
int *printmessage_l(char **msg, struct svc_req *req)
{
  static int result;
  char stffl30";
  int fd;

  /* Do something with *msg contents */
  ...

  result = 1;
  return(&result);
}

/* This is the server dispatcher routine.
   It is called when a request arrives from client
   and it applies to MESSAGEPROG program number and PRINTMESSAGEVERS
   version number */

static void
messageprog_l(struct svc_req *rqstp, SVCXPRT *transp)
{
  union u_argument{
   char *printmessage_l_arg;
  }argument;
  char *result;
  bool_t (*_xdr_argument)(), (*_xdr_result)();
  char *(*local)(union u_argument *, struct svc_req *);

  _rpcsvccount++;
  switch(rqstp->rq_proc)
  {
    /* rqstp->rq_proc contains the procedure number
       of procedure that should be called */

    case NULLPROC: /* empty procedure, do nothing, just send the ack */
      svc_sendreply(transp, (xdrproc_t)xdr_void, (char *)NULL);
      return;
    case PRINTMESSAGE: /* printmessage_l() */
      if (rqstp->rq_cred.oa_flavor != AUTH_SYS) {
         /* AUTH_SYS is required by this procedure */
         svcerr_weakauth(transp);
         return;
       }
      _xdr_argument = (bool_t(*)())xdr_wrapstring;
      _xdr_result = (bool_t(*)())xdr_int;
      local = (char *(*)(u_argument *, struct svc_req *))
                         printmessage_l;
      break;
    default: /* no other procedures available */
      svcerr_noproc(transp);
      return;
  }
  memset((char *)&argument, 0, sizeof(argument));

  /* decode arguments for the procedure */
  if (!svc_getargs(transp, (xdrproc_t)_xdr_argument,
                   (char *)&argument)){
    svcerr_decode(transp);
    return;
  }

  /* Invoke the procedure */
  result = (*local)(&argument, rqstp);

  /* Send reply to the client containing results of the invocation */
  if (result != NULL && !svc_sendreply(transp,
                            (xdrproc_t)_xdr_result, result)){
    svcerr_systemerr(transp);
  }

  if (!svc_freeargs(transp, (xdrproc_t)_xdr_argument,
                            (char *)&argument)){
    printf("unable to free arguments");
    exit(1);
  }
  return;
}

main()
{
  pid_t pid;
  int i;

  printf("Start..");

  printf("Try to create..");
  /* Create a new RPC server instance which will use messageprog_l()
     as a dispatcher function associated with MESSAGEPROG program
     number and PRINTMESSAGEVERS version number.
     Since "VISIBLE" nettype is selected, a number of server instances
     will be actually created: one for each "VISIBLE" entry in
     /etc/netconfig */
  if(!svc_create(messageprog_l, MESSAGEPROG, PRINTMESSAGEVERS,
                 "VISIBLE")){
     printf("Unable to create service.");
     return 1;
  }

  /* Enter the main loop of RPC */
  svc_run();

  return 0;
}



API introduced: V4R2
Top | Remote Procedure Call (RPC) APIs | APIs by category