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.
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.
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; }