gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r22876 - Extractor/src/main


From: gnunet
Subject: [GNUnet-SVN] r22876 - Extractor/src/main
Date: Tue, 24 Jul 2012 20:47:00 +0200

Author: grothoff
Date: 2012-07-24 20:47:00 +0200 (Tue, 24 Jul 2012)
New Revision: 22876

Added:
   Extractor/src/main/extractor_common.c
   Extractor/src/main/extractor_common.h
Modified:
   Extractor/src/main/Makefile.am
   Extractor/src/main/extractor.c
   Extractor/src/main/extractor_ipc.h
   Extractor/src/main/extractor_plugin_main.c
Log:
-misc

Modified: Extractor/src/main/Makefile.am
===================================================================
--- Extractor/src/main/Makefile.am      2012-07-24 15:30:16 UTC (rev 22875)
+++ Extractor/src/main/Makefile.am      2012-07-24 18:47:00 UTC (rev 22876)
@@ -42,6 +42,7 @@
 libextractor_la_SOURCES = \
   extractor_metatypes.c \
   extractor_print.c \
+  extractor_common.c extractor_common.h \
   extractor_plugpath.c extractor_plugpath.h \
   extractor_plugins.c extractor_plugins.h \
   $(EXTRACTOR_IPC) extractor_ipc.c extractor_ipc.h \

Modified: Extractor/src/main/extractor.c
===================================================================
--- Extractor/src/main/extractor.c      2012-07-24 15:30:16 UTC (rev 22875)
+++ Extractor/src/main/extractor.c      2012-07-24 18:47:00 UTC (rev 22876)
@@ -53,10 +53,10 @@
  * @param size number of bytes to write
  * @return number of bytes written (that is 'size'), or -1 on error
  */ 
