libextractor  1.11
About: GNU libextractor is a library used to extract meta-data from files of arbitrary type.
  Fossies Dox: libextractor-1.11.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

extractor_ipc.c
Go to the documentation of this file.
1 /*
2  This file is part of libextractor.
3  Copyright (C) 2012 Vidyut Samanta and Christian Grothoff
4 
5  libextractor is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published
7  by the Free Software Foundation; either version 3, or (at your
8  option) any later version.
9 
10  libextractor is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with libextractor; see the file COPYING. If not, write to the
17  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19  */
20 /**
21  * @file main/extractor_ipc.c
22  * @brief IPC with plugin (OS-independent parts)
23  * @author Christian Grothoff
24  */
25 #include "platform.h"
26 #include "extractor_logging.h"
27 #include "extractor_ipc.h"
28 #include "extractor_plugins.h"
29 
30 
31 /**
32  * Process a reply from channel (seek request, metadata and done message)
33  *
34  * @param plugin plugin this communication is about
35  * @param buf buffer with data from IPC channel
36  * @param size number of bytes in buffer
37  * @param proc metadata callback
38  * @param proc_cls callback cls
39  * @return number of bytes processed, -1 on error
40  */
41 ssize_t
43  const void *data,
44  size_t size,
46  void *proc_cls)
47 {
48  const char *cdata;
49  unsigned char code;
50  struct SeekRequestMessage seek;
51  struct MetaMessage meta;
52  const char *mime_type;
53  const char *value;
54  ssize_t ret;
55 
56  ret = 0;
57  while (size > 0)
58  {
59  cdata = data;
60  code = (unsigned char) cdata[0];
61  switch (code)
62  {
63  case MESSAGE_DONE: /* Done */
64  plugin->seek_request = -1;
65  plugin->round_finished = 1;
66  ret++;
67  size--;
68  data++;
69  continue;
70  case MESSAGE_SEEK: /* Seek */
71  if (size < sizeof (struct SeekRequestMessage))
72  {
73  plugin->seek_request = -1;
74  return ret;
75  }
76  memcpy (&seek, cdata, sizeof (seek));
77  plugin->seek_request = (int64_t) seek.file_offset;
78  plugin->seek_whence = seek.whence;
79  ret += sizeof (struct SeekRequestMessage);
80  data += sizeof (struct SeekRequestMessage);
81  size -= sizeof (struct SeekRequestMessage);
82  continue;
83  case MESSAGE_META: /* Meta */
84  if (size < sizeof (struct MetaMessage))
85  {
86  plugin->seek_request = -1;
87  return ret;
88  }
89  memcpy (&meta, cdata, sizeof (meta));
90  /* check hdr for sanity */
91  if (meta.value_size > MAX_META_DATA)
92  {
93  LOG ("Meta data exceeds size limit\n");
94  return -1; /* not allowing more than MAX_META_DATA meta data */
95  }
96  if (size < sizeof (meta) + meta.mime_length + meta.value_size)
97  {
98  plugin->seek_request = -1;
99  return ret;
100  }
101  if (0 == meta.mime_length)
102  {
103  mime_type = NULL;
104  }
105  else
106  {
107  mime_type = &cdata[sizeof (struct MetaMessage)];
108  if ('\0' != mime_type[meta.mime_length - 1])
109  {
110  LOG ("Mime type not 0-terminated\n");
111  return -1;
112  }
113  }
114  if (0 == meta.value_size)
115  value = NULL;
116  else
117  value = &cdata[sizeof (struct MetaMessage) + meta.mime_length];
118  if (meta.meta_type >= EXTRACTOR_metatype_get_max ())
120  proc (proc_cls,
121  plugin,
122  (enum EXTRACTOR_MetaType) meta.meta_type,
123  (enum EXTRACTOR_MetaFormat) meta.meta_format,
124  mime_type, value, meta.value_size);
125  ret += sizeof (struct MetaMessage) + meta.mime_length + meta.value_size;
126  size -= sizeof (struct MetaMessage) + meta.mime_length + meta.value_size;
127  data += sizeof (struct MetaMessage) + meta.mime_length + meta.value_size;
128  continue;
129  default:
130  LOG ("Invalid message type %d\n", (int) code);
131  return -1;
132  }
133  }
134  return ret;
135 }
136 
137 
138 /* end of extractor_ipc.c */
EXTRACTOR_MetaFormat
Definition: extractor.h:92
ssize_t EXTRACTOR_IPC_process_reply_(struct EXTRACTOR_PluginList *plugin, const void *data, size_t size, EXTRACTOR_ChannelMessageProcessor proc, void *proc_cls)
Definition: extractor_ipc.c:42
IPC with plugin (OS-independent API)
#define MESSAGE_META
#define MESSAGE_SEEK
#define MESSAGE_DONE
#define MAX_META_DATA
Definition: extractor_ipc.h:77
void(* EXTRACTOR_ChannelMessageProcessor)(void *cls, struct EXTRACTOR_PluginList *plugin, enum EXTRACTOR_MetaType meta_type, enum EXTRACTOR_MetaFormat meta_format, const char *mime, const void *value, size_t value_len)
logging API for GNU libextractor
#define LOG(...)
code to load plugins
#define NULL
Definition: getopt1.c:60
enum EXTRACTOR_MetaType EXTRACTOR_metatype_get_max(void)
EXTRACTOR_MetaType
Definition: extractor.h:126
@ EXTRACTOR_METATYPE_UNKNOWN
Definition: extractor.h:181
plaform specifics
uint32_t value_size
uint16_t meta_type
uint16_t mime_length
uint16_t meta_format