/* Function: GSI64Open() * * Purpose: Open a GSI64 file. Returns the number of records in * the file and a file pointer. Returns NULL on failure. * The file pointer should be fclose()'d normally. */ GSI64FILE * GSI64Open(char *gsifile) { GSI64FILE *gsi; char magic[GSI64_KEYSIZE]; gsi = (GSI64FILE *) MallocOrDie (sizeof(GSI64FILE)); if ((gsi->gsifp = fopen(gsifile, "r")) == NULL) { free(gsi); squid_errno = SQERR_NOFILE; return NULL; } if (! fread(magic, sizeof(char), GSI64_KEYSIZE, gsi->gsifp)) { free(gsi); squid_errno = SQERR_NODATA; return NULL; } if (strcmp(magic, "GSI64") != 0) { free(gsi); squid_errno = SQERR_FORMAT; return NULL; } if (! fread(&(gsi->nfiles), sizeof(sqd_uint16), 1, gsi->gsifp)) { free(gsi); squid_errno = SQERR_NODATA; return NULL; } if (! fread(&(gsi->recnum), sizeof(sqd_uint64), 1, gsi->gsifp)) { free(gsi); squid_errno = SQERR_NODATA; return NULL; } #if 0 /* HACK! we don't byteswap */ gsi->nfiles = sre_ntohs(gsi->nfiles); /* convert from network short */ gsi->recnum = sre_ntohl(gsi->recnum); /* convert from network long */ #endif return gsi; }
/* Function: GSIOpen() * * Purpose: Open a GSI file. Returns the number of records in * the file and a file pointer. Returns NULL on failure. * The file pointer should be fclose()'d normally. */ GSIFILE * GSIOpen(char *gsifile) { GSIFILE *gsi; char magic[GSI_KEYSIZE]; gsi = (GSIFILE *) MallocOrDie (sizeof(GSIFILE)); if ((gsi->gsifp = fopen(gsifile, "r")) == NULL) { squid_errno = SQERR_NOFILE; return NULL; } if (! fread(magic, sizeof(char), GSI_KEYSIZE, gsi->gsifp)) { squid_errno = SQERR_NODATA; return NULL; } if (strcmp(magic, "GSI") != 0) { squid_errno = SQERR_FORMAT; return NULL; } if (! fread(&(gsi->nfiles), sizeof(sqd_uint16), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return NULL; } if (! fread(&(gsi->recnum), sizeof(sqd_uint32), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return NULL; } gsi->nfiles = sre_ntohs(gsi->nfiles); /* convert from network short */ gsi->recnum = sre_ntohl(gsi->recnum); /* convert from network long */ return gsi; }
/* Function: GSIGetRecord() * * Purpose: Each non-header record of a GSI index files consists * of 38 bytes: 32 bytes of character string, a 2 byte * short, and a 4 byte long. This function returns the * three values. * * Args: gsi - open GSI index file, correctly positioned at a record * f1 - char[32], allocated by caller (or NULL if unwanted) * f2 - pointer to short (or NULL if unwanted) * f3 - pointer to long (or NULL if unwanted) * * Return: 0 on failure and sets squid_errno. */ static int GSIGetRecord(GSIFILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint32 *f3) { if (f1 == NULL) fseek(gsi->gsifp, GSI_KEYSIZE, SEEK_CUR); else if (! fread(f1, GSI_KEYSIZE, 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } if (f2 == NULL) fseek(gsi->gsifp, sizeof(sqd_uint16), SEEK_CUR); else if (! fread(f2, sizeof(sqd_uint16), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } if (f3 == NULL) fseek(gsi->gsifp, sizeof(sqd_uint32), SEEK_CUR); else if (! fread(f3, sizeof(sqd_uint32), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } if (f2 != NULL) *f2 = sre_ntohs(*f2); if (f3 != NULL) *f3 = sre_ntohl(*f3); return 1; }
/* Function: GSI64GetRecord() * * Purpose: Each non-header record of a GSI64 index file consists * of 42 bytes: 32 bytes of character string, a 2 byte * short, and an 8 byte long long. This function returns the * three values. * * Args: gsi - open GSI64 index file, correctly positioned at a record * f1 - char[32], allocated by caller (or NULL if unwanted) * f2 - pointer to short (or NULL if unwanted) * f3 - pointer to long long (or NULL if unwanted) * * Return: 0 on failure and sets squid_errno. */ int GSI64GetRecord(GSI64FILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint64 *f3) { if (f1 == NULL) fseek64(gsi->gsifp, GSI64_KEYSIZE, SEEK_CUR); else if (! fread(f1, GSI64_KEYSIZE, 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } if (f2 == NULL) fseek64(gsi->gsifp, sizeof(sqd_uint16), SEEK_CUR); else if (! fread(f2, sizeof(sqd_uint16), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } if (f3 == NULL) fseek64(gsi->gsifp, sizeof(sqd_uint64), SEEK_CUR); else if (! fread(f3, sizeof(sqd_uint64), 1, gsi->gsifp)) { squid_errno = SQERR_NODATA; return 0; } #if 0 /* no byteswap yet! HACK! */ if (f2 != NULL) *f2 = sre_ntohs(*f2); if (f3 != NULL) *f3 = sre_ntohl(*f3); #endif return 1; }