Annotation of 43BSDReno/sys/nfs/TEST/billboard/src/billboard.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  ******************************************************************************
                      3:  *
                      4:  * Module: billboard.c
                      5:  *
                      6:  * Description: billboard.c
                      7:  *             Billboard is an RPC program that handles information about
                      8:  *             testsuites completions.  The module here is the user program
                      9:  *             that communicates with the billboard server.  This program
                     10:  *             allows user to update and modify information maintained
                     11:  *             by the server.  The features supported are (described below
                     12:  *             using the command line options):
                     13:  *             i) -s <client identifier> <server identifier>
                     14:  *                     to set test between <client identifier> and 
                     15:  *                     <server identifier> as successfully tested
                     16:  *             ii) -u <client identifier> <server identifier>
                     17:  *                     to set test between <client identifier> and 
                     18:  *                     <server identifier> as NOT successfully tested
                     19:  *             iii) -a <client identifier>
                     20:  *                     to list server implementations that are successfully
                     21:  *                     tested against client <client identifier>
                     22:  *             iv) -b <client identifier>
                     23:  *                     to list server implementations that are NOT 
                     24:  *                     successfully tested against client <client identifier>
                     25:  *             v) -c <server identifier>
                     26:  *                     to list client implementations that are successfully
                     27:  *                     tested against server <server identifier>
                     28:  *             vi) -d <server identifier>
                     29:  *                     to list client implementations that are NOT 
                     30:  *                     successfully tested against server <server identifier>
                     31:  *             vii) -p <identifier>
                     32:  *                     to change the password of the <identifier> 
                     33:  *                     implementation
                     34:  *                
                     35:  *             where <client identifier> and <server identifier> is
                     36:  *                   identifier of the client and server implementation
                     37:  *                   respectively.
                     38:  *
                     39:  *             This user program also supports interactive interface whereby
                     40:  *             the user is presented with a list of options (same as the 
                     41:  *             features described above) to choose from.  User will be prompted
                     42:  *             for any additional data.
                     43:  *
                     44:  * Functions: 
                     45:  *     main(argc, argv)
                     46:  *     _cmd_line_option(argc, argv)
                     47:  *     _interactive_option()
                     48:  *     _bb_get_passwd(bb_passwd_in_p)
                     49:  *
                     50:  *
                     51:  ******************************************************************************
                     52:  */
                     53: 
                     54: /*
                     55:  ******************************************************************************
                     56:  * Include Files
                     57:  ******************************************************************************
                     58:  */
                     59: #include <stdio.h>
                     60: #include "common.h"
                     61: #include "protocol.h"
                     62: 
                     63: 
                     64: /*
                     65:  ******************************************************************************
                     66:  * Manifest Constants
                     67:  ******************************************************************************
                     68:  */
                     69: #define        _CONTROL_STR_SIZE       5       /* sscanf control string size */
                     70: 
                     71: /*
                     72:  ******************************************************************************
                     73:  * Macro Definitions
                     74:  ******************************************************************************
                     75:  */
                     76: /* print error messages */
                     77: #define        PRINT_ERROR()           {       fprintf(stderr, _Usage, argv[0]);\
                     78:                                        return(1);                      \
                     79:                                }
                     80: 
                     81: 
                     82: /*
                     83:  ******************************************************************************
                     84:  * Module Local Definitions
                     85:  ******************************************************************************
                     86:  */
                     87: /* usage message */
                     88: char   *_Usage=
                     89: "Usage: %s     [-s|-u client_idenitfier server_identifier]\n\
                     90:                [-a|-b client_idenitfier]\n\
                     91:                [-c|-d server_identifier]\n\
                     92:                [-p identifier]\n";
                     93:                        
                     94: /* 
                     95:  *randomly picked salt key for password encryption     
                     96:  * This may be modified if other algorithm is preferred 
                     97:  */
                     98: char   *_bb_salt= "kR";
                     99: 
                    100: /*
                    101:  ******************************************************************************
                    102:  * External Declarations
                    103:  ******************************************************************************
                    104:  */
                    105: extern char    *optarg;
                    106: extern int     optind;
                    107: 
                    108: 
                    109: /*
                    110:  ******************************************************************************
                    111:  * Function Declarations
                    112:  ******************************************************************************
                    113:  */
                    114: int            main();
                    115: static int     _cmd_line_option();
                    116: static void    _interactive_option();
                    117: static int     _bb_get_passwd();
                    118: 
                    119: 
                    120: /*
                    121:  ******************************************************************************
                    122:  *
                    123:  * Function: main
                    124:  *
                    125:  * Description:
                    126:  *     Invokes modules to handle command line interface or 
                    127:  *     interactive according to the user invocation.   
                    128:  *
                    129:  * Input:
                    130:  *     argc
                    131:  *     argv
                    132:  *
                    133:  * Output:
                    134:  *     Output goes to stdout, error goes to stderr.
                    135:  *
                    136:  * Returns:
                    137:  *     1 -- operation failed
                    138:  *     0 -- operation succeeded.
                    139:  *
                    140:  * Side Effects:
                    141:  *
                    142:  * Notes:
                    143:  *
                    144:  ******************************************************************************
                    145:  */
                    146: int
                    147: main(argc, argv)
                    148: int    argc;
                    149: char   *argv[];
                    150: {
                    151:        if (argc > 1)
                    152:                return(_cmd_line_option(argc, argv));
                    153:        else
                    154:                _interactive_option();
                    155: 
                    156:        exit(0);
                    157: }
                    158: 
                    159: /*
                    160:  ******************************************************************************
                    161:  *
                    162:  * Function: _cmd_line_option
                    163:  *
                    164:  * Description:
                    165:  *     Parses command line input and perform the requested
                    166:  *     operation accordingly.                              
                    167:  *
                    168:  * Input:
                    169:  *     argc
                    170:  *     argv
                    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: static int
                    184: _cmd_line_option(argc, argv)
                    185: int    argc;
                    186: char   *argv[];
                    187: {
                    188: int            option;
                    189: BB_set_in      bb_set_in;
                    190: BB_list_in     bb_list_in;
                    191: BB_passwd_in   bb_passwd_in;
                    192: 
                    193:        /* initialise termination of string buffers */
                    194:        bb_set_in.client[BB_ID_NAME_LEN-1]= bb_set_in.server[BB_ID_NAME_LEN-1]
                    195:                                                = '\0';
                    196:        bb_list_in.id[BB_ID_NAME_LEN-1]= '\0';
                    197: 
                    198:        /*
                    199:         * parses the command line input, and make the remote procedure call
                    200:         */
                    201:        if ((option= getopt(argc, argv, "s:u:a:b:c:d:p:")) != -1) {
                    202:                switch (option) {
                    203:                /* 
                    204:                 * gets client and server identifier and
                    205:                 * calls bb_call_set_unset to handle the
                    206:                 * remote procedure call
                    207:                 */
                    208:                case    's':    strncpy(bb_set_in.client, optarg, 
                    209:                                        BB_ID_NAME_LEN-1);
                    210:                                strncpy(bb_set_in.server, argv[optind], 
                    211:                                        BB_ID_NAME_LEN-1);      
                    212:                                bb_call_set_unset(BB_SET, &bb_set_in);
                    213:                                break;
                    214: 
                    215:                case    'u':    strncpy(bb_set_in.client, optarg,
                    216:                                        BB_ID_NAME_LEN-1);
                    217:                                strncpy(bb_set_in.server, argv[optind],
                    218:                                        BB_ID_NAME_LEN-1);      
                    219:                                bb_call_set_unset(BB_UNSET, &bb_set_in);
                    220:                                break;
                    221: 
                    222:                /* 
                    223:                 * gets client or server identifier and
                    224:                 * calls bb_list to handle the remote procedure
                    225:                 * call
                    226:                 */
                    227:                case    'a':    strncpy(bb_list_in.id, optarg,
                    228:                                        BB_ID_NAME_LEN-1);
                    229:                                bb_list(BB_ALIST, &bb_list_in);
                    230:                                break;
                    231: 
                    232:                case    'b':    strncpy(bb_list_in.id, optarg,
                    233:                                        BB_ID_NAME_LEN-1);
                    234:                                bb_list(BB_BLIST, &bb_list_in);
                    235:                                break;
                    236: 
                    237:                case    'c':    strncpy(bb_list_in.id, optarg,
                    238:                                        BB_ID_NAME_LEN-1);
                    239:                                bb_list(BB_CLIST, &bb_list_in);
                    240:                                break;
                    241: 
                    242:                case    'd':    strncpy(bb_list_in.id, optarg,
                    243:                                        BB_ID_NAME_LEN-1);
                    244:                                bb_list(BB_DLIST, &bb_list_in);
                    245:                                break;
                    246: 
                    247:                /* to change password */
                    248:                case    'p':
                    249:                                strncpy(bb_passwd_in.client, optarg,
                    250:                                        BB_ID_NAME_LEN-1);
                    251:                                if (_bb_get_passwd(&bb_passwd_in) == TRUE)
                    252:                                        bb_change_passwd(&bb_passwd_in);
                    253:                                break;
                    254: 
                    255:                case    '?':    PRINT_ERROR();
                    256:                }
                    257: 
                    258:        } else
                    259:                PRINT_ERROR();
                    260: 
                    261:        return(0);
                    262: }
                    263: 
                    264: /*
                    265:  ******************************************************************************
                    266:  *
                    267:  * Function: _interactive_option
                    268:  *
                    269:  * Description:
                    270:  *     Handles the interactive interface.  Promt user for inforamtion and 
                    271:  *     performs the operation selected by the user.
                    272:  *
                    273:  * Input:
                    274:  *
                    275:  * Output:
                    276:  *     Output goes to stdout, error goes to stderr.
                    277:  *
                    278:  * Returns:
                    279:  *
                    280:  * Side Effects:
                    281:  *
                    282:  * Notes:
                    283:  *
                    284:  ******************************************************************************
                    285:  */
                    286: static void    
                    287: _interactive_option()
                    288: {
                    289: int    option= 0;
                    290: BB_id  client_id;
                    291: BB_id  server_id;
                    292: char   buffer[BB_MAX_LINE_LEN];
                    293: char   control_str[_CONTROL_STR_SIZE];
                    294: 
                    295: BB_set_in      bb_set_in;
                    296: BB_list_in     bb_list_in;
                    297: BB_passwd_in   bb_passwd_in;
                    298: 
                    299:        /* terminate the string buffers */
                    300:        bb_set_in.client[BB_ID_NAME_LEN-1]= bb_set_in.server[BB_ID_NAME_LEN-1]
                    301:                                                = '\0';
                    302:        bb_list_in.id[BB_ID_NAME_LEN-1]= '\0';
                    303: 
                    304:        sprintf(control_str, "%%%ds", BB_ID_NAME_LEN-1);
                    305: 
                    306:        /*
                    307:         * requests for user input, and call the remote procedure to
                    308:         * handle the operation
                    309:         */
                    310:        for (;;) {
                    311:                /* print user interface options */
                    312:                printf("\n\
                    313: Options:\n\
                    314: -------:\n\
                    315: 1) set test passed\n\
                    316: 2) set test failed\n\
                    317: 3) list servers successfully tested against\n\
                    318: 4) list servers not tested against\n\
                    319: 5) list clients successfully tested against\n\
                    320: 6) list clients not tested against\n\
                    321: 7) set/change password\n\
                    322: 8) exit\n\n");
                    323: 
                    324:                printf("Enter option: ");
                    325:                gets(buffer);
                    326:                sscanf(buffer, "%d", &option);
                    327:                switch (option) {
                    328:                /* 
                    329:                 * gets client and server identifier and
                    330:                 * calls bb_call_set_unset to handle the
                    331:                 * remote procedure call
                    332:                 */
                    333:                case    1:
                    334:                                printf("Client Identifier: ");
                    335:                                gets(buffer);
                    336:                                sscanf(buffer, control_str, bb_set_in.client);
                    337:                                printf("Server Identifier: ");
                    338:                                gets(buffer);
                    339:                                sscanf(buffer, control_str, bb_set_in.server);
                    340:                                bb_call_set_unset(BB_SET, &bb_set_in);
                    341:                                break;
                    342: 
                    343:                case    2:
                    344:                                printf("Client Identifier: ");
                    345:                                gets(buffer);
                    346:                                sscanf(buffer, control_str, bb_set_in.client);
                    347:                                printf("Server Identifier: ");
                    348:                                gets(buffer);
                    349:                                sscanf(buffer, control_str, bb_set_in.server);
                    350:                                bb_call_set_unset(BB_UNSET, &bb_set_in);
                    351:                                break;
                    352: 
                    353:                /* 
                    354:                 * gets client or server identifier and
                    355:                 * calls bb_list to handle the remote procedure
                    356:                 * call
                    357:                 */
                    358:                case    3:
                    359:                                printf("Client Identifier: ");
                    360:                                gets(buffer);
                    361:                                sscanf(buffer, control_str, bb_list_in.id);
                    362:                                bb_list(BB_ALIST, &bb_list_in);
                    363:                                break;
                    364: 
                    365:                case    4:
                    366:                                printf("Client Identifier: ");
                    367:                                gets(buffer);
                    368:                                sscanf(buffer, control_str, bb_list_in.id);
                    369:                                bb_list(BB_BLIST, &bb_list_in);
                    370:                                break;
                    371: 
                    372:                case    5:
                    373:                                printf("Server Identifier: ");
                    374:                                gets(buffer);
                    375:                                sscanf(buffer, control_str, bb_list_in.id);
                    376:                                bb_list(BB_CLIST, &bb_list_in);
                    377:                                break;
                    378: 
                    379:                case    6:
                    380:                                printf("Server Identifier: ");
                    381:                                gets(buffer);
                    382:                                sscanf(buffer, control_str, bb_list_in.id);
                    383:                                bb_list(BB_DLIST, &bb_list_in);
                    384:                                break;
                    385: 
                    386:                /* to change password */
                    387:                case    7:      
                    388:                                printf("Identifier: ");
                    389:                                gets(buffer);
                    390:                                sscanf(buffer, control_str, bb_passwd_in.client);
                    391:                                if (_bb_get_passwd(&bb_passwd_in) == TRUE)
                    392:                                        bb_change_passwd(&bb_passwd_in);
                    393:                                break;
                    394: 
                    395:                case    8:      return;
                    396: 
                    397:                default:        
                    398:                                printf("invalid option\n\n");
                    399:                                break;
                    400:                }
                    401:        }
                    402: }
                    403: 
                    404: /*
                    405:  ******************************************************************************
                    406:  *
                    407:  * Function: _bb_get_passwd
                    408:  *
                    409:  * Description:
                    410:  *     Prompt for old and new passwords, and verifies the new one.
                    411:  *     Both passwords are then encrypted.
                    412:  *     We use Unix DES with fixed salt key for the password
                    413:  *      encryption for simplicity, you are welcome to use 
                    414:  *      your own algorithms.                              
                    415:  *
                    416:  * Input:
                    417:  *     bb_passwd_in_p -- input structure to RPC call
                    418:  *
                    419:  * Output:
                    420:  *
                    421:  * Returns:
                    422:  *
                    423:  * Side Effects:
                    424:  *
                    425:  * Notes:
                    426:  *
                    427:  ******************************************************************************
                    428:  */
                    429: static bool_t
                    430: _bb_get_passwd(bb_passwd_in_p)
                    431: BB_passwd_in   *bb_passwd_in_p;
                    432: {
                    433: char   buffer[BB_MAX_LINE_LEN];
                    434: 
                    435:        /* initialised password buffers */
                    436:        memset(bb_passwd_in_p->old, NUL, BB_PASSWD_LEN);
                    437:        memset(bb_passwd_in_p->new, NUL, BB_PASSWD_LEN);
                    438:        memset(buffer, NUL, BB_MAX_LINE_LEN);
                    439: 
                    440:        /*
                    441:         * get old and new password, and verify the new password
                    442:         */
                    443:        strncpy(bb_passwd_in_p->old, crypt(getpass("Old password:"), _bb_salt),
                    444:                BB_PASSWD_LEN-1);
                    445:        strcpy(buffer, getpass("New password:"));
                    446:        if (strcmp(buffer, getpass("Retype new password: ")) != 0) {
                    447:                printf("Mismatch - password unchanged.\n");
                    448:                return(FALSE);
                    449:        } else 
                    450:                strncpy(bb_passwd_in_p->new, crypt(buffer, _bb_salt), 
                    451:                        BB_PASSWD_LEN-1);
                    452:        return(TRUE);
                    453: }
                    454: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.