butc: avoid testing stack garbage; remove dead initializer
[openafs.git] / src / butc / tcudbprocs.c
index fd5687f..b4424d8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
+#include <afs/procmgmt.h>
+#include <roken.h>
 
-#include <sys/types.h>
-#ifdef AFS_NT40_ENV
-#include <winsock2.h>
-#include <io.h>
-#else
-#include <sys/time.h>
-#include <sys/file.h>
-#include <netinet/in.h>
-#include <netdb.h>
+#ifdef IGNORE_SOME_GCC_WARNINGS
+# pragma GCC diagnostic warning "-Wimplicit-function-declaration"
 #endif
-#include <errno.h>
+
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <afs/afsint.h>
-#include <stdio.h>
-#include <afs/procmgmt.h>
-#include <afs/assert.h>
+#include <afs/afs_assert.h>
 #include <afs/prs_fs.h>
-#include <fcntl.h>
 #include <afs/nfs.h>
 #include <lwp.h>
 #include <lock.h>
-#include <afs/auth.h>
 #include <afs/cellconfig.h>
 #include <afs/keys.h>
 #include <ubik.h>
 #include <afs/acl.h>
+#include <afs/volser.h>
+#include <afs/vlserver.h>
 #include <afs/tcdata.h>
 #include <afs/budb.h>
 #include <afs/budb_client.h>
 #include <afs/bubasics.h>
+#include <afs/bucoord_prototypes.h>
+#include <afs/butm_prototypes.h>
+#include <afs/budb_prototypes.h>
+#include <afs/afsutil.h>
+
+#include "butc_internal.h"
 #include "error_macros.h"
 
 /* GLOBAL CONFIGURATION PARAMETERS */
@@ -52,13 +49,34 @@ RCSID
 extern int dump_namecheck;
 extern int autoQuery;
 
+struct rstTapeInfo {
+    afs_int32 taskId;
+    afs_int32 tapeSeq;
+    afs_uint32 dumpid;
+};
+
+static void initTapeBuffering(void);
+static int writeDbDump(struct butm_tapeInfo *, afs_uint32, Date, afs_uint32);
+static int restoreDbEntries(struct butm_tapeInfo *, struct rstTapeInfo *);
+
+int getTapeData(struct butm_tapeInfo *, struct rstTapeInfo *, void *,
+               afs_int32);
+int restoreDbHeader(struct butm_tapeInfo *, struct rstTapeInfo *,
+                   struct structDumpHeader *);
+int restoreDbDump(struct butm_tapeInfo *, struct rstTapeInfo *,
+                 struct structDumpHeader *);
+int restoreText(struct butm_tapeInfo *, struct rstTapeInfo *,
+               struct structDumpHeader *);
+
+
+
+void * KeepAlive(void *);
 /* CreateDBDump
- *      create a dump entry for a saved database 
+ *      create a dump entry for a saved database
  */
 
 afs_int32
