⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bb_phase.c

📁 早期freebsd实现
💻 C
字号:
/* ****************************************************************************** * * Module: bb_phase.c * * Functions:  *	    bb_read_phases()	- Read or create the phases file. *	    bb_phase_update()	- Update the phases file on disk. *	    bb_set_phase()	- Add the specified flags to a phase. *	    bb_unset_phase()	- Remove the specified flags from a phase. *	    bb_phase_ok()	- Check if the phase is ok to make changes. * * ****************************************************************************** *//* ****************************************************************************** * Include Files ****************************************************************************** */#include <stdio.h>#include <rpc/rpc.h>#include "common.h"#include "protocol.h"#include "server.h"/***************************************************************************									****  bb_read_phases - If the phases file exists read the entries into 	****  the phases array.  Otherwise create the file with 0'ed entries.	****									***************************************************************************/BB_phase	phases[BB_MAX_IMP];	/* The phases array.		*/intbb_read_phases(){    FILE	*phase_file;		/* Pointer to the phase file.	*/    int		i = 0;			/* Index into phase array.	*/    int		num_imps;		/* The number of implementations*/    char	line[BB_MAX_LINE_LEN];	/* Space for the input line.	*/    num_imps = bb_get_imp_cnt();    /*    **  If the file exists read it into the phase array.    */    if ( (phase_file = fopen( BB_PHASE_FILE, "r")) != NULL )    {	for ( i = 0; i < num_imps; i++ )	{	    if ( (phases[i] = getw( phase_file)) == (u_char)EOF )	    {		fprintf( stderr, "ERROR: Phase data file incomplete.\n");		return BB_FAILURE;	    }	}	fclose( phase_file);	return BB_SUCCESS;    }    /*    **  The file did not exist so create it.    */    if ( (phase_file = fopen( BB_PHASE_FILE, "w")) == NULL )    {	fprintf( stderr, "FAILED opening the phase data file '%s'.\n",		 BB_PHASE_FILE);	fclose( phase_file);	return BB_FAILURE;    }    /*    **  Fill the file with zeroed phases.    */    for( i = 0; i < num_imps; i++ )    {	if ( putw( (int)BB_BOARD_UNSET, phase_file) == 1 )	{	    fprintf( stderr, "FAILED writting new phase file.\n");	    fclose( phase_file);	    return BB_FAILURE;	}    }    fclose( phase_file);    return BB_SUCCESS;}/***************************************************************************									****  bb_phase_update() - The phase of the client has changed and should	****  be written to disk.  						****									***************************************************************************/intbb_phase_update( client)  int		client;		/* The client with the change of phase.	*/{    int		num_imps;	/* The number of implementations.	*/    FILE	*phase_file;	/* Pointer to the phase file.		*/    long	seek_to;	/* The position to seek to in the file.	*/    num_imps = bb_get_imp_cnt();    if ( client >= num_imps )     {	return BB_FAILURE;    }    /*    **  The word that we want to write is at the location client    **  integers into the file.  Take the client index and multiply    **  that by the size of the integer and that is the offset.    */    seek_to = client * sizeof(int);    /*    **  Open the phase file.    */    if ( (phase_file = fopen( BB_PHASE_FILE, "r+")) == NULL )    {	fprintf( stderr, "ERROR: Could not open phase file for update.\n");	return BB_FAILURE;    }    if ( fseek( phase_file, seek_to, 0) != 0 )    {	fprintf( stderr, "ERROR: Could not seek in phase file.\n");	fclose( phase_file);	return BB_FAILURE;    }    if ( putw( (int)phases[client], phase_file) == 1 )    {	fprintf( stderr, "ERROR: Could not update phase file.\n");	fclose( phase_file);	return BB_FAILURE;    }    fclose( phase_file);    return BB_SUCCESS;}/***************************************************************************									****  bb_set_phase() - Change the phase of a client.  This adds the	****  flags specified to the phase in the phase list.			****									***************************************************************************/intbb_set_phase( client, phase)  BB_id		client;		/* The name of the client to change.	*/  int		phase;		/* The phase to add to the client.	*/{    int		client_id;	/* The index of the client.		*/    /*    **  Get the client's id.    */    if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )    {	return BB_BAD_CLIENT;    }    /*    **  Or the bits together to turn them on.  The bits are saying OOO WEEE.    */    phases[client_id] |= phase;        /*    **  If the phase cannot be written to disk, return an error.    */    return bb_phase_update( client_id);}/***************************************************************************									****  bb_unset_phase() - Change the phase of a client.  This deletes the	****  flags specified from the phase in the phase list.			****									***************************************************************************/intbb_unset_phase( client, phase)  BB_id		client;		/* The name of the client to change.	*/  int		phase;		/* The phase to add to the client.	*/{    int		client_id;	/* The index of the client.		*/    /*    **  Get the client's id.    */    if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )    {	return BB_BAD_CLIENT;    }    /*    **  Or the bits together to turn them on.  The bits are saying OOO WEEE.    */    phases[client_id] &= ~phase;        /*    **  If the phase cannot be written to disk, return an error.    */    return bb_phase_update( client_id);}/***************************************************************************									****  bb_phase_ok() - Check to see if the phase is ok for the change to	****  the board that will be made.					****									***************************************************************************/intbb_phase_ok( client)  BB_id		client;		/* The client identifier.		*/{    int		client_id;	/* The index of the client.		*/    /*    **  Get the client's id.    */    if ( (client_id = bb_get_hash( client)) == BB_HASH_ID_NOT_FOUND )    {	return BB_BAD_CLIENT;    }    if ( phases[client_id] & BB_SUN_PHASE )	return BB_SUCCESS;    else	return BB_FAILURE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -