]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/bsr.c
Fix problem of accents with new Win32 code.
[bacula/bacula] / bacula / src / dird / bsr.c
index c21937899e12be8dede958816792fae2daab7fb6..2b2e77526e362bdc9e5be97118da1d7ab64b9203 100644 (file)
@@ -2,8 +2,8 @@
  *
  *   Bacula Director -- Bootstrap Record routines.
  *
  *
  *   Bacula Director -- Bootstrap Record routines.
  *
- *     BSR (bootstrap record) handling routines split from
- *       ua_restore.c July MMIII
+ *      BSR (bootstrap record) handling routines split from
+ *        ua_restore.c July MMIII
  *
  *     Kern Sibbald, July MMII
  *
  *
  *     Kern Sibbald, July MMII
  *
  */
 
 /*
  */
 
 /*
-   Copyright (C) 2002-2005 Kern Sibbald
+   Copyright (C) 2002-2006 Kern Sibbald
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
-   version 2 as ammended with additional clauses defined in the
+   version 2 as amended with additional clauses defined in the
    file LICENSE in the main source directory.
 
    This program is distributed in the hope that it will be useful,
    file LICENSE in the main source directory.
 
    This program is distributed in the hope that it will be useful,
@@ -29,7 +29,7 @@
 #include "dird.h"
 
 /* Forward referenced functions */
 #include "dird.h"
 
 /* Forward referenced functions */
-static uint32_t write_bsr(UAContext *ua, RBSR *bsr, FILE *fd);
+static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd);
 void print_bsr(UAContext *ua, RBSR *bsr);
 
 
 void print_bsr(UAContext *ua, RBSR *bsr);
 
 
@@ -53,6 +53,27 @@ static void free_findex(RBSR_FINDEX *fi)
    }
 }
 
    }
 }
 
+/* 
+ * Get storage device name from Storage resource
+ */
+static bool get_storage_device(char *device, char *storage)
+{
+   STORE *store;
+   if (storage[0] == 0) {
+      return false;
+   }
+   store = (STORE *)GetResWithName(R_STORAGE, storage);    
+   if (!store) {
+      return false;
+   }
+   DEVICE *dev = (DEVICE *)(store->device->first());
+   if (!dev) {
+      return false;
+   }
+   bstrncpy(device, dev->hdr.name, MAX_NAME_LENGTH);
+   return true;
+}
+
 /*
  * Our data structures were not designed completely
  *  correctly, so the file indexes cover the full
 /*
  * Our data structures were not designed completely
  *  correctly, so the file indexes cover the full
@@ -64,23 +85,23 @@ static void free_findex(RBSR_FINDEX *fi)
  *  for each Volume.
  */
 static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi,
  *  for each Volume.
  */
 static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi,