-static int
-write_all (int fd,
-          const void *buf,
-          size_t size)
+ssize_t
+EXTRACTOR_write_all_ (int fd,
+                     const void *buf,
+                     size_t size)
 {
   const char *data = buf;
   size_t off = 0;

Added: Extractor/src/main/extractor_common.c
===================================================================
--- Extractor/src/main/extractor_common.c                               (rev 0)
+++ Extractor/src/main/extractor_common.c       2012-07-24 18:47:00 UTC (rev 
22876)
@@ -0,0 +1,88 @@
+/*
+     This file is part of libextractor.
+     (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., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+ */
+
+#include "platform.h"
+#include "extractor_common.h"
+#include "extractor.h"
+#include <sys/types.h>
+#include <signal.h>
+
+
+/**
+ * Writes 'size' bytes from 'buf' to 'fd', returns only when
+ * writing is not possible, or when all 'size' bytes were written
+ * (never does partial writes).
+ *
+ * @param fd fd to write into
+ * @param buf buffer to read from
+ * @param size number of bytes to write
+ * @return number of bytes written (that is 'size'), or -1 on error
+ */ 
+ssize_t
+EXTRACTOR_write_all_ (int fd,
+                     const void *buf,
+                     size_t size)
+{
+  const char *data = buf;
+  size_t off = 0;
+  ssize_t ret;
+  
+  while (off < size)
+    {
+      ret = write (fd, &data[off], size - off);
+      if (ret <= 0)
+       return -1;
+      off += ret;
+    }
+  return size;
+}
+
+
+/**
+ * Read a buffer from a given descriptor.
+ *
+ * @param fd descriptor to read from
+ * @param buf buffer to fill
+ * @param size number of bytes to read into 'buf'
+ * @return -1 on error, size on success
+ */
+ssize_t
+EXTRACTOR_read_all_ (int fd,
+                    void *buf,
+                    size_t size)
+{
+  char *data = buf;
+  size_t off = 0;
+  ssize_t ret;
+  
+  while (off < size)
+    {
+      ret = read (fd, &data[off], size - off);
+      if (ret <= 0)
+       return -1;
+      off += ret;
+    }
+  return size;
+  
+}
+
+
+
+/* end of extractor_common.c */

Added: Extractor/src/main/extractor_common.h
===================================================================
--- Extractor/src/main/extractor_common.h                               (rev 0)
+++ Extractor/src/main/extractor_common.h       2012-07-24 18:47:00 UTC (rev 
22876)
@@ -0,0 +1,55 @@
+/*
+     This file is part of libextractor.
+     (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., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef EXTRACTOR_COMMON_H
+#define EXTRACTOR_COMMON_H
+
+/**
+ * Writes 'size' bytes from 'buf' to 'fd', returns only when
+ * writing is not possible, or when all 'size' bytes were written
+ * (never does partial writes).
+ *
+ * @param fd fd to write into
+ * @param buf buffer to read from
+ * @param size number of bytes to write
+ * @return number of bytes written (that is 'size'), or -1 on error
+ */ 
+ssize_t
+EXTRACTOR_write_all_ (int fd,
+                     const void *buf,
+                     size_t size);
+
+
+/**
+ * Read a buffer from a given descriptor.
+ *
+ * @param fd descriptor to read from
+ * @param buf buffer to fill
+ * @param size number of bytes to read into 'buf'
+ * @return -1 on error, size on success
+ */
+ssize_t
+EXTRACTOR_read_all_ (int fd,
+                    void *buf,
+                    size_t size);
+
+
+#endif

Modified: Extractor/src/main/extractor_ipc.h
===================================================================
--- Extractor/src/main/extractor_ipc.h  2012-07-24 15:30:16 UTC (rev 22875)
+++ Extractor/src/main/extractor_ipc.h  2012-07-24 18:47:00 UTC (rev 22876)
@@ -145,6 +145,11 @@
   uint32_t shm_ready_bytes;
 
   /**
+   * Offset of the shm in the overall file.
+   */
+  uint64_t shm_off;
+
+  /**
    * Overall size of the file.
    */
   uint64_t file_size;

Modified: Extractor/src/main/extractor_plugin_main.c
===================================================================
--- Extractor/src/main/extractor_plugin_main.c  2012-07-24 15:30:16 UTC (rev 
22875)
+++ Extractor/src/main/extractor_plugin_main.c  2012-07-24 18:47:00 UTC (rev 
22876)
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "plibc.h"
 #include "extractor.h"
+#include "extractor_common.h"
 #include "extractor_datasource.h"
 #include "extractor_plugins.h"
 #include "extractor_ipc.h"
@@ -94,7 +95,6 @@
 };
 
 
-
 /**
  * Moves current absolute buffer position to @pos in @whence mode.
  * Will move logical position withouth shifting the buffer, if possible.
@@ -111,55 +111,62 @@
                 int whence)
 {
   struct ProcessingContext *pc = cls;
+  struct SeekRequestMessage srm;
+  struct UpdateMessage um;
+  uint64_t npos;
 
   switch (whence)
-  {
-  case SEEK_CUR:
-    if (plugin->shm_pos + pos < plugin->map_size && plugin->shm_pos + pos >= 0)
     {
-      plugin->shm_pos += pos;
-      return plugin->fpos + plugin->shm_pos;
-    }
-    if (0 != pl_pick_next_buffer_at (plugin, plugin->fpos + plugin->shm_pos + 
pos, 1))
+    case SEEK_CUR:
+      if ( (pos < 0) && (pc->read_position < - pos) )
+       return -1;
+      if ( (pos > 0) && 
+          ( (pc->read_position + pos < pc->read_position) ||
+            (pc->read_position + pos > pc->file_size) ) )
+       return -1;
+      npos = (uint64_t) (pc->read_position + pos);
+      break;
+    case SEEK_END:
+      if (pos > 0)
+       return -1;
+      pos = (int64_t) (pc->file_size + pos);
+      /* fall-through! */
+    case SEEK_SET:
+      if ( (pos < 0) || (pc->file_size < pos) )
+       return -1;
+      npos = (uint64_t) pos;
+      break;
+    default:
       return -1;
