]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bsys.c
Tweak Win32 build
[bacula/bacula] / bacula / src / lib / bsys.c
index b431327b9ac6548eecf8769f941deeed9d6daab9..c620740a5a59d6881affb1e786d3a1f85957e4dc 100644 (file)
@@ -8,7 +8,7 @@
  *   Version $Id$
  */
 /*
-   Copyright (C) 2000-2005 Kern Sibbald
+   Copyright (C) 2000-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
@@ -113,6 +113,16 @@ char *bstrncat(char *dest, POOL_MEM &src, int maxlen)
    return dest;
 }
 
+/*
+ * Allows one or both pointers to be NULL
+ */
+bool bstrcmp(const char *s1, const char *s2)
+{
+   if (s1 == s2) return true;
+   if (s1 == NULL || s2 == NULL) return false;
+   return strcmp(s1, s2) == 0;
+}
+
 /*
  * Get character length of UTF-8 string
  *
@@ -217,7 +227,7 @@ void *bcalloc (size_t size1, size_t size2)
 }
 
 /* Code now in src/lib/bsnprintf.c */
-#ifndef DEVELOPER
+#ifndef USE_BSNPRINTF
 
 #define BIG_BUF 5000
 /*
@@ -261,7 +271,7 @@ int bvsnprintf(char *str, int32_t size, const char  *format, va_list ap)
    return len;
 #endif
 }
-#endif /* DEVELOPER */
+#endif /* USE_BSNPRINTF */
 
 #ifndef HAVE_LOCALTIME_R
 
@@ -482,6 +492,21 @@ static struct s_state_hdr state_hdr = {
    0
 };
 
+#ifdef HAVE_WIN32
+#undef open
+#undef read
+#undef write
+#undef lseek
+#undef close
+#undef O_BINARY 
+#define open _open
+#define read _read
+#define write _write
+#define lseek _lseeki64
+#define close _close
+#define O_BINARY _O_BINARY
+#endif
+
 /*
  * Open and read the state file for the daemon
  */
@@ -489,6 +514,7 @@ void read_state_file(char *dir, const char *progname, int port)
 {
    int sfd;
    ssize_t stat;
+   bool ok = false;
    POOLMEM *fname = get_pool_memory(PM_FNAME);
    struct s_state_hdr hdr;
    int hdr_size = sizeof(hdr);
@@ -496,10 +522,10 @@ void read_state_file(char *dir, const char *progname, int port)
    Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
    /* If file exists, see what we have */
 // Dmsg1(10, "O_BINARY=%d\n", O_BINARY);
-   if ((sfd = open(fname, O_RDONLY|O_BINARY, 0)) < 0) {
+   if ((sfd = open(fname, O_RDONLY|O_BINARY)) < 0) {
       Dmsg3(010, "Could not open state file. sfd=%d size=%d: ERR=%s\n",
                     sfd, sizeof(hdr), strerror(errno));
-           goto bail_out;
+      goto bail_out;
    }
    if ((stat=read(sfd, &hdr, hdr_size)) != hdr_size) {
       Dmsg4(010, "Could not read state file. sfd=%d stat=%d size=%d: ERR=%s\n",
@@ -509,6 +535,7 @@ void read_state_file(char *dir, const char *progname, int port)
    if (hdr.version != state_hdr.version) {
       Dmsg2(010, "Bad hdr version. Wanted %d got %d\n",
          state_hdr.version, hdr.version);
+      goto bail_out;
    }
    hdr.id[13] = 0;
    if (strcmp(hdr.id, state_hdr.id) != 0) {
@@ -516,11 +543,17 @@ void read_state_file(char *dir, const char *progname, int port)
       goto bail_out;
    }
 // Dmsg1(010, "Read header of %d bytes.\n", sizeof(hdr));
-   read_last_jobs_list(sfd, hdr.last_jobs_addr);
+   if (!read_last_jobs_list(sfd, hdr.last_jobs_addr)) {
+      goto bail_out;
+   }
+   ok = true;
 bail_out:
    if (sfd >= 0) {
       close(sfd);
    }
+   if (!ok) {
+      unlink(fname);
+    }
    free_pool_memory(fname);
 }
 
@@ -530,17 +563,21 @@ bail_out:
 void write_state_file(char *dir, const char *progname, int port)
 {
    int sfd;
+   bool ok = false;
    POOLMEM *fname = get_pool_memory(PM_FNAME);
 
    Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
    /* Create new state file */
+   unlink(fname);
    if ((sfd = open(fname, O_CREAT|O_WRONLY|O_BINARY, 0640)) < 0) {
-      Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, strerror(errno));
-      Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, strerror(errno));
+      berrno be;
+      Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, be.strerror());
+      Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, be.strerror());
       goto bail_out;
    }
    if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
-      Dmsg1(000, "Write hdr error: ERR=%s\n", strerror(errno));
+      berrno be;
+      Dmsg1(000, "Write hdr error: ERR=%s\n", be.strerror());
       goto bail_out;
    }
 // Dmsg1(010, "Wrote header of %d bytes\n", sizeof(state_hdr));
@@ -548,17 +585,24 @@ void write_state_file(char *dir, const char *progname, int port)
    state_hdr.reserved[0] = write_last_jobs_list(sfd, state_hdr.last_jobs_addr);
 // Dmsg1(010, "write last job end = %d\n", (int)state_hdr.reserved[0]);
    if (lseek(sfd, 0, SEEK_SET) < 0) {
-      Dmsg1(000, "lseek error: ERR=%s\n", strerror(errno));
+      berrno be;
+      Dmsg1(000, "lseek error: ERR=%s\n", be.strerror());
       goto bail_out;
    }
    if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
-      Pmsg1(000, _("Write final hdr error: ERR=%s\n"), strerror(errno));
+      berrno be;
+      Pmsg1(000, _("Write final hdr error: ERR=%s\n"), be.strerror());
+      goto bail_out;
    }
+   ok = true;
 // Dmsg1(010, "rewrote header = %d\n", sizeof(state_hdr));
 bail_out:
    if (sfd >= 0) {
       close(sfd);
    }
+   if (!ok) {
+      unlink(fname);
+   }
    free_pool_memory(fname);
 }
 
@@ -641,7 +685,7 @@ char *bfgets(char *s, int size, FILE *fd)
             *p = 0;
          }
          else { /* Mac (\r only) */
-            ungetc(ch, fd); /* Push next character back to fd */
+            (void)ungetc(ch, fd); /* Push next character back to fd */
          }
          break;
       }