aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/eet/src/lib/eet_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/eet/src/lib/eet_lib.c')
-rw-r--r--libraries/eet/src/lib/eet_lib.c297
1 files changed, 91 insertions, 206 deletions
diff --git a/libraries/eet/src/lib/eet_lib.c b/libraries/eet/src/lib/eet_lib.c
index a0d6435..04feebe 100644
--- a/libraries/eet/src/lib/eet_lib.c
+++ b/libraries/eet/src/lib/eet_lib.c
@@ -82,126 +82,6 @@ EAPI Eet_Version *eet_version = &_version;
82 82
83#define EET_MAGIC_FILE2 0x1ee70f42 83#define EET_MAGIC_FILE2 0x1ee70f42
84 84
85typedef struct _Eet_File_Header Eet_File_Header;
86typedef struct _Eet_File_Node Eet_File_Node;
87typedef struct _Eet_File_Directory Eet_File_Directory;
88
89struct _Eet_File
90{
91 char *path;
92 Eina_File *readfp;
93 Eet_File_Header *header;
94 Eet_Dictionary *ed;
95 Eet_Key *key;
96 const unsigned char *data;
97 const void *x509_der;
98 const void *signature;
99 void *sha1;
100
101 Eet_File_Mode mode;
102
103 int magic;
104 int references;
105
106 unsigned long int data_size;
107 int x509_length;
108 unsigned int signature_length;
109 int sha1_length;
110
111 Eina_Lock file_lock;
112
113 unsigned char writes_pending : 1;
114 unsigned char delete_me_now : 1;
115};
116
117struct _Eet_File_Header
118{
119 int magic;
120 Eet_File_Directory *directory;
121};
122
123struct _Eet_File_Directory
124{
125 int size;
126 Eet_File_Node **nodes;
127};
128
129struct _Eet_File_Node
130{
131 char *name;
132 void *data;
133 Eet_File_Node *next; /* FIXME: make buckets linked lists */
134
135 unsigned long int offset;
136 unsigned long int dictionary_offset;
137 unsigned long int name_offset;
138
139 unsigned int name_size;
140 unsigned int size;
141 unsigned int data_size;
142
143 unsigned char free_name : 1;
144 unsigned char compression : 1;
145 unsigned char ciphered : 1;
146 unsigned char alias : 1;
147};
148
149#if 0
150/* Version 2 */
151/* NB: all int's are stored in network byte order on disk */
152/* file format: */
153int magic; /* magic number ie 0x1ee7ff00 */
154int num_directory_entries; /* number of directory entries to follow */
155int bytes_directory_entries; /* bytes of directory entries to follow */
156struct
157{
158 int offset; /* bytes offset into file for data chunk */
159 int flags; /* flags - for now 0 = uncompressed and clear, 1 = compressed and clear, 2 = uncompressed and ciphered, 3 = compressed and ciphered */
160 int size; /* size of the data chunk */
161 int data_size; /* size of the (uncompressed) data chunk */
162 int name_size; /* length in bytes of the name field */
163 char name[name_size]; /* name string (variable length) and \0 terminated */
164} directory[num_directory_entries];
165/* and now startes the data stream... */
166#endif /* if 0 */
167
168#if 0
169/* Version 3 */
170/* NB: all int's are stored in network byte order on disk */
171/* file format: */
172int magic; /* magic number ie 0x1ee70f42 */
173int num_directory_entries; /* number of directory entries to follow */
174int num_dictionary_entries; /* number of dictionary entries to follow */
175struct
176{
177 int data_offset; /* bytes offset into file for data chunk */
178 int size; /* size of the data chunk */
179 int data_size; /* size of the (uncompressed) data chunk */
180 int name_offset; /* bytes offset into file for name string */
181 int name_size; /* length in bytes of the name field */
182 int flags; /* bit flags - for now:
183 bit 0 => compresion on/off
184 bit 1 => ciphered on/off
185 bit 2 => alias
186 */
187} directory[num_directory_entries];
188struct
189{
190 int hash;
191 int offset;
192 int size;
193 int prev;
194 int next;
195} dictionary[num_dictionary_entries];
196/* now start the string stream. */
197/* and right after them the data stream. */
198int magic_sign; /* Optional, only if the eet file is signed. */
199int signature_length; /* Signature length. */
200int x509_length; /* Public certificate that signed the file. */
201char signature[signature_length]; /* The signature. */
202char x509[x509_length]; /* The public certificate. */
203#endif /* if 0 */
204
205#define EET_FILE2_HEADER_COUNT 3 85#define EET_FILE2_HEADER_COUNT 3
206#define EET_FILE2_DIRECTORY_ENTRY_COUNT 6 86#define EET_FILE2_DIRECTORY_ENTRY_COUNT 6
207#define EET_FILE2_DICTIONARY_ENTRY_COUNT 5 87#define EET_FILE2_DICTIONARY_ENTRY_COUNT 5
@@ -280,7 +160,7 @@ eet_check_pointer(const Eet_File *ef)
280 return 1; 160 return 1;
281 161
282 return 0; 162 return 0;
283} /* eet_check_pointer */ 163}
284 164
285static inline int 165static inline int
286eet_check_header(const Eet_File *ef) 166eet_check_header(const Eet_File *ef)
@@ -292,7 +172,7 @@ eet_check_header(const Eet_File *ef)
292 return 1; 172 return 1;
293 173
294 return 0; 174 return 0;
295} /* eet_check_header */ 175}
296 176
297static inline int 177static inline int
298eet_test_close(int test, 178eet_test_close(int test,
@@ -305,7 +185,7 @@ eet_test_close(int test,
305 } 185 }
306 186
307 return test; 187 return test;
308} /* eet_test_close */ 188}
309 189
310/* find an eet file in the currently in use cache */ 190/* find an eet file in the currently in use cache */
311static Eet_File * 191static Eet_File *
@@ -326,7 +206,7 @@ eet_cache_find(const char *path,
326 206
327 /* not found */ 207 /* not found */
328 return NULL; 208 return NULL;
329} /* eet_cache_find */ 209}
330 210
331/* add to end of cache */ 211/* add to end of cache */
332/* this should only be called when the cache lock is already held */ 212/* this should only be called when the cache lock is already held */
@@ -382,7 +262,7 @@ eet_cache_add(Eet_File *ef,
382 *cache = new_cache; 262 *cache = new_cache;
383 *cache_num = new_cache_num; 263 *cache_num = new_cache_num;
384 *cache_alloc = new_cache_alloc; 264 *cache_alloc = new_cache_alloc;
385} /* eet_cache_add */ 265}
386 266
387/* delete from cache */ 267/* delete from cache */
388/* this should only be called when the cache lock is already held */ 268/* this should only be called when the cache lock is already held */
@@ -437,7 +317,7 @@ eet_cache_del(Eet_File *ef,
437 *cache = new_cache; 317 *cache = new_cache;
438 *cache_num = new_cache_num; 318 *cache_num = new_cache_num;
439 *cache_alloc = new_cache_alloc; 319 *cache_alloc = new_cache_alloc;
440} /* eet_cache_del */ 320}
441 321
442/* internal string match. null friendly, catches same ptr */ 322/* internal string match. null friendly, catches same ptr */
443static int 323static int
@@ -452,7 +332,7 @@ eet_string_match(const char *s1,
452 return 1; 332 return 1;
453 333
454 return !strcmp(s1, s2); 334 return !strcmp(s1, s2);
455} /* eet_string_match */ 335}
456 336
457/* flush out writes to a v2 eet file */ 337/* flush out writes to a v2 eet file */
458static Eet_Error 338static Eet_Error
@@ -494,7 +374,7 @@ eet_flush2(Eet_File *ef)
494 if (!fp) 374 if (!fp)
495 return EET_ERROR_NOT_WRITABLE; 375 return EET_ERROR_NOT_WRITABLE;
496 376
497 fcntl(fileno(fp), F_SETFD, FD_CLOEXEC); 377 fcntl(fd, F_SETFD, FD_CLOEXEC);
498 } 378 }
499 else 379 else
500 return EET_ERROR_NOT_WRITABLE; 380 return EET_ERROR_NOT_WRITABLE;
@@ -627,14 +507,6 @@ eet_flush2(Eet_File *ef)
627 507
628 /* flush all write to the file. */ 508 /* flush all write to the file. */
629 fflush(fp); 509 fflush(fp);
630// this is going to really cause trouble. if ANYTHING this needs to go into a
631// thread spawned off - but even then...
632// in this case... ext4 is "wrong". (yes we can jump up and down and point posix
633// manual pages at eachother, but ext4 broke behavior that has been in place
634// for decades and that 1000's of apps rely on daily - that is that one operation
635// to disk is committed to disk BEFORE following operations, so the fs retains
636// a consistent state
637// fsync(fileno(fp));
638 510
639 /* append signature if required */ 511 /* append signature if required */
640 if (ef->key) 512 if (ef->key)
@@ -665,13 +537,13 @@ write_error:
665 case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break; 537 case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break;
666 538
667 default: error = EET_ERROR_WRITE_ERROR; break; 539 default: error = EET_ERROR_WRITE_ERROR; break;
668 } /* switch */ 540 }
669 } 541 }
670 542
671sign_error: 543sign_error:
672 fclose(fp); 544 fclose(fp);
673 return error; 545 return error;
674} /* eet_flush2 */ 546}
675 547
676EAPI int 548EAPI int
677eet_init(void) 549eet_init(void)
@@ -680,10 +552,7 @@ eet_init(void)
680 return eet_init_count; 552 return eet_init_count;
681 553
682 if (!eina_init()) 554 if (!eina_init())
683 { 555 return --eet_init_count;
684 fprintf(stderr, "Eet: Eina init failed");
685 return --eet_init_count;
686 }
687 556
688 _eet_log_dom_global = eina_log_domain_register("eet", EET_DEFAULT_LOG_COLOR); 557 _eet_log_dom_global = eina_log_domain_register("eet", EET_DEFAULT_LOG_COLOR);
689 if (_eet_log_dom_global < 0) 558 if (_eet_log_dom_global < 0)
@@ -694,12 +563,18 @@ eet_init(void)
694 563
695 eina_lock_new(&eet_cache_lock); 564 eina_lock_new(&eet_cache_lock);
696 565
697 if (!eet_node_init()) 566 if (!eet_mempool_init())
698 { 567 {
699 EINA_LOG_ERR("Eet: Eet_Node mempool creation failed"); 568 EINA_LOG_ERR("Eet: Eet_Node mempool creation failed");
700 goto unregister_log_domain; 569 goto unregister_log_domain;
701 } 570 }
702 571
572 if (!eet_node_init())
573 {
574 EINA_LOG_ERR("Eet: Eet_Node mempool creation failed");
575 goto shutdown_mempool;
576 }
577
703#ifdef HAVE_GNUTLS 578#ifdef HAVE_GNUTLS
704 /* Before the library can be used, it must initialize itself if needed. */ 579 /* Before the library can be used, it must initialize itself if needed. */
705 if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0) 580 if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0)
@@ -741,13 +616,15 @@ eet_init(void)
741shutdown_eet: 616shutdown_eet:
742#endif 617#endif
743 eet_node_shutdown(); 618 eet_node_shutdown();
619shutdown_mempool:
620 eet_mempool_shutdown();
744unregister_log_domain: 621unregister_log_domain:
745 eina_log_domain_unregister(_eet_log_dom_global); 622 eina_log_domain_unregister(_eet_log_dom_global);
746 _eet_log_dom_global = -1; 623 _eet_log_dom_global = -1;
747shutdown_eina: 624shutdown_eina:
748 eina_shutdown(); 625 eina_shutdown();
749 return --eet_init_count; 626 return --eet_init_count;
750} /* eet_init */ 627}
751 628
752EAPI int 629EAPI int
753eet_shutdown(void) 630eet_shutdown(void)
@@ -757,6 +634,7 @@ eet_shutdown(void)
757 634
758 eet_clearcache(); 635 eet_clearcache();
759 eet_node_shutdown(); 636 eet_node_shutdown();
637 eet_mempool_shutdown();
760 638
761 eina_lock_free(&eet_cache_lock); 639 eina_lock_free(&eet_cache_lock);
762 640
@@ -772,7 +650,7 @@ eet_shutdown(void)
772 eina_shutdown(); 650 eina_shutdown();
773 651
774 return eet_init_count; 652 return eet_init_count;
775} /* eet_shutdown */ 653}
776 654
777EAPI Eet_Error 655EAPI Eet_Error
778eet_sync(Eet_File *ef) 656eet_sync(Eet_File *ef)
@@ -795,7 +673,7 @@ eet_sync(Eet_File *ef)
795 673
796 UNLOCK_FILE(ef); 674 UNLOCK_FILE(ef);
797 return ret; 675 return ret;
798} /* eet_sync */ 676}
799 677
800EAPI void 678EAPI void
801eet_clearcache(void) 679eet_clearcache(void)
@@ -853,7 +731,7 @@ eet_clearcache(void)
853 } 731 }
854 732
855 UNLOCK_CACHE; 733 UNLOCK_CACHE;
856} /* eet_clearcache */ 734}
857 735
858/* FIXME: MMAP race condition in READ_WRITE_MODE */ 736/* FIXME: MMAP race condition in READ_WRITE_MODE */
859static Eet_File * 737static Eet_File *
@@ -902,14 +780,14 @@ eet_internal_read2(Eet_File *ef)
902 return NULL; 780 return NULL;
903 781
904 /* allocate header */ 782 /* allocate header */
905 ef->header = calloc(1, sizeof(Eet_File_Header)); 783 ef->header = eet_file_header_calloc(1);
906 if (eet_test_close(!ef->header, ef)) 784 if (eet_test_close(!ef->header, ef))
907 return NULL; 785 return NULL;
908 786
909 ef->header->magic = EET_MAGIC_FILE_HEADER; 787 ef->header->magic = EET_MAGIC_FILE_HEADER;
910 788
911 /* allocate directory block in ram */ 789 /* allocate directory block in ram */
912 ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); 790 ef->header->directory = eet_file_directory_calloc(1);
913 if (eet_test_close(!ef->header->directory, ef)) 791 if (eet_test_close(!ef->header->directory, ef))
914 return NULL; 792 return NULL;
915 793
@@ -939,10 +817,10 @@ eet_internal_read2(Eet_File *ef)
939 817
940 /* out directory block is inconsistent - we have overrun our */ 818 /* out directory block is inconsistent - we have overrun our */
941 /* dynamic block buffer before we finished scanning dir entries */ 819 /* dynamic block buffer before we finished scanning dir entries */
942 efn = malloc(sizeof(Eet_File_Node)); 820 efn = eet_file_node_malloc(1);
943 if (eet_test_close(!efn, ef)) 821 if (eet_test_close(!efn, ef))
944 { 822 {
945 if (efn) free(efn); /* yes i know - we only get here if 823 if (efn) eet_file_node_mp_free(efn); /* yes i know - we only get here if
946 * efn is null/0 -> trying to shut up 824 * efn is null/0 -> trying to shut up
947 * warning tools like cppcheck */ 825 * warning tools like cppcheck */
948 return NULL; 826 return NULL;
@@ -963,7 +841,7 @@ eet_internal_read2(Eet_File *ef)
963#define EFN_TEST(Test, Ef, Efn) \ 841#define EFN_TEST(Test, Ef, Efn) \
964 if (eet_test_close(Test, Ef)) \ 842 if (eet_test_close(Test, Ef)) \
965 { \ 843 { \
966 free(Efn); \ 844 eet_file_node_mp_free(Efn); \
967 return NULL; \ 845 return NULL; \
968 } 846 }
969 847
@@ -1022,11 +900,11 @@ eet_internal_read2(Eet_File *ef)
1022 ef)) 900 ef))
1023 return NULL; 901 return NULL;
1024 902
1025 ef->ed = calloc(1, sizeof (Eet_Dictionary)); 903 ef->ed = eet_dictionary_calloc(1);
1026 if (eet_test_close(!ef->ed, ef)) 904 if (eet_test_close(!ef->ed, ef))
1027 return NULL; 905 return NULL;
1028 906
1029 ef->ed->all = calloc(num_dictionary_entries, sizeof (Eet_String)); 907 ef->ed->all = calloc(1, num_dictionary_entries * sizeof(Eet_String));
1030 if (eet_test_close(!ef->ed->all, ef)) 908 if (eet_test_close(!ef->ed->all, ef))
1031 return NULL; 909 return NULL;
1032 910
@@ -1112,7 +990,7 @@ eet_internal_read2(Eet_File *ef)
1112 } 990 }
1113 991
1114 return ef; 992 return ef;
1115} /* eet_internal_read2 */ 993}
1116 994
1117#if EET_OLD_EET_FILE_FORMAT 995#if EET_OLD_EET_FILE_FORMAT
1118static Eet_File * 996static Eet_File *
@@ -1162,14 +1040,14 @@ eet_internal_read1(Eet_File *ef)
1162 return NULL; 1040 return NULL;
1163 1041
1164 /* allocate header */ 1042 /* allocate header */
1165 ef->header = calloc(1, sizeof(Eet_File_Header)); 1043 ef->header = eet_file_header_calloc(1);
1166 if (eet_test_close(!ef->header, ef)) 1044 if (eet_test_close(!ef->header, ef))
1167 return NULL; 1045 return NULL;
1168 1046
1169 ef->header->magic = EET_MAGIC_FILE_HEADER; 1047 ef->header->magic = EET_MAGIC_FILE_HEADER;
1170 1048
1171 /* allocate directory block in ram */ 1049 /* allocate directory block in ram */
1172 ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); 1050 ef->header->directory = eet_file_directory_calloc(1);
1173 if (eet_test_close(!ef->header->directory, ef)) 1051 if (eet_test_close(!ef->header->directory, ef))
1174 return NULL; 1052 return NULL;
1175 1053
@@ -1204,10 +1082,10 @@ eet_internal_read1(Eet_File *ef)
1204 return NULL; 1082 return NULL;
1205 1083
1206 /* allocate all the ram needed for this stored node accounting */ 1084 /* allocate all the ram needed for this stored node accounting */
1207 efn = malloc (sizeof(Eet_File_Node)); 1085 efn = eet_file_node_malloc(1);
1208 if (eet_test_close(!efn, ef)) 1086 if (eet_test_close(!efn, ef))
1209 { 1087 {
1210 if (efn) free(efn); /* yes i know - we only get here if 1088 if (efn) eet_file_node_mp_free(efn); /* yes i know - we only get here if
1211 * efn is null/0 -> trying to shut up 1089 * efn is null/0 -> trying to shut up
1212 * warning tools like cppcheck */ 1090 * warning tools like cppcheck */
1213 return NULL; 1091 return NULL;
@@ -1227,21 +1105,21 @@ eet_internal_read1(Eet_File *ef)
1227 /* invalid size */ 1105 /* invalid size */
1228 if (eet_test_close(efn->size <= 0, ef)) 1106 if (eet_test_close(efn->size <= 0, ef))
1229 { 1107 {
1230 free(efn); 1108 eet_file_node_mp_free(efn);
1231 return NULL; 1109 return NULL;
1232 } 1110 }
1233 1111
1234 /* invalid name_size */ 1112 /* invalid name_size */
1235 if (eet_test_close(name_size <= 0, ef)) 1113 if (eet_test_close(name_size <= 0, ef))
1236 { 1114 {
1237 free(efn); 1115 eet_file_node_mp_free(efn);
1238 return NULL; 1116 return NULL;
1239 } 1117 }
1240 1118
1241 /* reading name would mean falling off end of dyn_buf - invalid */ 1119 /* reading name would mean falling off end of dyn_buf - invalid */
1242 if (eet_test_close((p + 16 + name_size) > (dyn_buf + byte_entries), ef)) 1120 if (eet_test_close((p + 16 + name_size) > (dyn_buf + byte_entries), ef))
1243 { 1121 {
1244 free(efn); 1122 eet_file_node_mp_free(efn);
1245 return NULL; 1123 return NULL;
1246 } 1124 }
1247 1125
@@ -1257,7 +1135,7 @@ eet_internal_read1(Eet_File *ef)
1257 efn->name = malloc(sizeof(char) * name_size + 1); 1135 efn->name = malloc(sizeof(char) * name_size + 1);
1258 if (eet_test_close(!efn->name, ef)) 1136 if (eet_test_close(!efn->name, ef))
1259 { 1137 {
1260 free(efn); 1138 eet_file_node_mp_free(efn);
1261 return NULL; 1139 return NULL;
1262 } 1140 }
1263 1141
@@ -1294,7 +1172,7 @@ eet_internal_read1(Eet_File *ef)
1294 p += HEADER_SIZE + name_size; 1172 p += HEADER_SIZE + name_size;
1295 } 1173 }
1296 return ef; 1174 return ef;
1297} /* eet_internal_read1 */ 1175}
1298 1176
1299#endif /* if EET_OLD_EET_FILE_FORMAT */ 1177#endif /* if EET_OLD_EET_FILE_FORMAT */
1300 1178
@@ -1329,10 +1207,10 @@ eet_internal_read(Eet_File *ef)
1329 ef->delete_me_now = 1; 1207 ef->delete_me_now = 1;
1330 eet_internal_close(ef, EINA_TRUE); 1208 eet_internal_close(ef, EINA_TRUE);
1331 break; 1209 break;
1332 } /* switch */ 1210 }
1333 1211
1334 return NULL; 1212 return NULL;
1335} /* eet_internal_read */ 1213}
1336 1214
1337static Eet_Error 1215static Eet_Error
1338eet_internal_close(Eet_File *ef, 1216eet_internal_close(Eet_File *ef,
@@ -1405,16 +1283,16 @@ eet_internal_close(Eet_File *ef,
1405 if (efn->free_name) 1283 if (efn->free_name)
1406 free(efn->name); 1284 free(efn->name);
1407 1285
1408 free(efn); 1286 eet_file_node_mp_free(efn);
1409 } 1287 }
1410 } 1288 }
1411 free(ef->header->directory->nodes); 1289 free(ef->header->directory->nodes);
1412 } 1290 }
1413 1291
1414 free(ef->header->directory); 1292 eet_file_directory_mp_free(ef->header->directory);
1415 } 1293 }
1416 1294
1417 free(ef->header); 1295 eet_file_header_mp_free(ef->header);
1418 } 1296 }
1419 1297
1420 eet_dictionary_free(ef->ed); 1298 eet_dictionary_free(ef->ed);
@@ -1434,7 +1312,8 @@ eet_internal_close(Eet_File *ef,
1434 memset(ef, 0, sizeof(Eet_File)); 1312 memset(ef, 0, sizeof(Eet_File));
1435 1313
1436 /* free it */ 1314 /* free it */
1437 free(ef); 1315 eina_stringshare_del(ef->path);
1316 eet_file_mp_free(ef);
1438 return err; 1317 return err;
1439 1318
1440on_error: 1319on_error:
@@ -1442,7 +1321,7 @@ on_error:
1442 UNLOCK_CACHE; 1321 UNLOCK_CACHE;
1443 1322
1444 return EET_ERROR_NONE; 1323 return EET_ERROR_NONE;
1445} /* eet_internal_close */ 1324}
1446 1325
1447EAPI Eet_File * 1326EAPI Eet_File *
1448eet_memopen_read(const void *data, 1327eet_memopen_read(const void *data,
@@ -1453,7 +1332,7 @@ eet_memopen_read(const void *data,
1453 if (!data || size == 0) 1332 if (!data || size == 0)
1454 return NULL; 1333 return NULL;
1455 1334
1456 ef = malloc (sizeof (Eet_File)); 1335 ef = eet_file_malloc(1);
1457 if (!ef) 1336 if (!ef)
1458 return NULL; 1337 return NULL;
1459 1338
@@ -1477,7 +1356,14 @@ eet_memopen_read(const void *data,
1477 ef = eet_internal_read(ef); 1356 ef = eet_internal_read(ef);
1478 UNLOCK_CACHE; 1357 UNLOCK_CACHE;
1479 return ef; 1358 return ef;
1480} /* eet_memopen_read */ 1359}
1360
1361EAPI const char *
1362eet_file_get(Eet_File *ef)
1363{
1364 if (eet_check_pointer(ef)) return NULL;
1365 return ef->path;
1366}
1481 1367
1482EAPI Eet_File * 1368EAPI Eet_File *
1483eet_open(const char *file, 1369eet_open(const char *file,
@@ -1578,7 +1464,7 @@ open_error:
1578 file_len = strlen(file) + 1; 1464 file_len = strlen(file) + 1;
1579 1465
1580 /* Allocate struct for eet file and have it zero'd out */ 1466 /* Allocate struct for eet file and have it zero'd out */
1581 ef = malloc(sizeof(Eet_File) + file_len); 1467 ef = eet_file_malloc(1);
1582 if (!ef) 1468 if (!ef)
1583 goto on_error; 1469 goto on_error;
1584 1470
@@ -1586,8 +1472,7 @@ open_error:
1586 INIT_FILE(ef); 1472 INIT_FILE(ef);
1587 ef->key = NULL; 1473 ef->key = NULL;
1588 ef->readfp = fp; 1474 ef->readfp = fp;
1589 ef->path = ((char *)ef) + sizeof(Eet_File); 1475 ef->path = eina_stringshare_add_length(file, file_len);
1590 memcpy(ef->path, file, file_len);
1591 ef->magic = EET_MAGIC_FILE; 1476 ef->magic = EET_MAGIC_FILE;
1592 ef->references = 1; 1477 ef->references = 1;
1593 ef->mode = mode; 1478 ef->mode = mode;
@@ -1641,7 +1526,7 @@ empty_file:
1641on_error: 1526on_error:
1642 UNLOCK_CACHE; 1527 UNLOCK_CACHE;
1643 return NULL; 1528 return NULL;
1644} /* eet_open */ 1529}
1645 1530
1646EAPI Eet_File_Mode 1531EAPI Eet_File_Mode
1647eet_mode_get(Eet_File *ef) 1532eet_mode_get(Eet_File *ef)
@@ -1651,7 +1536,7 @@ eet_mode_get(Eet_File *ef)
1651 return EET_FILE_MODE_INVALID; 1536 return EET_FILE_MODE_INVALID;
1652 else 1537 else
1653 return ef->mode; 1538 return ef->mode;
1654} /* eet_mode_get */ 1539}
1655 1540
1656EAPI const void * 1541EAPI const void *
1657eet_identity_x509(Eet_File *ef, 1542eet_identity_x509(Eet_File *ef,
@@ -1664,7 +1549,7 @@ eet_identity_x509(Eet_File *ef,
1664 *der_length = ef->x509_length; 1549 *der_length = ef->x509_length;
1665 1550
1666 return ef->x509_der; 1551 return ef->x509_der;
1667} /* eet_identity_x509 */ 1552}
1668 1553
1669EAPI const void * 1554EAPI const void *
1670eet_identity_signature(Eet_File *ef, 1555eet_identity_signature(Eet_File *ef,
@@ -1677,7 +1562,7 @@ eet_identity_signature(Eet_File *ef,
1677 *signature_length = ef->signature_length; 1562 *signature_length = ef->signature_length;
1678 1563
1679 return ef->signature; 1564 return ef->signature;
1680} /* eet_identity_signature */ 1565}
1681 1566
1682EAPI const void * 1567EAPI const void *
1683eet_identity_sha1(Eet_File *ef, 1568eet_identity_sha1(Eet_File *ef,
@@ -1692,7 +1577,7 @@ eet_identity_sha1(Eet_File *ef,
1692 *sha1_length = ef->sha1_length; 1577 *sha1_length = ef->sha1_length;
1693 1578
1694 return ef->sha1; 1579 return ef->sha1;
1695} /* eet_identity_sha1 */ 1580}
1696 1581
1697EAPI Eet_Error 1582EAPI Eet_Error
1698eet_identity_set(Eet_File *ef, 1583eet_identity_set(Eet_File *ef,
@@ -1712,13 +1597,13 @@ eet_identity_set(Eet_File *ef,
1712 ef->writes_pending = 1; 1597 ef->writes_pending = 1;
1713 1598
1714 return EET_ERROR_NONE; 1599 return EET_ERROR_NONE;
1715} /* eet_identity_set */ 1600}
1716 1601
1717EAPI Eet_Error 1602EAPI Eet_Error
1718eet_close(Eet_File *ef) 1603eet_close(Eet_File *ef)
1719{ 1604{
1720 return eet_internal_close(ef, EINA_FALSE); 1605 return eet_internal_close(ef, EINA_FALSE);
1721} /* eet_close */ 1606}
1722 1607
1723EAPI void * 1608EAPI void *
1724eet_read_cipher(Eet_File *ef, 1609eet_read_cipher(Eet_File *ef,
@@ -1889,7 +1774,7 @@ on_error:
1889 UNLOCK_FILE(ef); 1774 UNLOCK_FILE(ef);
1890 free(data); 1775 free(data);
1891 return NULL; 1776 return NULL;
1892} /* eet_read_cipher */ 1777}
1893 1778
1894EAPI void * 1779EAPI void *
1895eet_read(Eet_File *ef, 1780eet_read(Eet_File *ef,
@@ -1897,7 +1782,7 @@ eet_read(Eet_File *ef,
1897 int *size_ret) 1782 int *size_ret)
1898{ 1783{
1899 return eet_read_cipher(ef, name, size_ret, NULL); 1784 return eet_read_cipher(ef, name, size_ret, NULL);
1900} /* eet_read */ 1785}
1901 1786
1902EAPI const void * 1787EAPI const void *
1903eet_read_direct(Eet_File *ef, 1788eet_read_direct(Eet_File *ef,
@@ -1995,7 +1880,7 @@ eet_read_direct(Eet_File *ef,
1995on_error: 1880on_error:
1996 UNLOCK_FILE(ef); 1881 UNLOCK_FILE(ef);
1997 return NULL; 1882 return NULL;
1998} /* eet_read_direct */ 1883}
1999 1884
2000EAPI const char * 1885EAPI const char *
2001eet_alias_get(Eet_File *ef, 1886eet_alias_get(Eet_File *ef,
@@ -2102,16 +1987,16 @@ eet_alias(Eet_File *ef,
2102 if (!ef->header) 1987 if (!ef->header)
2103 { 1988 {
2104 /* allocate header */ 1989 /* allocate header */
2105 ef->header = calloc(1, sizeof(Eet_File_Header)); 1990 ef->header = eet_file_header_calloc(1);
2106 if (!ef->header) 1991 if (!ef->header)
2107 goto on_error; 1992 goto on_error;
2108 1993
2109 ef->header->magic = EET_MAGIC_FILE_HEADER; 1994 ef->header->magic = EET_MAGIC_FILE_HEADER;
2110 /* allocate directory block in ram */ 1995 /* allocate directory block in ram */
2111 ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); 1996 ef->header->directory = eet_file_directory_calloc(1);
2112 if (!ef->header->directory) 1997 if (!ef->header->directory)
2113 { 1998 {
2114 free(ef->header); 1999 eet_file_header_mp_free(ef->header);
2115 ef->header = NULL; 2000 ef->header = NULL;
2116 goto on_error; 2001 goto on_error;
2117 } 2002 }
@@ -2124,7 +2009,7 @@ eet_alias(Eet_File *ef,
2124 (1 << ef->header->directory->size)); 2009 (1 << ef->header->directory->size));
2125 if (!ef->header->directory->nodes) 2010 if (!ef->header->directory->nodes)
2126 { 2011 {
2127 free(ef->header->directory); 2012 eet_file_directory_mp_free(ef->header->directory);
2128 ef->header = NULL; 2013 ef->header = NULL;
2129 goto on_error; 2014 goto on_error;
2130 } 2015 }
@@ -2198,7 +2083,7 @@ eet_alias(Eet_File *ef,
2198 } 2083 }
2199 if (!exists_already) 2084 if (!exists_already)
2200 { 2085 {
2201 efn = malloc(sizeof(Eet_File_Node)); 2086 efn = eet_file_node_malloc(1);
2202 if (!efn) 2087 if (!efn)
2203 { 2088 {
2204 free(data2); 2089 free(data2);
@@ -2230,7 +2115,7 @@ eet_alias(Eet_File *ef,
2230on_error: 2115on_error:
2231 UNLOCK_FILE(ef); 2116 UNLOCK_FILE(ef);
2232 return EINA_FALSE; 2117 return EINA_FALSE;
2233} /* eet_alias */ 2118}
2234 2119
2235EAPI int 2120EAPI int
2236eet_write_cipher(Eet_File *ef, 2121eet_write_cipher(Eet_File *ef,
@@ -2262,16 +2147,16 @@ eet_write_cipher(Eet_File *ef,
2262 if (!ef->header) 2147 if (!ef->header)
2263 { 2148 {
2264 /* allocate header */ 2149 /* allocate header */
2265 ef->header = calloc(1, sizeof(Eet_File_Header)); 2150 ef->header = eet_file_header_calloc(1);
2266 if (!ef->header) 2151 if (!ef->header)
2267 goto on_error; 2152 goto on_error;
2268 2153
2269 ef->header->magic = EET_MAGIC_FILE_HEADER; 2154 ef->header->magic = EET_MAGIC_FILE_HEADER;
2270 /* allocate directory block in ram */ 2155 /* allocate directory block in ram */
2271 ef->header->directory = calloc(1, sizeof(Eet_File_Directory)); 2156 ef->header->directory = eet_file_directory_calloc(1);
2272 if (!ef->header->directory) 2157 if (!ef->header->directory)
2273 { 2158 {
2274 free(ef->header); 2159 eet_file_header_mp_free(ef->header);
2275 ef->header = NULL; 2160 ef->header = NULL;
2276 goto on_error; 2161 goto on_error;
2277 } 2162 }
@@ -2284,7 +2169,7 @@ eet_write_cipher(Eet_File *ef,
2284 (1 << ef->header->directory->size)); 2169 (1 << ef->header->directory->size));
2285 if (!ef->header->directory->nodes) 2170 if (!ef->header->directory->nodes)
2286 { 2171 {
2287 free(ef->header->directory); 2172 eet_file_directory_mp_free(ef->header->directory);
2288 ef->header = NULL; 2173 ef->header = NULL;
2289 goto on_error; 2174 goto on_error;
2290 } 2175 }
@@ -2382,7 +2267,7 @@ eet_write_cipher(Eet_File *ef,
2382 } 2267 }
2383 if (!exists_already) 2268 if (!exists_already)
2384 { 2269 {
2385 efn = malloc(sizeof(Eet_File_Node)); 2270 efn = eet_file_node_malloc(1);
2386 if (!efn) 2271 if (!efn)
2387 { 2272 {
2388 free(data2); 2273 free(data2);
@@ -2413,7 +2298,7 @@ eet_write_cipher(Eet_File *ef,
2413on_error: 2298on_error:
2414 UNLOCK_FILE(ef); 2299 UNLOCK_FILE(ef);
2415 return 0; 2300 return 0;
2416} /* eet_write_cipher */ 2301}
2417 2302
2418EAPI int 2303EAPI int
2419eet_write(Eet_File *ef, 2304eet_write(Eet_File *ef,
@@ -2423,7 +2308,7 @@ eet_write(Eet_File *ef,
2423 int comp) 2308 int comp)
2424{ 2309{
2425 return eet_write_cipher(ef, name, data, size, comp, NULL); 2310 return eet_write_cipher(ef, name, data, size, comp, NULL);
2426} /* eet_write */ 2311}
2427 2312
2428EAPI int 2313EAPI int
2429eet_delete(Eet_File *ef, 2314eet_delete(Eet_File *ef,
@@ -2472,7 +2357,7 @@ eet_delete(Eet_File *ef,
2472 if (efn->free_name) 2357 if (efn->free_name)
2473 free(efn->name); 2358 free(efn->name);
2474 2359
2475 free(efn); 2360 eet_file_node_mp_free(efn);
2476 exists_already = 1; 2361 exists_already = 1;
2477 break; 2362 break;
2478 } 2363 }
@@ -2485,7 +2370,7 @@ eet_delete(Eet_File *ef,
2485 2370
2486 /* update access time */ 2371 /* update access time */
2487 return exists_already; 2372 return exists_already;
2488} /* eet_delete */ 2373}
2489 2374
2490EAPI Eet_Dictionary * 2375EAPI Eet_Dictionary *
2491eet_dictionary_get(Eet_File *ef) 2376eet_dictionary_get(Eet_File *ef)
@@ -2494,7 +2379,7 @@ eet_dictionary_get(Eet_File *ef)
2494 return NULL; 2379 return NULL;
2495 2380
2496 return ef->ed; 2381 return ef->ed;
2497} /* eet_dictionary_get */ 2382}
2498 2383
2499EAPI char ** 2384EAPI char **
2500eet_list(Eet_File *ef, 2385eet_list(Eet_File *ef,
@@ -2578,7 +2463,7 @@ on_error:
2578 *count_ret = 0; 2463 *count_ret = 0;
2579 2464
2580 return NULL; 2465 return NULL;
2581} /* eet_list */ 2466}
2582 2467
2583EAPI int 2468EAPI int
2584eet_num_entries(Eet_File *ef) 2469eet_num_entries(Eet_File *ef)
@@ -2605,7 +2490,7 @@ eet_num_entries(Eet_File *ef)
2605 UNLOCK_FILE(ef); 2490 UNLOCK_FILE(ef);
2606 2491
2607 return ret; 2492 return ret;
2608} /* eet_num_entries */ 2493}
2609 2494
2610static Eet_File_Node * 2495static Eet_File_Node *
2611find_node_by_name(Eet_File *ef, 2496find_node_by_name(Eet_File *ef,
@@ -2624,7 +2509,7 @@ find_node_by_name(Eet_File *ef,
2624 } 2509 }
2625 2510
2626 return NULL; 2511 return NULL;
2627} /* find_node_by_name */ 2512}
2628 2513
2629static int 2514static int
2630read_data_from_disk(Eet_File *ef, 2515read_data_from_disk(Eet_File *ef,
@@ -2644,5 +2529,5 @@ read_data_from_disk(Eet_File *ef,
2644 memcpy(buf, ef->data + efn->offset, len); 2529 memcpy(buf, ef->data + efn->offset, len);
2645 2530
2646 return len; 2531 return len;
2647} /* read_data_from_disk */ 2532}
2648 2533