|
|
1.1 ! root 1: /* ! 2: ****************************************************************************** ! 3: * ! 4: * Module: bb_board.c ! 5: * ! 6: * Description: ! 7: * ! 8: * Functions: ! 9: * bb_read_board() - Read or create the board data file. ! 10: * bb_board_tag() - Change an entry in the board. ! 11: * bb_get_clients() - Return a list of clients. ! 12: * bb_get_servers() - Return a list of servers. ! 13: * bb_board_update() - Update the board file on disk. ! 14: * ! 15: * ! 16: ****************************************************************************** ! 17: */ ! 18: ! 19: /* ! 20: ****************************************************************************** ! 21: * Include Files ! 22: ****************************************************************************** ! 23: */ ! 24: #include <stdio.h> ! 25: #include <rpc/rpc.h> ! 26: #include "common.h" ! 27: #include "protocol.h" ! 28: #include "server.h" ! 29: ! 30: ! 31: ! 32: /************************************************************************* ! 33: ** ** ! 34: ** bb_read_board() - If the board data file exists then read it and ** ! 35: ** store it in the board array. Otherwise create the file with zeroed ** ! 36: ** entries. ** ! 37: ** ** ! 38: *************************************************************************/ ! 39: BB_board board; /* The board of tested imps. */ ! 40: ! 41: int ! 42: bb_read_board() ! 43: { ! 44: FILE *board_file; /* Pointer to the board file. */ ! 45: int i; /* Index into board array. */ ! 46: int j; /* Index into board array. */ ! 47: int num_imps; /* The number of implementations*/ ! 48: ! 49: num_imps = bb_get_imp_cnt(); ! 50: ! 51: /* ! 52: ** If the file exists read it into the board array. ! 53: */ ! 54: if ( (board_file = fopen( BB_BOARD_FILE, "r")) != NULL ) ! 55: { ! 56: for ( i = 0; i < num_imps; i++ ) ! 57: { ! 58: for ( j = 0; j < num_imps; j++ ) ! 59: { ! 60: if ( (board[i][j] = getw( board_file)) == (u_char)EOF ) ! 61: { ! 62: fprintf( stderr, "ERROR: Board data file incomplete.\n"); ! 63: return BB_FAILURE; ! 64: } ! 65: } ! 66: } ! 67: ! 68: fclose( board_file); ! 69: return BB_SUCCESS; ! 70: } ! 71: ! 72: /* ! 73: ** The file did not exist so create it. ! 74: */ ! 75: if ( (board_file = fopen( BB_BOARD_FILE, "w")) == NULL ) ! 76: { ! 77: fprintf( stderr, "FAILED opening the board data file '%s'.\n", ! 78: BB_BOARD_FILE); ! 79: fclose( board_file); ! 80: return BB_FAILURE; ! 81: } ! 82: ! 83: /* ! 84: ** Fill the file with zeroed entries. ! 85: */ ! 86: for ( i = 0; i < num_imps; i++ ) ! 87: { ! 88: for ( j = 0; j < num_imps; j++ ) ! 89: { ! 90: if ( putw( (int)BB_BOARD_UNSET, board_file) == 1 ) ! 91: { ! 92: fprintf( stderr, "FAILED writting new board file.\n"); ! 93: fclose( board_file); ! 94: return BB_FAILURE; ! 95: } ! 96: } ! 97: } ! 98: ! 99: fclose( board_file); ! 100: return BB_SUCCESS; ! 101: } ! 102: ! 103: ! 104: ! 105: ! 106: /************************************************************************* ! 107: ** ** ! 108: ** bb_board_tag() - Change the value of the board slot to either set it ** ! 109: ** or unset it. Struct p_in contains a BB_id the client and the server.** ! 110: ** The p_out struct contains most of the company data. ** ! 111: ** ** ! 112: *************************************************************************/ ! 113: void ! 114: bb_board_tag( p_in, p_out, set) ! 115: BB_set_in *p_in; /* Set input, client id, server id. */ ! 116: BB_set_out *p_out; /* Set output, most company data. */ ! 117: int set; ! 118: { ! 119: int client_id; /* The client identifier. */ ! 120: int server_id; /* The server identifier. */ ! 121: BB_co_data codata; /* The company data. */ ! 122: ! 123: /* ! 124: ** Get the client and server id's. ! 125: */ ! 126: if ( (client_id = bb_get_hash( p_in->client)) == BB_HASH_ID_NOT_FOUND ) ! 127: { ! 128: p_out->status = BB_BAD_CLIENT; ! 129: return; ! 130: } ! 131: ! 132: if ( (server_id = bb_get_hash( p_in->server)) == BB_HASH_ID_NOT_FOUND ) ! 133: { ! 134: p_out->status = BB_BAD_SERVER; ! 135: return; ! 136: } ! 137: ! 138: if ( set == BB_SET ) ! 139: { ! 140: if ( board[server_id][client_id] == BB_BOARD_SET ) ! 141: { ! 142: p_out->status = BB_ALREADY_SET; ! 143: } ! 144: board[server_id][client_id] = BB_BOARD_SET; ! 145: } ! 146: else if ( set == BB_UNSET ) ! 147: { ! 148: if ( board[server_id][client_id] == BB_BOARD_UNSET ) ! 149: { ! 150: p_out->status = BB_ALREADY_UNSET; ! 151: } ! 152: board[server_id][client_id] = BB_BOARD_UNSET; ! 153: } ! 154: else ! 155: { ! 156: fprintf( stderr, "Unknown set operation.\n"); ! 157: p_out->status = BB_FAILURE; ! 158: return; ! 159: } ! 160: ! 161: /* ! 162: ** Fill in the company data parts of the output structure. ! 163: */ ! 164: if ( bb_get_codata( client_id, &codata) != BB_SUCCESS ) ! 165: { ! 166: /* OOOPS...this wasn't supposed to happen! */ ! 167: p_out->status = BB_FAILURE; ! 168: return; ! 169: } ! 170: p_out->client.booth = codata.booth; ! 171: strncpy( p_out->client.company, codata.company, BB_COMPANY_NAME_LEN); ! 172: strncpy( p_out->client.imp, codata.imp, BB_IMP_NAME_LEN); ! 173: strncpy( p_out->client.id, codata.id, BB_ID_NAME_LEN); ! 174: if ( bb_get_codata( server_id, &codata) != BB_SUCCESS ) ! 175: { ! 176: /* OOOPS...this wasn't supposed to happen! */ ! 177: p_out->status = BB_FAILURE; ! 178: return; ! 179: } ! 180: p_out->server.booth = codata.booth; ! 181: strncpy( p_out->server.company, codata.company, BB_COMPANY_NAME_LEN); ! 182: strncpy( p_out->server.imp, codata.imp, BB_IMP_NAME_LEN); ! 183: strncpy( p_out->server.id, codata.id, BB_ID_NAME_LEN); ! 184: ! 185: /* ! 186: ** Set the status to indicate whether or not the write to disk ! 187: ** succeeded otherwise use the previously set status. ! 188: */ ! 189: if ( bb_board_update( client_id, server_id) != BB_SUCCESS ) ! 190: { ! 191: p_out->status = BB_FAILURE; ! 192: } ! 193: } ! 194: ! 195: ! 196: ! 197: /************************************************************************* ! 198: ** ** ! 199: ** bb_get_clients() - Get the list of all the clients and their test ** ! 200: ** status for a particular server. ** ! 201: ** ** ! 202: *************************************************************************/ ! 203: int ! 204: bb_get_clients( id, list) ! 205: BB_id id; /* Id of the client. */ ! 206: BB_row list; /* List of all the servers. */ ! 207: { ! 208: int index; /* Index of the client. */ ! 209: ! 210: if ( (index = bb_get_hash( id)) == BB_HASH_ID_NOT_FOUND ) ! 211: { ! 212: return BB_BAD_CLIENT; ! 213: } ! 214: ! 215: memcpy( list, board[index], sizeof( list)); ! 216: return BB_SUCCESS; ! 217: } ! 218: ! 219: ! 220: ! 221: /************************************************************************* ! 222: ** ** ! 223: ** bb_get_servers() - Get the list of all the servers and their test ** ! 224: ** status for a particular client. ** ! 225: ** ** ! 226: *************************************************************************/ ! 227: int ! 228: bb_get_servers( id, list) ! 229: BB_id id; /* Id of the client. */ ! 230: BB_row list; /* List of all the servers. */ ! 231: { ! 232: int index; /* Index of the client. */ ! 233: int i; /* Nice loop variable name. */ ! 234: ! 235: if ( (index = bb_get_hash( id)) == BB_HASH_ID_NOT_FOUND ) ! 236: { ! 237: return BB_BAD_CLIENT; ! 238: } ! 239: ! 240: for( i = 0; i < BB_MAX_IMP; i++ ) ! 241: { ! 242: list[i] = board[i][index]; ! 243: } ! 244: ! 245: return BB_SUCCESS; ! 246: } ! 247: ! 248: ! 249: /************************************************************************* ! 250: ** ** ! 251: ** bb_board_update() - Update the billboard on the disk. Since these ** ! 252: ** only happen one at a time, update is for client,server pair. ** ! 253: ** ** ! 254: *************************************************************************/ ! 255: int ! 256: bb_board_update( client, server) ! 257: int client; /* The index of the client to update. */ ! 258: int server; /* The index of the server to update. */ ! 259: { ! 260: int num_imps; /* The number of implementations. */ ! 261: FILE *board_file; /* Pointer to the board file. */ ! 262: long seek_to; /* The position to seek to in the file. */ ! 263: ! 264: num_imps = bb_get_imp_cnt(); ! 265: ! 266: if ( (client >= num_imps) || (server >= num_imps) ) ! 267: { ! 268: return BB_FAILURE; ! 269: } ! 270: ! 271: /* ! 272: ** The word that we want to write is at a location server rows ! 273: ** down and client rows across. Since the output is written in ! 274: ** integers, multiply this number by the sizeof an integer and ! 275: ** that is where in the file to write the number. ! 276: */ ! 277: seek_to = ((server * num_imps) + client) * sizeof(int); ! 278: ! 279: /* ! 280: ** Open the board file. ! 281: */ ! 282: if ( (board_file = fopen( BB_BOARD_FILE, "r+")) == NULL ) ! 283: { ! 284: fprintf( stderr, "ERROR: Could not open board file for update.\n"); ! 285: return BB_FAILURE; ! 286: } ! 287: ! 288: if ( fseek( board_file, seek_to, 0) != 0 ) ! 289: { ! 290: fprintf( stderr, "ERROR: Could not seek in board file.\n"); ! 291: fclose( board_file); ! 292: return BB_FAILURE; ! 293: } ! 294: ! 295: if ( putw( (int)board[server][client], board_file) == 1 ) ! 296: { ! 297: fprintf( stderr, "ERROR: Could not update board file.\n"); ! 298: fclose( board_file); ! 299: return BB_FAILURE; ! 300: } ! 301: ! 302: fclose( board_file); ! 303: return BB_SUCCESS; ! 304: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.