|
|
BSD 4.3reno
/*
******************************************************************************
*
* Module: bb_codata.c
*
* Description:
*
* Functions:
* bb_put_codata() - Place a company data entry in the structure.
* bb_get_codata() - Get a company data entry from the structure.
* bb_get_imp_cnt() - Return the number of implementations.
* bb_read_companies() - Read the company data file.
* bb_read_1_codata() - Read a single company data from the file.
*
*
******************************************************************************
*/
/*
******************************************************************************
* Include Files
******************************************************************************
*/
#include <stdio.h>
#include <rpc/rpc.h>
#include "common.h"
#include "protocol.h"
#include "server.h"
static int co_cnt; /* The number of company data entries. */
static BB_co_data codata[BB_MAX_IMP];/* The company data records. */
void bb_get_ip_lines();
char *strtok();
int
bb_put_codata( p_codata)
BB_co_data *p_codata; /* The company data to put in the table */
{
if ( co_cnt + 1 >= BB_MAX_IMP )
{
fprintf( stderr, "FAILURE can't install company data record: %s.\n",
p_codata->company);
return BB_FAILURE;
}
memcpy( &codata[ co_cnt], p_codata, sizeof( *p_codata));
return co_cnt++;
}
int
bb_get_codata( index, p_codata)
int index; /* The index of the data to retrieve. */
BB_co_data *p_codata; /* Space to put the data. */
{
if ( index >= co_cnt )
{
return BB_FAILURE;
}
memcpy( p_codata, &codata[ index], sizeof( *p_codata));
return BB_SUCCESS;
}
int
bb_get_imp_cnt()
{
return co_cnt;
}
/*************************************************************************
** **
** bb_read_companies() - Read the file containing the company data. **
** For each entry create a company data record, and add an entry in the**
** hash table. The company data file also contains IP addresses, which**
** are stored in the ip_table. **
** **
*************************************************************************/
int
bb_read_companies()
{
int status; /* Status of function call returns. */
int index; /* Index of the company data record. */
BB_co_data cdata; /* Space for the readding of records. */
while( (status = bb_read_1_codata( &cdata)) != BB_END_OF_FILE )
{
/*
** If the read was not successful exit.
*/
if ( status != BB_SUCCESS )
{
fprintf( stderr, "ABORTING: Can't read company data file.\n");
return BB_FAILURE;
}
/*
** Put the company data record in the array.
*/
if ( (index = bb_put_codata( &cdata)) == BB_FAILURE )
{
fprintf( stderr, "ABORTING: Not enough company data space.\n");
return BB_FAILURE;
}
/*
** Fill in the hash record for the company data record.
*/
if ( bb_put_hash( codata[index].id, index) != BB_SUCCESS )
{
fprintf( stderr, "ABORTING: Unable to hash company: %s.\n",
cdata.company);
return BB_FAILURE;
}
}
/*
** Read all of the company data with no problems.
*/
return BB_SUCCESS;
}
/*************************************************************************
** **
** bb_read_1_codata() - Read one company data record from the co data **
** file. If the file is not open then open it and start readding. The **
** file is ordered in the same manner as the BB_co_data structure. IP **
** means a set of internet addresses are on the same line. Each of **
** these addresses belongs to the companies that follow up to the next **
** IP specification. **
** **
*************************************************************************/
static FILE *file = NULL; /* File pointer to company data file. */
int
bb_read_1_codata( p_codata)
BB_co_data *p_codata; /* Output a company data record. */
{
static int ip_count; /* Number of IP addresses for company. */
static int ip_index; /* Place where IP addresses start. */
bool_t done = FALSE; /* Done readding this codata record. */
char line[BB_MAX_LINE_LEN]; /* Input line buffer. */
/*
** If the file is not open then it neads to be.
*/
if ( file == NULL )
{
if ( (file = fopen( BB_CODATA_FILE, "r")) == NULL )
{
fprintf( stderr, "FAILED opening the company data file '%s'.\n",
BB_CODATA_FILE);
return BB_FAILURE;
}
ip_count = ip_index = 0;
}
while ( done != TRUE )
{
do
{
if ( fgets( line, BB_MAX_LINE_LEN, file) == NULL )
{
return BB_END_OF_FILE;
}
}
while ( line[0] == BB_COMMENT_DESIGNATOR );
switch ( line[BB_DES_CHAR] )
{
case BB_IP_DESIGNATOR:
bb_get_ip_lines( &line[BB_DES_START],
&ip_count, &ip_index);
break;
case BB_CO_DESIGNATOR:
line[strlen(line)-1] = NUL;
strncpy( p_codata->company, &line[BB_DES_START],
BB_COMPANY_NAME_LEN);
break;
case BB_IMP_DESIGNATOR:
line[strlen(line)-1] = NUL;
strncpy( p_codata->imp, &line[BB_DES_START],
BB_IMP_NAME_LEN);
break;
case BB_ID_DESIGNATOR:
line[strlen(line)-1] = NUL;
strncpy( p_codata->id, &line[BB_DES_START],
BB_ID_NAME_LEN);
break;
case BB_BOOTH_DESIGNATOR:
p_codata->booth = atoi( &line[BB_DES_START]);
break;
case BB_FLAGS_DESIGNATOR:
p_codata->flags = atoi( &line[BB_DES_START]);
break;
case BB_END_DESIGNATOR:
done = TRUE;
break;
default :
if ( line[0] != '\n' )
{
fprintf( stderr, "ERROR: Invalid field designator '%s'.\n",
line);
}
break;
}
}
p_codata->ip_cnt = ip_count;
p_codata->ip_idx = ip_index;
return BB_SUCCESS;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.