]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bsock.c
Working directory pane in restore. Will get this into the stack next.
[bacula/bacula] / bacula / src / lib / bsock.c
index 8567f37fdda59f5865f11fcaa175f1f7e856468b..4677cea2ec9837b4f4b70fd91cbdf0bd610b9fea 100644 (file)
 #include "jcr.h"
 #include <netdb.h>
 
+#ifndef ENODATA                    /* not defined on BSD systems */
+#define ENODATA EPIPE
+#endif
+
 #ifdef HAVE_WIN32
 #define socketRead(fd, buf, len)  ::recv(fd, buf, len, 0)
 #define socketWrite(fd, buf, len) ::send(fd, buf, len, 0)
@@ -271,6 +275,58 @@ bool BSOCK::signal(int signal)
    return send();
 }
 
+/* 
+ * Despool spooled attributes
+ */
+bool BSOCK::despool(void update_attr_spool_size(ssize_t size), ssize_t tsize)
+{
+   int32_t pktsiz;
+   size_t nbytes;
+   ssize_t last = 0, size = 0;
+   int count = 0;
+
+   rewind(spool_fd);
+
+#if defined(HAVE_POSIX_FADVISE) && defined(POSIX_FADV_WILLNEED)
+   posix_fadvise(fileno(spool_fd), 0, 0, POSIX_FADV_WILLNEED);
+#endif
+
+   while (fread((char *)&pktsiz, 1, sizeof(int32_t), spool_fd) ==
+          sizeof(int32_t)) {
+      size += sizeof(int32_t);
+      msglen = ntohl(pktsiz);
+      if (msglen > 0) {
+         if (msglen > (int32_t) sizeof_pool_memory(msg)) {
+            msg = realloc_pool_memory(msg, msglen + 1);
+         }
+         nbytes = fread(msg, 1, msglen, spool_fd);
+         if (nbytes != (size_t) msglen) {
+            berrno be;
+            Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, msglen);
+            Qmsg1(jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
+                  be.strerror());
+            update_attr_spool_size(tsize - last);
+            return false;
+         }
+         size += nbytes;
+         if ((++count & 0x3F) == 0) {
+            update_attr_spool_size(size - last);
+            last = size;
+         }
+      }
+      send();
+   }
+   update_attr_spool_size(tsize - last);
+   if (ferror(spool_fd)) {
+      berrno be;
+      Qmsg1(jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
+            be.strerror());
+      return false;
+   }
+   return true;
+}
+
+
 void BSOCK::close()
 {
    BSOCK *bsock = this;