-    plugin->shm_pos += pos;
-    return plugin->fpos + plugin->shm_pos;
-    break;
-  case SEEK_SET:
-    if (pos < 0)
-      return -1;
-    if (pos >= plugin->fpos && pos < plugin->fpos + plugin->map_size)
-    {
-      plugin->shm_pos = pos - plugin->fpos;
-      return pos;
     }
-    if (0 != pl_pick_next_buffer_at (plugin, pos, 1))
-      return -1;
-    if (pos >= plugin->fpos && pos < plugin->fpos + plugin->map_size)
+  if ( (pc->shm_off <= npos) &&
+       (pc->shm_off + pc->shm_ready_bytes > npos) )
     {
-      plugin->shm_pos = pos - plugin->fpos;
-      return pos;
+      pc->read_position = npos;
+      return (int64_t) npos;
     }
+  /* need to seek */
+  srm.opcode = MESSAGE_SEEK;
+  srm.reserved = 0;
+  srm.reserved2 = 0;
+  srm.requested_bytes = pc->shm_map_size;
+  if (srm.requested_bytes > pc->file_size - npos)
+    srm.requested_bytes = pc->file_size - npos;
+  srm.file_offset = npos;
+  if (-1 == EXTRACTOR_write_all_ (pc->out, &srm, sizeof (srm)))
     return -1;
-    break;
-  case SEEK_END:
-    while (plugin->fsize == -1)
+  if (-1 == EXTRACTOR_read_all_ (pc->in, &um, sizeof (um)))
+    return -1;
+  pc->shm_off = um.shm_off;
+  pc->shm_ready_bytes = um.shm_ready_bytes;
+  if ( (pc->shm_off <= npos) &&
+       (pc->shm_off + pc->shm_ready_bytes > npos) )
     {
-      pl_pick_next_buffer_at (plugin, plugin->fpos + plugin->map_size + pos, 
0);
+      pc->read_position = npos;
+      return (int64_t) npos;
     }
-    if (plugin->fsize + pos - 1 < plugin->fpos || plugin->fsize + pos - 1 > 
plugin->fpos + plugin->map_size)
-    {
-      if (0 != pl_pick_next_buffer_at (plugin, plugin->fsize - MAX_READ, 0))
-        return -1;
-    }
-    plugin->shm_pos = plugin->fsize + pos - plugin->fpos;
-    if (plugin->shm_pos < 0)
-      plugin->shm_pos = 0;
-    else if (plugin->shm_pos >= plugin->map_size)
-      plugin->shm_pos = plugin->map_size - 1;
-    return plugin->fpos + plugin->shm_pos - 1;
-    break;
-  }
+  /* oops, serious missunderstanding, we asked to seek
+     and then were notified about a different position!? */
   return -1;
 }
 
@@ -181,6 +188,7 @@
 {
   struct ProcessingContext *pc = cls;
   
+  // FIXME!
   *data = NULL;
   if (count > MAX_READ)
     return -1;
@@ -203,6 +211,12 @@
 }
 
 
+/**
+ * Provide the overall file size to plugins.
+ *
+ * @param cls the 'struct ProcessingContext'
+ * @return overall file size of the current file
+ */
 static uint64_t
 plugin_env_get_size (void *cls)
 {
@@ -254,17 +268,17 @@
   hdr.data_len = data_len;
   hdr.mime_len = mime_len;
   if ( (sizeof (meta_byte) != 
-       write_all (*cpipe_out,
-                  &meta_byte, sizeof (meta_byte))) ||
+       EXTRACTOR_write_all_ (*cpipe_out,
+                             &meta_byte, sizeof (meta_byte))) ||
        (sizeof (hdr) != 
-       write_all (*cpipe_out, 
-                  &hdr, sizeof (hdr))) ||
+       EXTRACTOR_write_all_ (*cpipe_out, 
+                             &hdr, sizeof (hdr))) ||
        (mime_len !=
-       write_all (*cpipe_out, 
-                  data_mime_type, mime_len)) ||
+       EXTRACTOR_write_all_ (*cpipe_out, 
+                             data_mime_type, mime_len)) ||
        (data_len !=
-       write_all (*cpipe_out, 
-                  data, data_len)) )
+       EXTRACTOR_write_all_ (*cpipe_out, 
+                             data, data_len)) )
     return 1;
   return 0;
 }
