| Skip Navigation Links | |
| Exit Print View | |
|
ONC+ Developer's Guide Oracle Solaris 11 Express 11/10 |
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 Sun RPC Library
B. RPC Protocol and Language Specification
F. Writing a Port Monitor With the Service Access Facility (SAF)
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. Sun registers version numbers and answers questions about them (rpc@Sun.com).
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;
}