Skip Navigation Links | |
Exit Print View | |
ONC+ Developer's Guide Oracle Solaris 11.1 Information Library |
1. Introduction to ONC+ Technologies
4. Programmer's Interface to RPC
5. Advanced RPC Programming Techniques
Authentication Using RPCSEC_GSS
Changing Values and Destroying a Context
Setting Server Principal Names
Generating Client Principal Names
Receiving Credentials at the Server
/etc/gss/qop and /etc/gss/mech
Using Transient RPC Program Numbers
6. Porting From TS-RPC to TI-RPC
7. Multithreaded RPC Programming
8. Extensions to the Oracle Solaris RPC Library
By convention, the first version number of a program, PROG, is named PROGVERS_ORIG and the most recent version is named PROGVERS. Program version numbers must be assigned consecutively. Leaving a gap in the program version sequence can cause the search algorithm not to find a matching program version number that is defined.
Only the owner of a program should change version numbers. Adding a version number to a program that you do not own can cause severe problems when the owner increments the version number.
Suppose a new version of the ruser program returns an unsigned short rather than an int. If you name this version RUSERSVERS_SHORT, a server that supports both versions would do a double register. Use the same server handle for both registrations.
Example 5-15 Server Handle for Two Versions of Single Routine
if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_ORIG, nuser, nconf)) { fprintf(stderr, "can't register RUSER service\n"); exit(1); } if (!svc_reg(transp, RUSERSPROG, RUSERSVERS_SHORT, nuser, nconf)) { fprintf(stderr, "can't register RUSER service\n"); exit(1); }
Both versions can be performed by a single procedure, as shown in the following example.
Example 5-16 Procedure for Two Versions of Single Routine
void nuser(rqstp, transp) struct svc_req *rqstp; SVCXPRT *transp; { unsigned int nusers; unsigned short nusers2; switch(rqstp->rq_proc) { case NULLPROC: if (!svc_sendreply( transp, xdr_void, 0)) fprintf(stderr, "can't reply to RPC call\n"); return; case RUSERSPROC_NUM: /* * Code here to compute the number of users * and assign it to the variable nusers */ switch(rqstp->rq_vers) { case RUSERSVERS_ORIG: if (! svc_sendreply( transp, xdr_u_int, &nusers)) fprintf(stderr, "can't reply to RPC call\n"); break; case RUSERSVERS_SHORT: nusers2 = nusers; if (! svc_sendreply( transp, xdr_u_short, &nusers2)) fprintf(stderr, "can't reply to RPC call\n"); break; } default: svcerr_noproc(transp); return; } return; }