This appendix contains copies of the complete live code modules used in the rpcgen and RPC chapters of this book. They are compilable as they are written and will run (unless otherwise noted to be pseudo-code or the like). They are provided for informational purposes only. Sun Microsystems assumes no liability from their use.
/* * rls.c: Remote directory listing client */ #include <stdio.h> #include <rpc/rpc.h> /* always need this */ #include "dir.h" /* generated by rpcgen */ extern int errno; main(argc, argv) int argc; char *argv[]; { CLIENT *cl; char *server; char *dir; readdir_res *result; namelist nl; if (argc != 3) { fprintf(stderr, "usage: %s host directory\n", argv[0]); exit(1); } server = argv[1]; dir = argv[2]; /* * Create client "handle" used for calling MESSAGEPROG on the server * designated on the command line. */ cl = clnt_create(server, DIRPROG, DIRVERS, "visible"); if (cl == (CLIENT *)NULL) { clnt_pcreateerror(server); exit(1); } result = readdir_1(&dir, cl); if (result == (readdir_res *)NULL) { clnt_perror(cl, server); exit(1); } /* Okay, we successfully called the remote procedure. */ if (result->errno != 0) { /* * A remote system error occurred. Print error message and die. */ } if (result->errno < sys_nerr) fprintf (stderr, "%s : %s\n", dir, sys_enlist[result->errno]); errno = result->errno; perror(dir); exit(1); } /* Successfully got a directory listing. Print it out. */ for(nl = result->readdir_res_u.list; nl != NULL; nl = nl- >next) { printf("%s\n", nl->name); } exit(0); |
/* * time.x: Remote time protocol */ program TIMEPROG { version TIMEVERS { unsigned int TIMEGET(void) = 1; } = 1; } = 0x20000044; #ifdef RPC_SVC %int * %timeget_1() %{ % static int thetime; % % thetime = time(0); % return (&thetime); %} #endif |
/* This program contains a procedure to add 2 numbers to demonstrate * some of the features of the new rpcgen. Note that add() takes 2 * arguments in this case. */ program ADDPROG { /* program number */ version ADDVER { /* version number */ int add ( int, int ) /* procedure */ = 1; } = 1; } = 199; |
Refer to the notes section on the spray(1M) man page for information about using this tool.
/* * rprintmsg.c: remote version of "printmsg.c" */ #include <stdio.h> #include <rpc/rpc.h> /* always needed */ #include "msg.h" /* msg.h generated by rpcgen */ main(argc, argv) int argc; char *argv[]; { CLIENT *cl; int *result; char *server; char *message; extern int sys_nerr; extern char *sys_errlist[]; if (argc != 3) { fprintf(stderr,"usage: %s host messagen", argv[0]); exit(1); } /* * Save values of command line arguments */ server = argv[1]; message = argv[2]; /* * Create client"handle" used for calling * MESSAGEPROG on the server * designated on the command line. */ cl = clnt_create(server, MESSAGEPROG, PRINTMESSAGEVERS, "visible"); if (cl == (CLIENT *)NULL) { /* * Couldn't establish connection with server. * Print error message and die. */ clnt_pcreateerror(server); exit(1); } /* Call the remote procedure "printmessage" on the server */ result = printmessage_1(&message, cl); if (result == (int *)NULL) { /* * An error occurred while calling the server. * Print error message and die. */ clnt_perror(cl, server); exit(1); } /* Okay, we successfully called the remote procedure. */ if (*result == 0) { /* * Server was unable to print our message. * Print error message and die. */ fprintf(stderr,"%s" } /* The message got printed on the server's console */ printf("Message delivered to %s!\n", server); exit(0); } |
/* msg.x: Remote message printing protocol */ program MESSAGEPROG { version MESSAGEVERS { int PRINTMESSAGE(string) = 1; } = 1; } = 0x20000001; |
This example is included for reference only. It is a version of the batched client string rendering service, written in as a non-batched program.