|
|
1.1 root 1: /*
2: ******************************************************************************
3: *
4: * Module: billboard_util.c
5: *
6: * Description: billboard_util.c
7: * Routines that handle the works for each feature.
8: *
9: * Functions:
10: * bb_call_set_unset(flag, bb_set_in_p)
11: * bb_set_unset_print_result(flag, bb_set_in_p, bb_set_out_p)
12: * bb_list(flag, bb_list_in_p)
13: * bb_list_print_result(flag, bb_list_in_p, bb_list_out_p)
14: * bb_change_passwd(bb_passwd_in_p)
15: * bb_print_vendor_info(bb_vendor_p)
16: *
17: * Notes:
18: *
19: ******************************************************************************
20: */
21: /*
22: ******************************************************************************
23: * Include Files
24: ******************************************************************************
25: */
26: #include <stdio.h>
27: #include <rpc/rpc.h>
28: #include "common.h"
29: #include "protocol.h"
30:
31: /*
32: ******************************************************************************
33: * Module Local Definitions
34: ******************************************************************************
35: */
36:
37: /*
38: * local copy of password, saved for interactive use of the tool
39: * i.e. the password entered when in interactive mode will be used for the
40: * rest of the interactive session
41: */
42: static BB_passwd _pwbuff;
43:
44: /*
45: ******************************************************************************
46: * External Declarations
47: ******************************************************************************
48: */
49: extern CLIENT *client_handle_p;
50: extern char server_name[];
51: extern char *_bb_salt;
52:
53:
54: /*
55: ******************************************************************************
56: * Function Declarations
57: ******************************************************************************
58: */
59: void bb_set_unset();
60: void bb_lists();
61: void bb_list_print_result();
62: void bb_set_unset_print_result();
63: void bb_change_passwd();
64: void bb_print_vendor_info();
65:
66:
67: /*
68: ******************************************************************************
69: *
70: * Function: bb_call_set_unset
71: *
72: * Description: handles the operation to set test failed/passed
73: * The user request will be sent to the server via RPC,
74: * if password is needed, the user will be prompted for one and
75: * the request will be re-sent.
76: *
77: * Input:
78: * flag -- BB_SET or BB_UNSET
79: * bb_set_in_p -- input bb_set_in structure to RPC call
80: *
81: * Output:
82: *
83: * Returns:
84: *
85: * Side Effects:
86: *
87: * Notes:
88: *
89: ******************************************************************************
90: */
91: void
92: bb_call_set_unset(flag, bb_set_in_p)
93: int flag;
94: BB_set_in *bb_set_in_p;
95: {
96: BB_set_out *bb_set_out_p;
97:
98: /*
99: * initialise the passowrd buffer, and copy exisiting password if
100: * exists
101: */
102: memset(bb_set_in_p->passwd, NUL, BB_PASSWD_LEN);
103: strncpy(bb_set_in_p->passwd, _pwbuff, BB_PASSWD_LEN-1);
104:
105: /*
106: * issue the RPC call
107: */
108: if (flag == BB_SET)
109: bb_set_out_p= (BB_set_out *) bb_call_rpc(bb_set_1, bb_set_in_p);
110: else if (flag == BB_UNSET)
111: bb_set_out_p= (BB_set_out *) bb_call_rpc(bb_unset_1,
112: bb_set_in_p);
113: else
114: return;
115:
116: /*
117: * if NULL is returned, RPC call failed.
118: */
119: if (bb_set_out_p == NULL) {
120: clnt_perror(client_handle_p, server_name);
121: return;
122: }
123:
124: /*
125: * If password is requested, the user is prompted for one and
126: * the request is re-sent
127: */
128: if (bb_set_out_p->status == BB_BAD_PASSWD) {
129: /*
130: * gets password
131: */
132: memset(bb_set_in_p->passwd, NUL, BB_PASSWD_LEN);
133: strncpy(bb_set_in_p->passwd,
134: crypt(getpass("Password:"), _bb_salt), BB_PASSWD_LEN-1);
135: /*
136: * save the password to be re-used if the tool is in
137: * interactive mode
138: */
139: strncpy(_pwbuff, bb_set_in_p->passwd, BB_PASSWD_LEN);
140: if (flag == BB_SET)
141: bb_set_out_p= (BB_set_out *) bb_call_rpc(bb_set_1,
142: bb_set_in_p);
143: else
144: bb_set_out_p= (BB_set_out *) bb_call_rpc(bb_unset_1,
145: bb_set_in_p);
146:
147: if (bb_set_out_p == NULL) {
148: clnt_perror(client_handle_p, server_name);
149: return;
150: }
151:
152: bb_set_unset_print_result(flag, bb_set_in_p, bb_set_out_p);
153: } else
154: bb_set_unset_print_result(flag, bb_set_in_p, bb_set_out_p);
155:
156: return;
157: }
158:
159:
160: /*
161: ******************************************************************************
162: *
163: * Function: bb_set_unset_print_result
164: *
165: * Description: print the result of RPC call for set unset of tests
166: *
167: * Input:
168: * flag: BB_SET or BB_UNSET
169: * bb_set_in_p: input bb_set_in structure to RPC call
170: * bb_set_out_p: RPC returned bb_set_out structure
171: *
172: * Output:
173: * Output goes to stdout, error goes to stderr.
174: *
175: * Returns:
176: *
177: * Side Effects:
178: *
179: * Notes:
180: *
181: ******************************************************************************
182: */
183: void
184: bb_set_unset_print_result(flag, bb_set_in_p, bb_set_out_p)
185: int flag;
186: BB_set_in *bb_set_in_p;
187: BB_set_out *bb_set_out_p;
188: {
189:
190: printf("\n");
191: switch (bb_set_out_p->status) {
192: case BB_SUCCESS:
193: if (flag == BB_SET)
194: printf("The following client and server implementation is tested succesfully:\n");
195: else
196: printf("The following client and server implementation is set as being untested:\n");
197: printf("Client:\n");
198: bb_print_vendor_info(&bb_set_out_p->client);
199: printf("Server:\n");
200: bb_print_vendor_info(&bb_set_out_p->server);
201: break;
202: case BB_FAILURE:
203: fprintf(stderr, "Operation failed\.n");
204: break;
205: case BB_BAD_CLIENT:
206: fprintf(stderr, "Bad client identifier: %s.\n",
207: bb_set_in_p->client);
208: break;
209: case BB_BAD_SERVER:
210: fprintf(stderr, "Bad server identifier: %s.\n",
211: bb_set_in_p->server);
212: break;
213: case BB_ALREADY_SET:
214: fprintf(stderr,
215: "Client %s against server %s has already been set as tested.\n",
216: bb_set_in_p->client, bb_set_in_p->server);
217: break;
218: case BB_ALREADY_UNSET:
219: fprintf(stderr,
220: "Client %s against server %s has already been set as untested.\n",
221: bb_set_in_p->client, bb_set_in_p->server);
222: break;
223:
224: case BB_BAD_PASSWD:
225: fprintf(stderr, "Bad password.\n");
226: break;
227:
228: case BB_BAD_PHASE:
229: fprintf(stderr, "You have to complete testing against a Sun server before proceeding.\n");
230: break;
231:
232: default:
233: fprintf(stderr, "Unexpected error code %d.\n",
234: bb_set_out_p->status);
235: break;
236: }
237:
238: return;
239: }
240:
241: /*
242: ******************************************************************************
243: *
244: * Function: bb_list
245: *
246: * Description: calls the RPC procedure, and prompted for password if needed.
247: *
248: * Input:
249: * bb_list_in_p -- input bb_list_in structure to RPC call
250: *
251: * Output:
252: *
253: * Returns:
254: *
255: * Side Effects:
256: *
257: * Notes:
258: *
259: ******************************************************************************
260: */
261: void
262: bb_list(flag, bb_list_in_p)
263: int flag;
264: BB_list_in *bb_list_in_p;
265: {
266: BB_list_out *(*func)();
267: BB_list_out *bb_list_out_p;
268:
269: /*
270: * set the RPC procedure
271: */
272: switch (flag) {
273: case BB_ALIST:
274: func= bb_alist_1;
275: break;
276: case BB_BLIST:
277: func= bb_blist_1;
278: break;
279: case BB_CLIST:
280: func= bb_clist_1;
281: break;
282: case BB_DLIST:
283: func= bb_dlist_1;
284: break;
285: default:
286: return;
287: }
288:
289: /*
290: * initialise the password buffer, and copy existing one if exists
291: */
292: memset(bb_list_in_p->passwd, NUL, BB_PASSWD_LEN);
293: strncpy(bb_list_in_p->passwd, _pwbuff, BB_PASSWD_LEN-1);
294:
295: bb_list_out_p= (BB_list_out *) bb_call_rpc(func, bb_list_in_p);
296: if (bb_list_out_p == NULL) {
297: clnt_perror(client_handle_p, server_name);
298: return;
299: }
300:
301: if (bb_list_out_p->status == BB_BAD_PASSWD) {
302: /*
303: * password is needed, so get one
304: */
305: memset(bb_list_in_p->passwd, NUL, BB_PASSWD_LEN);
306: strncpy(bb_list_in_p->passwd,
307: crypt(getpass("Password:"), _bb_salt), BB_PASSWD_LEN-1);
308: /*
309: * save the password to be re-used if the tool is in
310: * interactive mode
311: */
312: strncpy(_pwbuff, bb_list_in_p->passwd, BB_PASSWD_LEN);
313:
314: /*
315: * issue the RPC call
316: */
317: bb_list_out_p= (BB_list_out *) bb_call_rpc(func, bb_list_in_p);
318: if (bb_list_out_p == NULL) {
319: clnt_perror(client_handle_p, server_name);
320: return;
321: }
322: bb_list_print_result(flag, bb_list_in_p, bb_list_out_p);
323: } else
324: bb_list_print_result(flag, bb_list_in_p, bb_list_out_p);
325:
326: return;
327: }
328:
329: /*
330: ******************************************************************************
331: *
332: * Function: bb_list_print_result
333: *
334: * Description: print result of RPC call to get list of clients or servers.
335: *
336: * Input:
337: * flag -- BB_ALIST, BB_BLIST, BB_CLIST or BB_DLIST
338: * bb_list_in_p -- input bb_list_in structure to RPC call
339: * bb_list_out_p -- RPC returned bb_list_out structure
340: *
341: * Output:
342: * Output goes to stdout, error goes to stderr.
343: *
344: * Returns:
345: *
346: * Side Effects:
347: *
348: * Notes:
349: *
350: ******************************************************************************
351: */
352: void
353: bb_list_print_result(flag, bb_list_in_p, bb_list_out_p)
354: int flag;
355: BB_list_in *bb_list_in_p;
356: BB_list_out *bb_list_out_p;
357: {
358: int i;
359: int data_len;
360: register BB_vendor *vendor_p;
361:
362: printf("\n");
363: switch (bb_list_out_p->status) {
364: case BB_SUCCESS:
365:
366: if ((data_len= bb_list_out_p->data.data_len)
367: > 0) {
368: switch (flag) {
369: case BB_ALIST:
370: printf("List of servers successfully tested against client %s:\n",
371: bb_list_in_p->id);
372: break;
373: case BB_BLIST:
374: printf("List of servers not tested against client %s:\n",
375: bb_list_in_p->id);
376: break;
377: case BB_CLIST:
378: printf("List of clients successfully tested against server %s:\n",
379: bb_list_in_p->id);
380: break;
381: case BB_DLIST:
382: printf("List of clients not tested against server %s:\n",
383: bb_list_in_p->id);
384: break;
385: }
386: vendor_p= bb_list_out_p->data.data_val;
387:
388: for (i= 0; i < data_len; i++) {
389: printf("%d)\n", i+1);
390: bb_print_vendor_info(&vendor_p[i]);
391: }
392: } else {
393: switch (flag) {
394: case BB_ALIST:
395: printf("No servers successfully tested against client %s.\n",
396: bb_list_in_p->id);
397: break;
398: case BB_BLIST:
399: printf("All servers are successfully tested against client %s.\n",
400: bb_list_in_p->id);
401: break;
402: case BB_CLIST:
403: printf("No clients successfully tested against server %s.\n",
404: bb_list_in_p->id);
405: break;
406: case BB_DLIST:
407: printf("All clients are successfully tested against server %s.\n",
408: bb_list_in_p->id);
409: break;
410: }
411: }
412: break;
413: case BB_FAILURE:
414: fprintf(stderr, "Operation failed.\n");
415: break;
416: case BB_BAD_CLIENT:
417: fprintf(stderr, "Bad client identifier: %s.\n",
418: bb_list_in_p->id);
419: break;
420: case BB_BAD_SERVER:
421: fprintf(stderr, "Bad server identifier: %s.\n",
422: bb_list_in_p->id);
423: break;
424: case BB_BAD_PASSWD:
425: fprintf(stderr, "Bad password.\n");
426: break;
427:
428: default:
429: fprintf(stderr, "Unknown error code %d.\n",
430: bb_list_out_p->status);
431: break;
432: }
433:
434: return;
435: }
436:
437:
438: /*
439: ******************************************************************************
440: *
441: * Function: bb_change_passwd
442: *
443: * Description: handles RPC call to change the password. Make the RPC call
444: * and prints the status.
445: *
446: * Input:
447: * bb_passwd_in_p -- input bb_passwd_in structure to RPC call
448: *
449: * Output:
450: * Output goes to stdout, error goes to stderr.
451: *
452: * Returns:
453: *
454: * Side Effects:
455: *
456: * Notes:
457: *
458: ******************************************************************************
459: */
460: void
461: bb_change_passwd(bb_passwd_in_p)
462: BB_passwd_in *bb_passwd_in_p;
463: {
464: int *status_p;
465:
466: /*
467: * issue the RPC call
468: */
469: if ((status_p= (int *)bb_call_rpc(bb_passwd_set_1, bb_passwd_in_p))
470: != NULL) {
471: printf("\n");
472: switch (*status_p) {
473: case BB_SUCCESS:
474: printf("Password changed\n");
475: break;
476: case BB_FAILURE:
477: fprintf(stderr, "Operation failed.\n");
478: break;
479: case BB_BAD_CLIENT:
480: fprintf(stderr, "Bad client identifier: %s.\n",
481: bb_passwd_in_p->client);
482: break;
483: case BB_BAD_PASSWD:
484: fprintf(stderr, "Bad password.\n");
485: break;
486: default:
487: fprintf(stderr, "Unexpected error code %d.\n",
488: *status_p);
489: break;
490: }
491: } else
492: clnt_perror(client_handle_p, server_name);
493:
494: return;
495: }
496:
497: /*
498: ******************************************************************************
499: *
500: * Function: bb_print_vendor_info
501: *
502: * Description: print vendor information from returned RPC call
503: *
504: * Input:
505: * bb_vendor_p -- vendor info
506: *
507: * Output:
508: * prints vendor info on stdout
509: *
510: * Returns:
511: *
512: * Side Effects:
513: *
514: * Notes:
515: *
516: ******************************************************************************
517: */
518: void
519: bb_print_vendor_info(bb_vendor_p)
520: BB_vendor *bb_vendor_p;
521: {
522: printf("\tBooth: %d\n", bb_vendor_p->booth);
523: printf("\tCompany: %s\n", bb_vendor_p->company);
524: printf("\tImplementation: %s\n", bb_vendor_p->imp);
525: printf("\tIdentifier: %s\n\n", bb_vendor_p->id);
526:
527: return;
528: }
529:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.