Home | History | Annotate | Line # | Download | only in rpc.pcnfsd
pcnfsd_test.c revision 1.1
      1 /* RE_SID: @(%)/usr/dosnfs/shades_SCCS/unix/pcnfsd/v2/src/SCCS/s.pcnfsd_test.c 1.2 92/01/27 18:00:39 SMI */
      2 #include <stdio.h>
      3 #include <rpc/rpc.h>
      4 #include <malloc.h>
      5 #include "pcnfsd.h"
      6 
      7 CLIENT *cl;
      8 CLIENT *cl2;
      9 char *server;
     10 char spooldirbuff[256];
     11 char filenamebuff[256];
     12 char last_id[32] = "";
     13 
     14 void free_pr_list_item();
     15 void free_pr_queue_item();
     16 void good();
     17 void bad();
     18 
     19 
     20 main(argc, argv)
     21 int argc;
     22 char *argv[];
     23 {
     24 
     25 char *host_name;
     26 char *printer;
     27 char *user_name;
     28 char *passwd;
     29 char *transport = "udp";
     30 
     31 	if((argc < 6) || (argc > 7)) {
     32 		fprintf(stderr, "usage: %s server host printer user password [transport]\n",
     33 			argv[0]);
     34 		exit(1);
     35 	}
     36 
     37 	server = argv[1];
     38 	host_name = argv[2];
     39 	printer = argv[3];
     40 	user_name = argv[4];
     41 	passwd = argv[5];
     42 	if (argc == 7)
     43 		transport = argv[6];
     44 
     45 	cl = clnt_create(server, PCNFSDPROG, PCNFSDVERS, transport);
     46 	if(cl == NULL) {
     47 		clnt_pcreateerror(server);
     48 		exit(1);
     49 	}
     50 	cl2 = clnt_create(server, PCNFSDPROG, PCNFSDV2, transport);
     51 	if(cl2 == NULL) {
     52 		clnt_pcreateerror(server);
     53 		exit(1);
     54 	}
     55 	good();
     56 	test_v2_info();
     57 	good();
     58 	test_v2_auth(host_name, user_name, passwd);
     59 	bad("Invalid password");
     60 	test_v2_auth(host_name, user_name, "bogus");
     61 	good();
     62 	test_v2_list();
     63 	good();
     64 	test_v2_init(host_name, printer);
     65 	good();
     66 	test_v2_start(host_name, printer, user_name, "foo", "foo");
     67 	good();
     68 	test_v2_start(host_name, printer, user_name, "bar", "bar");
     69 	bad("No such file to print");
     70 	test_v2_start(host_name, printer, user_name, "bletch", "gack");
     71 	good();
     72 	test_v2_queue(printer, user_name, FALSE);
     73 	if(strlen(last_id)) {
     74 		bad("Cancelling job with bad username");
     75 		test_v2_cancel(host_name, printer, "nosuchuser", last_id);
     76 		good();
     77 		test_v2_cancel(host_name, printer, user_name, last_id);
     78 	}
     79 	bad("Cancelling unknown job");
     80 	test_v2_cancel(host_name, printer, user_name, "99999");
     81 	bad("Cancelling job on invalid printer");
     82 	test_v2_cancel(host_name, "nosuchprinter", user_name, last_id);
     83 	good();
     84 	test_v2_queue(printer, user_name, TRUE);
     85 	bad("Checking queue on invalid printer");
     86 	test_v2_queue("nosuchprinter", user_name, TRUE);
     87 	good();
     88 	test_v2_stat(printer);
     89 	bad("Checking status of invalid printer");
     90 	test_v2_stat("nosuchprinter");
     91 	good();
     92 	test_v2_map();
     93 	exit(0);
     94 /*NOTREACHED*/
     95 }
     96 
     97 #define zchar           0x5b
     98 
     99 void
    100 scramble(s1, s2)
    101 char           *s1;
    102 char           *s2;
    103 {
    104         while (*s1)
    105               {
    106               *s2++ = (*s1 ^ zchar) & 0x7f;
    107               s1++;
    108               }
    109         *s2 = 0;
    110 }
    111 
    112 
    113 
    114 test_v2_info()
    115 {
    116 v2_info_args a;
    117 v2_info_results *rp;
    118 int          *gp;
    119 int             i;
    120 
    121 	a.vers = "Sun Microsystems PCNFSD test subsystem V1";
    122 	a.cm = "-";
    123 	printf("\ninvoking pr_info_2\n");
    124 
    125 	rp = pcnfsd2_info_2(&a, cl2);
    126 
    127 	if(rp == NULL) {
    128 		clnt_perror(cl2, server);
    129 		return(1);
    130 	}
    131 
    132 	printf("results: vers = '%s', cm = '%s'\n",
    133 		rp->vers, rp->cm);
    134 	printf("facilities_len = %d\n", rp->facilities.facilities_len);
    135 	if (rp->facilities.facilities_len) {
    136 		gp = rp->facilities.facilities_val;
    137 		for(i = 0; i < rp->facilities.facilities_len; i++)
    138 			printf(" procedure %2d: %6d\n", i, *gp++);
    139 		printf("\n");
    140 	}
    141 /* free up allocated strings */
    142 	if(rp->cm)
    143 		free(rp->cm);
    144 	if(rp->facilities.facilities_val)
    145 		free(rp->facilities.facilities_val);
    146 	if(rp->vers)
    147 		free(rp->vers);
    148 
    149 	return(0);
    150 }
    151 
    152 test_v2_auth(host_name, user_name , pwrd)
    153 char *host_name;
    154 char *user_name;
    155 char *pwrd;
    156 {
    157 v2_auth_args a;
    158 v2_auth_results *rp;
    159 char            uname[32];
    160 char            pw[64];
    161 u_int          *gp;
    162 int             i;
    163 
    164 	scramble(user_name, uname);
    165 	scramble(pwrd, pw);
    166 	a.system = host_name;
    167 	a.id = uname;
    168 	a.pw = pw;
    169 	a.cm = "-";
    170 	printf("\ninvoking pr_auth_2\n");
    171 
    172 	rp = pcnfsd2_auth_2(&a, cl2);
    173 
    174 	if(rp == NULL) {
    175 		clnt_perror(cl2, server);
    176 		return(1);
    177 	}
    178 
    179 	if(rp->stat == AUTH_RES_FAIL)
    180 		printf("results: stat = AUTH_RES_FAIL\n");
    181 	else {
    182 	printf("results: stat = %d, uid = %u, gid = %u,\n homedir= '%s', cm = '%s'\n",
    183 		rp->stat, rp->uid, rp->gid, rp->home, rp->cm);
    184 	printf("gids_len = %d", rp->gids.gids_len);
    185 	if (rp->gids.gids_len) {
    186 		gp = rp->gids.gids_val;
    187 		for(i = 0; i < rp->gids.gids_len; i++)
    188 			printf(" %u", *gp++);
    189 		printf("\n");
    190 	}
    191 	}
    192 /* free up allocated strings */
    193 	if(rp->cm)
    194 		free(rp->cm);
    195 	if(rp->gids.gids_val)
    196 		free(rp->gids.gids_val);
    197 	if(rp->home)
    198 		free(rp->home);
    199 
    200 	return(0);
    201 }
    202 
    203 test_v2_init(host_name, printer)
    204 char *host_name;
    205 char *printer;
    206 {
    207 v2_pr_init_args a;
    208 v2_pr_init_results *rp;
    209 
    210 	a.system = host_name;
    211 	a.pn = printer;
    212 	a.cm = "-";
    213 	printf("\ninvoking pr_init_2\n");
    214 
    215 	rp = pcnfsd2_pr_init_2(&a, cl2);
    216 
    217 	if(rp == NULL) {
    218 		clnt_perror(cl2, server);
    219 		return(1);
    220 	}
    221 	printf("results: stat = %d, dir = '%s', cm = '%s'\n",
    222 		rp->stat, rp->dir, rp->cm);
    223 	strcpy(spooldirbuff, rp->dir);
    224 /* free up allocated strings */
    225 	if(rp->cm)
    226 		free(rp->cm);
    227 	if(rp->dir)
    228 		free(rp->dir);
    229 	return(0);
    230 }
    231 
    232 
    233 test_v2_start(host_name, printer, user_name, tag1, tag2)
    234 char *host_name;
    235 char *printer;
    236 char *user_name;
    237 char *tag1;
    238 char *tag2;
    239 {
    240 v2_pr_start_args a;
    241 v2_pr_start_results *rp;
    242 FILE *fp;
    243 	printf("\ntesting start print v2\n");
    244 
    245 	if(strcmp(server, "localhost")) {
    246 		printf("sorry - can only test start print on 'localhost'\n");
    247 		return(1);
    248 	}
    249 
    250 	sprintf(filenamebuff, "%s/%s", spooldirbuff, tag1);
    251 
    252 	fp = fopen(filenamebuff, "w");
    253 	if(fp == NULL) {
    254 		perror("creating test file");
    255 		return(1);
    256 	}
    257 	(void)fputs("foo bar bletch\n", fp);
    258 	(void)fclose(fp);
    259 
    260 	a.system = host_name;
    261 	a.pn = printer;
    262 	a.user = user_name;
    263 	a.file = tag2;
    264 	a.opts = "xxxx";
    265 	a.copies = 1;
    266 	a.cm = "-";
    267 
    268 	printf("\ninvoking pr_start_2\n");
    269 
    270 	rp = pcnfsd2_pr_start_2(&a, cl2);
    271 
    272 	if(rp == NULL) {
    273 		clnt_perror(cl2, server);
    274 		return(1);
    275 	}
    276 	printf("results: stat = %d, jobid = '%s', cm = '%s'\n",
    277 		rp->stat, rp->id, rp->cm);
    278 	if(rp->stat == PS_RES_OK)
    279 		strcpy(last_id, rp->id);
    280 /* free up allocated strings */
    281 	if(rp->cm)
    282 		free(rp->cm);
    283 	if(rp->id)
    284 		free(rp->id);
    285 	return(0);
    286 }
    287 
    288 
    289 test_v2_cancel(host_name, printer, user_name, id)
    290 char *host_name;
    291 char *printer;
    292 char *user_name;
    293 char *id;
    294 {
    295 v2_pr_cancel_args a;
    296 v2_pr_cancel_results *rp;
    297 	printf("\ntesting cancel print v2\n");
    298 
    299 	a.system = host_name;
    300 	a.pn = printer;
    301 	a.user = user_name;
    302 	a.id = id;
    303 	a.cm = "-";
    304 
    305 	printf("\ninvoking pr_cancel_2 for job %s on printer %s\n",
    306 		id, printer);
    307 
    308 	rp = pcnfsd2_pr_cancel_2(&a, cl2);
    309 
    310 	if(rp == NULL) {
    311 		clnt_perror(cl2, server);
    312 		return(1);
    313 	}
    314 	printf("results: stat = %d, cm = '%s'\n",
    315 		rp->stat, rp->cm);
    316 /* free up allocated strings */
    317 	if(rp->cm)
    318 		free(rp->cm);
    319 	return(0);
    320 }
    321 test_v2_list()
    322 {
    323 char a;
    324 v2_pr_list_results *rp;
    325 pr_list curr;
    326 
    327 
    328 	printf("\ninvoking pr_list_2\n");
    329 
    330 	rp = pcnfsd2_pr_list_2(&a, cl2);
    331 
    332 	if(rp == NULL) {
    333 		clnt_perror(cl2, server);
    334 		return(1);
    335 	}
    336 	printf("results: cm = '%s', printerlist:\n", rp->cm);
    337 	curr = rp->printers;
    338 	while(curr) {
    339 		printf("  name '%s' ", curr->pn);
    340 		if(strlen(curr->remhost))
    341 			printf("remote: srvr '%s', name '%s'",
    342 				curr->remhost,
    343 				curr->device);
    344 		else
    345 			printf("local device = '%s'", curr->device);
    346 		printf(", cm = '%s'\n", curr->cm);
    347 		curr = curr->pr_next;
    348 	}
    349 	printf("end of list\n");
    350 /* free up allocated strings */
    351 	if(rp->cm)
    352 		free(rp->cm);
    353 	if(rp->printers) {
    354 		printf("freeing results\n");
    355 		free_pr_list_item(rp->printers);
    356 	}
    357 	return(0);
    358 }
    359 
    360 
    361 void
    362 free_pr_list_item(curr)
    363 pr_list curr;
    364 {
    365 	if(curr->pn)
    366 		free(curr->pn);
    367 	if(curr->remhost)
    368 		free(curr->remhost);
    369 	if(curr->device)
    370 		free(curr->device);
    371 	if(curr->cm)
    372 		free(curr->cm);
    373 	if(curr->pr_next)
    374 		free_pr_list_item(curr->pr_next); /* recurse */
    375 	free(curr);
    376 }
    377 
    378 
    379 
    380 test_v2_queue(printer, user_name, private)
    381 char *printer;
    382 char *user_name;
    383 int private;
    384 {
    385 struct v2_pr_queue_args a;
    386 v2_pr_queue_results *rp;
    387 pr_queue curr;
    388 
    389 	a.pn = printer;
    390 	a.system = "foo";
    391 	a.user = user_name;
    392 	a.just_mine = private;
    393 	a.cm = "no";
    394 
    395 	printf("\ninvoking pr_queue_2 (just_mine = %d)\n", private);
    396 
    397 	rp = pcnfsd2_pr_queue_2(&a, cl2);
    398 
    399 	if(rp == NULL) {
    400 		clnt_perror(cl2, server);
    401 		return(1);
    402 	}
    403 	printf("results: stat = %d, qlen = %d, qshown = %d cm = '%s', queue:\n",
    404 		rp->stat, rp->qlen, rp->qshown, rp->cm);
    405 	curr = rp->jobs;
    406 	while(curr) {
    407 		printf("rank = %2d, id = '%s', size = '%s', status = '%s'\n",
    408 			curr->position,
    409 			curr->id,
    410 			curr->size,
    411 			curr->status);
    412 		printf("            user = '%s', file = '%s', cm = '%s'\n",
    413 			curr->user,
    414 			curr->file,
    415 			curr->cm);
    416 		curr = curr->pr_next;
    417 	}
    418 	printf("end of list\n");
    419 /* free up allocated strings */
    420 	if(rp->cm)
    421 		free(rp->cm);
    422 	if(rp->jobs) {
    423 		printf("freeing results\n");
    424 		free_pr_queue_item(rp->jobs);
    425 	}
    426 	return(0);
    427 }
    428 
    429 
    430 
    431 void
    432 free_pr_queue_item(curr)
    433 pr_queue curr;
    434 {
    435 	if(curr->id)
    436 		free(curr->id);
    437 	if(curr->size)
    438 		free(curr->size);
    439 	if(curr->status)
    440 		free(curr->status);
    441 	if(curr->system)
    442 		free(curr->system);
    443 	if(curr->user)
    444 		free(curr->user);
    445 	if(curr->file)
    446 		free(curr->file);
    447 	if(curr->cm)
    448 		free(curr->cm);
    449 	if(curr->pr_next)
    450 		free_pr_queue_item(curr->pr_next); /* recurse */
    451 	free(curr);
    452 }
    453 
    454 
    455 
    456 test_v2_stat(printer)
    457 char *printer;
    458 {
    459 v2_pr_status_args a;
    460 v2_pr_status_results *rp;
    461 
    462 	printf("\ntesting status print v2\n");
    463 
    464 	a.pn = printer;
    465 	a.cm = "-";
    466 
    467 	printf("\ninvoking pr_status_2\n");
    468 
    469 	rp = pcnfsd2_pr_status_2(&a, cl2);
    470 
    471 	if(rp == NULL) {
    472 		clnt_perror(cl2, server);
    473 		return(1);
    474 	}
    475 	printf("results: stat = %d, cm = '%s'\n",
    476 		rp->stat, rp->cm);
    477 	if(rp->stat == PI_RES_OK) {
    478 		printf("avail = %s, ", (rp->avail ? "YES" : "NO"));
    479 		printf("printing = %s, ", (rp->printing ? "YES" : "NO"));
    480 		printf("needs_operator = %s, ", (rp->needs_operator ? "YES" : "NO"));
    481 		printf("qlen = %d, status = '%s'\n", rp->qlen, rp->status);
    482 	}
    483 /* free up allocated strings */
    484 	if(rp->cm)
    485 		free(rp->cm);
    486 	if(rp->status)
    487 		free(rp->status);
    488 	return(0);
    489 }
    490 
    491 struct mapreq_arg_item * make_mapreq_entry(t, i, n, next)
    492 mapreq	t;
    493 int i;
    494 char *n;
    495 struct mapreq_arg_item *next;
    496 {
    497 struct mapreq_arg_item *x;
    498 	x = (struct mapreq_arg_item *)malloc(sizeof(struct mapreq_arg_item));
    499 	if(x == NULL) {
    500 		fprintf(stderr, "out of memory\n");
    501 		exit(123);
    502 	}
    503 	x->req = t;
    504 	x->id = i;
    505 	x->name = (n ? n : "");
    506 	x->mapreq_next = next;
    507 	return(x);
    508 }
    509 
    510 test_v2_map()
    511 {
    512 v2_mapid_args a;
    513 v2_mapid_results *rp;
    514 struct mapreq_res_item *rip;
    515 
    516 	a.cm = "-";
    517 	a.req_list = make_mapreq_entry(MAP_REQ_UID, 906, NULL,
    518 		make_mapreq_entry(MAP_REQ_GID, 1, NULL,
    519 		 make_mapreq_entry(MAP_REQ_UNAME, 0, "root",
    520 		   make_mapreq_entry(MAP_REQ_GNAME, 0, "wheel",
    521 		      make_mapreq_entry(MAP_REQ_UNAME, 0, "bogus", NULL)))));
    522 
    523 	printf("\ninvoking pr_mapid_2\n");
    524 	rp = pcnfsd2_mapid_2(&a, cl2);
    525 
    526 	if(rp == NULL) {
    527 		clnt_perror(cl2, server);
    528 		return(1);
    529 	}
    530 	printf("results: cm = '%s', result list %s\n",
    531 		rp->cm, rp->res_list ? "follows" : "omitted");
    532 	rip = rp->res_list;
    533 	while(rip) {
    534 		printf("request type = %d, status = %d, id = %d, name = '%s'\n",
    535 			rip->req, rip->stat, rip->id,
    536 			(rip->name ? rip->name : "(NULL)"));
    537 		rip = rip->mapreq_next;
    538 	}
    539 /* XXX should free up results */
    540 
    541 
    542 
    543 return(0);
    544 }
    545 
    546 
    547 void
    548 good()
    549 {
    550 printf("\n");
    551 printf("********************************************************\n");
    552 printf("********************************************************\n");
    553 printf("**      The following test is expected to SUCCEED     **\n");
    554 printf("********************************************************\n");
    555 printf("********************************************************\n");
    556 }
    557 
    558 void
    559 bad(reason)
    560 char *reason;
    561 {
    562 printf("\n");
    563 printf("********************************************************\n");
    564 printf("********************************************************\n");
    565 printf("**      The following test is expected to FAIL        **\n");
    566 printf("**                    Reason:                         **\n");
    567 printf("** %50s **\n", reason);
    568 printf("********************************************************\n");
    569 printf("********************************************************\n");
    570 }
    571