Correct pointer type of 'next' field within struct volinfo
[openafs.git] / src / bucoord / restore.c
index 24a3042..690ef33 100644 (file)
@@ -14,8 +14,6 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #include <afs/stds.h>
 #include <sys/types.h>
@@ -36,11 +34,12 @@ RCSID
 #include <afs/budb.h>
 #include <afs/vlserver.h>
 #include "error_macros.h"
+#include "bucoord_internal.h"
+#include "bucoord_prototypes.h"
 
 extern struct bc_dumpTask bc_dumpTasks[BC_MAXSIMDUMPS];
 extern char *whoami;
 
-#define        BC_MAXLEVELS        20
 #define        MAXTAPESATONCE      10
 
 #define HOSTADDR(sockaddr) (sockaddr)->sin_addr.s_addr
@@ -59,7 +58,7 @@ struct dumpinfo {
 };
 
 struct volinfo {
-    struct voli *next;
+    struct volinfo *next;
     char *volname;
     afs_int32 server;
     afs_int32 partition;
@@ -93,13 +92,12 @@ struct bc_tapeItem {
 };
 
 /* strip .backup from the end of a name */
-static
-StripBackup(aname)
-     register char *aname;
+static int
+StripBackup(char *aname)
 {
     int j;
 
-    if (j = BackupName(aname)) {
+    if ((j = BackupName(aname))) {
        aname[j] = 0;
        return 0;
     }
@@ -107,8 +105,7 @@ StripBackup(aname)
 }
 
 int
-BackupName(aname)
-     char *aname;
+BackupName(char *aname)
 {
     int j;
 
@@ -120,8 +117,8 @@ BackupName(aname)
     return 0;
 }
 
-extractTapeSeq(tapename)
-     char *tapename;
+int
+extractTapeSeq(char *tapename)
 {
     char *sptr;
 
@@ -132,8 +129,8 @@ extractTapeSeq(tapename)
     return (atol(sptr));
 }
 
-viceName(value)
-     long value;
+void
+viceName(long value)
 {
     char *alph;
     int r;
@@ -151,8 +148,8 @@ viceName(value)
  * entry:
  *     aindex - index into bc_dumpTasks that describes this dump.
  */
-bc_Restorer(aindex)
-     afs_int32 aindex;
+int
+bc_Restorer(afs_int32 aindex)
 {
     struct bc_dumpTask *dumpTaskPtr;
 
@@ -164,7 +161,8 @@ bc_Restorer(aindex)
     afs_int32 tapedumpid, parent;
 
     afs_int32 nentries = 0;
-    afs_int32 last, next, ve, vecount;
+    afs_int32 last = 0;
+    afs_int32 next, ve, vecount;
     struct bc_tapeItem *ti, *pti, *nti;
     struct bc_tapeList *tapeList = (struct bc_tapeList *)0;
     struct bc_tapeList *tle, *ptle, *ntle;
@@ -182,9 +180,10 @@ bc_Restorer(aindex)
     statusP statusPtr, newStatusPtr;
 
     struct dumpinfo *dumpinfolist = NULL;
-    struct dumpinfo *pdi, *ndi, *di, dlevels[BC_MAXLEVELS];
-    struct volinfo *pvi, *nvi, *vi;
+    struct dumpinfo *pdi, *ndi, *di, *dlevels;
+    struct volinfo *nvi, *vi;
     afs_int32 lvl, lv;
+    int num_dlevels = 20;
 
     afs_int32 serverAll;       /* The server to which all volumes are to be restore to */
     afs_int32 partitionAll;    /* Likewise for partition */
@@ -193,8 +192,7 @@ bc_Restorer(aindex)
     time_t did;
     int foundtape, c;
 
-    extern statusP createStatusNode();
-    extern statusP findStatus();
+    dlevels = (struct dumpinfo *) malloc(num_dlevels * sizeof(*dlevels));
 
     dumpTaskPtr = &bc_dumpTasks[aindex];
     serverAll = HOSTADDR(&dumpTaskPtr->destServer);
@@ -214,26 +212,52 @@ bc_Restorer(aindex)
     for (tvol = dumpTaskPtr->volumes; tvol; tvol = tvol->next) {       /*tvol */
        strcpy(vname, tvol->name);
        dumpDescr = &dumpDescr1;
-       code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
-
-       if (!BackupName(vname)) {       /* See if backup volume is there */
-           strcat(vname, ".backup");
-           dumpDescr = &dumpDescr2;
-           tcode = code;
+       if (dumpTaskPtr->parentDumpID > 0) /* Told which dump to try */
+         {
+           /* Right now, this assumes that all volumes listed will be
+            * from the given dumpID.  FIXME
+            */
+           code = bcdb_FindDumpByID(dumpTaskPtr->parentDumpID, dumpDescr);
+           if (code)
+             {
+               afs_com_err(whoami, code, "Couldn't look up info for dump %d\n",
+                       dumpTaskPtr->parentDumpID);
+               continue;
+             }
+           code = bcdb_FindVolumes(dumpTaskPtr->parentDumpID, vname, volumeEntries,
+                                   last, &next, MAXTAPESATONCE, &vecount);
+           if (code)
+             {
+               if (!BackupName(vname))
+                 {
+                   strcat(vname, ".backup");
+                   code = bcdb_FindVolumes(dumpTaskPtr->parentDumpID, vname, volumeEntries,
+                                           last, &next, MAXTAPESATONCE, &vecount);
+                 }
+             }
+         }
+       else
+         {
            code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
+           if (!BackupName(vname)) {   /* See if backup volume is there */
+             strcat(vname, ".backup");
+             dumpDescr = &dumpDescr2;
+             tcode = code;
+             code = bcdb_FindDump(vname, dumpTaskPtr->fromDate, dumpDescr);
 
-           if (code) {         /* Can't find backup, go with first results */
+             if (code) {       /* Can't find backup, go with first results */
                strcpy(vname, tvol->name);
                dumpDescr = &dumpDescr1;
                code = tcode;
-           } else if (!tcode) {        /* Both found an entry, go with latest result */
+             } else if (!tcode) {      /* Both found an entry, go with latest result */
                if (dumpDescr1.created > dumpDescr2.created) {
-                   strcpy(vname, tvol->name);
-                   dumpDescr = &dumpDescr1;
-                   code = tcode;
+                 strcpy(vname, tvol->name);
+                 dumpDescr = &dumpDescr1;
+                 code = tcode;
                }
+             }
            }
-       }
+         }
 
        if (code) {             /* If FindDump took an error */
            afs_com_err(whoami, code, "; Can't find any dump for volume %s",
@@ -314,6 +338,14 @@ bc_Restorer(aindex)
        memcpy(&dlevels[0], di, sizeof(struct dumpinfo));
        for (lvl = 1, parent = dlevels[0].parentDumpId; parent;
             parent = dlevels[lvl].parentDumpId, lvl++) {
+           if (lvl >= num_dlevels) {           /* running out of dump levels */
+               struct dumpinfo *tdl = dlevels;
+
+               num_dlevels += num_dlevels;     /* double */
+               dlevels = (struct dumpinfo *) malloc(num_dlevels * sizeof(*dlevels));
+               memcpy(dlevels, tdl, (num_dlevels/2) * sizeof(*dlevels));
+               free(tdl);
+           }
            code = bcdb_FindDumpByID(parent, &dumpDescr1);
            if (code) {
                for (vi = di->volinfolist; vi; vi = vi->next) {
@@ -768,5 +800,7 @@ bc_Restorer(aindex)
     if (volumeEntries)
        free(volumeEntries);
 
+    free(dlevels);
+
     return code;
 }