1 | /* SAMHAIN file system integrity testing */
|
---|
2 | /* Copyright (C) 2011 Rainer Wichmann */
|
---|
3 | /* */
|
---|
4 | /* This program is free software; you can redistribute it */
|
---|
5 | /* and/or modify */
|
---|
6 | /* it under the terms of the GNU General Public License as */
|
---|
7 | /* published by */
|
---|
8 | /* the Free Software Foundation; either version 2 of the License, or */
|
---|
9 | /* (at your option) any later version. */
|
---|
10 | /* */
|
---|
11 | /* This program is distributed in the hope that it will be useful, */
|
---|
12 | /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
---|
13 | /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
---|
14 | /* GNU General Public License for more details. */
|
---|
15 | /* */
|
---|
16 | /* You should have received a copy of the GNU General Public License */
|
---|
17 | /* along with this program; if not, write to the Free Software */
|
---|
18 | /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
---|
19 |
|
---|
20 | #include "config_xor.h"
|
---|
21 |
|
---|
22 | #ifndef NULL
|
---|
23 | #if !defined(__cplusplus)
|
---|
24 | #define NULL ((void*)0)
|
---|
25 | #else
|
---|
26 | #define NULL (0)
|
---|
27 | #endif
|
---|
28 | #endif
|
---|
29 |
|
---|
30 | #if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE)
|
---|
31 |
|
---|
32 | #include "samhain.h"
|
---|
33 | #include "sh_mem.h"
|
---|
34 | #include "sh_error_min.h"
|
---|
35 | #include "sh_utils.h"
|
---|
36 |
|
---|
37 | #define FIL__ _("sh_filetype.c")
|
---|
38 |
|
---|
39 | #include <string.h>
|
---|
40 | #include <stdlib.h>
|
---|
41 | #include <ctype.h>
|
---|
42 |
|
---|
43 | /* #define SH_FILE_MAIN 1 */
|
---|
44 | #ifdef SH_FILE_MAIN
|
---|
45 | #include <stdio.h>
|
---|
46 | #define _(a) a
|
---|
47 | #define N_(a) a
|
---|
48 | #define sl_strlcpy strncpy
|
---|
49 | #endif
|
---|
50 |
|
---|
51 | #define SH_FTYPE_MAX 32
|
---|
52 |
|
---|
53 | /* List of filetype description, in the format:
|
---|
54 | * offset : type(0=text, 1=binary) : length(if binary) : G1 : G2 : G3 : Name : Teststring
|
---|
55 | *
|
---|
56 | * This list is mostly taken from the 'filetype' library by Paul L Daniels.
|
---|
57 | *
|
---|
58 | * Copyright (c) 2003, PLD
|
---|
59 | * All rights reserved.
|
---|
60 | *
|
---|
61 | * Redistribution and use in source and binary forms, with or
|
---|
62 | * without modification, are permitted provided that the
|
---|
63 | * following conditions are met:
|
---|
64 | *
|
---|
65 | * * Redistributions of source code must retain the above
|
---|
66 | * copyright notice, this list of conditions and the following
|
---|
67 | * disclaimer.
|
---|
68 | *
|
---|
69 | * * Redistributions in binary form must reproduce the above
|
---|
70 | * copyright notice, this list of conditions and the following
|
---|
71 | * disclaimer in the documentation and/or other materials provided
|
---|
72 | * with the distribution.
|
---|
73 | *
|
---|
74 | * * Neither the name of the PLD nor the names of its contributors
|
---|
75 | * may be used to endorse or promote products derived from this software
|
---|
76 | * without specific prior written permission.
|
---|
77 | *
|
---|
78 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
---|
79 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
---|
80 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
---|
81 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
---|
82 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
---|
83 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
---|
84 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
---|
85 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
---|
86 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
---|
87 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
---|
88 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
---|
89 | * POSSIBILITY OF SUCH DAMAGE.
|
---|
90 | */
|
---|
91 |
|
---|
92 |
|
---|
93 | char * sh_ftype_list[] = {
|
---|
94 |
|
---|
95 | N_("6:0:0:IMAGE:COMPRESSED:JPG:JFIF Jpeg:JFIF"),
|
---|
96 | N_("0:0:0:IMAGE:COMPRESSED:PNG:PNG:=89PNG=0d=0a=1a=0a"),
|
---|
97 | N_("0:0:0:IMAGE:COMPRESSED:JPG:JFIF Jpeg:=FF=D8=FF"),
|
---|
98 | N_("0:0:0:IMAGE:COMPRESSED:GIF:GIF:GIF97a"),
|
---|
99 | N_("0:0:0:IMAGE:COMPRESSED:GIF:GIF:GIF89a"),
|
---|
100 | N_("0:0:0:IMAGE:COMPRESSED:GIF:GIF:GIF87a"),
|
---|
101 | N_("0:1:4:IMAGE:COMPRESSED:TIFF:TIFF-LE:II=2A=00"),
|
---|
102 | N_("0:1:4:IMAGE:COMPRESSED:TIFF:TIFF-BE:MM=00=2A"),
|
---|
103 | N_("0:1:2:IMAGE:COMPRESSED:PCX:PCX25:=0A=00"),
|
---|
104 | N_("0:1:2:IMAGE:COMPRESSED:PCX:PCX28WP:=0A=02"),
|
---|
105 | N_("0:1:2:IMAGE:COMPRESSED:PCX:PCX28NP:=0A=03"),
|
---|
106 | N_("0:1:2:IMAGE:COMPRESSED:PCX:PCX30:=0A=05"),
|
---|
107 | N_("0:0:0:IMAGE:RAW:BMP:Bitmap:BM"),
|
---|
108 | N_("0:0:0:IMAGE:RAW:XPM:XPM:/* XPM */"),
|
---|
109 | N_("0:0:0:IMAGE:SPECIAL:AUTOCAD:DWT:AC=31=30=31"),
|
---|
110 | N_("0:0:0:IMAGE:SPECIAL:AUTOCAD:DWF:(DWF V"),
|
---|
111 | N_("0:0:0:IMAGE:SPECIAL:AUTOCAD:WMF:=D7=CD=C6=9A"),
|
---|
112 | N_("0:0:0:IMAGE:SPECIAL:AUTOCAD:DWG:AC10"),
|
---|
113 | N_("8:0:0:IMAGE:SPECIAL:COREL:CorelDraw:CDR"),
|
---|
114 | N_("0:0:0:IMAGE:SPECIAL:FITS:Fits file:SIMPLE=20=20="),
|
---|
115 | N_("1536:0:0:IMAGE:SPECIAL:VISIO:VisioDraw:Visio"),
|
---|
116 | N_("128:0:0:IMAGE:SPECIAL:DICM:DICOM medical:DICM"),
|
---|
117 | N_("0:0:0:IMAGE:SPECIAL:PHS:Photoshop:8BPS"),
|
---|
118 | N_("0:0:0:IMAGE:SPECIAL:XCF:Gimp XCF:gimp xcf"),
|
---|
119 | N_("0:0:0:MOVIE:COMPRESSED:RIFF:RIFF/AVI Movie:RIFF"),
|
---|
120 | N_("0:0:0:MOVIE:RAW:MOV:SGI Movie:MOVI:.mov SGI Movie"),
|
---|
121 | N_("0:1:4:MOVIE:COMPRESSED:MPG:Mpeg 2:=00=00=01=BA"),
|
---|
122 | N_("0:1:4:MOVIE:COMPRESSED:MPG:Mpeg 2:=00=00=01=B3"),
|
---|
123 | N_("4:0:0:MOVIE:COMPRESSED:QT:QuickTime:moov"),
|
---|
124 | N_("4:0:0:MOVIE:COMPRESSED:QT:QuickTime:mdat"),
|
---|
125 | N_("36:0:0:MOVIE:COMPRESSED:QT:QuickTime:moov"),
|
---|
126 | N_("36:0:0:MOVIE:COMPRESSED:QT:QuickTime:mdat"),
|
---|
127 | N_("68:0:0:MOVIE:COMPRESSED:QT:QuickTime:moov"),
|
---|
128 | N_("68:0:0:MOVIE:COMPRESSED:QT:QuickTime:mdat"),
|
---|
129 | N_("0:1:3:MOVIE:COMPRESSED:FLI:FLIC animation:=00=11=AF"),
|
---|
130 | N_("0:0:0:MOVIE:COMPRESSED:FLASH:Flash data:FWS"),
|
---|
131 | N_("0:0:0:MOVIE:COMPRESSED:FLASH:Flash data:CWS"),
|
---|
132 | N_("0:0:0:MOVIE:COMPRESSED:FLASH:Flash video:FLV"),
|
---|
133 | N_("0:0:0:MOVIE:COMPRESSED:WMV:WMV:=30=26=B2=75=8E=66=CF"),
|
---|
134 | N_("0:0:0:AUDIO:RAW:SND:Sun Audio:.snd"),
|
---|
135 | N_("0:0:0:AUDIO:RAW:EMOD:EMOD:Mod"),
|
---|
136 | N_("1080:0:0:AUDIO:RAW:MOD:SoundTracker (.M.K):.M.K"),
|
---|
137 | N_("1080:0:0:AUDIO:RAW:MOD:SoundTracker (M.K.):M.K."),
|
---|
138 | N_("1080:0:0:AUDIO:RAW:MOD:NoiseTracker:N.T."),
|
---|
139 | N_("1080:0:0:AUDIO:RAW:MOD:SoundTracker (M!K!):M!K!"),
|
---|
140 | N_("1080:0:0:AUDIO:RAW:MOD:SoundTracker (M&K!):M&K!"),
|
---|
141 | N_("8:0:0:AUDIO:RAW:WAVE:Wave:WAVE"),
|
---|
142 | N_("0:1:4:AUDIO:RAW:DEC:DEC-Audio:=00=64=73=2E"),
|
---|
143 | N_("0:0:0:AUDIO:STANDARD:MIDI:Midi:MThd"),
|
---|
144 | N_("0:0:0:AUDIO:COMPRESSED:REAL:RealMedia:.RMF"),
|
---|
145 | N_("0:0:0:AUDIO:COMPRESSED:OGG:Ogg Vorbis:OggS"),
|
---|
146 | N_("0:0:0:AUDIO:COMPRESSED:FLAC:Flac:fLaC"),
|
---|
147 | N_("0:1:5:AUDIO:COMPRESSED:MP3:MP3 Audio:=49=44=33=02=00"),
|
---|
148 | N_("0:1:5:AUDIO:COMPRESSED:MP3:MP3 Audio:=49=44=33=03=00"),
|
---|
149 | N_("0:1:5:AUDIO:COMPRESSED:MP3:MP3 Audio:=49=44=33=04=00"),
|
---|
150 | N_("0:1:2:AUDIO:COMPRESSED:MP3:MP3 Audio:=ff=fb"),
|
---|
151 | N_("0:1:2:AUDIO:COMPRESSED:MP3:MP3 Audio:=ff=fa"),
|
---|
152 | N_("2:0:0:ARCHIVE:COMPRESSED:LHA:Lha 0:-lh0-"),
|
---|
153 | N_("2:0:0:ARCHIVE:COMPRESSED:LHA:Lha 1:-lh1-"),
|
---|
154 | N_("2:0:0:ARCHIVE:COMPRESSED:LHA:Lha 4:-lz4-"),
|
---|
155 | N_("2:0:0:ARCHIVE:COMPRESSED:LHA:Lha z5:-lz5-"),
|
---|
156 | N_("2:0:0:ARCHIVE:COMPRESSED:LHA:Lha 5:-lh5-"),
|
---|
157 | N_("0:0:0:ARCHIVE:COMPRESSED:RAR:RarArchive:Rar!"),
|
---|
158 | N_("0:0:0:ARCHIVE:COMPRESSED:ZIP:PkZip:PK=03=04"),
|
---|
159 | N_("0:0:0:ARCHIVE:COMPRESSED:7Z:7-Zip:=37=7A=BC=AF=27=1C"),
|
---|
160 | N_("0:0:0:ARCHIVE:COMPRESSED:COMPRESS:Compress:=1F=89"),
|
---|
161 | N_("0:0:0:ARCHIVE:COMPRESSED:GZIP:Gzip:=1F=8B"),
|
---|
162 | N_("0:0:0:ARCHIVE:COMPRESSED:BZIP2:Bzip2:BZh"),
|
---|
163 | N_("0:0:0:ARCHIVE:COMPRESSED:ARJ:ARJ:=60=ea"),
|
---|
164 | N_("0:0:0:ARCHIVE:COMPRESSED:ARJ:ARJ:=ea=60"),
|
---|
165 | N_("0:0:0:ARCHIVE:COMPRESSED:HPAK:HPack:HPAK"),
|
---|
166 | N_("0:0:0:ARCHIVE:COMPRESSED:JAM:Jam:=E9,=01JAM"),
|
---|
167 | N_("0:0:0:ARCHIVE:COMPRESSED:SQUISH:Squish:SQSH"),
|
---|
168 | N_("0:1:8:ARCHIVE:COMPRESSED:CAB:MS Cabinet:MSCF=00=00=00=00"),
|
---|
169 | N_("20:0:0:ARCHIVE:COMPRESSED:ZOO:Zoo:=FD=C4=A7=DC"),
|
---|
170 | N_("0:0:0:ARCHIVE:COMPRESSED:XPK:Amiga XPK Archive:XPKF"),
|
---|
171 | N_("0:0:0:ARCHIVE:PACKAGE:RPM:RPM:=ED=AB=EE=DB"),
|
---|
172 | N_("0:0:0:ARCHIVE:PACKAGE:DEB:DEB:!<arch>=0A""debian"),
|
---|
173 | N_("0:0:0:ARCHIVE:UNIX:AR:AR:!<arch>"),
|
---|
174 | N_("0:0:0:ARCHIVE:UNIX:AR:AR:<ar>"),
|
---|
175 | N_("257:1:8:ARCHIVE:UNIX:TAR:TAR:ustar=20=20=00"),
|
---|
176 | N_("257:1:6:ARCHIVE:UNIX:TAR:TAR:ustar=00"),
|
---|
177 | N_("0:0:0:LIBRARY:JAVA:CLASS:Java:=CA=FE=BA=BE"),
|
---|
178 | N_("2108:0:0:DOCUMENT:OFFICE:WORD:Word v5:MSWordDoc"),
|
---|
179 | N_("2112:0:0:DOCUMENT:OFFICE:WORD:Word v5:MSWordDoc"),
|
---|
180 | N_("2080:0:0:DOCUMENT:OFFICE:EXCEL:Excel v4:Microsoft Excel"),
|
---|
181 | N_("2080:0:0:DOCUMENT:OFFICE:WORD:MS Word:Microsoft Word"),
|
---|
182 | N_("0:0:0:DOCUMENT:OFFICE:WORD:Word:=94=A6=2E"),
|
---|
183 | N_("512:1:19:DOCUMENT:OFFICE:WORD:Word:R=00o=00o=00t=00 =00""E=00n=00t=00r=00y"),
|
---|
184 | N_("0:1:9:DOCUMENT:OFFICE:ALL:MSOffice:=D0=CF=11=E0=A1=B1=1A=E1=00"),
|
---|
185 | N_("0:0:0:DOCUMENT:ADOBE:PDF:PortableDocument:%PDF-"),
|
---|
186 | N_("0:0:0:DOCUMENT:ADOBE:EPS:EncapsulatedPS:%!PS-ADOBE EPS"),
|
---|
187 | N_("0:0:0:DOCUMENT:STANDARD:RTF:RichText:{\\rtf"),
|
---|
188 | N_("6:1:4:DOCUMENT:STANDARD:RTF:RichText Compressed:=00=00LZ"),
|
---|
189 | N_("6:0:0:DOCUMENT:ID:VCARD:VCARD:vcard"),
|
---|
190 | N_("0:0:0:EXECUTABLE:DOS:EXE:DosExe:MZ"),
|
---|
191 | N_("0:0:0:EXECUTABLE:DOS:EXE:DosExe:LZ"),
|
---|
192 | N_("0:0:0:EXECUTABLE:DOS:COM:DosCom 1:=E9"),
|
---|
193 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#!/bin/sh"),
|
---|
194 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#! /bin/sh"),
|
---|
195 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#!/bin/bash"),
|
---|
196 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#! /bin/bash"),
|
---|
197 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#!/usr/bin/bash"),
|
---|
198 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Bourne:#! /usr/bin/bash"),
|
---|
199 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Csh:#!/usr/bin/csh"),
|
---|
200 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Csh:#! /usr/bin/csh"),
|
---|
201 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Csh:#!/bin/csh"),
|
---|
202 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Csh:#! /bin/csh"),
|
---|
203 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Korn:#! /usr/bin/ksh"),
|
---|
204 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Korn:#!/usr/bin/ksh"),
|
---|
205 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Korn:#! /bin/ksh"),
|
---|
206 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Korn:#!/bin/ksh"),
|
---|
207 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Tenex:#!/usr/bin/tcsh"),
|
---|
208 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Tenex:#! /usr/bin/tcsh"),
|
---|
209 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Tenex:#!/bin/tcsh"),
|
---|
210 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Tenex:#! /bin/tcsh"),
|
---|
211 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Zsh:#!/usr/bin/zsh"),
|
---|
212 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Zsh:#! /usr/bin/zsh"),
|
---|
213 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Zsh:#!/bin/zsh"),
|
---|
214 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Zsh:#! /bin/zsh"),
|
---|
215 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:ash:#!/usr/bin/ash"),
|
---|
216 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:ash:#! /usr/bin/ash"),
|
---|
217 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:ash:#!/bin/ash"),
|
---|
218 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:ash:#! /bin/ash"),
|
---|
219 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#!/usr/bin/nawk"),
|
---|
220 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#! /usr/bin/nawk"),
|
---|
221 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#!/bin/nawk"),
|
---|
222 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#! /bin/nawk"),
|
---|
223 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#!/bin/gawk"),
|
---|
224 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#! /bin/gawk"),
|
---|
225 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#!/bin/awk"),
|
---|
226 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:awk:#! /bin/awk"),
|
---|
227 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:perl:#!/usr/bin/perl"),
|
---|
228 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:perl:#! /usr/bin/perl"),
|
---|
229 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:perl:#!/bin/perl"),
|
---|
230 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:perl:#! /bin/perl"),
|
---|
231 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Shell script:#!/"),
|
---|
232 | N_("0:0:0:EXECUTABLE:UNIX:SHELL:Shell script:#! /"),
|
---|
233 | N_("0:0:0:EXECUTABLE:UNIX:ELF:Linux ELF32:=7f""ELF=01"),
|
---|
234 | N_("0:0:0:EXECUTABLE:UNIX:ELF:Linux ELF:=7f""ELF=02"),
|
---|
235 | N_("0:0:0:EXECUTABLE:DOS:COM:DosCom 2:=8c"),
|
---|
236 | N_("0:0:0:EXECUTABLE:DOS:COM:DosCom 3:=eb"),
|
---|
237 | N_("0:0:0:EXECUTABLE:DOS:COM:DosCom 4:=b8"),
|
---|
238 | N_("0:1:4:EXECUTABLE:AMIGAOS:EXECUTABLE:AmigaOS Executable:=00=00=03=F3"),
|
---|
239 | N_("0:1:20:DATABASE:ANY:ACCESS:MSAccess:=00=01=00=00Standard=20Jet=20""DB=00"),
|
---|
240 | N_("0:1:2:DATABASE:ANY:MYSQL:MySQL database:=fe=01"),
|
---|
241 | N_("0:1:4:DATABASE:ANY:MYSQL:MySQL database:=fe=fe=03=00"),
|
---|
242 | N_("0:1:4:DATABASE:ANY:MYSQL:MySQL database:=fe=fe=07=00"),
|
---|
243 | N_("0:1:4:DATABASE:ANY:MYSQL:MySQL database:=fe=fe=05=00"),
|
---|
244 | N_("0:1:4:DATABASE:ANY:MYSQL:MySQL database:=fe=fe=06=00"),
|
---|
245 |
|
---|
246 | NULL,
|
---|
247 | NULL,
|
---|
248 | NULL,
|
---|
249 | NULL,
|
---|
250 |
|
---|
251 | NULL,
|
---|
252 | NULL,
|
---|
253 | NULL,
|
---|
254 | NULL,
|
---|
255 |
|
---|
256 | NULL,
|
---|
257 | NULL,
|
---|
258 | NULL,
|
---|
259 | NULL,
|
---|
260 |
|
---|
261 | NULL,
|
---|
262 | NULL,
|
---|
263 | NULL,
|
---|
264 | NULL,
|
---|
265 |
|
---|
266 | NULL,
|
---|
267 | };
|
---|
268 |
|
---|
269 | static unsigned int sh_ftype_def = 0;
|
---|
270 |
|
---|
271 | #define SH_FTYPE_ADD 16
|
---|
272 |
|
---|
273 | struct sh_ftype_rec {
|
---|
274 | size_t offset;
|
---|
275 | size_t length;
|
---|
276 | char pattern[SH_FTYPE_MAX];
|
---|
277 |
|
---|
278 | char type[SH_FTYPE_MAX];
|
---|
279 | };
|
---|
280 |
|
---|
281 |
|
---|
282 | struct sh_ftype_rec ** sh_ftype_arr = NULL;
|
---|
283 | static unsigned int sh_ftype_nn = 0;
|
---|
284 |
|
---|
285 | #if !defined(SH_FILE_MAIN)
|
---|
286 |
|
---|
287 | static unsigned int sh_ftype_usr = 0;
|
---|
288 |
|
---|
289 | extern char * unquote_string (const char * str, size_t len);
|
---|
290 |
|
---|
291 | int sh_restrict_add_ftype(const char * str)
|
---|
292 | {
|
---|
293 | size_t len;
|
---|
294 | char * cond;
|
---|
295 |
|
---|
296 | if (sh_ftype_def == 0)
|
---|
297 | {
|
---|
298 | while(sh_ftype_list[sh_ftype_def] != NULL) ++sh_ftype_def;
|
---|
299 | }
|
---|
300 |
|
---|
301 | if (!str)
|
---|
302 | {
|
---|
303 | if (sh_ftype_usr > 0)
|
---|
304 | {
|
---|
305 | unsigned int i, j = sh_ftype_def;
|
---|
306 |
|
---|
307 | for (i = 0; i < sh_ftype_usr; ++i)
|
---|
308 | {
|
---|
309 | SH_FREE(sh_ftype_list[j+i]);
|
---|
310 | sh_ftype_list[j+i] = NULL;
|
---|
311 | }
|
---|
312 | sh_ftype_usr = 0;
|
---|
313 | }
|
---|
314 |
|
---|
315 | if (sh_ftype_arr)
|
---|
316 | {
|
---|
317 | unsigned int i = 0;
|
---|
318 |
|
---|
319 | while(sh_ftype_arr[i] != NULL)
|
---|
320 | {
|
---|
321 | SH_FREE(sh_ftype_arr[i]);
|
---|
322 | ++i;
|
---|
323 | }
|
---|
324 | SH_FREE(sh_ftype_arr);
|
---|
325 | sh_ftype_arr = NULL;
|
---|
326 | }
|
---|
327 | }
|
---|
328 | else if (sh_ftype_usr < SH_FTYPE_ADD)
|
---|
329 | {
|
---|
330 | len = strlen(str);
|
---|
331 | cond = unquote_string(str, len);
|
---|
332 | sh_ftype_list[sh_ftype_def+sh_ftype_usr] = cond;
|
---|
333 | ++sh_ftype_usr;
|
---|
334 | }
|
---|
335 | else
|
---|
336 | {
|
---|
337 | return -1;
|
---|
338 | }
|
---|
339 | return 0;
|
---|
340 | }
|
---|
341 |
|
---|
342 |
|
---|
343 | #endif
|
---|
344 |
|
---|
345 |
|
---|
346 | static int init_record(unsigned int n, char * define,
|
---|
347 | struct sh_ftype_rec * record)
|
---|
348 | {
|
---|
349 | unsigned int offset, dtype, length, i = 0, xn = 0;
|
---|
350 | char type[SH_FTYPE_MAX];
|
---|
351 | char pattern[SH_FTYPE_MAX];
|
---|
352 |
|
---|
353 | char * end;
|
---|
354 | char * start;
|
---|
355 |
|
---|
356 | offset = strtoul(define, &end, 0);
|
---|
357 | if (*end != ':')
|
---|
358 | return -1;
|
---|
359 |
|
---|
360 | start = end; ++start;
|
---|
361 | dtype = strtoul(start, &end, 0);
|
---|
362 | if (*end != ':')
|
---|
363 | return -1;
|
---|
364 |
|
---|
365 | start = end; ++start;
|
---|
366 | length = strtoul(start, &end, 0);
|
---|
367 | if (*end != ':')
|
---|
368 | return -1;
|
---|
369 |
|
---|
370 | start = end; ++start;
|
---|
371 |
|
---|
372 | while (*start && (i < sizeof(type)))
|
---|
373 | {
|
---|
374 | type[i] = *start; ++start;
|
---|
375 | if (type[i] == ':')
|
---|
376 | ++xn;
|
---|
377 | if (xn == 3)
|
---|
378 | {
|
---|
379 | type[i] = '\0';
|
---|
380 | break;
|
---|
381 | }
|
---|
382 | ++i;
|
---|
383 | }
|
---|
384 | if (xn != 3)
|
---|
385 | return -1;
|
---|
386 |
|
---|
387 | start = strchr(start, ':');
|
---|
388 |
|
---|
389 | if (!start)
|
---|
390 | return -1;
|
---|
391 |
|
---|
392 | ++start;
|
---|
393 |
|
---|
394 | if (dtype == 0)
|
---|
395 | {
|
---|
396 | sl_strlcpy(pattern, start, sizeof(pattern));
|
---|
397 | length = strlen(pattern);
|
---|
398 | }
|
---|
399 | else if (length <= sizeof(pattern))
|
---|
400 | {
|
---|
401 | memcpy(pattern, start, length);
|
---|
402 | }
|
---|
403 | else
|
---|
404 | {
|
---|
405 | return -1;
|
---|
406 | }
|
---|
407 |
|
---|
408 | /* fprintf(stderr, "FIXME: %d %d %s ", dtype, length, type); */
|
---|
409 | /**
|
---|
410 | if (dtype == 0)
|
---|
411 | fprintf(stderr, "%s\n", pattern);
|
---|
412 | else
|
---|
413 | {
|
---|
414 | int k;
|
---|
415 | for (k = 0; k < length; ++k)
|
---|
416 | fprintf(stderr, "0x%X", (unsigned int) (pattern[k]));
|
---|
417 | fprintf(stderr, "\n");
|
---|
418 | }
|
---|
419 | **/
|
---|
420 |
|
---|
421 | for (i = 0; i < n; ++i)
|
---|
422 | {
|
---|
423 | if (sh_ftype_arr[i]->length <= length &&
|
---|
424 | sh_ftype_arr[i]->offset == offset)
|
---|
425 | {
|
---|
426 | if (0 == memcmp(sh_ftype_arr[i]->pattern, pattern,
|
---|
427 | sh_ftype_arr[i]->length))
|
---|
428 | {
|
---|
429 | #ifdef SH_FILE_MAIN
|
---|
430 | fprintf(stderr,
|
---|
431 | "Pattern %d (%s / %s) override by earlier pattern %d (%s / %s)\n",
|
---|
432 | n, type, pattern,
|
---|
433 | i, sh_ftype_arr[i]->type, sh_ftype_arr[i]->pattern);
|
---|
434 | #else
|
---|
435 | char errbuf[256];
|
---|
436 |
|
---|
437 | sl_snprintf(errbuf, sizeof(errbuf),
|
---|
438 | _("Pattern %d (%s) override by earlier pattern %d (%s)"),
|
---|
439 | n, type,
|
---|
440 | i, sh_ftype_arr[i]->type);
|
---|
441 | sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN,
|
---|
442 | errbuf,
|
---|
443 | _("init_record"));
|
---|
444 | #endif
|
---|
445 | }
|
---|
446 | }
|
---|
447 | }
|
---|
448 |
|
---|
449 |
|
---|
450 | record->offset = offset;
|
---|
451 | record->length = length;
|
---|
452 | memcpy(record->pattern, pattern, length);
|
---|
453 | sl_strlcpy(record->type, type, SH_FTYPE_MAX);
|
---|
454 |
|
---|
455 | return 0;
|
---|
456 | }
|
---|
457 |
|
---|
458 | static void file_arr_init()
|
---|
459 | {
|
---|
460 | unsigned int i, nn = 0;
|
---|
461 |
|
---|
462 | if (sh_ftype_def == 0)
|
---|
463 | {
|
---|
464 | while(sh_ftype_list[sh_ftype_def] != NULL) ++sh_ftype_def;
|
---|
465 | }
|
---|
466 |
|
---|
467 | while (sh_ftype_list[nn] != NULL) ++nn;
|
---|
468 |
|
---|
469 | #ifdef SH_FILE_MAIN
|
---|
470 | printf("%d definitions found, defined = %d\n", nn, sh_ftype_def);
|
---|
471 | #endif
|
---|
472 |
|
---|
473 | #ifdef SH_FILE_MAIN
|
---|
474 | sh_ftype_arr = malloc((nn+1) * sizeof(struct sh_ftype_rec *));
|
---|
475 | #else
|
---|
476 | sh_ftype_arr = SH_ALLOC((nn+1) * sizeof(struct sh_ftype_rec *));
|
---|
477 | #endif
|
---|
478 |
|
---|
479 | for(i = 0; i < nn; i++)
|
---|
480 | {
|
---|
481 | #ifdef SH_FILE_MAIN
|
---|
482 | sh_ftype_arr[i] = malloc(sizeof(struct sh_ftype_rec));
|
---|
483 | #else
|
---|
484 | sh_ftype_arr[i] = SH_ALLOC(sizeof(struct sh_ftype_rec));
|
---|
485 | #endif
|
---|
486 |
|
---|
487 | memset(sh_ftype_arr[i], 0, sizeof(struct sh_ftype_rec));
|
---|
488 | if (i < sh_ftype_def)
|
---|
489 | {
|
---|
490 | char * p = _(sh_ftype_list[i]);
|
---|
491 | size_t len = strlen(p);
|
---|
492 | char * cond = unquote_string(p, len);
|
---|
493 |
|
---|
494 | init_record(i, cond, sh_ftype_arr[i]);
|
---|
495 | }
|
---|
496 | else
|
---|
497 | {
|
---|
498 | init_record(i, sh_ftype_list[i], sh_ftype_arr[i]);
|
---|
499 | }
|
---|
500 | }
|
---|
501 | sh_ftype_arr[nn] = NULL;
|
---|
502 | sh_ftype_nn = nn;
|
---|
503 |
|
---|
504 | return;
|
---|
505 | }
|
---|
506 |
|
---|
507 | static char * check_filetype(char * filetype,
|
---|
508 | const char * buffer, size_t buflen)
|
---|
509 | {
|
---|
510 | unsigned int i;
|
---|
511 | const char * p;
|
---|
512 |
|
---|
513 | if (!sh_ftype_arr)
|
---|
514 | {
|
---|
515 | file_arr_init();
|
---|
516 | }
|
---|
517 |
|
---|
518 | for (i = 0; i < sh_ftype_nn; ++i)
|
---|
519 | {
|
---|
520 | if (sh_ftype_arr[i]->length > 0 &&
|
---|
521 | (sh_ftype_arr[i]->length + sh_ftype_arr[i]->offset) < buflen)
|
---|
522 | {
|
---|
523 | p = &buffer[sh_ftype_arr[i]->offset];
|
---|
524 |
|
---|
525 | #if 0
|
---|
526 | {
|
---|
527 | int dd;
|
---|
528 | /* fprintf(stderr, "FIXME: %03d comp %d:%d ", i,
|
---|
529 | sh_ftype_arr[i]->offset, sh_ftype_arr[i]->length); */
|
---|
530 | for (dd = 0; dd < sh_ftype_arr[i]->length; ++dd) {
|
---|
531 | fprintf(stderr, "0x%X ", sh_ftype_arr[i]->pattern[dd]);
|
---|
532 | }
|
---|
533 | for (dd = 0; dd < sh_ftype_arr[i]->length; ++dd) {
|
---|
534 | fprintf(stderr, "0x%X ", p[dd]);
|
---|
535 | }
|
---|
536 | fprintf(stderr, "\n");
|
---|
537 | }
|
---|
538 | #endif
|
---|
539 |
|
---|
540 | if (0 == memcmp(p, sh_ftype_arr[i]->pattern, sh_ftype_arr[i]->length))
|
---|
541 | {
|
---|
542 | sl_strlcpy(filetype, sh_ftype_arr[i]->type, SH_FTYPE_MAX);
|
---|
543 | return (filetype);
|
---|
544 | }
|
---|
545 | }
|
---|
546 | }
|
---|
547 |
|
---|
548 | if (buflen > 0) {
|
---|
549 |
|
---|
550 | int flag = 0;
|
---|
551 |
|
---|
552 | p = buffer;
|
---|
553 | for (i = 0; i < buflen; ++i) {
|
---|
554 | if (*p == '\0')
|
---|
555 | {
|
---|
556 | sl_strlcpy(filetype, _("FILE:BINARY:UNKNOWN"), SH_FTYPE_MAX);
|
---|
557 | goto out;
|
---|
558 | }
|
---|
559 | else if (!isgraph((int)*p) && !isspace((int)*p))
|
---|
560 | {
|
---|
561 | flag = 1;
|
---|
562 | }
|
---|
563 | ++p;
|
---|
564 | }
|
---|
565 | if (flag == 0)
|
---|
566 | {
|
---|
567 | sl_strlcpy(filetype, _("FILE:TEXT:ASCII"), SH_FTYPE_MAX);
|
---|
568 | goto out;
|
---|
569 | }
|
---|
570 | }
|
---|
571 | sl_strlcpy(filetype, _("FILE:UNKNOWN:UNKNOWN"), SH_FTYPE_MAX);
|
---|
572 | out:
|
---|
573 | return filetype;
|
---|
574 | }
|
---|
575 |
|
---|
576 | #if !defined(SH_FILE_MAIN)
|
---|
577 |
|
---|
578 | int matches_filetype(SL_TICKET ft, char * test_type)
|
---|
579 | {
|
---|
580 | char buffer[3072];
|
---|
581 | char filetype[SH_FTYPE_MAX];
|
---|
582 | long len;
|
---|
583 |
|
---|
584 | len = sl_read_timeout (ft, buffer, sizeof(buffer), 12, SL_TRUE);
|
---|
585 |
|
---|
586 | sl_rewind(ft);
|
---|
587 |
|
---|
588 | if (len > 0)
|
---|
589 | {
|
---|
590 | check_filetype(filetype, buffer, len);
|
---|
591 | }
|
---|
592 | else
|
---|
593 | {
|
---|
594 | sl_strlcpy(filetype, _("FILE:UNKNOWN:UNKNOWN"), SH_FTYPE_MAX);
|
---|
595 | }
|
---|
596 |
|
---|
597 | if (0 == strcmp(filetype, test_type))
|
---|
598 | {
|
---|
599 | return 1;
|
---|
600 | }
|
---|
601 |
|
---|
602 | return 0;
|
---|
603 | }
|
---|
604 |
|
---|
605 | #else
|
---|
606 | /* SH_FILE_MAIN */
|
---|
607 | #include <unistd.h>
|
---|
608 |
|
---|
609 | int main (int argc, char * argv[])
|
---|
610 | {
|
---|
611 | char buffer[3072];
|
---|
612 | char filetype[SH_FTYPE_MAX];
|
---|
613 | size_t len;
|
---|
614 |
|
---|
615 | FILE * fh = fopen(argv[1], "r");
|
---|
616 |
|
---|
617 | if (fh)
|
---|
618 | {
|
---|
619 | int fd = fileno(fh);
|
---|
620 |
|
---|
621 | len = read(fd, buffer, 3072);
|
---|
622 |
|
---|
623 | check_filetype(filetype, buffer, len);
|
---|
624 |
|
---|
625 | fprintf(stdout, "%s: %s\n", argv[1], filetype);
|
---|
626 |
|
---|
627 | return 0;
|
---|
628 | }
|
---|
629 | return 1;
|
---|
630 | }
|
---|
631 | #endif
|
---|
632 |
|
---|
633 | #endif
|
---|
634 | /* #if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE) */
|
---|