|
|
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.