17 # magically route argument
19 my($self, $argument) = @_;
21 if (length $argument > 1024 || $argument =~ m/\n/) {
22 # assume it's data. Saves a stat call if the data's long
23 # also avoids stat warning if there's a newline
24 return $self->checktype_contents($argument);
29 return $self->checktype_filename($argument);
31 return undef; # directories don't have mime types
34 # otherwise, fall back to checking the string as if it's data again
35 return $self->checktype_contents($argument);
38 sub checktype_filename {
39 # reads in 16k of selected file, or returns undef if can't open,
40 # then checks contents
42 my($self, $filename) = @_;
43 my $fh = IO::File->new($filename) || return undef;
45 $fh->read($data, 16*1024);
47 return $self->checktype_contents($data);
50 sub checktype_contents {
51 # checks file contents
53 my($self, $data) = @_;
56 # autogenerated code begins
58 if ($data =~ m[^TADS]) {
59 return q{application/x-tads-game};
61 if ($data =~ m[^Core\001]) {
62 return q{application/x-executable-file};
64 if ($data =~ m[^AMANDA\:\ TAPESTART\ DATE]) {
65 return q{application/x-amanda-header};
67 if (length $data > 0) {
68 $substr = substr($data, 0, 4);
69 if (pack('H*', '000003f3') eq $substr ) {
70 return q{application/x-executable-file};
73 if (length $data > 0) {
74 $substr = substr($data, 0, 4);
75 if (pack('H*', '000003e7') eq $substr ) {
76 return q{application/x-library-file};
79 if (length $data > 0) {
80 $substr = substr($data, 0, 4);
81 if (pack('H*', '000001b3') eq $substr ) {
85 if (length $data > 0) {
86 $substr = substr($data, 0, 4);
87 if (pack('H*', '000001ba') eq $substr ) {
91 if (length $data > 0) {
92 $substr = substr($data, 0, 2);
93 if (pack('H*', 'fff0') eq $substr ) {
97 if ($data =~ m[^MOVI]) {
98 return q{video/x-sgi-movie};
100 if (length $data > 4) {
101 $substr = substr($data, 4, 1024);
102 if (defined $substr && $substr =~ m[^moov]) {
103 return q{video/quicktime};
106 if (length $data > 4) {
107 $substr = substr($data, 4, 1024);
108 if (defined $substr && $substr =~ m[^mdat]) {
109 return q{video/quicktime};
112 if (length $data > 8) {
113 $substr = substr($data, 8, 1024);
114 if (defined $substr && $substr =~ m[^mp42]) {
115 return q{video/quicktime};
118 if (length $data > 12) {
119 $substr = substr($data, 12, 1024);
120 if (defined $substr && $substr =~ m[^mdat]) {
121 return q{video/quicktime};
124 if (length $data > 36) {
125 $substr = substr($data, 36, 1024);
126 if (defined $substr && $substr =~ m[^mdat]) {
127 return q{video/quicktime};
130 if (length $data > 0) {
131 $substr = substr($data, 0, 4);
132 if (pack('H*', '3026b275') eq $substr ) {
133 return q{video/x-ms-asf};
136 if ($data =~ m[^ASF\ ]) {
137 return q{audio/x-ms-asx};
139 if ($data =~ m[^\<ASX]) {
140 return q{audio/x-ms-asx};
142 if ($data =~ m[^\<asx]) {
143 return q{audio/x-ms-asx};
145 if ($data =~ m[^FiLeStArTfIlEsTaRt]) {
146 return q{text/x-apple-binscii};
148 if ($data =~ m[^\x0aGL]) {
149 return q{application/data};
151 if ($data =~ m[^\x76\xff]) {
152 return q{application/data};
154 if ($data =~ m[^NuFile]) {
155 return q{application/data};
157 if ($data =~ m[^N\xf5F\xe9l\xe5]) {
158 return q{application/data};
160 if (length $data > 0) {
161 $substr = substr($data, 0, 4);
162 if (pack('H*', '00051600') eq $substr ) {
163 return q{application/data};
166 if (length $data > 0) {
167 $substr = substr($data, 0, 4);
168 if (pack('H*', '00051607') eq $substr ) {
169 return q{application/data};
172 if (length $data > 257) {
173 $substr = substr($data, 257, 1024);
174 if (defined $substr && $substr =~ m[^ustar\0]) {
175 return q{application/x-tar};
178 if (length $data > 257) {
179 $substr = substr($data, 257, 1024);
180 if (defined $substr && $substr =~ m[^ustar\040\040\0]) {
181 return q{application/x-gtar};
184 if ($data =~ m[^070707]) {
185 return q{application/x-cpio};
187 if ($data =~ m[^070701]) {
188 return q{application/x-cpio};
190 if ($data =~ m[^070702]) {
191 return q{application/x-cpio};
193 if ($data =~ m[^\!\<arch\>\ndebian]) {
194 return q{application/x-dpkg};
196 if ($data =~ m[^\=\<ar\>]) {
197 return q{application/x-ar};
199 if ($data =~ m[^\!\<arch\>\n__________E]) {
200 return q{application/x-ar};
202 if ($data =~ m[^\-h\-]) {
203 return q{application/data};
205 if ($data =~ m[^\!\<arch\>]) {
206 return q{application/x-ar};
208 if ($data =~ m[^\<ar\>]) {
209 return q{application/x-ar};
211 if ($data =~ m[^\=\<ar\>]) {
212 return q{application/x-ar};
214 if (length $data > 0) {
215 $substr = substr($data, 0, 4);
216 if (pack('H*', '65ff0000') eq $substr ) {
217 return q{application/x-ar};
220 if (length $data > 0) {
221 $substr = substr($data, 0, 4);
222 if (pack('H*', '3c61723e') eq $substr ) {
223 return q{application/x-ar};
226 if ($data =~ m[^\032archive]) {
227 return q{application/data};
229 if ($data =~ m[^HPAK]) {
230 return q{application/data};
232 if ($data =~ m[^\351\,\001JAM\ ]) {
233 return q{application/data};
235 if (length $data > 2) {
236 $substr = substr($data, 2, 1024);
237 if (defined $substr && $substr =~ m[^\-lh0\-]) {
238 return q{application/x-lha};
241 if (length $data > 2) {
242 $substr = substr($data, 2, 1024);
243 if (defined $substr && $substr =~ m[^\-lh1\-]) {
244 return q{application/x-lha};
247 if (length $data > 2) {
248 $substr = substr($data, 2, 1024);
249 if (defined $substr && $substr =~ m[^\-lz4\-]) {
250 return q{application/x-lha};
253 if (length $data > 2) {
254 $substr = substr($data, 2, 1024);
255 if (defined $substr && $substr =~ m[^\-lz5\-]) {
256 return q{application/x-lha};
259 if (length $data > 2) {
260 $substr = substr($data, 2, 1024);
261 if (defined $substr && $substr =~ m[^\-lzs\-]) {
262 return q{application/x-lha};
265 if (length $data > 2) {
266 $substr = substr($data, 2, 1024);
267 if (defined $substr && $substr =~ m[^\-lh40\-]) {
268 return q{application/x-lha};
271 if (length $data > 2) {
272 $substr = substr($data, 2, 1024);
273 if (defined $substr && $substr =~ m[^\-lhd\-]) {
274 return q{application/x-lha};
277 if (length $data > 2) {
278 $substr = substr($data, 2, 1024);
279 if (defined $substr && $substr =~ m[^\-lh2\-]) {
280 return q{application/x-lha};
283 if (length $data > 2) {
284 $substr = substr($data, 2, 1024);
285 if (defined $substr && $substr =~ m[^\-lh3\-]) {
286 return q{application/x-lha};
289 if (length $data > 2) {
290 $substr = substr($data, 2, 1024);
291 if (defined $substr && $substr =~ m[^\-lh4\-]) {
292 return q{application/x-lha};
295 if (length $data > 2) {
296 $substr = substr($data, 2, 1024);
297 if (defined $substr && $substr =~ m[^\-lh5\-]) {
298 return q{application/x-lha};
301 if ($data =~ m[^Rar\!]) {
302 return q{application/x-rar};
304 if ($data =~ m[^SQSH]) {
305 return q{application/data};
307 if ($data =~ m[^UC2\x1a]) {
308 return q{application/data};
310 if ($data =~ m[^PK\003\004]) {
311 return q{application/zip};
313 if (length $data > 10) {
314 $substr = substr($data, 10, 1024);
315 if (defined $substr && $substr =~ m[^\#\ This\ is\ a\ shell\ archive]) {
316 return q{application/x-shar};
319 if ($data =~ m[^\*STA]) {
320 return q{application/data};
322 if ($data =~ m[^2278]) {
323 return q{application/data};
325 if ($data =~ m[^\000\004\036\212\200]) {
326 return q{application/core};
328 if ($data =~ m[^\.snd]) {
329 return q{audio/basic};
331 if ($data =~ m[^MThd]) {
332 return q{audio/midi};
334 if ($data =~ m[^CTMF]) {
335 return q{audio/x-cmf};
337 if ($data =~ m[^SBI]) {
338 return q{audio/x-sbi};
340 if ($data =~ m[^Creative\ Voice\ File]) {
341 return q{audio/x-voc};
343 if (length $data > 0) {
344 $substr = substr($data, 0, 4);
345 if (pack('H*', '4e54524b') eq $substr ) {
346 return q{audio/x-multitrack};
349 if (length $data > 8) {
350 $substr = substr($data, 8, 1024);
351 if (defined $substr && $substr =~ m[^AVI]) {
352 return q{video/x-msvideo};
355 if (length $data > 8) {
356 $substr = substr($data, 8, 1024);
357 if (defined $substr && $substr =~ m[^WAVE]) {
358 return q{audio/x-wav};
361 if ($data =~ m[^EMOD]) {
362 return q{audio/x-emod};
364 if (length $data > 0) {
365 $substr = substr($data, 0, 4);
366 if (pack('H*', '2e7261fd') eq $substr ) {
367 return q{audio/x-pn-realaudio};
370 if ($data =~ m[^MTM]) {
371 return q{audio/x-multitrack};
373 if ($data =~ m[^if]) {
374 return q{audio/x-669-mod};
376 if ($data =~ m[^FAR]) {
379 if ($data =~ m[^MAS_U]) {
380 return q{audio/x-multimate-mod};
382 if (length $data > 0x2c) {
383 $substr = substr($data, 0x2c, 1024);
384 if (defined $substr && $substr =~ m[^SCRM]) {
385 return q{audio/x-st3-mod};
388 if ($data =~ m[^GF1PATCH110\0ID\#000002\0]) {
389 return q{audio/x-gus-patch};
391 if ($data =~ m[^GF1PATCH100\0ID\#000002\0]) {
392 return q{audio/x-gus-patch};
394 if ($data =~ m[^JN]) {
395 return q{audio/x-669-mod};
397 if ($data =~ m[^UN05]) {
398 return q{audio/x-mikmod-uni};
400 if ($data =~ m[^Extended\ Module\:]) {
401 return q{audio/x-ft2-mod};
403 if (length $data > 21) {
404 $substr = substr($data, 21, 1024);
405 if (defined $substr && $substr =~ m[^\!SCREAM\!]) {
406 return q{audio/x-st2-mod};
409 if (length $data > 1080) {
410 $substr = substr($data, 1080, 1024);
411 if (defined $substr && $substr =~ m[^M\.K\.]) {
412 return q{audio/x-protracker-mod};
415 if (length $data > 1080) {
416 $substr = substr($data, 1080, 1024);
417 if (defined $substr && $substr =~ m[^M\!K\!]) {
418 return q{audio/x-protracker-mod};
421 if (length $data > 1080) {
422 $substr = substr($data, 1080, 1024);
423 if (defined $substr && $substr =~ m[^FLT4]) {
424 return q{audio/x-startracker-mod};
427 if (length $data > 1080) {
428 $substr = substr($data, 1080, 1024);
429 if (defined $substr && $substr =~ m[^4CHN]) {
430 return q{audio/x-fasttracker-mod};
433 if (length $data > 1080) {
434 $substr = substr($data, 1080, 1024);
435 if (defined $substr && $substr =~ m[^6CHN]) {
436 return q{audio/x-fasttracker-mod};
439 if (length $data > 1080) {
440 $substr = substr($data, 1080, 1024);
441 if (defined $substr && $substr =~ m[^8CHN]) {
442 return q{audio/x-fasttracker-mod};
445 if (length $data > 1080) {
446 $substr = substr($data, 1080, 1024);
447 if (defined $substr && $substr =~ m[^CD81]) {
448 return q{audio/x-oktalyzer-mod};
451 if (length $data > 1080) {
452 $substr = substr($data, 1080, 1024);
453 if (defined $substr && $substr =~ m[^OKTA]) {
454 return q{audio/x-oktalyzer-mod};
457 if (length $data > 1080) {
458 $substr = substr($data, 1080, 1024);
459 if (defined $substr && $substr =~ m[^16CN]) {
460 return q{audio/x-taketracker-mod};
463 if (length $data > 1080) {
464 $substr = substr($data, 1080, 1024);
465 if (defined $substr && $substr =~ m[^32CN]) {
466 return q{audio/x-taketracker-mod};
469 if ($data =~ m[^TOC]) {
470 return q{audio/x-toc};
472 if (length $data > 0) {
473 $substr = substr($data, 0, 2);
474 if (pack('H*', 'fffa') eq $substr ) {
478 if ($data =~ m[^ID3]) {
481 if ($data =~ m[^\/\/]) {
484 if ($data =~ m[^\\1cw\ ]) {
485 return q{application/data};
487 if ($data =~ m[^\\1cw]) {
488 return q{application/data};
490 if (length $data > 0) {
491 $substr = substr($data, 0, 4);
492 if (pack('H*', '85011400') eq $substr ) {
493 return q{application/data};
496 if (length $data > 0) {
497 $substr = substr($data, 0, 4);
498 if (pack('H*', '8501cb00') eq $substr ) {
499 return q{application/data};
502 if (length $data > 4) {
503 $substr = substr($data, 4, 1024);
504 if (defined $substr && $substr =~ m[^pipe]) {
505 return q{application/data};
508 if (length $data > 4) {
509 $substr = substr($data, 4, 1024);
510 if (defined $substr && $substr =~ m[^prof]) {
511 return q{application/data};
514 if ($data =~ m[^\:\ shell]) {
515 return q{application/data};
517 if ($data =~ m[^\#\!\/bin\/sh]) {
518 return q{application/x-sh};
520 if ($data =~ m[^\#\!\ \/bin\/sh]) {
521 return q{application/x-sh};
523 if ($data =~ m[^\#\!\ \/bin\/sh]) {
524 return q{application/x-sh};
526 if ($data =~ m[^\#\!\/bin\/csh]) {
527 return q{application/x-csh};
529 if ($data =~ m[^\#\!\ \/bin\/csh]) {
530 return q{application/x-csh};
532 if ($data =~ m[^\#\!\ \/bin\/csh]) {
533 return q{application/x-csh};
535 if ($data =~ m[^\#\!\/bin\/ksh]) {
536 return q{application/x-ksh};
538 if ($data =~ m[^\#\!\ \/bin\/ksh]) {
539 return q{application/x-ksh};
541 if ($data =~ m[^\#\!\ \/bin\/ksh]) {
542 return q{application/x-ksh};
544 if ($data =~ m[^\#\!\/bin\/tcsh]) {
545 return q{application/x-csh};
547 if ($data =~ m[^\#\!\ \/bin\/tcsh]) {
548 return q{application/x-csh};
550 if ($data =~ m[^\#\!\ \/bin\/tcsh]) {
551 return q{application/x-csh};
553 if ($data =~ m[^\#\!\/usr\/local\/tcsh]) {
554 return q{application/x-csh};
556 if ($data =~ m[^\#\!\ \/usr\/local\/tcsh]) {
557 return q{application/x-csh};
559 if ($data =~ m[^\#\!\/usr\/local\/bin\/tcsh]) {
560 return q{application/x-csh};
562 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/tcsh]) {
563 return q{application/x-csh};
565 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/tcsh]) {
566 return q{application/x-csh};
568 if ($data =~ m[^\#\!\/usr\/local\/bin\/zsh]) {
569 return q{application/x-zsh};
571 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/zsh]) {
572 return q{application/x-zsh};
574 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/zsh]) {
575 return q{application/x-zsh};
577 if ($data =~ m[^\#\!\/usr\/local\/bin\/ash]) {
578 return q{application/x-sh};
580 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/ash]) {
581 return q{application/x-zsh};
583 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/ash]) {
584 return q{application/x-zsh};
586 if ($data =~ m[^\#\!\/usr\/local\/bin\/ae]) {
587 return q{text/script};
589 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/ae]) {
590 return q{text/script};
592 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/ae]) {
593 return q{text/script};
595 if ($data =~ m[^\#\!\/bin\/nawk]) {
596 return q{application/x-awk};
598 if ($data =~ m[^\#\!\ \/bin\/nawk]) {
599 return q{application/x-awk};
601 if ($data =~ m[^\#\!\ \/bin\/nawk]) {
602 return q{application/x-awk};
604 if ($data =~ m[^\#\!\/usr\/bin\/nawk]) {
605 return q{application/x-awk};
607 if ($data =~ m[^\#\!\ \/usr\/bin\/nawk]) {
608 return q{application/x-awk};
610 if ($data =~ m[^\#\!\ \/usr\/bin\/nawk]) {
611 return q{application/x-awk};
613 if ($data =~ m[^\#\!\/usr\/local\/bin\/nawk]) {
614 return q{application/x-awk};
616 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/nawk]) {
617 return q{application/x-awk};
619 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/nawk]) {
620 return q{application/x-awk};
622 if ($data =~ m[^\#\!\/bin\/gawk]) {
623 return q{application/x-awk};
625 if ($data =~ m[^\#\!\ \/bin\/gawk]) {
626 return q{application/x-awk};
628 if ($data =~ m[^\#\!\ \/bin\/gawk]) {
629 return q{application/x-awk};
631 if ($data =~ m[^\#\!\/usr\/bin\/gawk]) {
632 return q{application/x-awk};
634 if ($data =~ m[^\#\!\ \/usr\/bin\/gawk]) {
635 return q{application/x-awk};
637 if ($data =~ m[^\#\!\ \/usr\/bin\/gawk]) {
638 return q{application/x-awk};
640 if ($data =~ m[^\#\!\/usr\/local\/bin\/gawk]) {
641 return q{application/x-awk};
643 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/gawk]) {
644 return q{application/x-awk};
646 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/gawk]) {
647 return q{application/x-awk};
649 if ($data =~ m[^\#\!\/bin\/awk]) {
650 return q{application/x-awk};
652 if ($data =~ m[^\#\!\ \/bin\/awk]) {
653 return q{application/x-awk};
655 if ($data =~ m[^\#\!\ \/bin\/awk]) {
656 return q{application/x-awk};
658 if ($data =~ m[^\#\!\/usr\/bin\/awk]) {
659 return q{application/x-awk};
661 if ($data =~ m[^\#\!\ \/usr\/bin\/awk]) {
662 return q{application/x-awk};
664 if ($data =~ m[^\#\!\ \/usr\/bin\/awk]) {
665 return q{application/x-awk};
667 if ($data =~ m[^BEGIN]) {
668 return q{application/x-awk};
670 if ($data =~ m[^\#\!\/bin\/perl]) {
671 return q{application/x-perl};
673 if ($data =~ m[^\#\!\ \/bin\/perl]) {
674 return q{application/x-perl};
676 if ($data =~ m[^\#\!\ \/bin\/perl]) {
677 return q{application/x-perl};
679 if ($data =~ m[^eval\ \"exec\ \/bin\/perl]) {
680 return q{application/x-perl};
682 if ($data =~ m[^\#\!\/usr\/bin\/perl]) {
683 return q{application/x-perl};
685 if ($data =~ m[^\#\!\ \/usr\/bin\/perl]) {
686 return q{application/x-perl};
688 if ($data =~ m[^\#\!\ \/usr\/bin\/perl]) {
689 return q{application/x-perl};
691 if ($data =~ m[^eval\ \"exec\ \/usr\/bin\/perl]) {
692 return q{application/x-perl};
694 if ($data =~ m[^\#\!\/usr\/local\/bin\/perl]) {
695 return q{application/x-perl};
697 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/perl]) {
698 return q{application/x-perl};
700 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/perl]) {
701 return q{application/x-perl};
703 if ($data =~ m[^eval\ \"exec\ \/usr\/local\/bin\/perl]) {
704 return q{application/x-perl};
706 if ($data =~ m[^\#\!\/bin\/rc]) {
707 return q{text/script};
709 if ($data =~ m[^\#\!\ \/bin\/rc]) {
710 return q{text/script};
712 if ($data =~ m[^\#\!\ \/bin\/rc]) {
713 return q{text/script};
715 if ($data =~ m[^\#\!\/bin\/bash]) {
716 return q{application/x-sh};
718 if ($data =~ m[^\#\!\ \/bin\/bash]) {
719 return q{application/x-sh};
721 if ($data =~ m[^\#\!\ \/bin\/bash]) {
722 return q{application/x-sh};
724 if ($data =~ m[^\#\!\/usr\/local\/bin\/bash]) {
725 return q{application/x-sh};
727 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/bash]) {
728 return q{application/x-sh};
730 if ($data =~ m[^\#\!\ \/usr\/local\/bin\/bash]) {
731 return q{application/x-sh};
733 if ($data =~ m[^\#\!\ \/]) {
734 return q{text/script};
736 if ($data =~ m[^\#\!\ \/]) {
737 return q{text/script};
739 if ($data =~ m[^\#\!\/]) {
740 return q{text/script};
742 if ($data =~ m[^\#\!\ ]) {
743 return q{text/script};
745 if ($data =~ m[^\037\235]) {
746 return q{application/compress};
748 if ($data =~ m[^\037\213]) {
749 return q{application/x-gzip};
751 if ($data =~ m[^\037\036]) {
752 return q{application/data};
754 if ($data =~ m[^\377\037]) {
755 return q{application/data};
757 if ($data =~ m[^BZh]) {
758 return q{application/x-bzip2};
760 if ($data =~ m[^\037\237]) {
761 return q{application/data};
763 if ($data =~ m[^\037\236]) {
764 return q{application/data};
766 if ($data =~ m[^\037\240]) {
767 return q{application/data};
769 if ($data =~ m[^BZ]) {
770 return q{application/x-bzip};
772 if ($data =~ m[^\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a]) {
773 return q{application/data};
775 if (length $data > 0) {
776 $substr = substr($data, 0, 4);
777 if (pack('H*', '011257') eq $substr ) {
778 return q{application/core};
781 if (length $data > 0) {
782 $substr = substr($data, 0, 4);
783 if (pack('H*', '13579ace') eq $substr ) {
784 return q{application/x-gdbm};
787 if ($data =~ m[^GDBM]) {
788 return q{application/x-gdbm};
790 if (length $data > 0) {
791 $substr = substr($data, 0, 4);
792 if (pack('H*', '061561') eq $substr ) {
793 return q{application/x-db};
796 if (length $data > 0) {
797 $substr = substr($data, 0, 4);
798 if (pack('H*', '053162') eq $substr ) {
799 return q{application/x-db};
802 if ($data =~ m[^\=\<list\>\n\<protocol\ bbn\-m]) {
803 return q{application/data};
805 if ($data =~ m[^diff\ ]) {
806 return q{text/x-patch};
808 if ($data =~ m[^\*\*\*\ ]) {
809 return q{text/x-patch};
811 if ($data =~ m[^Only\ in\ ]) {
812 return q{text/x-patch};
814 if ($data =~ m[^Common\ subdirectories\:\ ]) {
815 return q{text/x-patch};
817 if ($data =~ m[^\!\<arch\>\n________64E]) {
818 return q{application/data};
820 if ($data =~ m[^\377\377\177]) {
821 return q{application/data};
823 if ($data =~ m[^\377\377\174]) {
824 return q{application/data};
826 if ($data =~ m[^\377\377\176]) {
827 return q{application/data};
829 if ($data =~ m[^\033c\033]) {
830 return q{application/data};
832 if ($data =~ m[^\!\<PDF\>\!\n]) {
833 return q{application/x-prof};
835 if ($data =~ m[^\177ELF]) {
836 return q{application/x-executable-file};
838 if ($data =~ m[^\366\366\366\366]) {
839 return q{application/x-pc-floppy};
841 if (length $data > 0774) {
842 $substr = substr($data, 0774, 2);
843 if (pack('H*', 'dabe') eq $substr ) {
844 return q{application/data};
847 if ($data =~ m[^\-rom1fs\-\0]) {
848 return q{application/x-filesystem};
850 if (length $data > 0x18b) {
851 $substr = substr($data, 0x18b, 1024);
852 if (defined $substr && $substr =~ m[^OS\/2]) {
853 return q{application/x-bootable};
856 if ($data =~ m[^FONT]) {
857 return q{font/x-vfont};
859 if ($data =~ m[^\%\!PS\-AdobeFont\-1\.0]) {
860 return q{font/type1};
862 if (length $data > 6) {
863 $substr = substr($data, 6, 1024);
864 if (defined $substr && $substr =~ m[^\%\!PS\-AdobeFont\-1\.0]) {
865 return q{font/type1};
868 if ($data =~ m[^STARTFONT\040]) {
869 return q{font/x-bdf};
871 if ($data =~ m[^\001fcp]) {
872 return q{font/x-pcf};
874 if ($data =~ m[^D1\.0\015]) {
875 return q{font/x-speedo};
877 if ($data =~ m[^flf]) {
878 return q{font/x-figlet};
880 if ($data =~ m[^flc]) {
881 return q{application/x-font};
883 if (length $data > 0) {
884 $substr = substr($data, 0, 4);
885 if (pack('H*', '14025919') eq $substr ) {
886 return q{font/x-libgrx};
889 if (length $data > 0) {
890 $substr = substr($data, 0, 4);
891 if (pack('H*', 'ff464f4e') eq $substr ) {
892 return q{font/x-dos};
895 if (length $data > 7) {
896 $substr = substr($data, 7, 4);
897 if (pack('H*', '00454741') eq $substr ) {
898 return q{font/x-dos};
901 if (length $data > 7) {
902 $substr = substr($data, 7, 4);
903 if (pack('H*', '00564944') eq $substr ) {
904 return q{font/x-dos};
907 if (length $data > 4098) {
908 $substr = substr($data, 4098, 1024);
909 if (defined $substr && $substr =~ m[^DOSFONT]) {
910 return q{font/x-dos};
913 if ($data =~ m[^\<MakerFile]) {
914 return q{application/x-framemaker};
916 if ($data =~ m[^\<MIFFile]) {
917 return q{application/x-framemaker};
919 if ($data =~ m[^\<MakerDictionary]) {
920 return q{application/x-framemaker};
922 if ($data =~ m[^\<MakerScreenFont]) {
923 return q{font/x-framemaker};
925 if ($data =~ m[^\<MML]) {
926 return q{application/x-framemaker};
928 if ($data =~ m[^\<BookFile]) {
929 return q{application/x-framemaker};
931 if ($data =~ m[^\<Maker]) {
932 return q{application/x-framemaker};
934 if (length $data > 7) {
935 $substr = substr($data, 7, 1024);
936 if (defined $substr && $substr =~ m[^\357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]) {
937 return q{application/core};
940 if ($data =~ m[^GIMP\ Gradient]) {
941 return q{application/x-gimp-gradient};
943 if ($data =~ m[^gimp\ xcf]) {
944 return q{application/x-gimp-image};
946 if (length $data > 20) {
947 $substr = substr($data, 20, 1024);
948 if (defined $substr && $substr =~ m[^GPAT]) {
949 return q{application/x-gimp-pattern};
952 if (length $data > 20) {
953 $substr = substr($data, 20, 1024);
954 if (defined $substr && $substr =~ m[^GIMP]) {
955 return q{application/x-gimp-brush};
958 if ($data =~ m[^\336\224\225]) {
959 return q{application/x-locale};
961 if ($data =~ m[^\2254\22\336]) {
962 return q{application/x-locale};
964 if ($data =~ m[^\000\001\000\000\000]) {
967 if (length $data > 0) {
968 $substr = substr($data, 0, 4);
969 if (pack('H*', '02100106') eq $substr ) {
970 return q{application/x-object-file};
973 if (length $data > 0) {
974 $substr = substr($data, 0, 4);
975 if (pack('H*', '02100107') eq $substr ) {
976 return q{application/x-executable-file};
979 if (length $data > 0) {
980 $substr = substr($data, 0, 4);
981 if (pack('H*', '02100108') eq $substr ) {
982 return q{application/x-executable-file};
985 if (length $data > 0) {
986 $substr = substr($data, 0, 4);
987 if (pack('H*', '0210010b') eq $substr ) {
988 return q{application/x-executable-file};
991 if (length $data > 0) {
992 $substr = substr($data, 0, 4);
993 if (pack('H*', '0210010e') eq $substr ) {
994 return q{application/x-library-file};
997 if (length $data > 0) {
998 $substr = substr($data, 0, 4);
999 if (pack('H*', '0210010d') eq $substr ) {
1000 return q{application/x-library-file};
1003 if (length $data > 0) {
1004 $substr = substr($data, 0, 4);
1005 if (pack('H*', '02140106') eq $substr ) {
1006 return q{application/x-object-file};
1009 if (length $data > 0) {
1010 $substr = substr($data, 0, 4);
1011 if (pack('H*', '02140107') eq $substr ) {
1012 return q{application/x-executable-file};
1015 if (length $data > 0) {
1016 $substr = substr($data, 0, 4);
1017 if (pack('H*', '02140108') eq $substr ) {
1018 return q{application/x-executable-file};
1021 if (length $data > 0) {
1022 $substr = substr($data, 0, 4);
1023 if (pack('H*', '0214010b') eq $substr ) {
1024 return q{application/x-executable-file};
1027 if (length $data > 0) {
1028 $substr = substr($data, 0, 4);
1029 if (pack('H*', '0214010e') eq $substr ) {
1030 return q{application/x-library-file};
1033 if (length $data > 0) {
1034 $substr = substr($data, 0, 4);
1035 if (pack('H*', '0214010d') eq $substr ) {
1036 return q{application/x-object-file};
1039 if (length $data > 0) {
1040 $substr = substr($data, 0, 4);
1041 if (pack('H*', '020b0106') eq $substr ) {
1042 return q{application/x-object-file};
1045 if (length $data > 0) {
1046 $substr = substr($data, 0, 4);
1047 if (pack('H*', '020b0107') eq $substr ) {
1048 return q{application/x-executable-file};
1051 if (length $data > 0) {
1052 $substr = substr($data, 0, 4);
1053 if (pack('H*', '020b0108') eq $substr ) {
1054 return q{application/x-executable-file};
1057 if (length $data > 0) {
1058 $substr = substr($data, 0, 4);
1059 if (pack('H*', '020b010b') eq $substr ) {
1060 return q{application/x-executable-file};
1063 if (length $data > 0) {
1064 $substr = substr($data, 0, 4);
1065 if (pack('H*', '020b010e') eq $substr ) {
1066 return q{application/x-library-file};
1069 if (length $data > 0) {
1070 $substr = substr($data, 0, 4);
1071 if (pack('H*', '020b010d') eq $substr ) {
1072 return q{application/x-library-file};
1075 if (length $data > 0) {
1076 $substr = substr($data, 0, 4);
1077 if (pack('H*', '213c6172') eq $substr ) {
1078 return q{application/x-ar};
1081 if (length $data > 0) {
1082 $substr = substr($data, 0, 4);
1083 if (pack('H*', '020c0108') eq $substr ) {
1084 return q{application/x-executable-file};
1087 if (length $data > 0) {
1088 $substr = substr($data, 0, 4);
1089 if (pack('H*', '020c0107') eq $substr ) {
1090 return q{application/x-executable-file};
1093 if (length $data > 0) {
1094 $substr = substr($data, 0, 4);
1095 if (pack('H*', '020c010b') eq $substr ) {
1096 return q{application/x-executable-file};
1099 if (length $data > 0) {
1100 $substr = substr($data, 0, 4);
1101 if (pack('H*', '020c0106') eq $substr ) {
1102 return q{application/x-executable-file};
1105 if (length $data > 0) {
1106 $substr = substr($data, 0, 4);
1107 if (pack('H*', '020a0108') eq $substr ) {
1108 return q{application/x-executable-file};
1111 if (length $data > 0) {
1112 $substr = substr($data, 0, 4);
1113 if (pack('H*', '020a0107') eq $substr ) {
1114 return q{application/x-executable-file};
1117 if (length $data > 0) {
1118 $substr = substr($data, 0, 4);
1119 if (pack('H*', '020c010e') eq $substr ) {
1120 return q{application/x-library-file};
1123 if (length $data > 0) {
1124 $substr = substr($data, 0, 4);
1125 if (pack('H*', '020c010d') eq $substr ) {
1126 return q{application/x-library-file};
1129 if ($data =~ m[^Bitmapfile]) {
1130 return q{image/unknown};
1132 if ($data =~ m[^IMGfile]) {
1133 return q{CIS image/unknown};
1135 if ($data =~ m[^msgcat01]) {
1136 return q{application/x-locale};
1138 if ($data =~ m[^HPHP48\-]) {
1139 return q{application/unknown};
1141 if ($data =~ m[^\%\%HP\:]) {
1142 return q{text/x-unknown};
1144 if (length $data > 0) {
1145 $substr = substr($data, 0, 2);
1146 if (pack('H*', '01df') eq $substr ) {
1147 return q{application/executable};
1150 if (length $data > 0) {
1151 $substr = substr($data, 0, 2);
1152 if (pack('H*', '0104') eq $substr ) {
1153 return q{application/x-shared-library};
1156 if (length $data > 0) {
1157 $substr = substr($data, 0, 2);
1158 if (pack('H*', '0105') eq $substr ) {
1159 return q{application/data};
1162 if (length $data > 0) {
1163 $substr = substr($data, 0, 2);
1164 if (pack('H*', 'fe04') eq $substr ) {
1165 return q{application/data};
1168 if ($data =~ m[^0xabcdef]) {
1169 return q{application/data};
1171 if (length $data > 0) {
1172 $substr = substr($data, 0, 4);
1173 if (pack('H*', '000001f9') eq $substr ) {
1174 return q{application/data};
1177 if ($data =~ m[^\<aiaff\>]) {
1178 return q{application/x-archive};
1180 if ($data =~ m[^FORM]) {
1181 return q{application/data};
1183 if ($data =~ m[^P1]) {
1184 return q{image/x-portable-bitmap};
1186 if ($data =~ m[^P2]) {
1187 return q{image/x-portable-graymap};
1189 if ($data =~ m[^P3]) {
1190 return q{image/x-portable-pixmap};
1192 if ($data =~ m[^P4]) {
1193 return q{image/x-portable-bitmap};
1195 if ($data =~ m[^P5]) {
1196 return q{image/x-portable-graymap};
1198 if ($data =~ m[^P6]) {
1199 return q{image/x-portable-pixmap};
1201 if ($data =~ m[^IIN1]) {
1202 return q{image/tiff};
1204 if ($data =~ m[^MM\x00\x2a]) {
1205 return q{image/tiff};
1207 if ($data =~ m[^II\x2a\x00]) {
1208 return q{image/tiff};
1210 if ($data =~ m[^\x89PNG]) {
1211 return q{image/x-png};
1213 if (length $data > 1) {
1214 $substr = substr($data, 1, 1024);
1215 if (defined $substr && $substr =~ m[^PNG]) {
1216 return q{image/x-png};
1219 if ($data =~ m[^GIF8]) {
1220 return q{image/gif};
1222 if ($data =~ m[^\361\0\100\273]) {
1223 return q{image/x-cmu-raster};
1225 if (length $data > 0) {
1226 $substr = substr($data, 0, 2);
1227 if (pack('H*', 'ffd8') eq $substr ) {
1228 return q{image/jpeg};
1231 if ($data =~ m[^hsi1]) {
1232 return q{image/x-jpeg-proprietary};
1234 if ($data =~ m[^BM]) {
1235 return q{image/x-bmp};
1237 if ($data =~ m[^IC]) {
1238 return q{image/x-ico};
1240 if (length $data > 0) {
1241 $substr = substr($data, 0, 4);
1242 if (pack('H*', '59a66a95') eq $substr ) {
1243 return q{x/x-image-sun-raster};
1246 if (length $data > 2048) {
1247 $substr = substr($data, 2048, 1024);
1248 if (defined $substr && $substr =~ m[^PCD_IPI]) {
1249 return q{x/x-photo-cd-pack-file};
1252 if ($data =~ m[^PCD_OPA]) {
1253 return q{x/x-photo-cd-overfiew-file};
1255 if ($data =~ m[^\007\001\000]) {
1256 return q{Linux/i386 object file};
1258 if (length $data > 4086) {
1259 $substr = substr($data, 4086, 1024);
1260 if (defined $substr && $substr =~ m[^SWAP\-SPACE]) {
1261 return q{Linux/i386 swap file};
1264 if ($data =~ m[^\;\;]) {
1265 return q{Lisp/Scheme program text};
1267 if ($data =~ m[^FFIL]) {
1270 if (length $data > 65) {
1271 $substr = substr($data, 65, 1024);
1272 if (defined $substr && $substr =~ m[^FFIL]) {
1276 if ($data =~ m[^LWFN]) {
1277 return q{font/type1};
1279 if (length $data > 65) {
1280 $substr = substr($data, 65, 1024);
1281 if (defined $substr && $substr =~ m[^LWFN]) {
1282 return q{font/type1};
1285 if ($data =~ m[^Return\-Path\:]) {
1286 return q{message/rfc822};
1288 if ($data =~ m[^Path\:]) {
1289 return q{message/news};
1291 if ($data =~ m[^Xref\:]) {
1292 return q{message/news};
1294 if ($data =~ m[^From\:]) {
1295 return q{message/rfc822};
1297 if ($data =~ m[^Article]) {
1298 return q{message/news};
1300 if ($data =~ m[^BABYL]) {
1301 return q{message/x-gnu-rmail};
1303 if ($data =~ m[^Received\:]) {
1304 return q{message/rfc822};
1306 if ($data =~ m[^MZ]) {
1307 return q{application/x-ms-dos-executable};
1309 if (length $data > 2080) {
1310 $substr = substr($data, 2080, 1024);
1311 if (defined $substr && $substr =~ m[^Microsoft\ Word\ 6\.0\ Document]) {
1312 return q{text/vnd.ms-word};
1315 if (length $data > 2080) {
1316 $substr = substr($data, 2080, 1024);
1317 if (defined $substr && $substr =~ m[^Documento\ Microsoft\ Word\ 6]) {
1318 return q{text/vnd.ms-word};
1321 if (length $data > 2112) {
1322 $substr = substr($data, 2112, 1024);
1323 if (defined $substr && $substr =~ m[^MSWordDoc]) {
1324 return q{text/vnd.ms-word};
1327 if (length $data > 0) {
1328 $substr = substr($data, 0, 4);
1329 if (pack('H*', '31be0000') eq $substr ) {
1330 return q{text/vnd.ms-word};
1333 if ($data =~ m[^PO\^Q\`]) {
1334 return q{text/vnd.ms-word};
1336 if (length $data > 2080) {
1337 $substr = substr($data, 2080, 1024);
1338 if (defined $substr && $substr =~ m[^Microsoft\ Excel\ 5\.0\ Worksheet]) {
1339 return q{application/vnd.ms-excel};
1342 if (length $data > 2114) {
1343 $substr = substr($data, 2114, 1024);
1344 if (defined $substr && $substr =~ m[^Biff5]) {
1345 return q{application/vnd.ms-excel};
1348 if ($data =~ m[^\x31\xbe\x00\x00]) {
1349 return q{application/msword};
1351 if ($data =~ m[^PO\^Q\`]) {
1352 return q{application/msword};
1354 if (length $data > 1) {
1355 $substr = substr($data, 1, 1024);
1356 if (defined $substr && $substr =~ m[^WPC]) {
1357 return q{text/vnd.wordperfect};
1360 if ($data =~ m[^StartFontMetrics]) {
1361 return q{font/x-sunos-news};
1363 if ($data =~ m[^StartFont]) {
1364 return q{font/x-sunos-news};
1366 if (length $data > 0) {
1367 $substr = substr($data, 0, 4);
1368 if (pack('H*', '137A2944') eq $substr ) {
1369 return q{font/x-sunos-news};
1372 if (length $data > 0) {
1373 $substr = substr($data, 0, 4);
1374 if (pack('H*', '137A2947') eq $substr ) {
1375 return q{font/x-sunos-news};
1378 if (length $data > 0) {
1379 $substr = substr($data, 0, 4);
1380 if (pack('H*', '137A2950') eq $substr ) {
1381 return q{font/x-sunos-news};
1384 if (length $data > 0) {
1385 $substr = substr($data, 0, 4);
1386 if (pack('H*', '137A2951') eq $substr ) {
1387 return q{font/x-sunos-news};
1390 if (length $data > 8) {
1391 $substr = substr($data, 8, 4);
1392 if (pack('H*', '137A2B45') eq $substr ) {
1393 return q{font/x-sunos-news};
1396 if (length $data > 8) {
1397 $substr = substr($data, 8, 4);
1398 if (pack('H*', '137A2B48') eq $substr ) {
1399 return q{font/x-sunos-news};
1402 if (length $data > 0) {
1403 $substr = substr($data, 0, 2);
1404 if (pack('H*', '87CD') eq $substr ) {
1405 return q{OS9/6809 module:};
1408 if (length $data > 0) {
1409 $substr = substr($data, 0, 2);
1410 if (pack('H*', '4AFC') eq $substr ) {
1411 return q{OS9/68K module:};
1414 if ($data =~ m[^\%PDF\-]) {
1415 return q{application/pdf};
1417 if ($data =~ m[^\%\!]) {
1418 return q{application/postscript};
1420 if ($data =~ m[^\004\%\!]) {
1421 return q{application/postscript};
1423 if ($data =~ m[^\033E\033]) {
1424 return q{image/x-pcl-hp};
1426 if ($data =~ m[^\<\!DOCTYPE\ HTML]) {
1427 return q{text/html};
1429 if ($data =~ m[^\<\!doctype\ html]) {
1430 return q{text/html};
1432 if ($data =~ m[^\<HEAD]) {
1433 return q{text/html};
1435 if ($data =~ m[^\<head]) {
1436 return q{text/html};
1438 if ($data =~ m[^\<TITLE]) {
1439 return q{text/html};
1441 if ($data =~ m[^\<title]) {
1442 return q{text/html};
1444 if ($data =~ m[^\<html]) {
1445 return q{text/html};
1447 if ($data =~ m[^\<HTML]) {
1448 return q{text/html};
1450 if ($data =~ m[^\<\!SQ\ A\/E\>]) {
1451 return q{A/E SGML Document binary};
1453 if ($data =~ m[^\<\!SQ\ STS\>]) {
1454 return q{A/E SGML binary styles file};
1456 if ($data =~ m[^\367\203]) {
1457 return q{font/x-tex};
1459 if ($data =~ m[^\367\131]) {
1460 return q{font/x-tex};
1462 if ($data =~ m[^\367\312]) {
1463 return q{font/x-tex};
1465 if (length $data > 2) {
1466 $substr = substr($data, 2, 1024);
1467 if (defined $substr && $substr =~ m[^\000\021]) {
1468 return q{font/x-tex-tfm};
1471 if (length $data > 2) {
1472 $substr = substr($data, 2, 1024);
1473 if (defined $substr && $substr =~ m[^\000\022]) {
1474 return q{font/x-tex-tfm};
1477 if (length $data > 1) {
1478 $substr = substr($data, 1, 1024);
1479 if (defined $substr && $substr =~ m[^WPC]) {
1480 return q{(Corel/WP)};
1483 if ($data =~ m[^BLENDER]) {
1484 return q{application/x-blender};
1487 # autogerated code ends
1491 return 'application/octet-stream';
1501 File::Type - determine file type using magic
1505 my $ft = File::Type->new();
1507 # read in data from file to $data, then
1508 my $type_from_data = $ft->checktype_contents($data);
1510 # alternatively, check file from disk
1511 my $type_from_file = $ft->checktype_filename($file);
1513 # convenient method for checking either a file or data
1514 my $type_1 = $ft->mime_type($file);
1515 my $type_2 = $ft->mime_type($data);
1519 File::Type uses magic numbers (typically at the start of a file) to
1520 determine the MIME type of that file.
1522 File::Type can use either a filename, or file contents, to determine the
1529 Returns a new File::Type object.
1531 =head2 mime_type($argument)
1533 Takes either data or a filename, determines what it is, and passes the
1534 argument through to the relevant method below. If the argument is a
1535 directory, returns undef.
1537 =head2 checktype_filename($filename)
1539 Opens $filename (if possible; if not, returns undef) and returns the MIME
1542 =head2 checktype_contents($data)
1544 Matches $data against the magic database criteria and returns the MIME
1551 * Add additional magic match criteria
1561 Some magic definitions in the mime-magic file used in the creation of this
1562 module vary from those in other apps (eg image/x-png not image/png).
1566 L<File::MMagic> and L<File::MimeInfo> perform the same job, but have a number
1567 of problems that led to the creation of this module.
1569 L<File::MMagic> inlines a copy of the magic database, and uses a DATA
1570 filehandle, which causes problems when running under mod_perl.
1572 L<File::MimeInfo> uses an external magic file, and relies on file extensions
1573 rather than magic to determine the mime type.
1575 As a result, File::Type uses a seperate module and script to create the
1576 code at the core of this module, which means that there is no need to
1577 include a magic database at all, and that it is safe to run under mod_perl.
1579 L<File::Type::Builder>, which generates the code at the heart of this module.
1581 =head1 ACKNOWLEDGMENTS
1583 File::Type is built from a mime-magic file from cleancode.org. The original
1584 can be found at L<http://cleancode.org/cgi-bin/viewcvs.cgi/email/mime-magic.mime?rev=1.1.1.1>.
1588 Paul Mison <pmison@fotango.com>
1592 Copyright 2003-2004 Fotango Ltd.
1596 Licensed under the same terms as Perl itself.