]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/jcr.c
State file debug + full functionality for alist
[bacula/bacula] / bacula / src / lib / jcr.c
index da48fd0f23ad83e6eaa0921fcf269d76deea451c..00cd0307d9fe4964b581099d183dd5d3a201f619 100755 (executable)
@@ -75,12 +75,22 @@ void term_last_jobs_list()
 void read_last_jobs_list(int fd, uint64_t addr)
 {
    struct s_last_job *je, job;
+   uint32_t num;
 
+   Dmsg1(010, "read_last_jobs seek to %d\n", (int)addr);
    if (addr == 0 || lseek(fd, addr, SEEK_SET) < 0) {
       return;
    }
-   for ( ;; ) {
-      if (read(fd, &job, sizeof(job)) < 0) {
+   if (read(fd, &num, sizeof(num)) != sizeof(num)) {
+      return;
+   }
+   Dmsg1(010, "Read num_items=%d\n", num);
+   if (num > 4 * MAX_LAST_JOBS) {  /* sanity check */
+      return;
+   }
+   for ( ; num; num--) {
+      if (read(fd, &job, sizeof(job)) != sizeof(job)) {
+         Dmsg1(000, "Read job entry. ERR=%s\n", strerror(errno));
         return;
       }
       if (job.JobId > 0) {
@@ -93,32 +103,37 @@ void read_last_jobs_list(int fd, uint64_t addr)
         if (last_jobs->size() > MAX_LAST_JOBS) {
            last_jobs->remove(last_jobs->first());
         }
-        job.JobId = 0;                 /* zap last job */
-      } else {
-        break;
       }
    }
 }
 
 uint64_t write_last_jobs_list(int fd, uint64_t addr)
 {
-   struct s_last_job *je, job;
+   struct s_last_job *je;
+   uint32_t num;
+
+   Dmsg1(010, "write_last_jobs seek to %d\n", (int)addr);
    if (lseek(fd, addr, SEEK_SET) < 0) {
       return 0;
    }
    if (last_jobs) {
+      /* First record is number of entires */
+      num = last_jobs->size();
+      if (write(fd, &num, sizeof(num)) != sizeof(num)) {
+         Dmsg1(000, "Error writing num_items: ERR=%s\n", strerror(errno));
+        return 0;
+      }
       foreach_dlist(je, last_jobs) {
-        if (write(fd, je, sizeof(struct s_last_job)) < 0) {
+        if (write(fd, je, sizeof(struct s_last_job)) != sizeof(struct s_last_job)) {
+            Dmsg1(000, "Error writing job: ERR=%s\n", strerror(errno));
            return 0;
         }
       }
    }
-   /* Write a zero record to terminate list */
-   memset(&job, 0, sizeof(job));
-   write(fd, &job, sizeof(job));
+   /* Return current address */
    ssize_t stat = lseek(fd, 0, SEEK_CUR);
    if (stat < 0) {
-      return 0;
+      stat = 0;
    }
    return stat;