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
6. Porting From TS-RPC to TI-RPC
7. Multithreaded RPC Programming
8. Extensions to the Oracle Solaris RPC Library
B. RPC Protocol and Language Specification
Directory Listing Program and Support Routines (rpcgen)
Add Two Numbers Program (rpcgen)
Example D-7 printmesg.c
/* printmsg.c: print a message on the console */ #include <stdio.h> main(argc, argv) int argc; char *argv[]; { char *message; if (argc != 2) { fprintf(stderr, "usage: %s <message>\n", argv[0]); exit(1); } message = argv[1]; if( !printmessage(message) ) { fprintf(stderr, "%s: couldn't print your message\n", argv[0]); exit(1); } printf("Message Delivered!\n"); exit(0); } /* Print a message to the console. */ /* * Return a boolean indicating whether the message was actually * printed. */ printmessage(msg) char *msg; { FILE *f; if = fopen("/dev/console","w"); if (f == (FILE *)NULL) return (0); fprintf(f,"%sen”, msg); fclose(f); return (1); }
Example D-8 Remote Version of printmesg.c
/* * 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); }
Example D-9 rpcgen Program: msg.x
/* msg.x: Remote message printing protocol */ program MESSAGEPROG { version MESSAGEVERS { int PRINTMESSAGE(string) = 1; } = 1; } = 0x20000001;
Example D-10 mesg_proc.c
/* * msg_proc.c: implementation of the remote * procedure "printmessage" */ #include <stdio.h> #include <rpc/rpc.h> /* always needed */ #include "msg.h” /* msg.h generated by rpcgen */ /* * Remote version of "printmessage" */ /*ARGSUSED1*/ int printmessage_1(msg, req) char **msg; struct svc_req *req; { static int result; /* must be static! */ FILE *f; f = fopen("/dev/console", "w"); if (f == (FILE *)NULL) { result = 0; return (&result); } fprintf(f, "%sen", *msg); fclose(f); result = 1; return (&result); }