-             int32_t FirstIndex, int32_t LastIndex, FILE *fd)
+              int32_t FirstIndex, int32_t LastIndex, FILE *fd)
 {
    uint32_t count = 0;
    for ( ; fi; fi=fi->next) {
       int32_t findex, findex2;
       if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
 {
    uint32_t count = 0;
    for ( ; fi; fi=fi->next) {
       int32_t findex, findex2;
       if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
-         (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
-         (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
-        findex = fi->findex < FirstIndex ? FirstIndex : fi->findex;
-        findex2 = fi->findex2 > LastIndex ? LastIndex : fi->findex2;
-        if (findex == findex2) {
+          (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
+          (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
+         findex = fi->findex < FirstIndex ? FirstIndex : fi->findex;
+         findex2 = fi->findex2 > LastIndex ? LastIndex : fi->findex2;
+         if (findex == findex2) {
             fprintf(fd, "FileIndex=%d\n", findex);
             fprintf(fd, "FileIndex=%d\n", findex);
-           count++;
-        } else {
+            count++;
+         } else {
             fprintf(fd, "FileIndex=%d-%d\n", findex, findex2);
             fprintf(fd, "FileIndex=%d-%d\n", findex, findex2);
-           count += findex2 - findex + 1;
-        }
+            count += findex2 - findex + 1;
+         }
       }
    }
    return count;
       }
    }
    return count;
@@ -91,13 +112,13 @@ static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi,
  *   falls within the range of selected files in the bsr.
  */
 static bool is_volume_selected(RBSR_FINDEX *fi,
  *   falls within the range of selected files in the bsr.
  */
 static bool is_volume_selected(RBSR_FINDEX *fi,
-             int32_t FirstIndex, int32_t LastIndex)
+              int32_t FirstIndex, int32_t LastIndex)
 {
    for ( ; fi; fi=fi->next) {
       if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
 {
    for ( ; fi; fi=fi->next) {
       if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
-         (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
-         (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
-        return true;
+          (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
+          (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
+         return true;
       }
    }
    return false;
       }
    }
    return false;
@@ -111,10 +132,10 @@ static void print_findex(UAContext *ua, RBSR_FINDEX *fi)
    for ( ; fi; fi=fi->next) {
       if (fi->findex == fi->findex2) {
          bsendmsg(ua, "FileIndex=%d\n", fi->findex);
    for ( ; fi; fi=fi->next) {
       if (fi->findex == fi->findex2) {
          bsendmsg(ua, "FileIndex=%d\n", fi->findex);
-//       Dmsg1(100, "FileIndex=%d\n", fi->findex);
+         Dmsg1(1000, "FileIndex=%d\n", fi->findex);
       } else {
          bsendmsg(ua, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
       } else {
          bsendmsg(ua, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
-//       Dmsg2(100, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
+         Dmsg2(1000, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
       }
    }
 }
       }
    }
 }
@@ -134,7 +155,7 @@ void free_bsr(RBSR *bsr)
    for ( ; bsr; bsr=next) {
       free_findex(bsr->fi);
       if (bsr->VolParams) {
    for ( ; bsr; bsr=next) {
       free_findex(bsr->fi);
       if (bsr->VolParams) {
-        free(bsr->VolParams);
+         free(bsr->VolParams);
       }
       next = bsr->next;
       free(bsr);
       }
       next = bsr->next;
       free(bsr);
@@ -153,23 +174,26 @@ bool complete_bsr(UAContext *ua, RBSR *bsr)
       jr.JobId = bsr->JobId;
       if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
          bsendmsg(ua, _("Unable to get Job record. ERR=%s\n"), db_strerror(ua->db));
       jr.JobId = bsr->JobId;
       if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
          bsendmsg(ua, _("Unable to get Job record. ERR=%s\n"), db_strerror(ua->db));
-        return false;
+         return false;
       }
       bsr->VolSessionId = jr.VolSessionId;
       bsr->VolSessionTime = jr.VolSessionTime;
       if ((bsr->VolCount=db_get_job_volume_parameters(ua->jcr, ua->db, bsr->JobId,
       }
       bsr->VolSessionId = jr.VolSessionId;
       bsr->VolSessionTime = jr.VolSessionTime;
       if ((bsr->VolCount=db_get_job_volume_parameters(ua->jcr, ua->db, bsr->JobId,
-          &(bsr->VolParams))) == 0) {
+           &(bsr->VolParams))) == 0) {
          bsendmsg(ua, _("Unable to get Job Volume Parameters. ERR=%s\n"), db_strerror(ua->db));
          bsendmsg(ua, _("Unable to get Job Volume Parameters. ERR=%s\n"), db_strerror(ua->db));
-        if (bsr->VolParams) {
-           free(bsr->VolParams);
-           bsr->VolParams = NULL;
-        }
-        return false;
+         if (bsr->VolParams) {
+            free(bsr->VolParams);
+            bsr->VolParams = NULL;
+         }
+         return false;
       }
    }
    return true;
 }
 
       }
    }
    return true;
 }
 
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t uniq = 0;
+
 void make_unique_restore_filename(UAContext *ua, POOLMEM **fname)
 {
    JCR *jcr = ua->jcr;
 void make_unique_restore_filename(UAContext *ua, POOLMEM **fname)
 {
    JCR *jcr = ua->jcr;
@@ -178,32 +202,40 @@ void make_unique_restore_filename(UAContext *ua, POOLMEM **fname)
       Mmsg(fname, "%s", ua->argv[i]);              
       jcr->unlink_bsr = false;
    } else {
       Mmsg(fname, "%s", ua->argv[i]);              
       jcr->unlink_bsr = false;
    } else {
-      Mmsg(fname, "%s/%s.restore.%s.bsr", working_directory, my_name, 
-        jcr->Job);
+      P(mutex);
+      uniq++;
+      V(mutex);
+      Mmsg(fname, "%s/%s.restore.%u.bsr", working_directory, my_name, uniq);
       jcr->unlink_bsr = true;
    }
       jcr->unlink_bsr = true;
    }
+   if (jcr->RestoreBootstrap) {
+      free(jcr->RestoreBootstrap);
+   }
+   jcr->RestoreBootstrap = bstrdup(*fname);
 }
 
 /*
  * Write the bootstrap records to file
  */
 }
 
 /*
  * Write the bootstrap records to file
  */
-uint32_t write_bsr_file(UAContext *ua, RBSR *bsr)
+uint32_t write_bsr_file(UAContext *ua, RESTORE_CTX &rx)
 {
    FILE *fd;
    POOLMEM *fname = get_pool_memory(PM_MESSAGE);
    uint32_t count = 0;;
    bool err;
 {
    FILE *fd;
    POOLMEM *fname = get_pool_memory(PM_MESSAGE);
    uint32_t count = 0;;
    bool err;
+   char *p;
+   JobId_t JobId;
 
    make_unique_restore_filename(ua, &fname);
    fd = fopen(fname, "w+");
    if (!fd) {
       berrno be;
       bsendmsg(ua, _("Unable to create bootstrap file %s. ERR=%s\n"),
 
    make_unique_restore_filename(ua, &fname);
    fd = fopen(fname, "w+");
    if (!fd) {
       berrno be;
       bsendmsg(ua, _("Unable to create bootstrap file %s. ERR=%s\n"),
-        fname, be.strerror());
+         fname, be.strerror());
       goto bail_out;
    }
    /* Write them to file */
       goto bail_out;
    }
    /* Write them to file */
-   count = write_bsr(ua, bsr, fd);
+   count = write_bsr(ua, rx, fd);
    err = ferror(fd);
    fclose(fd);
    if (err) {
    err = ferror(fd);
    fclose(fd);
    if (err) {
@@ -220,11 +252,28 @@ uint32_t write_bsr_file(UAContext *ua, RBSR *bsr)
    bsendmsg(ua, _("The job will require the following Volumes:\n"));
    /* Create Unique list of Volumes using prompt list */
    start_prompt(ua, "");
    bsendmsg(ua, _("The job will require the following Volumes:\n"));
    /* Create Unique list of Volumes using prompt list */
    start_prompt(ua, "");
-   for (RBSR *nbsr=bsr; nbsr; nbsr=nbsr->next) {
-      for (int i=0; i < nbsr->VolCount; i++) {
-        if (nbsr->VolParams[i].VolumeName[0]) {
-           add_prompt(ua, nbsr->VolParams[i].VolumeName);
-        }
+   if (*rx.JobIds) {
+      /* Ensure that the volumes are printed in JobId order */
+      for (p=rx.JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) {
+         for (RBSR *nbsr=rx.bsr; nbsr; nbsr=nbsr->next) {
+            if (JobId != nbsr->JobId) {
+               continue;
+            }
+            for (int i=0; i < nbsr->VolCount; i++) {
+               if (nbsr->VolParams[i].VolumeName[0]) {
+                  add_prompt(ua, nbsr->VolParams[i].VolumeName);
+               }
+            }
+         }
+      }
+   } else {
+      /* Print Volumes in any order */
+      for (RBSR *nbsr=rx.bsr; nbsr; nbsr=nbsr->next) {
+         for (int i=0; i < nbsr->VolCount; i++) {
+            if (nbsr->VolParams[i].VolumeName[0]) {
+               add_prompt(ua, nbsr->VolParams[i].VolumeName);
+            }
+         }
       }
    }
    for (int i=0; i < ua->num_prompts; i++) {
       }
    }
    for (int i=0; i < ua->num_prompts; i++) {
@@ -243,57 +292,136 @@ bail_out:
    return count;
 }
 
    return count;
 }
 
-static uint32_t write_bsr(UAContext *ua, RBSR *bsr, FILE *fd)
+/*
+ * Here we actually write out the details of the bsr file.
+ *  Note, there is one bsr for each JobId, but the bsr may
+ *  have multiple volumes, which have been entered in the
+ *  order they were written.  
+ * The bsrs must be written out in the order the JobIds
+ *  are found in the jobid list.
+ */
+static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd)
 {
    uint32_t count = 0;
    uint32_t total_count = 0;
    uint32_t LastIndex = 0;
    bool first = true;
 {
    uint32_t count = 0;
    uint32_t total_count = 0;
    uint32_t LastIndex = 0;
    bool first = true;
-   for ( ; bsr; bsr=bsr->next) {
-      /*
-       * For a given volume, loop over all the JobMedia records.
-       *   VolCount is the number of JobMedia records.
-       */
-      for (int i=0; i < bsr->VolCount; i++) {
-        if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
-             bsr->VolParams[i].LastIndex)) {
-           bsr->VolParams[i].VolumeName[0] = 0;  /* zap VolumeName */
-           continue;
-        }
-         fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
-         fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
-         fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
-         fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
-        if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
-            fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
-        } else {
-            fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
-                   bsr->VolParams[i].EndFile);
-        }
-        if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
-            fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartBlock);
-        } else {
-            fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
-                   bsr->VolParams[i].EndBlock);
-        }
-//       Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
-//         bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
-
-        count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
-                             bsr->VolParams[i].LastIndex, fd);
-        if (count) {
-            fprintf(fd, "Count=%u\n", count);
-        }
-        total_count += count;
-        /* If the same file is present on two tapes or in two files
-         *   on a tape, it is a continuation, and should not be treated
-         *   twice in the totals.
-         */
-        if (!first && LastIndex == bsr->VolParams[i].FirstIndex) {
-           total_count--;
-        }
-        first = false;
-        LastIndex = bsr->VolParams[i].LastIndex;
+   char *p;
+   JobId_t JobId;
+   char device[MAX_NAME_LENGTH];
+   RBSR *bsr;
+   if (*rx.JobIds == 0) {
+      for (bsr=rx.bsr; bsr; bsr=bsr->next) {
+         /*
+          * For a given volume, loop over all the JobMedia records.
+          *   VolCount is the number of JobMedia records.
+          */
+         for (int i=0; i < bsr->VolCount; i++) {
+            if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
+                 bsr->VolParams[i].LastIndex)) {
+               bsr->VolParams[i].VolumeName[0] = 0;  /* zap VolumeName */
+               continue;
+            }
+            fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
+            fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
+            if (get_storage_device(device, bsr->VolParams[i].Storage)) {
+               fprintf(fd, "Device=\"%s\"\n", device);
+            }
+            if (bsr->VolParams[i].Slot > 0) {
+               fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot);
+            }
+            fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
+            fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
+            if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
+               fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
+            } else {
+               fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
+                       bsr->VolParams[i].EndFile);
+            }
+            if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
+               fprintf(fd, "VolBlock=%u\n", bsr->VolParams[i].StartBlock);
+            } else {
+               fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
+                       bsr->VolParams[i].EndBlock);
+            }
+   //       Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
+   //          bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
+
+            count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
+                                 bsr->VolParams[i].LastIndex, fd);
+            if (count) {
+               fprintf(fd, "Count=%u\n", count);
+            }
+            total_count += count;
+            /* If the same file is present on two tapes or in two files
+             *   on a tape, it is a continuation, and should not be treated
+             *   twice in the totals.
+             */
+            if (!first && LastIndex == bsr->VolParams[i].FirstIndex) {
+               total_count--;
+            }
+            first = false;
+            LastIndex = bsr->VolParams[i].LastIndex;
+         }
+      }
+      return total_count;
+   }
+   for (p=rx.JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) {
+      for (bsr=rx.bsr; bsr; bsr=bsr->next) {
+         if (JobId != bsr->JobId) {
+            continue;
+         }
+         /*
+          * For a given volume, loop over all the JobMedia records.
+          *   VolCount is the number of JobMedia records.
+          */
+         for (int i=0; i < bsr->VolCount; i++) {
+            if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
+                 bsr->VolParams[i].LastIndex)) {
+               bsr->VolParams[i].VolumeName[0] = 0;  /* zap VolumeName */
+               continue;
+            }
+            fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
+            fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType);
+            if (get_storage_device(device, bsr->VolParams[i].Storage)) {
+               fprintf(fd, "Device=\"%s\"\n", device);
+            }
+            if (bsr->VolParams[i].Slot > 0) {
+               fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot);
+            }
+            fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
+            fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
+            if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
+               fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
+            } else {
+               fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
+                       bsr->VolParams[i].EndFile);
+            }
+            if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
+               fprintf(fd, "VolBlock=%u\n", bsr->VolParams[i].StartBlock);
+            } else {
+               fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
+                       bsr->VolParams[i].EndBlock);
+            }
+   //       Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
+   //          bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
+
+            count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
+                                 bsr->VolParams[i].LastIndex, fd);
+            if (count) {
+               fprintf(fd, "Count=%u\n", count);
+            }
+            total_count += count;
+            /* If the same file is present on two tapes or in two files
+             *   on a tape, it is a continuation, and should not be treated
+             *   twice in the totals.
+             */
+            if (!first && LastIndex == bsr->VolParams[i].FirstIndex) {
+               total_count--;
+            }
+            first = false;
+            LastIndex = bsr->VolParams[i].LastIndex;
+         }
       }
    }
    return total_count;
       }
    }
    return total_count;
