static int _check_mtime(GeoIP *gi) { struct stat buf; if (gi->flags & GEOIP_CHECK_CACHE) { if (stat(gi->file_path, &buf) != -1) { if (buf.st_mtime != gi->mtime) { /* GeoIP Database file updated */ if (gi->flags & (GEOIP_MEMORY_CACHE)) { { /* reload database into memory cache */ if ((gi->cache = (unsigned char*) realloc(gi->cache, buf.st_size)) == NULL) { fprintf(stderr,"Out of memory when reloading %s\n",gi->file_path); return -1; } } } /* refresh filehandle */ fclose(gi->GeoIPDatabase); gi->GeoIPDatabase = fopen(gi->file_path,"rb"); if (gi->GeoIPDatabase == NULL) { fprintf(stderr,"Error Opening file %s when reloading\n",gi->file_path); return -1; } gi->mtime = buf.st_mtime; gi->size = buf.st_size; if ( gi->flags & GEOIP_MEMORY_CACHE ) { if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) { fprintf(stderr,"Error reading file %s when reloading\n",gi->file_path); return -1; } } if (gi->databaseSegments != NULL) { free(gi->databaseSegments); gi->databaseSegments = NULL; } _setup_segments(gi); if (gi->databaseSegments == NULL) { fprintf(stderr, "Error reading file %s -- corrupt\n", gi->file_path); return -1; } if (gi->flags & GEOIP_INDEX_CACHE) { gi->index_cache = (unsigned char *) realloc(gi->index_cache, sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); if (gi->index_cache != NULL) { fseek(gi->GeoIPDatabase, 0, SEEK_SET); if (fread(gi->index_cache, sizeof(unsigned char), gi->databaseSegments[0] * (long)gi->record_length * 2, gi->GeoIPDatabase) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { fprintf(stderr,"Error reading file %s where reloading\n",gi->file_path); return -1; } } } } } } return 0; }
GeoIP* GeoIP_open (const char * filename, int flags) { struct stat buf; GeoIP * gi; size_t len; #ifdef WIN32 int name_len; wchar_t* wfilename; wchar_t const* dst_start; char const* src_start; #endif gi = (GeoIP *)malloc(sizeof(GeoIP)); if (gi == NULL) return NULL; len = sizeof(char) * (strlen(filename)+1); gi->file_path = (char*)malloc(len); if (gi->file_path == NULL) { free(gi); return NULL; } strncpy(gi->file_path, filename, len); #ifdef WIN32 assert(sizeof(wchar_t) == 2); name_len = strlen(filename); wfilename = malloc((name_len + 1) * sizeof(wchar_t)); dst_start = wfilename; src_start = filename; ConvertUTF8toUTF16((const UTF8**)&src_start, (const UTF8*)src_start + name_len+1, (UTF16**)&dst_start, (UTF16*)dst_start + name_len + 1 , lenientConversion); gi->GeoIPDatabase = _wfopen(wfilename,L"rb"); free(wfilename); #else gi->GeoIPDatabase = fopen(filename,"rb"); #endif if (gi->GeoIPDatabase == NULL) { fprintf(stderr,"Error Opening file %s\n",filename); free(gi->file_path); free(gi); return NULL; } else { if (flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE) ) { if (fstat(_fileno(gi->GeoIPDatabase), &buf) == -1) { fprintf(stderr,"Error stating file %s\n",filename); free(gi->file_path); free(gi); return NULL; } gi->mtime = buf.st_mtime; gi->size = buf.st_size; #if !defined WIN32 && !defined __OS2__ /* MMAP added my Peter Shipley */ if ( flags & GEOIP_MMAP_CACHE) { gi->cache = (unsigned char*)mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); if ( gi->cache == MAP_FAILED ) { fprintf(stderr,"Error mmaping file %s\n",filename); free(gi->file_path); free(gi); return NULL; } } else #endif { gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); if (gi->cache != NULL) { if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) { fprintf(stderr,"Error reading file %s\n",filename); free(gi->cache); free(gi->file_path); free(gi); return NULL; } } } } else { if (flags & GEOIP_CHECK_CACHE) { if (fstat(_fileno(gi->GeoIPDatabase), &buf) == -1) { fprintf(stderr,"Error stating file %s\n",filename); free(gi->file_path); free(gi); return NULL; } gi->mtime = buf.st_mtime; } gi->cache = NULL; } gi->flags = flags; gi->charset = GEOIP_CHARSET_ISO_8859_1; _setup_segments(gi); if (flags & GEOIP_INDEX_CACHE) { gi->index_cache = (unsigned char *) malloc(sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); if (gi->index_cache != NULL) { fseek(gi->GeoIPDatabase, 0, SEEK_SET); if (fread(gi->index_cache, sizeof(unsigned char), gi->databaseSegments[0] * (long)gi->record_length * 2, gi->GeoIPDatabase) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { fprintf(stderr,"Error reading file %s\n",filename); free(gi->databaseSegments); free(gi->index_cache); free(gi); return NULL; } } } else { gi->index_cache = NULL; } return gi; } }
static int _check_mtime(GeoIP *gi) { struct stat buf; if (gi->flags & GEOIP_CHECK_CACHE) { if (stat(gi->file_path, &buf) != -1) { if (buf.st_mtime != gi->mtime) { int name_len; wchar_t* wfilename; wchar_t const* dst_start; char const* src_start; /* GeoIP Database file updated */ if (gi->flags & (GEOIP_MEMORY_CACHE | GEOIP_MMAP_CACHE)) { #if !defined WIN32 && !defined __OS2__ if ( gi->flags & GEOIP_MMAP_CACHE) { munmap(gi->cache, gi->size); gi->cache = NULL; } else #endif { /* reload database into memory cache */ if ((gi->cache = (unsigned char*) realloc(gi->cache, buf.st_size)) == NULL) { fprintf(stderr,"Out of memory when reloading %s\n",gi->file_path); return -1; } } } /* refresh filehandle */ fclose(gi->GeoIPDatabase); #ifdef WIN32 assert(sizeof(wchar_t) == 2); name_len = strlen(gi->file_path); wfilename = malloc((name_len + 1) * sizeof(wchar_t)); dst_start = wfilename; src_start = gi->file_path; ConvertUTF8toUTF16((const UTF8**)&src_start, (const UTF8*)src_start + name_len+1, (UTF16**)&dst_start, (UTF16*)dst_start + name_len + 1 , lenientConversion); gi->GeoIPDatabase = _wfopen(wfilename,L"rb"); free(wfilename); #else gi->GeoIPDatabase = fopen(gi->file_path,"rb"); #endif if (gi->GeoIPDatabase == NULL) { fprintf(stderr,"Error Opening file %s when reloading\n",gi->file_path); return -1; } gi->mtime = buf.st_mtime; gi->size = buf.st_size; #if !defined WIN32 && !defined __OS2__ if ( gi->flags & GEOIP_MMAP_CACHE) { gi->cache = (unsigned char*)mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fileno(gi->GeoIPDatabase), 0); if ( gi->cache == MAP_FAILED ) { fprintf(stderr,"Error remapping file %s when reloading\n",gi->file_path); gi->cache = 0; return -1; } } else #endif if ( gi->flags & GEOIP_MEMORY_CACHE ) { if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) { fprintf(stderr,"Error reading file %s when reloading\n",gi->file_path); return -1; } } if (gi->databaseSegments != NULL) { free(gi->databaseSegments); gi->databaseSegments = NULL; } _setup_segments(gi); if (gi->databaseSegments == NULL) { fprintf(stderr, "Error reading file %s -- corrupt\n", gi->file_path); return -1; } if (gi->flags & GEOIP_INDEX_CACHE) { gi->index_cache = (unsigned char *) realloc(gi->index_cache, sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); if (gi->index_cache != NULL) { fseek(gi->GeoIPDatabase, 0, SEEK_SET); if (fread(gi->index_cache, sizeof(unsigned char), gi->databaseSegments[0] * (long)gi->record_length * 2, gi->GeoIPDatabase) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { fprintf(stderr,"Error reading file %s where reloading\n",gi->file_path); return -1; } } } } } } return 0; }
GeoIP* GeoIP_open (const char * filename, int flags) { struct stat buf; GeoIP * gi; size_t len; #ifdef WIN32 WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0) return NULL; #endif gi = (GeoIP *)malloc(sizeof(GeoIP)); if (gi == NULL) return NULL; len = sizeof(char) * (strlen(filename)+1); gi->file_path = malloc(len); if (gi->file_path == NULL) { free(gi); return NULL; } strncpy(gi->file_path, filename, len); gi->GeoIPDatabase = fopen(filename,"rb"); if (gi->GeoIPDatabase == NULL) { fprintf(stderr,"Error Opening file %s\n",filename); free(gi->file_path); free(gi); return NULL; } else { if (flags & (GEOIP_MEMORY_CACHE) ) { if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { fprintf(stderr,"Error stating file %s\n",filename); free(gi->file_path); free(gi); return NULL; } gi->mtime = buf.st_mtime; gi->size = buf.st_size; /* MMAP added my Peter Shipley */ { gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size); if (gi->cache != NULL) { if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) { fprintf(stderr,"Error reading file %s\n",filename); free(gi->cache); free(gi->file_path); free(gi); return NULL; } } } } else { if (flags & GEOIP_CHECK_CACHE) { if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) { fprintf(stderr,"Error stating file %s\n",filename); free(gi->file_path); free(gi); return NULL; } gi->mtime = buf.st_mtime; } gi->cache = NULL; } gi->flags = flags; gi->charset = GEOIP_CHARSET_ISO_8859_1; _setup_segments(gi); if (flags & GEOIP_INDEX_CACHE) { gi->index_cache = (unsigned char *) malloc(sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2))); if (gi->index_cache != NULL) { fseek(gi->GeoIPDatabase, 0, SEEK_SET); if (fread(gi->index_cache, sizeof(unsigned char), gi->databaseSegments[0] * (long)gi->record_length * 2, gi->GeoIPDatabase) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) { fprintf(stderr,"Error reading file %s\n",filename); free(gi->databaseSegments); free(gi->index_cache); free(gi); return NULL; } } } else { gi->index_cache = NULL; } return gi; } }