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

1.1     ! root        1: /*
        !             2:  ******************************************************************************
        !             3:  *
        !             4:  * Module: bb_passwd.c
        !             5:  *
        !             6:  * Functions: 
        !             7:  *         bb_read_passwords() - Read or create the password file.
        !             8:  *         bb_check_passwd()   - Check a password against the passwd list.
        !             9:  *         bb_passwd_set_1()   - Set a password in the passwd list.
        !            10:  *         bb_passwd_update()  - Update the password list on disk.
        !            11:  *
        !            12:  *
        !            13:  ******************************************************************************
        !            14:  */
        !            15: 
        !            16: /*
        !            17:  ******************************************************************************
        !            18:  * Include Files
        !            19:  ******************************************************************************
        !            20:  */
        !            21: #include <stdio.h>
        !            22: #include <rpc/rpc.h>
        !            23: #include "common.h"
        !            24: #include "protocol.h"
        !            25: #include "server.h"
        !            26: 
        !            27: 
        !            28: /*************************************************************************
        !            29: **                                                                     **
        !            30: **  bb_read_passwords() - If the password file exists read it and store        **
        !            31: **  each line in the password array.  If it does not exist then create **
        !            32: **  it and fill in a blank entry for each implementation.              **
        !            33: **                                                                     **
        !            34: *************************************************************************/
        !            35: BB_passwd      passwds[BB_MAX_IMP];    /* The password array.          */
        !            36: 
        !            37: int
        !            38: bb_read_passwords()
        !            39: {
        !            40:     FILE       *passwd_file;           /* Pointer to the passwd file.  */
        !            41:     int                i = 0;                  /* Index into passwd array.     */
        !            42:     int                num_imps;               /* The number of implementations*/
        !            43:     BB_passwd  empty_pass;             /* An empty password record.    */
        !            44: 
        !            45:     num_imps = bb_get_imp_cnt();
        !            46: 
        !            47:     /*
        !            48:     **  If the file exists read it into the password array.
        !            49:     */
        !            50:     if ( (passwd_file = fopen( BB_PASSWD_FILE, "r")) != NULL )
        !            51:     {
        !            52:        while ( fread( passwds[i], BB_PASSWD_LEN, 1, passwd_file) != 0 )
        !            53:        {
        !            54:            passwds[i][BB_PASSWD_LEN-1] = NULL;
        !            55:            i++;
        !            56:            if ( i > num_imps )
        !            57:            {
        !            58:                fprintf( stderr, "ERROR: Too many passwords in file.\n");
        !            59:                fclose( passwd_file);
        !            60:                return BB_FAILURE;
        !            61:            }
        !            62:        }
        !            63: 
        !            64:        fclose( passwd_file);
        !            65:        return BB_SUCCESS;
        !            66:     }
        !            67: 
        !            68:     /*
        !            69:     **  The file did not exist so create it.
        !            70:     */
        !            71:     if ( (passwd_file = fopen( BB_PASSWD_FILE, "w")) == NULL )
        !            72:     {
        !            73:        fprintf( stderr, "FAILED opening the password data file '%s'.\n",
        !            74:                 BB_PASSWD_FILE);
        !            75:        fclose( passwd_file);
        !            76:        return BB_FAILURE;
        !            77:     }
        !            78: 
        !            79:     /*
        !            80:     **  Fill the file with empty passwords.
        !            81:     */
        !            82:     memset( empty_pass, NUL, BB_PASSWD_LEN);
        !            83:     for( i = 0; i < num_imps; i++ )
        !            84:     {
        !            85:        if ( fwrite( empty_pass, BB_PASSWD_LEN, 1, passwd_file) != 1 )
        !            86:        {
        !            87:            fprintf( stderr, "ERROR: Could not create password file.\n");
        !            88:            fclose( passwd_file);
        !            89:            return BB_FAILURE;
        !            90:        }
        !            91:        memset( passwds[i], NUL, BB_PASSWD_LEN);
        !            92:     }
        !            93: 
        !            94:     fclose( passwd_file);
        !            95:     return BB_SUCCESS;
        !            96: }
        !            97: 
        !            98: 
        !            99: 
        !           100: /*************************************************************************
        !           101: **                                                                     **
        !           102: **  bb_check_passwd() - Check to see if the password matches the id.   **
        !           103: **                                                                     **
        !           104: *************************************************************************/
        !           105: int
        !           106: bb_check_passwd( id, passwd)
        !           107:   BB_id                id;             /* The identifier of the passwd owner.  */
        !           108:   BB_passwd    passwd;         /* The password to verify.              */
        !           109: {
        !           110:     int                index;          /* The index of the identifier.         */
        !           111: 
        !           112:     if ( (index = bb_get_hash( id)) == BB_HASH_ID_NOT_FOUND )
        !           113:     {
        !           114:        return BB_BAD_CLIENT;
        !           115:     }
        !           116: 
        !           117:     /*
        !           118:     **  If no password exists return success.
        !           119:     */
        !           120:     if ( passwds[index][0] == NUL )
        !           121:        return BB_SUCCESS;
        !           122: 
        !           123:     if ( strncmp( passwd, passwds[index], BB_PASSWD_LEN) != 0 )
        !           124:     {
        !           125:        return BB_BAD_PASSWD;
        !           126:     }
        !           127: 
        !           128:     return BB_SUCCESS;
        !           129: }
        !           130: 
        !           131: 
        !           132: 
        !           133: /*************************************************************************
        !           134: **                                                                     **
        !           135: **  bb_passwd_set_1() - Set the password for the client in the database.**
        !           136: **  check to make sure the old password is correct first.              **
        !           137: **                                                                     **
        !           138: *************************************************************************/
        !           139: int *
        !           140: bb_passwd_set_1( p_passwd)
        !           141:   BB_passwd_in *p_passwd;      /* The passwd_in structure.             */
        !           142: {
        !           143:     static int result;         /* The result of the set operation.     */
        !           144:     int                index;          /* The index of the identifier.         */
        !           145: 
        !           146:     /*
        !           147:     **  bb_check_passwd() returns the reason for failure, so use that
        !           148:     **  as the result of this function call.
        !           149:     */
        !           150:     if ( (result = bb_check_passwd( p_passwd->client, p_passwd->old))
        !           151:         != BB_SUCCESS )
        !           152:     {
        !           153:        return &result;
        !           154:     }
        !           155: 
        !           156:     if ( (index = bb_get_hash( p_passwd->client)) == BB_HASH_ID_NOT_FOUND )
        !           157:     {
        !           158:        result = BB_BAD_CLIENT;
        !           159:        return &result;
        !           160:     }
        !           161: 
        !           162:     /*
        !           163:     **  Copy the password to the data structure and update the data file.
        !           164:     */
        !           165:     strncpy( passwds[index], p_passwd->new, BB_PASSWD_LEN);
        !           166:     result = bb_passwd_update( index);
        !           167:     return &result;
        !           168: }
        !           169: 
        !           170: 
        !           171: 
        !           172: /*************************************************************************
        !           173: **                                                                     **
        !           174: **  bb_passwd_update() - Write the password which has changed out to   **
        !           175: **  password data file.                                                        **
        !           176: **                                                                     **
        !           177: *************************************************************************/
        !           178: int
        !           179: bb_passwd_update( index)
        !           180:   int          index;          /* The index of the changed password.   */
        !           181: {
        !           182:     int                num_imps;       /* The number of implementations.       */
        !           183:     FILE       *passwd_file;   /* Pointer to the passwd file.          */
        !           184:     long       seek_to;        /* The position to seek to in the file. */
        !           185: 
        !           186:     num_imps = bb_get_imp_cnt();
        !           187: 
        !           188:     if ( index >= num_imps ) 
        !           189:     {
        !           190:        return BB_FAILURE;
        !           191:     }
        !           192: 
        !           193:     /*
        !           194:     **  The password that we want to write is at location index
        !           195:     **  passwords into the file.  Multiply index by the size of
        !           196:     **  a password and that is the offset.
        !           197:     */
        !           198:     seek_to = index * BB_PASSWD_LEN;
        !           199: 
        !           200:     /*
        !           201:     **  Open the password file.
        !           202:     */
        !           203:     if ( (passwd_file = fopen( BB_PASSWD_FILE, "r+")) == NULL )
        !           204:     {
        !           205:        fprintf( stderr, "ERROR: Could not open password file for update.\n");
        !           206:        return BB_FAILURE;
        !           207:     }
        !           208: 
        !           209:     if ( fseek( passwd_file, seek_to, 0) != 0 )
        !           210:     {
        !           211:        fprintf( stderr, "ERROR: Could not seek in password file.\n");
        !           212:        fclose( passwd_file);
        !           213:        return BB_FAILURE;
        !           214:     }
        !           215: 
        !           216:     if ( fwrite( passwds[index], BB_PASSWD_LEN, 1, passwd_file) != 1 )
        !           217:     {
        !           218:        fprintf( stderr, "ERROR: Could not update password file.\n");
        !           219:        fclose( passwd_file);
        !           220:        return BB_FAILURE;
        !           221:     }
        !           222: 
        !           223:     fclose( passwd_file);
        !           224:     return BB_SUCCESS;
        !           225: }

unix.superglobalmegacorp.com

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