@@ -308,10 +436,10 @@ void print_bsr(UAContext *ua, RBSR *bsr)
          bsendmsg(ua, "VolSessionId=%u\n", bsr->VolSessionId);
          bsendmsg(ua, "VolSessionTime=%u\n", bsr->VolSessionTime);
          bsendmsg(ua, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
          bsendmsg(ua, "VolSessionId=%u\n", bsr->VolSessionId);
          bsendmsg(ua, "VolSessionTime=%u\n", bsr->VolSessionTime);
          bsendmsg(ua, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile,
-                 bsr->VolParams[i].EndFile);
+                  bsr->VolParams[i].EndFile);
          bsendmsg(ua, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
          bsendmsg(ua, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
-                 bsr->VolParams[i].EndBlock);
-        print_findex(ua, bsr->fi);
+                  bsr->VolParams[i].EndBlock);
+         print_findex(ua, bsr->fi);
       }
       print_bsr(ua, bsr->next);
    }
       }
       print_bsr(ua, bsr->next);
    }
@@ -331,10 +459,10 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
    RBSR_FINDEX *fi, *lfi;
 
    if (findex == 0) {
    RBSR_FINDEX *fi, *lfi;
 
    if (findex == 0) {
-      return;                        /* probably a dummy directory */
+      return;                         /* probably a dummy directory */
    }
 
    }
 
