"Fossies" - the Fresh Open Source Software Archive 
Member "libextractor-1.11/src/main/extractor_ipc.c" (30 Jan 2021, 4310 Bytes) of package /linux/privat/libextractor-1.11.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "extractor_ipc.c" see the
Fossies "Dox" file reference documentation.
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
42 EXTRACTOR_IPC_process_reply_ (struct EXTRACTOR_PluginList *plugin,
43 const void *data,
44 size_t size,
45 EXTRACTOR_ChannelMessageProcessor proc,
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 ())
119 meta.meta_type = EXTRACTOR_METATYPE_UNKNOWN;
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 */