"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 */