-   if (bsr->fi == NULL) {            /* if no FI add one */
+   if (bsr->fi == NULL) {             /* if no FI add one */
       /* This is the first FileIndex item in the chain */
       bsr->fi = new_findex();
       bsr->JobId = JobId;
       /* This is the first FileIndex item in the chain */
       bsr->fi = new_findex();
       bsr->JobId = JobId;
@@ -345,22 +473,22 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
    /* Walk down list of bsrs until we find the JobId */
    if (bsr->JobId != JobId) {
       for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
    /* Walk down list of bsrs until we find the JobId */
    if (bsr->JobId != JobId) {
       for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
-        if (nbsr->JobId == JobId) {
-           bsr = nbsr;
-           break;
-        }
+         if (nbsr->JobId == JobId) {
+            bsr = nbsr;
+            break;
+         }
       }
 
       }
 
-      if (!nbsr) {                   /* Must add new JobId */
-        /* Add new JobId at end of chain */
-        for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
-           {  }
-        nbsr->next = new_bsr();
-        nbsr->next->JobId = JobId;
-        nbsr->next->fi = new_findex();
-        nbsr->next->fi->findex = findex;
-        nbsr->next->fi->findex2 = findex;
-        return;
+      if (!nbsr) {                    /* Must add new JobId */
+         /* Add new JobId at end of chain */
+         for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
+            {  }
+         nbsr->next = new_bsr();
+         nbsr->next->JobId = JobId;
+         nbsr->next->fi = new_findex();
+         nbsr->next->fi->findex = findex;
+         nbsr->next->fi->findex2 = findex;
+         return;
       }
    }
 
       }
    }
 
