summaryrefslogtreecommitdiff
path: root/usr.sbin/rpc.pcnfsd/pcnfsd_test.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /usr.sbin/rpc.pcnfsd/pcnfsd_test.c
initial import of NetBSD tree
Diffstat (limited to 'usr.sbin/rpc.pcnfsd/pcnfsd_test.c')
-rw-r--r--usr.sbin/rpc.pcnfsd/pcnfsd_test.c572
1 files changed, 572 insertions, 0 deletions
diff --git a/usr.sbin/rpc.pcnfsd/pcnfsd_test.c b/usr.sbin/rpc.pcnfsd/pcnfsd_test.c
new file mode 100644
index 00000000000..1a3561435e6
--- /dev/null
+++ b/usr.sbin/rpc.pcnfsd/pcnfsd_test.c
@@ -0,0 +1,572 @@
+/* $NetBSD: pcnfsd_test.c,v 1.2 1995/07/25 22:21:01 gwr Exp $ */
+
+/* RE_SID: @(%)/usr/dosnfs/shades_SCCS/unix/pcnfsd/v2/src/SCCS/s.pcnfsd_test.c 1.2 92/01/27 18:00:39 SMI */
+#include <stdio.h>
+#include <rpc/rpc.h>
+#include <malloc.h>
+#include "pcnfsd.h"
+
+CLIENT *cl;
+CLIENT *cl2;
+char *server;
+char spooldirbuff[256];
+char filenamebuff[256];
+char last_id[32] = "";
+
+void free_pr_list_item();
+void free_pr_queue_item();
+void good();
+void bad();
+
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+
+char *host_name;
+char *printer;
+char *user_name;
+char *passwd;
+char *transport = "udp";
+
+ if((argc < 6) || (argc > 7)) {
+ fprintf(stderr, "usage: %s server host printer user password [transport]\n",
+ argv[0]);
+ exit(1);
+ }
+
+ server = argv[1];
+ host_name = argv[2];
+ printer = argv[3];
+ user_name = argv[4];
+ passwd = argv[5];
+ if (argc == 7)
+ transport = argv[6];
+
+ cl = clnt_create(server, PCNFSDPROG, PCNFSDVERS, transport);
+ if(cl == NULL) {
+ clnt_pcreateerror(server);
+ exit(1);
+ }
+ cl2 = clnt_create(server, PCNFSDPROG, PCNFSDV2, transport);
+ if(cl2 == NULL) {
+ clnt_pcreateerror(server);
+ exit(1);
+ }
+ good();
+ test_v2_info();
+ good();
+ test_v2_auth(host_name, user_name, passwd);
+ bad("Invalid password");
+ test_v2_auth(host_name, user_name, "bogus");
+ good();
+ test_v2_list();
+ good();
+ test_v2_init(host_name, printer);
+ good();
+ test_v2_start(host_name, printer, user_name, "foo", "foo");
+ good();
+ test_v2_start(host_name, printer, user_name, "bar", "bar");
+ bad("No such file to print");
+ test_v2_start(host_name, printer, user_name, "bletch", "gack");
+ good();
+ test_v2_queue(printer, user_name, FALSE);
+ if(strlen(last_id)) {
+ bad("Cancelling job with bad username");
+ test_v2_cancel(host_name, printer, "nosuchuser", last_id);
+ good();
+ test_v2_cancel(host_name, printer, user_name, last_id);
+ }
+ bad("Cancelling unknown job");
+ test_v2_cancel(host_name, printer, user_name, "99999");
+ bad("Cancelling job on invalid printer");
+ test_v2_cancel(host_name, "nosuchprinter", user_name, last_id);
+ good();
+ test_v2_queue(printer, user_name, TRUE);
+ bad("Checking queue on invalid printer");
+ test_v2_queue("nosuchprinter", user_name, TRUE);
+ good();
+ test_v2_stat(printer);
+ bad("Checking status of invalid printer");
+ test_v2_stat("nosuchprinter");
+ good();
+ test_v2_map();
+ exit(0);
+/*NOTREACHED*/
+}
+
+#define zchar 0x5b
+
+void
+scramble(s1, s2)
+char *s1;
+char *s2;
+{
+ while (*s1)
+ {
+ *s2++ = (*s1 ^ zchar) & 0x7f;
+ s1++;
+ }
+ *s2 = 0;
+}
+
+
+
+test_v2_info()
+{
+v2_info_args a;
+v2_info_results *rp;
+int *gp;
+int i;
+
+ a.vers = "Sun Microsystems PCNFSD test subsystem V1";
+ a.cm = "-";
+ printf("\ninvoking pr_info_2\n");
+
+ rp = pcnfsd2_info_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+
+ printf("results: vers = '%s', cm = '%s'\n",
+ rp->vers, rp->cm);
+ printf("facilities_len = %d\n", rp->facilities.facilities_len);
+ if (rp->facilities.facilities_len) {
+ gp = rp->facilities.facilities_val;
+ for(i = 0; i < rp->facilities.facilities_len; i++)
+ printf(" procedure %2d: %6d\n", i, *gp++);
+ printf("\n");
+ }
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->facilities.facilities_val)
+ free(rp->facilities.facilities_val);
+ if(rp->vers)
+ free(rp->vers);
+
+ return(0);
+}
+
+test_v2_auth(host_name, user_name , pwrd)
+char *host_name;
+char *user_name;
+char *pwrd;
+{
+v2_auth_args a;
+v2_auth_results *rp;
+char uname[32];
+char pw[64];
+u_int *gp;
+int i;
+
+ scramble(user_name, uname);
+ scramble(pwrd, pw);
+ a.system = host_name;
+ a.id = uname;
+ a.pw = pw;
+ a.cm = "-";
+ printf("\ninvoking pr_auth_2\n");
+
+ rp = pcnfsd2_auth_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+
+ if(rp->stat == AUTH_RES_FAIL)
+ printf("results: stat = AUTH_RES_FAIL\n");
+ else {
+ printf("results: stat = %d, uid = %u, gid = %u,\n homedir= '%s', cm = '%s'\n",
+ rp->stat, rp->uid, rp->gid, rp->home, rp->cm);
+ printf("gids_len = %d", rp->gids.gids_len);
+ if (rp->gids.gids_len) {
+ gp = rp->gids.gids_val;
+ for(i = 0; i < rp->gids.gids_len; i++)
+ printf(" %u", *gp++);
+ printf("\n");
+ }
+ }
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->gids.gids_val)
+ free(rp->gids.gids_val);
+ if(rp->home)
+ free(rp->home);
+
+ return(0);
+}
+
+test_v2_init(host_name, printer)
+char *host_name;
+char *printer;
+{
+v2_pr_init_args a;
+v2_pr_init_results *rp;
+
+ a.system = host_name;
+ a.pn = printer;
+ a.cm = "-";
+ printf("\ninvoking pr_init_2\n");
+
+ rp = pcnfsd2_pr_init_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: stat = %d, dir = '%s', cm = '%s'\n",
+ rp->stat, rp->dir, rp->cm);
+ strcpy(spooldirbuff, rp->dir);
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->dir)
+ free(rp->dir);
+ return(0);
+}
+
+
+test_v2_start(host_name, printer, user_name, tag1, tag2)
+char *host_name;
+char *printer;
+char *user_name;
+char *tag1;
+char *tag2;
+{
+v2_pr_start_args a;
+v2_pr_start_results *rp;
+FILE *fp;
+ printf("\ntesting start print v2\n");
+
+ if(strcmp(server, "localhost")) {
+ printf("sorry - can only test start print on 'localhost'\n");
+ return(1);
+ }
+
+ sprintf(filenamebuff, "%s/%s", spooldirbuff, tag1);
+
+ fp = fopen(filenamebuff, "w");
+ if(fp == NULL) {
+ perror("creating test file");
+ return(1);
+ }
+ (void)fputs("foo bar bletch\n", fp);
+ (void)fclose(fp);
+
+ a.system = host_name;
+ a.pn = printer;
+ a.user = user_name;
+ a.file = tag2;
+ a.opts = "xxxx";
+ a.copies = 1;
+ a.cm = "-";
+
+ printf("\ninvoking pr_start_2\n");
+
+ rp = pcnfsd2_pr_start_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: stat = %d, jobid = '%s', cm = '%s'\n",
+ rp->stat, rp->id, rp->cm);
+ if(rp->stat == PS_RES_OK)
+ strcpy(last_id, rp->id);
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->id)
+ free(rp->id);
+ return(0);
+}
+
+
+test_v2_cancel(host_name, printer, user_name, id)
+char *host_name;
+char *printer;
+char *user_name;
+char *id;
+{
+v2_pr_cancel_args a;
+v2_pr_cancel_results *rp;
+ printf("\ntesting cancel print v2\n");
+
+ a.system = host_name;
+ a.pn = printer;
+ a.user = user_name;
+ a.id = id;
+ a.cm = "-";
+
+ printf("\ninvoking pr_cancel_2 for job %s on printer %s\n",
+ id, printer);
+
+ rp = pcnfsd2_pr_cancel_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: stat = %d, cm = '%s'\n",
+ rp->stat, rp->cm);
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ return(0);
+}
+test_v2_list()
+{
+char a;
+v2_pr_list_results *rp;
+pr_list curr;
+
+
+ printf("\ninvoking pr_list_2\n");
+
+ rp = pcnfsd2_pr_list_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: cm = '%s', printerlist:\n", rp->cm);
+ curr = rp->printers;
+ while(curr) {
+ printf(" name '%s' ", curr->pn);
+ if(strlen(curr->remhost))
+ printf("remote: srvr '%s', name '%s'",
+ curr->remhost,
+ curr->device);
+ else
+ printf("local device = '%s'", curr->device);
+ printf(", cm = '%s'\n", curr->cm);
+ curr = curr->pr_next;
+ }
+ printf("end of list\n");
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->printers) {
+ printf("freeing results\n");
+ free_pr_list_item(rp->printers);
+ }
+ return(0);
+}
+
+
+void
+free_pr_list_item(curr)
+pr_list curr;
+{
+ if(curr->pn)
+ free(curr->pn);
+ if(curr->remhost)
+ free(curr->remhost);
+ if(curr->device)
+ free(curr->device);
+ if(curr->cm)
+ free(curr->cm);
+ if(curr->pr_next)
+ free_pr_list_item(curr->pr_next); /* recurse */
+ free(curr);
+}
+
+
+
+test_v2_queue(printer, user_name, private)
+char *printer;
+char *user_name;
+int private;
+{
+struct v2_pr_queue_args a;
+v2_pr_queue_results *rp;
+pr_queue curr;
+
+ a.pn = printer;
+ a.system = "foo";
+ a.user = user_name;
+ a.just_mine = private;
+ a.cm = "no";
+
+ printf("\ninvoking pr_queue_2 (just_mine = %d)\n", private);
+
+ rp = pcnfsd2_pr_queue_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: stat = %d, qlen = %d, qshown = %d cm = '%s', queue:\n",
+ rp->stat, rp->qlen, rp->qshown, rp->cm);
+ curr = rp->jobs;
+ while(curr) {
+ printf("rank = %2d, id = '%s', size = '%s', status = '%s'\n",
+ curr->position,
+ curr->id,
+ curr->size,
+ curr->status);
+ printf(" user = '%s', file = '%s', cm = '%s'\n",
+ curr->user,
+ curr->file,
+ curr->cm);
+ curr = curr->pr_next;
+ }
+ printf("end of list\n");
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->jobs) {
+ printf("freeing results\n");
+ free_pr_queue_item(rp->jobs);
+ }
+ return(0);
+}
+
+
+
+void
+free_pr_queue_item(curr)
+pr_queue curr;
+{
+ if(curr->id)
+ free(curr->id);
+ if(curr->size)
+ free(curr->size);
+ if(curr->status)
+ free(curr->status);
+ if(curr->system)
+ free(curr->system);
+ if(curr->user)
+ free(curr->user);
+ if(curr->file)
+ free(curr->file);
+ if(curr->cm)
+ free(curr->cm);
+ if(curr->pr_next)
+ free_pr_queue_item(curr->pr_next); /* recurse */
+ free(curr);
+}
+
+
+
+test_v2_stat(printer)
+char *printer;
+{
+v2_pr_status_args a;
+v2_pr_status_results *rp;
+
+ printf("\ntesting status print v2\n");
+
+ a.pn = printer;
+ a.cm = "-";
+
+ printf("\ninvoking pr_status_2\n");
+
+ rp = pcnfsd2_pr_status_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: stat = %d, cm = '%s'\n",
+ rp->stat, rp->cm);
+ if(rp->stat == PI_RES_OK) {
+ printf("avail = %s, ", (rp->avail ? "YES" : "NO"));
+ printf("printing = %s, ", (rp->printing ? "YES" : "NO"));
+ printf("needs_operator = %s, ", (rp->needs_operator ? "YES" : "NO"));
+ printf("qlen = %d, status = '%s'\n", rp->qlen, rp->status);
+ }
+/* free up allocated strings */
+ if(rp->cm)
+ free(rp->cm);
+ if(rp->status)
+ free(rp->status);
+ return(0);
+}
+
+struct mapreq_arg_item * make_mapreq_entry(t, i, n, next)
+mapreq t;
+int i;
+char *n;
+struct mapreq_arg_item *next;
+{
+struct mapreq_arg_item *x;
+ x = (struct mapreq_arg_item *)malloc(sizeof(struct mapreq_arg_item));
+ if(x == NULL) {
+ fprintf(stderr, "out of memory\n");
+ exit(123);
+ }
+ x->req = t;
+ x->id = i;
+ x->name = (n ? n : "");
+ x->mapreq_next = next;
+ return(x);
+}
+
+test_v2_map()
+{
+v2_mapid_args a;
+v2_mapid_results *rp;
+struct mapreq_res_item *rip;
+
+ a.cm = "-";
+ a.req_list = make_mapreq_entry(MAP_REQ_UID, 906, NULL,
+ make_mapreq_entry(MAP_REQ_GID, 1, NULL,
+ make_mapreq_entry(MAP_REQ_UNAME, 0, "root",
+ make_mapreq_entry(MAP_REQ_GNAME, 0, "wheel",
+ make_mapreq_entry(MAP_REQ_UNAME, 0, "bogus", NULL)))));
+
+ printf("\ninvoking pr_mapid_2\n");
+ rp = pcnfsd2_mapid_2(&a, cl2);
+
+ if(rp == NULL) {
+ clnt_perror(cl2, server);
+ return(1);
+ }
+ printf("results: cm = '%s', result list %s\n",
+ rp->cm, rp->res_list ? "follows" : "omitted");
+ rip = rp->res_list;
+ while(rip) {
+ printf("request type = %d, status = %d, id = %d, name = '%s'\n",
+ rip->req, rip->stat, rip->id,
+ (rip->name ? rip->name : "(NULL)"));
+ rip = rip->mapreq_next;
+ }
+/* XXX should free up results */
+
+
+
+return(0);
+}
+
+
+void
+good()
+{
+printf("\n");
+printf("********************************************************\n");
+printf("********************************************************\n");
+printf("** The following test is expected to SUCCEED **\n");
+printf("********************************************************\n");
+printf("********************************************************\n");
+}
+
+void
+bad(reason)
+char *reason;
+{
+printf("\n");
+printf("********************************************************\n");
+printf("********************************************************\n");
+printf("** The following test is expected to FAIL **\n");
+printf("** Reason: **\n");
+printf("** %50s **\n", reason);
+printf("********************************************************\n");
+printf("********************************************************\n");
+}