@@ -284,9 +298,9 @@
   if (NULL != pc->shm)
     return -1;
   if (sizeof (struct InitMessage) - 1
-      != read (pc->in,
-              &init.reserved,
-              sizeof (struct InitMessage) - 1))
+      != EXTRACTOR_read_all_ (pc->in,
+                  &init.reserved,
+                  sizeof (struct InitMessage) - 1))
     return -1;
   if (init.shm_name_length > MAX_SHM_NAME)
     return -1;
@@ -294,9 +308,9 @@
     char shm_name[init.shm_name_length + 1];
 
     if (init.shm_name_length 
-       != read (pc->in,
-                shm_name,
-                init.shm_name_length))
+       != EXTRACTOR_read_all_ (pc->in,
+                    shm_name,
+                    init.shm_name_length))
       return -1;
     shm_name[init.shm_name_length] = '\0';
 
@@ -333,11 +347,12 @@
 {
   struct StartMessage start;
   struct EXTRACTOR_ExtractContext ec;
+  char done;
 
   if (sizeof (struct StartMessage) - 1
-      != read (pc->in,
-              &start.reserved,
-              sizeof (struct StartMessage) - 1))
+      != EXTRACTOR_read_all_ (pc->in,
+                  &start.reserved,
+                  sizeof (struct StartMessage) - 1))
     return -1;
   pc->shm_ready_bytes = start.shm_ready_bytes;
   pc->file_size = start.shm_file_size;
@@ -350,6 +365,22 @@
   ec.get_size = &plugin_env_get_size;
   ec.proc = &plugin_env_send_proc;
   pc->plugin->extract_method (&ec);
+  done = MESSAGE_DONE;
+  if (-1 == send_to_master (pc, &done, sizeof (done)))
+    return -1;
+  if ( (NULL != pc->plugin->specials) &&
+       (NULL != strstr (pc->plugin->specials, "force-kill")) )
+    {
+      /* we're required to die after each file since this
+        plugin only supports a single file at a time */
+#if !WINDOWS
+      fsync (pc->out);
+#else
+      _commit (pc->out);
+#endif
+      _exit (0);
+    }
+  return 0;
 }
 
 
@@ -366,7 +397,7 @@
     {
       unsigned char code;
   
-      if (1 != read (pc->in, &code, 1))
+      if (1 != EXTRACTOR_read_all_ (pc->in, &code, 1))
        break;
       switch (code)
        {
@@ -390,100 +421,7 @@
     }
 }
 
