home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / rpc2 / part11 / rpc / rpcgen / test / demo_clnt.c next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  3.2 KB  |  150 lines

  1. /*
  2.  *  Client program for rpcgen demo
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <rpc/rpc.h>
  7. #include "demo_xdr.h"
  8.  
  9. char *Prog, *Host;
  10.  
  11. struct Calls {
  12.     char    *name;            /* name of call */
  13.     enum ret_status arg_type;    /* arg type expected */
  14.     int    procno;            /* proc number */
  15. } Calls[] = {
  16.     { "ctime",    RET_CLOCK,    CTIME        },
  17.     { "localtime",    RET_CLOCK,    LOCALTIME    },
  18.     { "gmtime",    RET_CLOCK,    GMTIME        },
  19.     { "asctime",    RET_TM,        ASCTIME        },
  20.     { "timezone",    RET_TZ,        TIMEZONE    },
  21.     { "dysize",    RET_YEAR,    DYSIZE        },
  22.     { NULL }
  23. };
  24.  
  25. char     *Arg;
  26. demo_res Res;
  27. xdrproc_t Xargs, Xres;
  28.  
  29. main(argc, argv)
  30. char **argv;
  31. {
  32.     struct Calls *callp;
  33.     int ret;
  34.  
  35.     Prog = argv[0];
  36.     if (argc < 3)
  37.         usage();
  38.  
  39.     for (callp = Calls; callp->name; callp++)
  40.         if (!strcmp(callp->name, argv[2]))
  41.             break;
  42.     if (callp->name == NULL) {
  43.         fprintf(stderr, "%s: call \"%s\" not recognized.\n",
  44.             Prog, argv[2]);
  45.         exit(1);
  46.     }
  47.     Host = argv[1];
  48.     argc -= 3; argv += 3;
  49.     getargs(argc, argv, callp);
  50.     Xres = xdr_demo_res;
  51.     if (ret = callrpc(Host, DEMOPROG, DEMOVERS, callp->procno,
  52.         Xargs, Arg, Xres, &Res))
  53.     {
  54.         fprintf(stderr, "%s: rpc failed: ", Prog);
  55.         clnt_perrno(ret);
  56.         fprintf(stderr, "\n");
  57.         exit(1);
  58.     }
  59.     printres(callp);
  60. }
  61.  
  62. getargs(argc, argv, callp)
  63. int argc;
  64. char **argv;
  65. struct Calls *callp;
  66. {
  67.     static long l_arg;
  68.     static timeval tv;
  69.     static tzargs tz_arg;
  70.  
  71.     gettimeofday(&tv, &tz_arg);
  72.     switch (callp->arg_type) {
  73.         case RET_CLOCK:
  74.         l_arg = (long)(argc > 0? atoi(argv[0]) : tv.tv_sec);
  75.         Arg = (char *)&l_arg;
  76.         Xargs = xdr_clock;
  77.         break;
  78.         case RET_TM:
  79.         l_arg = (long)(argc > 0? atoi(argv[0]) : tv.tv_sec);
  80.         Arg = (char *)localtime(&l_arg);
  81.         Xargs = xdr_tm;
  82.         break;
  83.         case RET_TZ:
  84.         if (argc == 1) {
  85.             fprintf(stderr, "\
  86. %s: call \"%s\" takes two arguments.\n", Prog, callp->name);
  87.             exit(1);
  88.         } else if (argc > 1) {
  89.             tz_arg.zone = atoi(argv[0]);
  90.             tz_arg.dst = atoi(argv[1]);
  91.         }
  92.         Arg = (char *)&tz_arg;
  93.         Xargs = xdr_tzargs;
  94.         break;
  95.         case RET_YEAR:
  96.         l_arg = (argc > 0? atoi(argv[0]) : 1986);
  97.         Arg = (char *)&l_arg;
  98.         Xargs = xdr_int;
  99.         break;
  100.         default:
  101.         fprintf(stderr, "%s: panic: unknown arg type %d\n",
  102.             Prog, callp->arg_type);
  103.         exit(1);
  104.     }
  105. }
  106.  
  107. printres(callp)
  108. struct Calls *callp;
  109. {
  110.     switch (Res.which) {
  111.         case RET_DATE:
  112.         printf("date from %s: %s\n", Host, Res.demo_res.date);
  113.         break;
  114.         case RET_TM:
  115. #define TZP(x) Res.demo_res.tmp->tm_/**/x
  116.         printf("\
  117. time info from %s: sec=%d, min=%d, hour=%d, mday=%d, mon=%d,\n\
  118.                    year=%d, wday=%d, yday=%d, isdst=%d\n",
  119.             Host, TZP(sec), TZP(min), TZP(hour), TZP(mday),
  120.             TZP(mon), TZP(year), TZP(wday), TZP(yday), TZP(isdst));
  121.         break;
  122.         case RET_STR:
  123.         printf("Return string from %s: %s\n", Host, Res.demo_res.str);
  124.         break;
  125.         case RET_DAYS:
  126.         printf("Return from %s: %d days\n", Host, Res.demo_res.days);
  127.         break;
  128.         case RET_ERROR:
  129.         printf("%s returned error %d (%s)\n", Host,
  130.             Res.demo_res.err.err_number,
  131.             Res.demo_res.err.err_text);
  132.         break;
  133.         default:
  134.         printf("%s returned an unknown return type (%d)\n",
  135.             Host, Res.which);
  136.         break;
  137.     }
  138. }
  139.  
  140. usage()
  141. {
  142.     struct Calls *callp;
  143.  
  144.     fprintf(stderr, "usage: %s host call [args]\n", Prog);
  145.     fprintf(stderr, "valid calls are:\n");
  146.     for (callp = Calls; callp->name; callp++)
  147.         fprintf(stderr, "\t%s\n", callp->name);
  148.     exit(1);
  149. }
  150.