diff options
author | David Walter Seikel | 2012-01-23 23:30:42 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-23 23:30:42 +1000 |
commit | 825a3d837a33f226c879cd02ad15c3fba57e8b2c (patch) | |
tree | 75f57bd9c4253508d338dc79ba8e57a7abc42255 /libraries/eet/src/lib/eet_lib.c | |
parent | Add ability to disable the test harness, or the Lua compile test. (diff) | |
download | SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.zip SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.gz SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.bz2 SledjHamr-825a3d837a33f226c879cd02ad15c3fba57e8b2c.tar.xz |
Update the EFL to what I'm actually using, coz I'm using some stuff not yet released.
Diffstat (limited to 'libraries/eet/src/lib/eet_lib.c')
-rw-r--r-- | libraries/eet/src/lib/eet_lib.c | 297 |
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 | ||
85 | typedef struct _Eet_File_Header Eet_File_Header; | ||
86 | typedef struct _Eet_File_Node Eet_File_Node; | ||
87 | typedef struct _Eet_File_Directory Eet_File_Directory; | ||
88 | |||
89 | struct _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 | |||
117 | struct _Eet_File_Header | ||
118 | { | ||
119 | int magic; | ||
120 | Eet_File_Directory *directory; | ||
121 | }; | ||
122 | |||
123 | struct _Eet_File_Directory | ||
124 | { | ||
125 | int size; | ||
126 | Eet_File_Node **nodes; | ||
127 | }; | ||
128 | |||
129 | struct _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: */ | ||
153 | int magic; /* magic number ie 0x1ee7ff00 */ | ||
154 | int num_directory_entries; /* number of directory entries to follow */ | ||
155 | int bytes_directory_entries; /* bytes of directory entries to follow */ | ||
156 | struct | ||
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: */ | ||
172 | int magic; /* magic number ie 0x1ee70f42 */ | ||
173 | int num_directory_entries; /* number of directory entries to follow */ | ||
174 | int num_dictionary_entries; /* number of dictionary entries to follow */ | ||
175 | struct | ||
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]; | ||
188 | struct | ||
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. */ | ||
198 | int magic_sign; /* Optional, only if the eet file is signed. */ | ||
199 | int signature_length; /* Signature length. */ | ||
200 | int x509_length; /* Public certificate that signed the file. */ | ||
201 | char signature[signature_length]; /* The signature. */ | ||
202 | char 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 | ||
285 | static inline int | 165 | static inline int |
286 | eet_check_header(const Eet_File *ef) | 166 | eet_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 | ||
297 | static inline int | 177 | static inline int |
298 | eet_test_close(int test, | 178 | eet_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 */ |
311 | static Eet_File * | 191 | static 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 */ |
443 | static int | 323 | static 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 */ |
458 | static Eet_Error | 338 | static 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 | ||
671 | sign_error: | 543 | sign_error: |
672 | fclose(fp); | 544 | fclose(fp); |
673 | return error; | 545 | return error; |
674 | } /* eet_flush2 */ | 546 | } |
675 | 547 | ||
676 | EAPI int | 548 | EAPI int |
677 | eet_init(void) | 549 | eet_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) | |||
741 | shutdown_eet: | 616 | shutdown_eet: |
742 | #endif | 617 | #endif |
743 | eet_node_shutdown(); | 618 | eet_node_shutdown(); |
619 | shutdown_mempool: | ||
620 | eet_mempool_shutdown(); | ||
744 | unregister_log_domain: | 621 | unregister_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; |
747 | shutdown_eina: | 624 | shutdown_eina: |
748 | eina_shutdown(); | 625 | eina_shutdown(); |
749 | return --eet_init_count; | 626 | return --eet_init_count; |
750 | } /* eet_init */ | 627 | } |
751 | 628 | ||
752 | EAPI int | 629 | EAPI int |
753 | eet_shutdown(void) | 630 | eet_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 | ||
777 | EAPI Eet_Error | 655 | EAPI Eet_Error |
778 | eet_sync(Eet_File *ef) | 656 | eet_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 | ||
800 | EAPI void | 678 | EAPI void |
801 | eet_clearcache(void) | 679 | eet_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 */ |
859 | static Eet_File * | 737 | static 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 |
1118 | static Eet_File * | 996 | static 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 | ||
1337 | static Eet_Error | 1215 | static Eet_Error |
1338 | eet_internal_close(Eet_File *ef, | 1216 | eet_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 | ||
1440 | on_error: | 1319 | on_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 | ||
1447 | EAPI Eet_File * | 1326 | EAPI Eet_File * |
1448 | eet_memopen_read(const void *data, | 1327 | eet_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 | |||
1361 | EAPI const char * | ||
1362 | eet_file_get(Eet_File *ef) | ||
1363 | { | ||
1364 | if (eet_check_pointer(ef)) return NULL; | ||
1365 | return ef->path; | ||
1366 | } | ||
1481 | 1367 | ||
1482 | EAPI Eet_File * | 1368 | EAPI Eet_File * |
1483 | eet_open(const char *file, | 1369 | eet_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: | |||
1641 | on_error: | 1526 | on_error: |
1642 | UNLOCK_CACHE; | 1527 | UNLOCK_CACHE; |
1643 | return NULL; | 1528 | return NULL; |
1644 | } /* eet_open */ | 1529 | } |
1645 | 1530 | ||
1646 | EAPI Eet_File_Mode | 1531 | EAPI Eet_File_Mode |
1647 | eet_mode_get(Eet_File *ef) | 1532 | eet_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 | ||
1656 | EAPI const void * | 1541 | EAPI const void * |
1657 | eet_identity_x509(Eet_File *ef, | 1542 | eet_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 | ||
1669 | EAPI const void * | 1554 | EAPI const void * |
1670 | eet_identity_signature(Eet_File *ef, | 1555 | eet_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 | ||
1682 | EAPI const void * | 1567 | EAPI const void * |
1683 | eet_identity_sha1(Eet_File *ef, | 1568 | eet_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 | ||
1697 | EAPI Eet_Error | 1582 | EAPI Eet_Error |
1698 | eet_identity_set(Eet_File *ef, | 1583 | eet_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 | ||
1717 | EAPI Eet_Error | 1602 | EAPI Eet_Error |
1718 | eet_close(Eet_File *ef) | 1603 | eet_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 | ||
1723 | EAPI void * | 1608 | EAPI void * |
1724 | eet_read_cipher(Eet_File *ef, | 1609 | eet_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 | ||
1894 | EAPI void * | 1779 | EAPI void * |
1895 | eet_read(Eet_File *ef, | 1780 | eet_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 | ||
1902 | EAPI const void * | 1787 | EAPI const void * |
1903 | eet_read_direct(Eet_File *ef, | 1788 | eet_read_direct(Eet_File *ef, |
@@ -1995,7 +1880,7 @@ eet_read_direct(Eet_File *ef, | |||
1995 | on_error: | 1880 | on_error: |
1996 | UNLOCK_FILE(ef); | 1881 | UNLOCK_FILE(ef); |
1997 | return NULL; | 1882 | return NULL; |
1998 | } /* eet_read_direct */ | 1883 | } |
1999 | 1884 | ||
2000 | EAPI const char * | 1885 | EAPI const char * |
2001 | eet_alias_get(Eet_File *ef, | 1886 | eet_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, | |||
2230 | on_error: | 2115 | on_error: |
2231 | UNLOCK_FILE(ef); | 2116 | UNLOCK_FILE(ef); |
2232 | return EINA_FALSE; | 2117 | return EINA_FALSE; |
2233 | } /* eet_alias */ | 2118 | } |
2234 | 2119 | ||
2235 | EAPI int | 2120 | EAPI int |
2236 | eet_write_cipher(Eet_File *ef, | 2121 | eet_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, | |||
2413 | on_error: | 2298 | on_error: |
2414 | UNLOCK_FILE(ef); | 2299 | UNLOCK_FILE(ef); |
2415 | return 0; | 2300 | return 0; |
2416 | } /* eet_write_cipher */ | 2301 | } |
2417 | 2302 | ||
2418 | EAPI int | 2303 | EAPI int |
2419 | eet_write(Eet_File *ef, | 2304 | eet_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 | ||
2428 | EAPI int | 2313 | EAPI int |
2429 | eet_delete(Eet_File *ef, | 2314 | eet_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 | ||
2490 | EAPI Eet_Dictionary * | 2375 | EAPI Eet_Dictionary * |
2491 | eet_dictionary_get(Eet_File *ef) | 2376 | eet_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 | ||
2499 | EAPI char ** | 2384 | EAPI char ** |
2500 | eet_list(Eet_File *ef, | 2385 | eet_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 | ||
2583 | EAPI int | 2468 | EAPI int |
2584 | eet_num_entries(Eet_File *ef) | 2469 | eet_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 | ||
2610 | static Eet_File_Node * | 2495 | static Eet_File_Node * |
2611 | find_node_by_name(Eet_File *ef, | 2496 | find_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 | ||
2629 | static int | 2514 | static int |
2630 | read_data_from_disk(Eet_File *ef, | 2515 | read_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 | ||