aboutsummaryrefslogtreecommitdiff
path: root/src/main/test2_extractor.c
blob: a2c1d5319049bbc4da7acee07baf8205b9b4feb2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
     This file is part of libextractor.
     Copyright (C) 2012 Vidyut Samanta and Christian Grothoff

     libextractor is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published
     by the Free Software Foundation; either version 3, or (at your
     option) any later version.

     libextractor is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with libextractor; see the file COPYING.  If not, write to the
     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     Boston, MA 02110-1301, USA.
 */
/**
 * @file main/test2_extractor.c
 * @brief plugin for testing GNU libextractor
 * Data file (or buffer) for this test must be 150 * 1024 bytes long,
 * first 4 bytes must be "test", all other bytes should be equal to
 * <FILE_OFFSET> % 256. The test client must return 0 after seeing
 * "Hello World!" metadata, and return 1 after seeing "Goodbye!"
 * metadata.
 * @author Christian Grothoff
 */
#include "platform.h"
#include "extractor.h"
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>


/**
 * Signature of the extract method that each plugin
 * must provide.
 *
 * @param ec extraction context provided to the plugin
 */
void
EXTRACTOR_test2_extract_method (struct EXTRACTOR_ExtractContext *ec)
{
  void *dp;

  if ((NULL == ec->config) || (0 != strcmp (ec->config, "test2")))
    return; /* only run in test mode */
  if (4 != ec->read (ec->cls, &dp, 4))
  {
    fprintf (stderr, "Reading at offset 0 failed\n");
    ABORT ();
  }
  if (0 != strncmp ("test", dp, 4))
  {
    fprintf (stderr, "Unexpected data at offset 0\n");
    ABORT ();
  }
  if ( (1024 * 150 != ec->get_size (ec->cls)) &&
       (UINT64_MAX != ec->get_size (ec->cls)) )
  {
    fprintf (stderr, "Unexpected file size returned (expected 150k)\n");
    ABORT ();
  }
  if (1024 * 100 + 4 != ec->seek (ec->cls, 1024 * 100 + 4, SEEK_SET))
  {
    fprintf (stderr, "Failure to seek (SEEK_SET)\n");
    ABORT ();
  }
  if (1 != ec->read (ec->cls, &dp, 1))
  {
    fprintf (stderr, "Failure to read at 100k + 4\n");
    ABORT ();
  }
  if ((1024 * 100 + 4) % 256 != *(unsigned char *) dp)
  {
    fprintf (stderr, "Unexpected data at offset 100k + 4\n");
    ABORT ();
  }
  if (((1024 * 100 + 4) + 1 - (1024 * 50 + 7)) !=
      ec->seek (ec->cls, -(1024 * 50 + 7), SEEK_CUR))
  {
    fprintf (stderr, "Failure to seek (SEEK_SET)\n");
    ABORT ();
  }
  if (1 != ec->read (ec->cls, &dp, 1))
  {
    fprintf (stderr, "Failure to read at 50k - 3\n");
    ABORT ();
  }
  if (((1024 * 100 + 4) + 1 - (1024 * 50 + 7)) % 256 != *(unsigned char *) dp)
  {
    fprintf (stderr, "Unexpected data at offset 100k - 3\n");
    ABORT ();
  }
  if (1024 * 150 != ec->seek (ec->cls, 0, SEEK_END))
  {
    fprintf (stderr, "Failure to seek (SEEK_END)\n");
    ABORT ();
  }
  if (0 != ec->read (ec->cls, &dp, 1))
  {
    fprintf (stderr, "Failed to receive EOF at 150k\n");
    ABORT ();
  }
  if (1024 * 150 - 2 != ec->seek (ec->cls, -2, SEEK_END))
  {
    fprintf (stderr, "Failure to seek (SEEK_END - 2)\n");
    ABORT ();
  }
  if (1 != ec->read (ec->cls, &dp, 1))
  {
    fprintf (stderr, "Failure to read at 150k - 3\n");
    ABORT ();
  }
  if ((1024 * 150 - 2) % 256 != *(unsigned char *) dp)
  {
    fprintf (stderr, "Unexpected data at offset 150k - 3\n");
    ABORT ();
  }
}


/* end of test2_extractor.c */