3434
3535#include <fcntl.h>
3636#include <unistd.h>
37+ #include <errno.h>
3738#include <fnmatch.h>
3839#include <assert.h>
3940
@@ -122,7 +123,9 @@ _xdg_mime_cache_new_from_file (const char *file_name)
122123 int minor ;
123124
124125 /* Open the file and map it into memory */
125- fd = open (file_name , O_RDONLY |_O_BINARY , 0 );
126+ do {
127+ fd = open (file_name , O_RDONLY |_O_BINARY , 0 );
128+ } while (fd == -1 && errno == EINTR );
126129
127130 if (fd < 0 )
128131 return NULL ;
@@ -173,7 +176,7 @@ cache_magic_matchlet_compare_to_data (XdgMimeCache *cache,
173176 xdg_uint32_t data_offset = GET_UINT32 (cache -> buffer , offset + 16 );
174177 xdg_uint32_t mask_offset = GET_UINT32 (cache -> buffer , offset + 20 );
175178
176- int i , j ;
179+ xdg_uint32_t i , j ;
177180
178181 for (i = range_start ; i < range_start + range_length ; i ++ )
179182 {
@@ -196,7 +199,7 @@ cache_magic_matchlet_compare_to_data (XdgMimeCache *cache,
196199 }
197200 else
198201 {
199- valid_matchlet = memcmp (cache -> buffer + data_offset , data + i , data_length ) == 0 ;
202+ valid_matchlet = memcmp (cache -> buffer + data_offset , ( unsigned char * ) data + i , data_length ) == 0 ;
200203 }
201204
202205 if (valid_matchlet )
@@ -215,7 +218,7 @@ cache_magic_matchlet_compare (XdgMimeCache *cache,
215218 xdg_uint32_t n_children = GET_UINT32 (cache -> buffer , offset + 24 );
216219 xdg_uint32_t child_offset = GET_UINT32 (cache -> buffer , offset + 28 );
217220
218- int i ;
221+ xdg_uint32_t i ;
219222
220223 if (cache_magic_matchlet_compare_to_data (cache , offset , data , len ))
221224 {
@@ -245,7 +248,7 @@ cache_magic_compare_to_data (XdgMimeCache *cache,
245248 xdg_uint32_t n_matchlets = GET_UINT32 (cache -> buffer , offset + 8 );
246249 xdg_uint32_t matchlet_offset = GET_UINT32 (cache -> buffer , offset + 12 );
247250
248- int i ;
251+ xdg_uint32_t i ;
249252
250253 for (i = 0 ; i < n_matchlets ; i ++ )
251254 {
@@ -265,15 +268,13 @@ static const char *
265268cache_magic_lookup_data (XdgMimeCache * cache ,
266269 const void * data ,
267270 size_t len ,
268- int * prio ,
269- const char * mime_types [],
270- int n_mime_types )
271+ int * prio )
271272{
272273 xdg_uint32_t list_offset ;
273274 xdg_uint32_t n_entries ;
274275 xdg_uint32_t offset ;
275276
276- int j , n ;
277+ xdg_uint32_t j ;
277278
278279 * prio = 0 ;
279280
@@ -289,21 +290,6 @@ cache_magic_lookup_data (XdgMimeCache *cache,
289290 data , len , prio );
290291 if (match )
291292 return match ;
292- else
293- {
294- xdg_uint32_t mimetype_offset ;
295- const char * non_match ;
296-
297- mimetype_offset = GET_UINT32 (cache -> buffer , offset + 16 * j + 4 );
298- non_match = cache -> buffer + mimetype_offset ;
299-
300- for (n = 0 ; n < n_mime_types ; n ++ )
301- {
302- if (mime_types [n ] &&
303- _xdg_mime_mime_type_equal (mime_types [n ], non_match ))
304- mime_types [n ] = NULL ;
305- }
306- }
307293 }
308294
309295 return NULL ;
@@ -412,7 +398,8 @@ cache_glob_lookup_fnmatch (const char *file_name,
412398 const char * mime_type ;
413399 const char * ptr ;
414400
415- int i , j , n ;
401+ int i , n ;
402+ xdg_uint32_t j ;
416403
417404 n = 0 ;
418405 for (i = 0 ; _caches [i ]; i ++ )
@@ -468,7 +455,8 @@ cache_glob_node_lookup_suffix (XdgMimeCache *cache,
468455 int weight ;
469456 int case_sensitive ;
470457
471- int min , max , mid , n , i ;
458+ xdg_uint32_t i ;
459+ int min , max , mid , n ;
472460
473461 character = file_name [len - 1 ];
474462
@@ -677,8 +665,7 @@ cache_get_mime_type_for_data (const void *data,
677665 int prio ;
678666 const char * match ;
679667
680- match = cache_magic_lookup_data (cache , data , len , & prio ,
681- mime_types , n_mime_types );
668+ match = cache_magic_lookup_data (cache , data , len , & prio );
682669 if (prio > priority )
683670 {
684671 priority = prio ;
@@ -697,9 +684,11 @@ cache_get_mime_type_for_data (const void *data,
697684 if (mime_types [n ] && _xdg_mime_cache_mime_type_subclass (mime_types [n ], mime_type ))
698685 return mime_types [n ];
699686 }
700-
701- /* Return magic match */
702- return mime_type ;
687+ if (n == 0 )
688+ {
689+ /* No globs: return magic match */
690+ return mime_type ;
691+ }
703692 }
704693
705694 /* Pick first glob result, as fallback */
@@ -787,7 +776,7 @@ _xdg_mime_cache_get_mime_type_for_file (const char *file_name,
787776 mime_types , n );
788777
789778 if (!mime_type )
790- mime_type = _xdg_binary_or_text_fallback (data , bytes_read );
779+ mime_type = _xdg_binary_or_text_fallback (data , bytes_read );
791780
792781 free (data );
793782 fclose (file );
@@ -816,19 +805,28 @@ _xdg_mime_cache_get_mime_types_from_file_name (const char *file_name,
816805
817806#if 1
818807static int
819- is_super_type (const char * mime )
808+ ends_with (const char * str ,
809+ const char * suffix )
820810{
821811 int length ;
822- const char * type ;
812+ int suffix_length ;
823813
824- length = strlen (mime );
825- type = & (mime [length - 2 ]);
814+ length = strlen (str );
815+ suffix_length = strlen (suffix );
816+ if (length < suffix_length )
817+ return 0 ;
826818
827- if (strcmp (type , "/*" ) == 0 )
819+ if (strcmp (str + length - suffix_length , suffix ) == 0 )
828820 return 1 ;
829821
830822 return 0 ;
831823}
824+
825+ static int
826+ is_super_type (const char * mime )
827+ {
828+ return ends_with (mime , "/*" );
829+ }
832830#endif
833831
834832int
@@ -837,7 +835,8 @@ _xdg_mime_cache_mime_type_subclass (const char *mime,
837835{
838836 const char * umime , * ubase ;
839837
840- int i , j , min , max , med , cmp ;
838+ xdg_uint32_t j ;
839+ int i , min , max , med , cmp ;
841840
842841 umime = _xdg_mime_cache_unalias_mime_type (mime );
843842 ubase = _xdg_mime_cache_unalias_mime_type (base );
@@ -860,7 +859,8 @@ _xdg_mime_cache_mime_type_subclass (const char *mime,
860859 strncmp (umime , "text/" , 5 ) == 0 )
861860 return 1 ;
862861
863- if (strcmp (ubase , "application/octet-stream" ) == 0 )
862+ if (strcmp (ubase , "application/octet-stream" ) == 0 &&
863+ strncmp (umime , "inode/" , 6 ) != 0 )
864864 return 1 ;
865865
866866 for (i = 0 ; _caches [i ]; i ++ )
@@ -919,7 +919,8 @@ _xdg_mime_cache_unalias_mime_type (const char *mime)
919919char * *
920920_xdg_mime_cache_list_mime_parents (const char * mime )
921921{
922- int i , j , k , l , p ;
922+ int i , l , p ;
923+ xdg_uint32_t j , k ;
923924 char * all_parents [128 ]; /* we'll stop at 128 */
924925 char * * result ;
925926
@@ -1031,6 +1032,7 @@ dump_glob_node (XdgMimeCache *cache,
10311032 xdg_uint32_t mime_offset ;
10321033 xdg_uint32_t n_children ;
10331034 xdg_uint32_t child_offset ;
1035+ xdg_uint32_t k ;
10341036 int i ;
10351037
10361038 character = GET_UINT32 (cache -> buffer , offset );
@@ -1045,15 +1047,15 @@ dump_glob_node (XdgMimeCache *cache,
10451047 printf ("\n" );
10461048 if (child_offset )
10471049 {
1048- for (i = 0 ; i < n_children ; i ++ )
1049- dump_glob_node (cache , child_offset + 20 * i , depth + 1 );
1050+ for (k = 0 ; k < n_children ; k ++ )
1051+ dump_glob_node (cache , child_offset + 20 * k , depth + 1 );
10501052 }
10511053}
10521054
10531055void
10541056_xdg_mime_cache_glob_dump (void )
10551057{
1056- int i , j ;
1058+ xdg_uint32_t i , j ;
10571059 for (i = 0 ; _caches [i ]; i ++ )
10581060 {
10591061 XdgMimeCache * cache = _caches [i ];
@@ -1067,3 +1069,5 @@ _xdg_mime_cache_glob_dump (void)
10671069 dump_glob_node (cache , offset + 20 * j , 0 );
10681070 }
10691071}
1072+
1073+
0 commit comments