@@ -372,10 +500,10 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
    /* Check if this findex is smaller than first item */
    if (findex < fi->findex) {
       if ((findex+1) == fi->findex) {
    /* Check if this findex is smaller than first item */
    if (findex < fi->findex) {
       if ((findex+1) == fi->findex) {
-        fi->findex = findex;         /* extend down */
-        return;
+         fi->findex = findex;         /* extend down */
+         return;
       }
       }
-      fi = new_findex();             /* yes, insert before first item */
+      fi = new_findex();              /* yes, insert before first item */
       fi->findex = findex;
       fi->findex2 = findex;
       fi->next = lfi;
       fi->findex = findex;
       fi->findex2 = findex;
       fi->next = lfi;
@@ -385,26 +513,26 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
    /* Walk down fi chain and find where to insert insert new FileIndex */
    for ( ; fi; fi=fi->next) {
       if (findex == (fi->findex2 + 1)) {  /* extend up */
    /* Walk down fi chain and find where to insert insert new FileIndex */
    for ( ; fi; fi=fi->next) {
       if (findex == (fi->findex2 + 1)) {  /* extend up */
-        RBSR_FINDEX *nfi;
-        fi->findex2 = findex;
-        /*
-         * If the following record contains one higher, merge its
-         *   file index by extending it up.
-         */
-        if (fi->next && ((findex+1) == fi->next->findex)) {
-           nfi = fi->next;
-           fi->findex2 = nfi->findex2;
-           fi->next = nfi->next;
-           free(nfi);
-        }
-        return;
+         RBSR_FINDEX *nfi;
+         fi->findex2 = findex;
+         /*
+          * If the following record contains one higher, merge its
+          *   file index by extending it up.
+          */
+         if (fi->next && ((findex+1) == fi->next->findex)) {
+            nfi = fi->next;
+            fi->findex2 = nfi->findex2;
+            fi->next = nfi->next;
+            free(nfi);
+         }
+         return;
       }
       if (findex < fi->findex) {      /* add before */
       }
       if (findex < fi->findex) {      /* add before */
-        if ((findex+1) == fi->findex) {
-           fi->findex = findex;
-           return;
-        }
-        break;
+         if ((findex+1) == fi->findex) {
+            fi->findex = findex;
+            return;
+         }
+         break;
       }
       lfi = fi;
    }
       }
       lfi = fi;
    }
@@ -427,7 +555,7 @@ void add_findex_all(RBSR *bsr, uint32_t JobId)
    RBSR *nbsr;
    RBSR_FINDEX *fi;
 
    RBSR *nbsr;
    RBSR_FINDEX *fi;
 
-   if (bsr->fi == NULL) {            /* if no FI add one */
+   if (bsr->fi == NULL) {             /* if no FI add one */
       /* This is the first FileIndex item in the chain */
       bsr->fi = new_findex();
       bsr->JobId = JobId;
       /* This is the first FileIndex item in the chain */
       bsr->fi = new_findex();
       bsr->JobId = JobId;
@@ -438,22 +566,22 @@ void add_findex_all(RBSR *bsr, uint32_t JobId)
    /* Walk down list of bsrs until we find the JobId */
    if (bsr->JobId != JobId) {
       for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
    /* Walk down list of bsrs until we find the JobId */
    if (bsr->JobId != JobId) {
       for (nbsr=bsr->next; nbsr; nbsr=nbsr->next) {
-        if (nbsr->JobId == JobId) {
-           bsr = nbsr;
-           break;
-        }
+         if (nbsr->JobId == JobId) {
+            bsr = nbsr;
+            break;
+         }
       }
 
       }
 
-      if (!nbsr) {                   /* Must add new JobId */
-        /* Add new JobId at end of chain */
-        for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
-           {  }
-        nbsr->next = new_bsr();
-        nbsr->next->JobId = JobId;
-        nbsr->next->fi = new_findex();
-        nbsr->next->fi->findex = 1;
-        nbsr->next->fi->findex2 = INT32_MAX;
-        return;
+      if (!nbsr) {                    /* Must add new JobId */
+         /* Add new JobId at end of chain */
+         for (nbsr=bsr; nbsr->next; nbsr=nbsr->next)
+            {  }
+         nbsr->next = new_bsr();
+         nbsr->next->JobId = JobId;
+         nbsr->next->fi = new_findex();
+         nbsr->next->fi->findex = 1;
+         nbsr->next->fi->findex2 = INT32_MAX;
+         return;
       }
    }
 
       }
    }