source: trunk/src/sh_filetype.c @ 454

Last change on this file since 454 was 454, checked in by katerina, 7 years ago

Fix for ticket #355 (use calloc instead of malloc).

File size: 18.7 KB
Line 
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
93char * 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
269static unsigned int    sh_ftype_def = 0;
270
271#define SH_FTYPE_ADD  16
272
273struct 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
282struct sh_ftype_rec ** sh_ftype_arr = NULL;
283static unsigned int    sh_ftype_nn  = 0;
284
285#if !defined(SH_FILE_MAIN)
286
287static unsigned int    sh_ftype_usr = 0;
288
289extern char * unquote_string (const char * str, size_t len);
290
291int 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
346static 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
458static 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 = calloc((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] = calloc(1, 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
507static 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
578int 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
609int 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) */
Note: See TracBrowser for help on using the repository browser.