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