forked from enlightenment/efl
eet: use Eina_File and fix forgotten init in Eet test suite.
SVN revision: 59471
This commit is contained in:
parent
c9a4fc3054
commit
ac1a18741b
|
@ -496,3 +496,8 @@
|
||||||
|
|
||||||
* Use Eina_Lock.
|
* Use Eina_Lock.
|
||||||
* Sync GNUTLS initialisation with Eina.
|
* Sync GNUTLS initialisation with Eina.
|
||||||
|
|
||||||
|
2011-05-17 Cedric BAIL
|
||||||
|
|
||||||
|
* Use Eina_File.
|
||||||
|
* Fix test forgetting to initialize eet.
|
||||||
|
|
|
@ -86,7 +86,7 @@ typedef struct _Eet_File_Directory Eet_File_Directory;
|
||||||
struct _Eet_File
|
struct _Eet_File
|
||||||
{
|
{
|
||||||
char *path;
|
char *path;
|
||||||
FILE *readfp;
|
Eina_File *readfp;
|
||||||
Eet_File_Header *header;
|
Eet_File_Header *header;
|
||||||
Eet_Dictionary *ed;
|
Eet_Dictionary *ed;
|
||||||
Eet_Key *key;
|
Eet_Key *key;
|
||||||
|
@ -100,13 +100,11 @@ struct _Eet_File
|
||||||
int magic;
|
int magic;
|
||||||
int references;
|
int references;
|
||||||
|
|
||||||
int data_size;
|
unsigned long int data_size;
|
||||||
int x509_length;
|
int x509_length;
|
||||||
unsigned int signature_length;
|
unsigned int signature_length;
|
||||||
int sha1_length;
|
int sha1_length;
|
||||||
|
|
||||||
time_t mtime;
|
|
||||||
|
|
||||||
Eina_Lock file_lock;
|
Eina_Lock file_lock;
|
||||||
|
|
||||||
unsigned char writes_pending : 1;
|
unsigned char writes_pending : 1;
|
||||||
|
@ -131,13 +129,13 @@ struct _Eet_File_Node
|
||||||
void *data;
|
void *data;
|
||||||
Eet_File_Node *next; /* FIXME: make buckets linked lists */
|
Eet_File_Node *next; /* FIXME: make buckets linked lists */
|
||||||
|
|
||||||
int offset;
|
unsigned long int offset;
|
||||||
int dictionary_offset;
|
unsigned long int dictionary_offset;
|
||||||
int name_offset;
|
unsigned long int name_offset;
|
||||||
|
|
||||||
int name_size;
|
unsigned int name_size;
|
||||||
int size;
|
unsigned int size;
|
||||||
int data_size;
|
unsigned int data_size;
|
||||||
|
|
||||||
unsigned char free_name : 1;
|
unsigned char free_name : 1;
|
||||||
unsigned char compression : 1;
|
unsigned char compression : 1;
|
||||||
|
@ -850,12 +848,12 @@ eet_internal_read2(Eet_File *ef)
|
||||||
const int *data = (const int *)ef->data;
|
const int *data = (const int *)ef->data;
|
||||||
const char *start = (const char *)ef->data;
|
const char *start = (const char *)ef->data;
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
int num_directory_entries;
|
unsigned long int bytes_directory_entries;
|
||||||
int bytes_directory_entries;
|
unsigned long int bytes_dictionary_entries;
|
||||||
int num_dictionary_entries;
|
unsigned long int signature_base_offset;
|
||||||
int bytes_dictionary_entries;
|
unsigned long int num_directory_entries;
|
||||||
int signature_base_offset;
|
unsigned long int num_dictionary_entries;
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
idx += sizeof(int);
|
idx += sizeof(int);
|
||||||
if (eet_test_close((int)ntohl(*data) != EET_MAGIC_FILE2, ef))
|
if (eet_test_close((int)ntohl(*data) != EET_MAGIC_FILE2, ef))
|
||||||
|
@ -916,8 +914,8 @@ eet_internal_read2(Eet_File *ef)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
Eet_File_Node *efn;
|
Eet_File_Node *efn;
|
||||||
int name_offset;
|
unsigned long int name_offset;
|
||||||
int name_size;
|
unsigned long int name_size;
|
||||||
int hash;
|
int hash;
|
||||||
int flag;
|
int flag;
|
||||||
|
|
||||||
|
@ -1022,8 +1020,8 @@ eet_internal_read2(Eet_File *ef)
|
||||||
|
|
||||||
for (j = 0; j < ef->ed->count; ++j)
|
for (j = 0; j < ef->ed->count; ++j)
|
||||||
{
|
{
|
||||||
|
unsigned int offset;
|
||||||
int hash;
|
int hash;
|
||||||
int offset;
|
|
||||||
|
|
||||||
GET_INT(hash, dico, idx);
|
GET_INT(hash, dico, idx);
|
||||||
GET_INT(offset, dico, idx);
|
GET_INT(offset, dico, idx);
|
||||||
|
@ -1104,10 +1102,10 @@ eet_internal_read1(Eet_File *ef)
|
||||||
{
|
{
|
||||||
const unsigned char *dyn_buf = NULL;
|
const unsigned char *dyn_buf = NULL;
|
||||||
const unsigned char *p = NULL;
|
const unsigned char *p = NULL;
|
||||||
|
unsigned long int byte_entries;
|
||||||
|
unsigned long int num_entries;
|
||||||
|
unsigned int i;
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
int num_entries;
|
|
||||||
int byte_entries;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
WRN(
|
WRN(
|
||||||
"EET file format of '%s' is deprecated. You should just open it one time with mode == EET_FILE_MODE_READ_WRITE to solve this issue.",
|
"EET file format of '%s' is deprecated. You should just open it one time with mode == EET_FILE_MODE_READ_WRITE to solve this issue.",
|
||||||
|
@ -1334,7 +1332,13 @@ eet_internal_close(Eet_File *ef,
|
||||||
ef->references--;
|
ef->references--;
|
||||||
/* if its still referenced - dont go any further */
|
/* if its still referenced - dont go any further */
|
||||||
if (ef->references > 0)
|
if (ef->references > 0)
|
||||||
goto on_error; /* flush any writes */
|
{
|
||||||
|
/* flush any writes */
|
||||||
|
if ((ef->mode == EET_FILE_MODE_WRITE) ||
|
||||||
|
(ef->mode == EET_FILE_MODE_READ_WRITE))
|
||||||
|
eet_sync(ef);
|
||||||
|
goto on_error;
|
||||||
|
}
|
||||||
|
|
||||||
err = eet_flush2(ef);
|
err = eet_flush2(ef);
|
||||||
|
|
||||||
|
@ -1349,10 +1353,7 @@ eet_internal_close(Eet_File *ef,
|
||||||
if (ef->mode == EET_FILE_MODE_READ)
|
if (ef->mode == EET_FILE_MODE_READ)
|
||||||
eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
|
eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
|
||||||
else if ((ef->mode == EET_FILE_MODE_WRITE) ||
|
else if ((ef->mode == EET_FILE_MODE_WRITE) ||
|
||||||
(
|
(ef->mode == EET_FILE_MODE_READ_WRITE))
|
||||||
ef
|
|
||||||
->
|
|
||||||
mode == EET_FILE_MODE_READ_WRITE))
|
|
||||||
eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
|
eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
|
||||||
|
|
||||||
/* we can unlock the cache now */
|
/* we can unlock the cache now */
|
||||||
|
@ -1400,13 +1401,13 @@ eet_internal_close(Eet_File *ef,
|
||||||
eet_dictionary_free(ef->ed);
|
eet_dictionary_free(ef->ed);
|
||||||
|
|
||||||
if (ef->sha1)
|
if (ef->sha1)
|
||||||
free(ef->sha1);
|
free(ef->sha1);
|
||||||
|
|
||||||
if (ef->data)
|
if (ef->data)
|
||||||
munmap((void *)ef->data, ef->data_size);
|
eina_file_map_free(ef->readfp, (void *) ef->data);
|
||||||
|
|
||||||
if (ef->readfp)
|
if (ef->readfp)
|
||||||
fclose(ef->readfp);
|
eina_file_close(ef->readfp);
|
||||||
|
|
||||||
/* zero out ram for struct - caution tactic against stale memory use */
|
/* zero out ram for struct - caution tactic against stale memory use */
|
||||||
memset(ef, 0, sizeof(Eet_File));
|
memset(ef, 0, sizeof(Eet_File));
|
||||||
|
@ -1443,7 +1444,6 @@ eet_memopen_read(const void *data,
|
||||||
ef->references = 1;
|
ef->references = 1;
|
||||||
ef->mode = EET_FILE_MODE_READ;
|
ef->mode = EET_FILE_MODE_READ;
|
||||||
ef->header = NULL;
|
ef->header = NULL;
|
||||||
ef->mtime = 0;
|
|
||||||
ef->delete_me_now = 1;
|
ef->delete_me_now = 1;
|
||||||
ef->readfp = NULL;
|
ef->readfp = NULL;
|
||||||
ef->data = data;
|
ef->data = data;
|
||||||
|
@ -1462,10 +1462,10 @@ EAPI Eet_File *
|
||||||
eet_open(const char *file,
|
eet_open(const char *file,
|
||||||
Eet_File_Mode mode)
|
Eet_File_Mode mode)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
Eina_File *fp;
|
||||||
Eet_File *ef;
|
Eet_File *ef;
|
||||||
int file_len;
|
int file_len;
|
||||||
struct stat file_stat;
|
unsigned long int size;
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1504,28 +1504,18 @@ eet_open(const char *file,
|
||||||
if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
|
if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
|
||||||
{
|
{
|
||||||
/* Prevent garbage in futur comparison. */
|
/* Prevent garbage in futur comparison. */
|
||||||
file_stat.st_mtime = 0;
|
fp = eina_file_open(file, EINA_FALSE);
|
||||||
|
|
||||||
fp = fopen(file, "rb");
|
|
||||||
if (!fp)
|
if (!fp)
|
||||||
goto open_error;
|
goto open_error;
|
||||||
|
|
||||||
if (fstat(fileno(fp), &file_stat))
|
size = eina_file_size_get(fp);
|
||||||
|
|
||||||
|
if (size < ((int)sizeof(int) * 3))
|
||||||
{
|
{
|
||||||
fclose(fp);
|
eina_file_close(fp);
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
|
|
||||||
memset(&file_stat, 0, sizeof(file_stat));
|
size = 0;
|
||||||
|
|
||||||
goto open_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_stat.st_size < ((int)sizeof(int) * 3))
|
|
||||||
{
|
|
||||||
fclose(fp);
|
|
||||||
fp = NULL;
|
|
||||||
|
|
||||||
memset(&file_stat, 0, sizeof(file_stat));
|
|
||||||
|
|
||||||
goto open_error;
|
goto open_error;
|
||||||
}
|
}
|
||||||
|
@ -1539,15 +1529,13 @@ open_error:
|
||||||
if (mode != EET_FILE_MODE_WRITE)
|
if (mode != EET_FILE_MODE_WRITE)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
memset(&file_stat, 0, sizeof(file_stat));
|
size = 0;
|
||||||
|
|
||||||
fp = NULL;
|
fp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We found one */
|
/* We found one */
|
||||||
if (ef &&
|
if (ef && ef->readfp != fp)
|
||||||
((file_stat.st_mtime != ef->mtime) ||
|
|
||||||
(file_stat.st_size != ef->data_size)))
|
|
||||||
{
|
{
|
||||||
ef->delete_me_now = 1;
|
ef->delete_me_now = 1;
|
||||||
ef->references++;
|
ef->references++;
|
||||||
|
@ -1559,7 +1547,7 @@ open_error:
|
||||||
{
|
{
|
||||||
/* reference it up and return it */
|
/* reference it up and return it */
|
||||||
if (fp)
|
if (fp)
|
||||||
fclose(fp);
|
eina_file_close(fp);
|
||||||
|
|
||||||
ef->references++;
|
ef->references++;
|
||||||
UNLOCK_CACHE;
|
UNLOCK_CACHE;
|
||||||
|
@ -1583,7 +1571,6 @@ open_error:
|
||||||
ef->references = 1;
|
ef->references = 1;
|
||||||
ef->mode = mode;
|
ef->mode = mode;
|
||||||
ef->header = NULL;
|
ef->header = NULL;
|
||||||
ef->mtime = file_stat.st_mtime;
|
|
||||||
ef->writes_pending = 0;
|
ef->writes_pending = 0;
|
||||||
ef->delete_me_now = 0;
|
ef->delete_me_now = 0;
|
||||||
ef->data = NULL;
|
ef->data = NULL;
|
||||||
|
@ -1603,14 +1590,12 @@ open_error:
|
||||||
if (eet_test_close(!ef->readfp, ef))
|
if (eet_test_close(!ef->readfp, ef))
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
fcntl(fileno(ef->readfp), F_SETFD, FD_CLOEXEC);
|
|
||||||
/* if we opened for read or read-write */
|
/* if we opened for read or read-write */
|
||||||
if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
|
if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
|
||||||
{
|
{
|
||||||
ef->data_size = file_stat.st_size;
|
ef->data_size = size;
|
||||||
ef->data = mmap(NULL, ef->data_size, PROT_READ,
|
ef->data = eina_file_map_all(fp, EINA_FILE_SEQUENTIAL);
|
||||||
MAP_SHARED, fileno(ef->readfp), 0);
|
if (eet_test_close((ef->data == NULL), ef))
|
||||||
if (eet_test_close((ef->data == MAP_FAILED), ef))
|
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
ef = eet_internal_read(ef);
|
ef = eet_internal_read(ef);
|
||||||
|
@ -1623,11 +1608,10 @@ empty_file:
|
||||||
if (ef->references == 1)
|
if (ef->references == 1)
|
||||||
{
|
{
|
||||||
if (ef->mode == EET_FILE_MODE_READ)
|
if (ef->mode == EET_FILE_MODE_READ)
|
||||||
eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
|
eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
|
||||||
else
|
else if ((ef->mode == EET_FILE_MODE_WRITE) ||
|
||||||
if ((ef->mode == EET_FILE_MODE_WRITE) ||
|
(ef->mode == EET_FILE_MODE_READ_WRITE))
|
||||||
(ef->mode == EET_FILE_MODE_READ_WRITE))
|
eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
|
||||||
eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UNLOCK_CACHE;
|
UNLOCK_CACHE;
|
||||||
|
@ -1723,7 +1707,7 @@ eet_read_cipher(Eet_File *ef,
|
||||||
{
|
{
|
||||||
Eet_File_Node *efn;
|
Eet_File_Node *efn;
|
||||||
char *data = NULL;
|
char *data = NULL;
|
||||||
int size = 0;
|
unsigned long int size = 0;
|
||||||
|
|
||||||
if (size_ret)
|
if (size_ret)
|
||||||
*size_ret = 0;
|
*size_ret = 0;
|
||||||
|
@ -1928,7 +1912,8 @@ eet_read_direct(Eet_File *ef,
|
||||||
if (!efn)
|
if (!efn)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
if (efn->offset < 0 && !efn->data)
|
/* trick to detect data in memory instead of mmaped from disk */
|
||||||
|
if (efn->offset > ef->data_size && !efn->data)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
/* get size (uncompressed, if compressed at all) */
|
/* get size (uncompressed, if compressed at all) */
|
||||||
|
@ -2106,8 +2091,10 @@ eet_alias(Eet_File *ef,
|
||||||
efn->size = data_size;
|
efn->size = data_size;
|
||||||
efn->data_size = strlen(destination) + 1;
|
efn->data_size = strlen(destination) + 1;
|
||||||
efn->data = data2;
|
efn->data = data2;
|
||||||
efn->offset = -1;
|
/* Put the offset above the limit to avoid direct access */
|
||||||
|
efn->offset = ef->data_size + 1;
|
||||||
exists_already = EINA_TRUE;
|
exists_already = EINA_TRUE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2126,7 +2113,8 @@ eet_alias(Eet_File *ef,
|
||||||
|
|
||||||
efn->next = ef->header->directory->nodes[hash];
|
efn->next = ef->header->directory->nodes[hash];
|
||||||
ef->header->directory->nodes[hash] = efn;
|
ef->header->directory->nodes[hash] = efn;
|
||||||
efn->offset = -1;
|
/* Put the offset above the limit to avoid direct access */
|
||||||
|
efn->offset = ef->data_size + 1;
|
||||||
efn->alias = 1;
|
efn->alias = 1;
|
||||||
efn->ciphered = 0;
|
efn->ciphered = 0;
|
||||||
efn->compression = !!comp;
|
efn->compression = !!comp;
|
||||||
|
@ -2288,7 +2276,8 @@ eet_write_cipher(Eet_File *ef,
|
||||||
efn->size = data_size;
|
efn->size = data_size;
|
||||||
efn->data_size = size;
|
efn->data_size = size;
|
||||||
efn->data = data2;
|
efn->data = data2;
|
||||||
efn->offset = -1;
|
/* Put the offset above the limit to avoid direct access */
|
||||||
|
efn->offset = ef->data_size + 1;
|
||||||
exists_already = 1;
|
exists_already = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2308,7 +2297,8 @@ eet_write_cipher(Eet_File *ef,
|
||||||
|
|
||||||
efn->next = ef->header->directory->nodes[hash];
|
efn->next = ef->header->directory->nodes[hash];
|
||||||
ef->header->directory->nodes[hash] = efn;
|
ef->header->directory->nodes[hash] = efn;
|
||||||
efn->offset = -1;
|
/* Put the offset above the limit to avoid direct access */
|
||||||
|
efn->offset = ef->data_size + 1;
|
||||||
efn->alias = 0;
|
efn->alias = 0;
|
||||||
efn->ciphered = cipher_key ? 1 : 0;
|
efn->ciphered = cipher_key ? 1 : 0;
|
||||||
efn->compression = !!comp;
|
efn->compression = !!comp;
|
||||||
|
@ -2544,28 +2534,16 @@ read_data_from_disk(Eet_File *ef,
|
||||||
void *buf,
|
void *buf,
|
||||||
int len)
|
int len)
|
||||||
{
|
{
|
||||||
if (efn->offset < 0)
|
if (efn->offset > ef->data_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (ef->data)
|
if (!ef->data)
|
||||||
{
|
return 0;
|
||||||
if ((efn->offset + len) > ef->data_size)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
memcpy(buf, ef->data + efn->offset, len);
|
if ((efn->offset + len) > ef->data_size)
|
||||||
}
|
return 0;
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!ef->readfp)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* seek to data location */
|
memcpy(buf, ef->data + efn->offset, len);
|
||||||
if (fseek(ef->readfp, efn->offset, SEEK_SET) < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* read it */
|
|
||||||
len = fread(buf, len, 1, ef->readfp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
} /* read_data_from_disk */
|
} /* read_data_from_disk */
|
||||||
|
|
|
@ -1018,6 +1018,12 @@ START_TEST(eet_file_data_test)
|
||||||
|
|
||||||
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
|
fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
|
||||||
|
|
||||||
|
result = eet_data_read(ef, edd, EET_TEST_FILE_KEY1);
|
||||||
|
fail_if(!result);
|
||||||
|
|
||||||
|
/* Test the resulting data. */
|
||||||
|
fail_if(_eet_test_ex_check(result, 0) != 0);
|
||||||
|
|
||||||
eet_close(ef);
|
eet_close(ef);
|
||||||
|
|
||||||
/* Read back the data. */
|
/* Read back the data. */
|
||||||
|
@ -1204,6 +1210,8 @@ START_TEST(eet_image)
|
||||||
unsigned int w;
|
unsigned int w;
|
||||||
unsigned int h;
|
unsigned int h;
|
||||||
|
|
||||||
|
eet_init();
|
||||||
|
|
||||||
fail_if(!(file = tmpnam(file)));
|
fail_if(!(file = tmpnam(file)));
|
||||||
|
|
||||||
/* Save the encoded data in a file. */
|
/* Save the encoded data in a file. */
|
||||||
|
|
Loading…
Reference in New Issue