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

1.1     ! root        1: /*
        !             2:  ******************************************************************************
        !             3:  *
        !             4:  * Module: bb_phase.c
        !             5:  *
        !             6:  * Functions: 
        !             7:  *         bb_read_phases()    - Read or create the phases file.
        !             8:  *         bb_phase_update()   - Update the phases file on disk.
        !             9:  *         bb_set_phase()      - Add the specified flags to a phase.
        !            10:  *         bb_unset_phase()    - Remove the specified flags from a phase.
        !            11:  *         bb_phase_ok()       - Check if the phase is ok to make changes.
        !            12:  *
        !            13:  *
        !            14:  ******************************************************************************
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  ******************************************************************************
        !            19:  * Include Files
        !            20:  ******************************************************************************
        !            21:  */
        !            22: #include <stdio.h>
        !            23: #include <rpc/rpc.h>
        !            24: #include "common.h"
        !            25: #include "protocol.h"
        !            26: #include "server.h"
        !            27: 
        !            28: 
        !            29: /*************************************************************************
        !            30: **                                                                     **
        !            31: **  bb_read_phases - If the phases file exists read the entries into   **
        !            32: **  the phases array.  Otherwise create the file with 0'ed entries.    **
        !            33: **                                                                     **
        !            34: *************************************************************************/
        !            35: BB_phase       phases[BB_MAX_IMP];     /* The phases array.            */
        !            36: 
        !            37: int
        !            38: bb_read_phases()
        !            39: {
        !            40:     FILE       *phase_file;            /* Pointer to the phase file.   */
        !            41:     int                i = 0;                  /* Index into phase array.      */
        !            42:     int                num_imps;               /* The number of implementations*/
        !            43:     char       line[BB_MAX_LINE_LEN];  /* Space for the input line.    */
        !            44: 
        !            45:     num_imps = bb_get_imp_cnt();
        !            46: 
        !            47:     /*
        !            48:     **  If the file exists read it into the phase array.
        !            49:     */
        !            50:     if ( (phase_file = fopen( BB_PHASE_FILE, "r")) != NULL )
        !            51:     {
        !            52:        for ( i = 0; i < num_imps; i++ )
        !            53:        {
        !            54:            if ( (phases[i] = getw( phase_file)) == (u_char)EOF )
        !            55:            {
        !            56:                fprintf( stderr, "ERROR: Phase data file incomplete.\n");
        !            57:                return BB_FAILURE;
        !            58:            }
        !            59:        }
        !            60: 
        !            61:        fclose( phase_file);
        !            62:        return BB_SUCCESS;
        !            63:     }
        !            64: 
        !            65:     /*
        !            66:     **  The file did not exist so create it.
        !            67:     */
        !            68:     if ( (phase_file = fopen( BB_PHASE_FILE, "w")) == NULL )
        !            69:     {
        !            70:        fprintf( stderr, "FAILED opening the phase data file '%s'.\n",
        !            71:                 BB_PHASE_FILE);
        !            72:        fclose( phase_file);
        !            73:        return BB_FAILURE;
        !            74:     }
        !            75: 
        !            76:     /*
        !            77:     **  Fill the file with zeroed phases.
        !            78:     */
        !            79:     for( i = 0; i < num_imps; i++ )
        !            80:     {
        !            81:        if ( putw( (int)BB_BOARD_UNSET, phase_file) == 1 )
        !            82:        {
        !            83:            fprintf( stderr, "FAILED writting new phase file.\n");
        !            84:            fclose( phase_file);
        !            85:            return BB_FAILURE;
        !            86:        }
        !            87:     }
        !            88: 
        !            89:     fclose( phase_file);
        !            90:     return BB_SUCCESS;
        !            91: }
        !            92: 
        !            93: 
        !            94: 
        !            95: /*************************************************************************
        !            96: **                                                                     **
        !            97: **  bb_phase_update() - The phase of the client has changed and should **
        !            98: **  be written to disk.                                                **
        !            99: **                                                                     **
        !           100: *************************************************************************/
        !           101: int
        !           102: bb_phase_update( client)
        !           103:   int          client;         /* The client with the change of phase. */
        !           104: {
        !           105:     int                num_imps;       /* The number of implementations.       */
        !           106:     FILE       *phase_file;    /* Pointer to the phase file.           */
        !           107:     long       seek_to;        /* The position to seek to in the file. */
        !           108: 
        !           109:     num_imps = bb_get_imp_cnt();
        !           110: 
        !           111:     if ( client >= num_imps ) 
        !           112:     {
        !           113:        return BB_FAILURE;
        !           114:     }
        !           115: 
        !           116:     /*
        !           117:     **  The word that we want to write is at the location client
        !           118:     **  integers into the file.  Take the client index and multiply
        !           119:     **  that by the size of the integer and that is the offset.
        !           120:     */
        !           121:     seek_to = client * sizeof(int);
        !           122: 
        !           123:     /*
        !           124:     **  Open the phase file.
        !           125:     */
        !           126:     if ( (phase_file = fopen( BB_PHASE_FILE, "r+")) == NULL )
        !           127:     {
        !           128:        fprintf( stderr, "ERROR: Could not open phase file for update.\n");
        !           129:        return BB_FAILURE;
        !           130:     }
        !           131: 
        !           132:     if ( fseek( phase_file, seek_to, 0) != 0 )
        !           133:     {
        !           134:        fprintf( stderr, "ERROR: Could not seek in phase file.\n");
        !           135:        fclose( phase_file);
        !           136:        return BB_FAILURE;
        !           137:     }
        !           138: 
        !           139:     if ( putw( (int)phases[client], phase_file) == 1 )
        !           140:     {
        !           141:        fprintf( stderr, "ERROR: Could not update phase file.\n");
        !           142:        fclose( phase_file);
        !           143:        return BB_FAILURE;
        !           144:     }
        !           145: 
        !           146:     fclose( phase_file);
        !           147:     return BB_SUCCESS;
        !           148: }
        !           149: 
        !           150: 
        !           151: /*************************************************************************
        !           152: **                                                                     **
        !           153: **  bb_set_phase() - Change the phase of a client.  This adds the      **
        !           154: **  flags specified to the phase in the phase list.                    **
        !           155: **                                                                     **
        !           156: *************************************************************************/
        !           157: int
        !           158: bb_set_phase( client, phase)
        !           159:   BB_id                client;         /* The name of the client to change.    */
        !           160:   int          phase;          /* The phase to add to the client.      */
        !           161: {
        !           162:     int                client_id;      /* The index of the client.             */
        !           163: 
        !           164:     /*
        !           165:     **  Get the client's id.
        !           166:     */
        !           167:     if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )
        !           168:     {
        !           169:        return BB_BAD_CLIENT;
        !           170:     }
        !           171: 
        !           172:     /*
        !           173:     **  Or the bits together to turn them on.  The bits are saying OOO WEEE.
        !           174:     */
        !           175:     phases[client_id] |= phase;
        !           176:     
        !           177:     /*
        !           178:     **  If the phase cannot be written to disk, return an error.
        !           179:     */
        !           180:     return bb_phase_update( client_id);
        !           181: }
        !           182: 
        !           183: 
        !           184: /*************************************************************************
        !           185: **                                                                     **
        !           186: **  bb_unset_phase() - Change the phase of a client.  This deletes the **
        !           187: **  flags specified from the phase in the phase list.                  **
        !           188: **                                                                     **
        !           189: *************************************************************************/
        !           190: int
        !           191: bb_unset_phase( client, phase)
        !           192:   BB_id                client;         /* The name of the client to change.    */
        !           193:   int          phase;          /* The phase to add to the client.      */
        !           194: {
        !           195:     int                client_id;      /* The index of the client.             */
        !           196: 
        !           197:     /*
        !           198:     **  Get the client's id.
        !           199:     */
        !           200:     if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )
        !           201:     {
        !           202:        return BB_BAD_CLIENT;
        !           203:     }
        !           204: 
        !           205:     /*
        !           206:     **  Or the bits together to turn them on.  The bits are saying OOO WEEE.
        !           207:     */
        !           208:     phases[client_id] &= ~phase;
        !           209:     
        !           210:     /*
        !           211:     **  If the phase cannot be written to disk, return an error.
        !           212:     */
        !           213:     return bb_phase_update( client_id);
        !           214: }
        !           215: 
        !           216: 
        !           217: 
        !           218: /*************************************************************************
        !           219: **                                                                     **
        !           220: **  bb_phase_ok() - Check to see if the phase is ok for the change to  **
        !           221: **  the board that will be made.                                       **
        !           222: **                                                                     **
        !           223: *************************************************************************/
        !           224: int
        !           225: bb_phase_ok( client)
        !           226:   BB_id                client;         /* The client identifier.               */
        !           227: {
        !           228:     int                client_id;      /* The index of the client.             */
        !           229: 
        !           230:     /*
        !           231:     **  Get the client's id.
        !           232:     */
        !           233:     if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )
        !           234:     {
        !           235:        return BB_BAD_CLIENT;
        !           236:     }
        !           237: 
        !           238:     if ( phases[client_id] & BB_SUN_PHASE )
        !           239:        return BB_SUCCESS;
        !           240:     else
        !           241:        return BB_FAILURE;
        !           242: }

unix.superglobalmegacorp.com

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