-#if 0
-    case MESSAGE_UPDATED_SHM:
-      if (plugin->operation_mode == OPMODE_DECOMPRESS)
-      {
-        read_result2 = read (in, &plugin->fpos, sizeof (int64_t));
-        read_result3 = read (in, &plugin->map_size, sizeof (size_t));
-        read_result4 = read (in, &plugin->fsize, sizeof (int64_t));
-        if ((read_result2 < sizeof (int64_t)) || (read_result3 < sizeof 
(size_t)) ||
-            plugin->fpos < 0 || (plugin->operation_mode != OPMODE_DECOMPRESS 
&& (plugin->fsize <= 0 || plugin->fpos >= plugin->fsize)))
-        {
-          do_break = 1;
-          break;
-        }
-        /* FIXME: also check mapped region size (lseek for *nix, VirtualQuery 
for W32) */
-        /* Re-map the shm */
-#if !WINDOWS
-        if ((-1 == plugin->shm_id) ||
-            (NULL == (plugin->shm_ptr = mmap (NULL, plugin->map_size, 
PROT_READ, MAP_SHARED, plugin->shm_id, 0))) ||
-            (plugin->shm_ptr == (void *) -1))
-        {
-          do_break = 1;
-          break;
-        }
-#else
-        if ((plugin->map_handle == 0) ||
-           (NULL == (plugin->shm_ptr = 
-        {
-          do_break = 1;
-          break;
-        }
-#endif
-        if (plugin->waiting_for_update == 1)
-        {
-          /* We were only waiting for this one message */
-          do_break = 1;
-          plugin->waiting_for_update = 2;
-          break;
-        }
-        /* Run extractor on mapped region (recursive call doesn't reach this
-         * point and breaks out earlier.
-         */
-        extract_reply = plugin->extract_method (plugin, transmit_reply, &out);
-        /* Unmap the shm */
-#if !WINDOWS
-        if ((plugin->shm_ptr != NULL) &&
-            (plugin->shm_ptr != (void*) -1) )
-          munmap (plugin->shm_ptr, plugin->map_size);
-#else
-        if (plugin->shm_ptr != NULL)
-          UnmapViewOfFile (plugin->shm_ptr);
-#endif
-        plugin->shm_ptr = NULL;
-        if (extract_reply == 1)
-        {
-          /* Tell LE that we're done */
-          unsigned char done_byte = MESSAGE_DONE;
-          if (write (out, &done_byte, 1) != 1)
-          {
-            do_break = 1;
-            break;
-          }
-          if ((plugin->specials != NULL) &&
-              (NULL != strstr (plugin->specials, "force-kill")))
-          {
-            /* we're required to die after each file since this
-               plugin only supports a single file at a time */
-#if !WINDOWS
-            fsync (out);
-#else
-            _commit (out);
-#endif
-            _exit (0);
-          }
-        }
-        else
-        {
-          /* Tell LE that we're not done, and we need to seek */
-          unsigned char seek_byte = MESSAGE_SEEK;
-          if (write (out, &seek_byte, 1) != 1)
-          {
-            do_break = 1;
-            break;
-          }
-          if (write (out, &plugin->seek_request, sizeof (int64_t)) != sizeof 
(int64_t))
-          {
-            do_break = 1;
-            break;
-          }
-        }
-      }
-}
-#endif
 
-
 #ifndef WINDOWS
 /**
  * Open '/dev/null' and make the result the given
@@ -587,28 +525,29 @@
   SYSTEM_INFO si;
   size_t i;
 
+  // FIXME: check for errors from 'EXTRACTOR_read_all_'!
   if (NULL == (ret = malloc (sizeof (struct EXTRACTOR_PluginList))))
     return NULL;
   GetSystemInfo (&si);
   ret->allocation_granularity = si.dwAllocationGranularity;
-  read (fd, &i, sizeof (size_t));
+  EXTRACTOR_read_all_ (fd, &i, sizeof (size_t));
   if (NULL == (ret->libname = malloc (i)))
     {
       free (ret);
       return NULL;
     }
-  read (fd, ret->libname, i);
+  EXTRACTOR_read_all_ (fd, ret->libname, i);
   ret->libname[i - 1] = '\0';
-  read (fd, &i, sizeof (size_t));
+  EXTRACTOR_read_all_ (fd, &i, sizeof (size_t));
   if (NULL == (ret->short_libname = malloc (i)))
     {
       free (ret->libname);
       free (ret);
       return NULL;
     }
-  read (fd, ret->short_libname, i);
+  EXTRACTOR_read_all_ (fd, ret->short_libname, i);
   ret->short_libname[i - 1] = '\0';
-  read (fd, &i, sizeof (size_t));
+  EXTRACTOR_read_all_ (fd, &i, sizeof (size_t));
   if (0 == i)
     {
       ret->plugin_options = NULL;
@@ -621,7 +560,7 @@
       free (ret);
       return NULL;
     }
-  read (fd, ret->plugin_options, i);
+  EXTRACTOR_read_all_ (fd, ret->plugin_options, i);
   ret->plugin_options[i - 1] = '\0';
   return ret;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]