-CreateDBDump(dumpEntryPtr)
-     struct budb_dumpEntry *dumpEntryPtr;
+CreateDBDump(struct budb_dumpEntry *dumpEntryPtr)
 {
     afs_int32 code = 0;
 
@@ -98,28 +116,20 @@ struct budb_dumpEntry lastDump;    /* the last dump of this volset */
  *      Leave the tape mounted.
  */
 afs_int32
-GetDBTape(taskId, expires, tapeInfoPtr, dumpid, sequence, queryFlag,
-         wroteLabel)
-     afs_int32 taskId;
-     Date expires;
-     struct butm_tapeInfo *tapeInfoPtr;
-     afs_uint32 dumpid;
-     afs_int32 sequence;
-     int queryFlag;
-     int *wroteLabel;
+GetDBTape(afs_int32 taskId, Date expires, struct butm_tapeInfo *tapeInfoPtr,
+         afs_uint32 dumpid, afs_int32 sequence, int queryFlag,
+         int *wroteLabel)
 {
     afs_int32 code = 0;
     int interactiveFlag;
     char tapeName[BU_MAXTAPELEN];
     char strlevel[5];
     struct timeval tp;
-    struct timezone tzp;
     afs_int32 curTime;
     int tapecount = 1;
 
     struct butm_tapeLabel oldTapeLabel, newLabel;
     struct tapeEntryList *endList;
-    extern struct tapeConfig globalTapeConfig;
 
     /* construct the name of the tape */
     sprintf(tapeName, "%s.%-d", DUMP_TAPE_NAME, sequence);
@@ -173,7 +183,7 @@ GetDBTape(taskId, expires, tapeInfoPtr, dumpid, sequence, queryFlag,
                goto getNewTape;
            }
 
-           /* On first tape, the savedb has not started yet, so the database is not locked 
+           /* On first tape, the savedb has not started yet, so the database is not locked
             * and we can therefore, access information from it. This is easier to do because
             * database dumps don't have appended dumps (nor appended).
             */
@@ -182,7 +192,7 @@ GetDBTape(taskId, expires, tapeInfoPtr, dumpid, sequence, queryFlag,
                struct budb_dumpEntry de, de2;
 
                /* Verify the tape has not expired
-                * Early database dumps don't have a dumpid 
+                * Early database dumps don't have a dumpid
                 */
                if (!tapeExpired(&oldTapeLabel)) {
                    TLog(taskId, "This tape has not expired\n");
@@ -223,12 +233,12 @@ GetDBTape(taskId, expires, tapeInfoPtr, dumpid, sequence, queryFlag,
            }
 
            /* Otherwise, the savedb is in progress and we can't
-            * access the database (it's locked). So we rely on the 
+            * access the database (it's locked). So we rely on the
             * information available (and not the backup database).
             */
            else {
                /* Check the tape's expiration date. Use the expiration on the label */
-               gettimeofday(&tp, &tzp);
+               gettimeofday(&tp, NULL);
                curTime = tp.tv_sec;
                if (curTime < oldTapeLabel.expirationDate) {
                    TLog(taskId, "This tape has not expired\n");
@@ -303,7 +313,7 @@ GetDBTape(taskId, expires, tapeInfoPtr, dumpid, sequence, queryFlag,
  */
 
 afs_int32
-freeTapeList()
+freeTapeList(void)
 {
     struct tapeEntryList *next;
 
@@ -319,13 +329,12 @@ freeTapeList()
 }
 
 /* addTapesToDb
- *       With the list of tapes, add them to the database. 
+ *       With the list of tapes, add them to the database.
  *       Also delete any olddumpids that are around.
  */
 
 afs_int32
-addTapesToDb(taskId)
-     afs_int32 taskId;
+addTapesToDb(afs_int32 taskId)
 {
     afs_int32 code = 0;
     afs_int32 i, new;
@@ -373,12 +382,9 @@ addTapesToDb(taskId)
  *     the blocksize on writes
  */
 
-static
-writeDbDump(tapeInfoPtr, taskId, expires, dumpid)
-     struct butm_tapeInfo *tapeInfoPtr;
-     afs_uint32 taskId;
-     Date expires;
-     afs_uint32 dumpid;
+static int
+writeDbDump(struct butm_tapeInfo *tapeInfoPtr, afs_uint32 taskId,
+           Date expires, afs_uint32 dumpid)
 {
     afs_int32 blockSize;
     afs_int32 writeBufNbytes = 0;
@@ -387,7 +393,7 @@ writeDbDump(tapeInfoPtr, taskId, expires, dumpid)
     char *writeBufPtr;
     afs_int32 transferSize;
 
-    char *readBufPtr;
+    char *readBufPtr = NULL;
     afs_int32 maxReadSize;
 
     charListT charList;
@@ -409,8 +415,6 @@ writeDbDump(tapeInfoPtr, taskId, expires, dumpid)
     extern struct tapeConfig globalTapeConfig;
     extern struct udbHandleS udbHandle;
 
-    extern int KeepAlive();
-
     blockSize = BUTM_BLKSIZE;
     writeBlock = (char *)malloc(BUTM_BLOCKSIZE);
     if (!writeBlock)
@@ -420,12 +424,12 @@ writeDbDump(tapeInfoPtr, taskId, expires, dumpid)
     memset(writeBuffer, 0, BUTM_BLKSIZE);
     maxReadSize = 1024;
 
-    /* 
-     * The margin of space to check for end of tape is set to the 
-     * amount of space used to write an end-of-tape multiplied by 2. 
+    /*
+     * The margin of space to check for end of tape is set to the
+     * amount of space used to write an end-of-tape multiplied by 2.
      * The amount of space is size of a 16K EODump marker, its EOF
      * marker, and up to two EOF markers done on close (1 16K blocks +
-     * 3 EOF * markers). 
+     * 3 EOF * markers).
      */
     tc_EndMargin = (16384 + 3 * globalTapeConfig.fileMarkSize) * 2;
     tc_KEndMargin = tc_EndMargin / 1024;
@@ -620,11 +624,11 @@ writeDbDump(tapeInfoPtr, taskId, expires, dumpid)
  *     dump backup database to tape
  */
 
-afs_int32
-saveDbToTape(saveDbIfPtr)
-     struct saveDbIf *saveDbIfPtr;
+void *
+saveDbToTape(void *param)
 {
-    afs_int32 code = 0;
+    struct saveDbIf *saveDbIfPtr = (struct saveDbIf *)param;
+    afs_int32 code;
     afs_int32 i;
     int wroteLabel;
     afs_uint32 taskId;
@@ -636,8 +640,10 @@ saveDbToTape(saveDbIfPtr)
     extern struct deviceSyncNode *deviceLatch;
     extern struct tapeConfig globalTapeConfig;
 
+    afs_pthread_setname_self("Db save");
     expires = (saveDbIfPtr->archiveTime ? NEVERDATE : 0);
     taskId = saveDbIfPtr->taskId;
+    dumpEntry.id = 0;
 
     setStatus(taskId, DRIVE_WAIT);
     EnterDeviceQueue(deviceLatch);     /* lock tape device */
@@ -680,7 +686,7 @@ saveDbToTape(saveDbIfPtr)
                  &wroteLabel);
 
     /*
-     * If did not write the label, remove created dump 
+     * If did not write the label, remove created dump
      * Else if wrote the label, remove old dump from db so it's not saved.
      */
     if (!wroteLabel) {
@@ -741,23 +747,17 @@ saveDbToTape(saveDbIfPtr)
 
     free(saveDbIfPtr);
     LeaveDeviceQueue(deviceLatch);
-    return (code);
+    return (void *)(intptr_t)(code);
 }
 
-struct rstTapeInfo {
-    afs_int32 taskId;
-    afs_int32 tapeSeq;
-    afs_uint32 dumpid;
-};
 
 /* makeDbDumpEntry()
  *      Make a database dump entry given a tape label.
  */
 
 afs_int32
-makeDbDumpEntry(tapeEntPtr, dumpEntryPtr)
-     struct budb_tapeEntry *tapeEntPtr;
-     struct budb_dumpEntry *dumpEntryPtr;
+makeDbDumpEntry(struct budb_tapeEntry *tapeEntPtr,
+               struct budb_dumpEntry *dumpEntryPtr)
 {
     memset(dumpEntryPtr, 0, sizeof(struct budb_dumpEntry));
 
@@ -787,10 +787,8 @@ makeDbDumpEntry(tapeEntPtr, dumpEntryPtr)
  */
 
 afs_int32
-readDbTape(tapeInfoPtr, rstTapeInfoPtr, query)
-     struct butm_tapeInfo *tapeInfoPtr;
-     struct rstTapeInfo *rstTapeInfoPtr;
-     int query;
+readDbTape(struct butm_tapeInfo *tapeInfoPtr,
+          struct rstTapeInfo *rstTapeInfoPtr, int query)
 {
     afs_int32 code = 0;
     int interactiveFlag;
@@ -905,8 +903,8 @@ readDbTape(tapeInfoPtr, rstTapeInfoPtr, query)
 }
 
 static afs_int32 nbytes = 0;   /* # bytes left in buffer */
-static
-initTapeBuffering()
+static void
+initTapeBuffering(void)
 {
     nbytes = 0;
 }
@@ -918,10 +916,9 @@ initTapeBuffering()
  *     tape positioned after tape label
  */
 
-static
-restoreDbEntries(tapeInfoPtr, rstTapeInfoPtr)
-     struct butm_tapeInfo *tapeInfoPtr;
-     struct rstTapeInfo *rstTapeInfoPtr;
+static int
+restoreDbEntries(struct butm_tapeInfo *tapeInfoPtr,
+                struct rstTapeInfo *rstTapeInfoPtr)
 {
     struct structDumpHeader netItemHeader, hostItemHeader;
     afs_int32 more = 1;
@@ -1014,10 +1011,10 @@ restoreDbEntries(tapeInfoPtr, rstTapeInfoPtr)
  *     restore the backup database from tape.
  */
 
-afs_int32
-restoreDbFromTape(taskId)
-     afs_uint32 taskId;
+void *
+restoreDbFromTape(void *param)
 {
+    afs_uint32 taskId = (intptr_t) param;
     afs_int32 code = 0;
     afs_int32 i;
     struct butm_tapeInfo tapeInfo;
@@ -1027,6 +1024,7 @@ restoreDbFromTape(taskId)
     extern struct tapeConfig globalTapeConfig;
     extern struct deviceSyncNode *deviceLatch;
 
+    afs_pthread_setname_self("Db restore");
     setStatus(taskId, DRIVE_WAIT);
     EnterDeviceQueue(deviceLatch);     /* lock tape device */
     clearStatus(taskId, DRIVE_WAIT);
@@ -1103,20 +1101,20 @@ restoreDbFromTape(taskId)
     LeaveDeviceQueue(deviceLatch);
     setStatus(taskId, TASK_DONE);
 
-    return (code);
+    return (void *)(intptr_t)(code);
 }
 
 /* KeepAlive
- * 
- *      While dumping the database, keeps the connection alive.  
+ *
+ *      While dumping the database, keeps the connection alive.
  *      Every 10 seconds, wake up and ask to read 0 bytes of the database.
- *      This resets the database's internal timer so that it does not 
+ *      This resets the database's internal timer so that it does not
  *      prematuraly quit (on asking for new tapes and such).
- *      
+ *
  *      Use the same udbHandle as writeDbDump so we go to the same server.
  */
-int
-KeepAlive()
+void *
+KeepAlive(void *unused)
 {
     charListT charList;
     afs_int32 code;
@@ -1124,6 +1122,7 @@ KeepAlive()
 
     extern struct udbHandleS udbHandle;
 
+    afs_pthread_setname_self("Keep-alive");
     while (1) {
 #ifdef AFS_PTHREAD_ENV
        sleep(5);
@@ -1146,10 +1145,10 @@ KeepAlive()
  *     restore special items in the header
  */
 
-restoreDbHeader(tapeInfo, rstTapeInfoPtr, nextHeader)
-     struct butm_tapeInfo *tapeInfo;
-     struct rstTapeInfo *rstTapeInfoPtr;
-     struct structDumpHeader *nextHeader;
+int
+restoreDbHeader(struct butm_tapeInfo *tapeInfo,
+               struct rstTapeInfo *rstTapeInfoPtr,
+               struct structDumpHeader *nextHeader)
 {
     struct structDumpHeader netItemHeader;
     struct DbHeader netDbHeader, hostDbHeader;
@@ -1168,7 +1167,7 @@ restoreDbHeader(tapeInfo, rstTapeInfoPtr, nextHeader)
 
     /* Add the database header to the database */
     code =
-       ubik_Call(BUDB_RestoreDbHeader, udbHandle.uh_client, 0,
+       ubik_BUDB_RestoreDbHeader(udbHandle.uh_client, 0,
                  &hostDbHeader);
     if (code) {
        ErrorLog(0, rstTapeInfoPtr->taskId, code, 0,
@@ -1197,28 +1196,25 @@ restoreDbHeader(tapeInfo, rstTapeInfoPtr, nextHeader)
  *     nextHeader - ptr to structure for return value
  * exit:
  *     nextHeader - next structure header from tape
- * notes: 
+ * notes:
  *     upon entry, the dump structure header has been read confirming that
  *     a database dump tree exists on the tape
  */
 
-restoreDbDump(tapeInfo, rstTapeInfoPtr, nextHeader)
-     struct butm_tapeInfo *tapeInfo;
-     struct rstTapeInfo *rstTapeInfoPtr;
-     struct structDumpHeader *nextHeader;
+int
+restoreDbDump(struct butm_tapeInfo *tapeInfo,
+             struct rstTapeInfo *rstTapeInfoPtr,
+             struct structDumpHeader *nextHeader)
 {
     struct budb_dumpEntry netDumpEntry, hostDumpEntry;
     struct budb_tapeEntry netTapeEntry, hostTapeEntry;
     struct budb_volumeEntry netVolumeEntry, hostVolumeEntry;
     struct structDumpHeader netItemHeader;
-    afs_int32 taskId;
     int restoreThisDump = 1;
     afs_int32 code = 0;
 
     extern struct udbHandleS udbHandle;
 
-    taskId = rstTapeInfoPtr->taskId;
-
     /* read dump entry */
     memset(&netDumpEntry, 0, sizeof(netDumpEntry));
     code =
@@ -1347,10 +1343,7 @@ restoreDbDump(tapeInfo, rstTapeInfoPtr, nextHeader)
  */
 
 afs_int32
-saveTextFile(taskId, textType, fileName)
-     afs_int32 taskId;
-     afs_int32 textType;
-     char *fileName;
+saveTextFile(afs_int32 taskId, afs_int32 textType, char *fileName)
 {
     udbClientTextP ctPtr = 0;
     afs_int32 code = 0;
@@ -1404,10 +1397,10 @@ saveTextFile(taskId, textType, fileName)
  *     nextHeader - struct header for next item on the tape
  */
 
-restoreText(tapeInfo, rstTapeInfoPtr, nextHeader)
-     struct butm_tapeInfo *tapeInfo;
-     struct rstTapeInfo *rstTapeInfoPtr;
-     struct structDumpHeader *nextHeader;
+int
+restoreText(struct butm_tapeInfo *tapeInfo,
+           struct rstTapeInfo *rstTapeInfoPtr,
+           struct structDumpHeader *nextHeader)
 {
     char filename[64];
     afs_int32 nbytes;
@@ -1448,11 +1441,7 @@ restoreText(tapeInfo, rstTapeInfoPtr, nextHeader)
 
     /* open the text file */
     sprintf(filename, "%s/bu_XXXXXX", gettmpdir());
-#if defined (HAVE_MKSTEMP)
     fid = mkstemp(filename);
-#else
-    fid = open(mktemp(filename), O_RDWR | O_CREAT | O_EXCL, 0600);
-#endif
     if (fid < 0) {
        ErrorLog(0, rstTapeInfoPtr->taskId, errno, 0,
                 "Can't open temporary text file: %s\n", filename);
@@ -1525,7 +1514,7 @@ static char *tapeReadBufferPtr = 0;       /* position in buffer */
 
 /* getTapeData
  *     Read information from tape, and place the requested number of bytes
- *     in the buffer supplied 
+ *     in the buffer supplied
  * entry:
  *     tapeInfo
  *     rstTapeInfoPtr - Info about the dump being restored.
@@ -1535,15 +1524,14 @@ static char *tapeReadBufferPtr = 0;     /* position in buffer */
  *     fn retn - 0, ok, n, error
  */
 
-getTapeData(tapeInfoPtr, rstTapeInfoPtr, buffer, requestedBytes)
-     struct butm_tapeInfo *tapeInfoPtr;
-     struct rstTapeInfo *rstTapeInfoPtr;
-     char *buffer;
-     afs_int32 requestedBytes;
+int
+getTapeData(struct butm_tapeInfo *tapeInfoPtr,
+           struct rstTapeInfo *rstTapeInfoPtr,
+           void *out, afs_int32 requestedBytes)
 {
-    afs_int32 taskId, transferBytes, new;
+    char *buffer = (char *) out;
+    afs_int32 taskId, transferBytes;
     afs_int32 code = 0;
-    afs_uint32 dumpid;
 
     taskId = rstTapeInfoPtr->taskId;