]> git.sur5r.net Git - bacula/bacula/commitdiff
Implement kb,mb,and gb modifiers + add Makefile to win32 directory + Michel Meyers...
authorKern Sibbald <kern@sibbald.com>
Wed, 25 Feb 2004 18:25:40 +0000 (18:25 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 25 Feb 2004 18:25:40 +0000 (18:25 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1089 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/dird.c
bacula/src/lib/edit.c
bacula/src/stored/stored.c
bacula/src/win32/Makefile.in [new file with mode: 0644]
bacula/src/win32/bacula.nsi
bacula/src/win32/build.bat
bacula/src/win32/winbacula.nsi.in [new file with mode: 0755]

index b78e35d8667bf2a6d66fdc8a607a6edb8f7b628b..271a841d6dfbabff4f827fa5af4de99224ddf2e7 100644 (file)
@@ -269,7 +269,7 @@ static void terminate_dird(int sig)
    stop_watchdog();
    close_memory_pool();              /* release free memory in pool */
    sm_dump(False);
-   exit(sig != 0);
+   exit(sig);
 }
 
 /*
index ec5262890f7728ca3b896a736122cd29dd20decd..b9e24a7bc3828ba09d88a6cdf5f0d75ea8b6ab63 100644 (file)
@@ -94,28 +94,13 @@ char *edit_uint64(uint64_t val, char *buf)
    return buf;
 }
 
-
 /*
- * Convert a string duration to utime_t (64 bit seconds)
- * Returns 0: if error
-          1: if OK, and value stored in value
+ * Given a string "str", separate the integer part into
+ *   str, and the modifier into mod.
  */
-int duration_to_utime(char *str, utime_t *value)
+static bool get_modifier(char *str, char *mod, int mod_len)
 {
    int i, len;
-   double val;
-   /*
-    * The "n" = mins and months appears before minutes so that m maps
-    *   to months. These "kludges" make it compatible with pre 1.31 
-    *  Baculas.
-    */
-   static const char *mod[] = {"n", "seconds", "months", "minutes", 
-                  "hours", "days", "weeks",   "quarters",   "years", NULL};
-   static const int32_t mult[] = {60,  1, 60*60*24*30, 60, 
-                 60*60, 60*60*24, 60*60*24*7, 60*60*24*91, 60*60*24*365};
-   char mod_str[20];
-   int mod_len;
-
    /*
     * Look for modifier by walking back looking for the first
     *  space or digit.
@@ -138,16 +123,15 @@ int duration_to_utime(char *str, utime_t *value)
    /* If not found, error */
    if (i == 0 || i == len) {
       Dmsg2(200, "error i=%d len=%d\n", i, len);
-      return 0;
+      return false;
    }
-   /* Move modifier to mod_str */
-   bstrncpy(mod_str, &str[i], sizeof(mod_str));
-   mod_len = strlen(mod_str);
-   if (mod_len == 0) {               /* Make sure we have a modifier */
+   /* Move modifier to mod */
+   bstrncpy(mod, &str[i], mod_len);
+   if (strlen(mod) == 0) {              /* Make sure we have a modifier */
       Dmsg0(200, "No modifier found\n");
-      return 0;
+      return false;
    }
-   Dmsg2(200, "in=%s  mod=%s:\n", str, mod_str);
+   Dmsg2(200, "in=%s  mod=%s:\n", str, mod);
    /* Backup over any spaces in front of modifier */
    for ( ; i>0; i--) {
       if (B_ISSPACE(str[i-1])) {
@@ -159,9 +143,36 @@ int duration_to_utime(char *str, utime_t *value)
    /* The remainder (beginning) should be our number */
    if (!is_a_number(str)) {
       Dmsg0(200, "input not a number\n");
+      return false;
+   }
+   return true;
+}
+
+/*
+ * Convert a string duration to utime_t (64 bit seconds)
+ * Returns 0: if error
+          1: if OK, and value stored in value
+ */
+int duration_to_utime(char *str, utime_t *value)
+{
+   int i, mod_len;
+   double val;
+   char mod_str[20];
+   /*
+    * The "n" = mins and months appears before minutes so that m maps
+    *   to months. These "kludges" make it compatible with pre 1.31 
+    *  Baculas.
+    */
+   static const char *mod[] = {"n", "seconds", "months", "minutes", 
+                  "hours", "days", "weeks",   "quarters",   "years", NULL};
+   static const int32_t mult[] = {60,  1, 60*60*24*30, 60, 
+                 60*60, 60*60*24, 60*60*24*7, 60*60*24*91, 60*60*24*365};
+
+   if (!get_modifier(str, mod_str, sizeof(mod_str))) {
       return 0;
    }
    /* Now find the multiplier corresponding to the modifier */
+   mod_len = strlen(mod_str);
    for (i=0; mod[i]; i++) {
       if (strncasecmp(mod_str, mod[i], mod_len) == 0) {
         break;
@@ -179,7 +190,6 @@ int duration_to_utime(char *str, utime_t *value)
    }
   *value = (utime_t)(val * mult[i]);
    return 1;
-
 }
 
 /*
@@ -188,8 +198,8 @@ int duration_to_utime(char *str, utime_t *value)
 char *edit_utime(utime_t val, char *buf)
 {
    char mybuf[30];
-   static int mult[] = {60*60*24*365, 60*60*24*30, 60*60*24, 60*60, 60};
-   static char *mod[]  = {"year",  "month",  "day", "hour", "min"};
+   static const int32_t mult[] = {60*60*24*365, 60*60*24*30, 60*60*24, 60*60, 60};
+   static const char *mod[]  = {"year",  "month",  "day", "hour", "min"};
    int i;
    uint32_t times;
 
@@ -216,62 +226,41 @@ char *edit_utime(utime_t val, char *buf)
  * Returns 0: if error
           1: if OK, and value stored in value
  */
-int size_to_uint64(char *str, int str_len, uint64_t *rtn_value)
+int size_to_uint64(char *str, int str_len, uint64_t *value)
 {
-   int i, ch;
-   double value;
-   int mod[]  = {'*', 'k', 'm', 'g', 0}; /* first item * not used */
-   uint64_t mult[] = {1,            /* byte */
-                     1024,          /* kilobyte */
-                     1048576,       /* megabyte */
-                     1073741824};   /* gigabyte */
-
-#ifdef we_have_a_compiler_that_works
-   int mod[]  = {'*', 'k', 'm', 'g', 't', 0};
-   uint64_t mult[] = {1,            /* byte */
-                     1024,          /* kilobyte */
-                     1048576,       /* megabyte */
-                     1073741824,    /* gigabyte */
-                     1099511627776};/* terabyte */
-#endif
-
-   Dmsg1(400, "Enter sized to uint64 str=%s\n", str);
-
-   /* Look for modifier */
-   ch = str[str_len - 1];
-   i = 0;
-   if (B_ISALPHA(ch)) {
-      if (B_ISUPPER(ch)) {
-        ch = tolower(ch);
-      }
-      while (mod[++i] != 0) {
-        if (ch == mod[i]) {
-           str_len--;
-           str[str_len] = 0; /* strip modifier */
-           break;
-        }
+   int i, mod_len;
+   double val;
+   char mod_str[20];
+   static const char *mod[]  = {"*", "k", "kb", "m", "mb",  "g", "gb",  NULL}; /* first item * not used */
+   const int64_t mult[] = {1,            /* byte */
+                          1024,          /* kilobyte */
+                          1000,          /* kb kilobyte */
+                          1048576,       /* megabyte */
+                          1000000,       /* mb megabyte */
+                          1073741824,    /* gigabyte */
+                          1000000000};   /* gb gigabyte */
+
+   if (!get_modifier(str, mod_str, sizeof(mod_str))) {
+      return 0;
+   }
+   /* Now find the multiplier corresponding to the modifier */
+   mod_len = strlen(mod_str);
+   for (i=0; mod[i]; i++) {
+      if (strncasecmp(mod_str, mod[i], mod_len) == 0) {
+        break;
       }
    }
-   if (mod[i] == 0 || !is_a_number(str)) {
-      return 0;
+   if (mod[i] == NULL) {
+      Dmsg0(200, "Modifier not found\n");
+      return 0;                      /* modifer not found */
    }
-   Dmsg3(400, "size str=:%s: %lf i=%d\n", str, strtod(str, NULL), i);
-
+   Dmsg2(200, "str=%s: mult=%d\n", str, mult[i]);
    errno = 0;
-   value = strtod(str, NULL);
-   if (errno != 0 || value < 0) {
+   val = strtod(str, NULL);
+   if (errno != 0 || val < 0) {
       return 0;
    }
-#if defined(HAVE_WIN32)
-   /* work around microsofts non handling of uint64 to double cvt*/
-   *rtn_value = (uint64_t)(value * (__int64)mult[i]);
-   Dmsg2(400, "Full value = %lf %" lld "\n", value * (__int64)mult[i],  
-        (uint64_t)(value * (__int64)mult[i]));
-#else
-   *rtn_value = (uint64_t)(value * mult[i]);
-   Dmsg2(400, "Full value = %lf %" lld "\n", value * mult[i],  
-      (uint64_t)(value * mult[i]));
-#endif
+  *value = (utime_t)(val * mult[i]);
    return 1;
 }
 
index ddb3f7f5ddbe0a61f33bca8c64cedf46e2ab2674..54d8e2524d469b0de38c4da58b7ca066b73ac2fa 100644 (file)
@@ -399,5 +399,5 @@ void terminate_stored(int sig)
    close_memory_pool();
 
    sm_dump(False);                   /* dump orphaned buffers */
-   exit(1);
+   exit(sig);
 }
diff --git a/bacula/src/win32/Makefile.in b/bacula/src/win32/Makefile.in
new file mode 100644 (file)
index 0000000..c41c38a
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Makefile to build the native Win32 File daemon
+# VC++ and tools must be on your path
+#
+#     Kern Sibbald, February 2004
+#
+
+NMAKE=nmake
+MAKENSIS="c:/Program Files/NSIS/makensis"
+
+first_rule: all
+
+dummy:
+
+all:  zlib pthreads bacula installer
+
+zlib: dummy 
+       (cd zlib; env MAKEFLAGS= ${NMAKE} /f win32/Makefile.msc)
+
+pthreads: dummy
+       (cd pthreads; env MAKEFLAGS= ${NMAKE} VCE)
+
+bacula: zlib pthreads
+       (cd baculafd; env MAKEFLAGS= ${NMAKE} CFG="baculafd - Win32 Release" /f baculafd.mak)
+
+#
+# Quickie debug installation
+#
+install: bacula
+       cp -f pthreads/pthreadVCE.dll baculafd/Release
+       cp -f bacula-fd.conf baculafd/Release
+       (cd baculafd/Release; ./bacula-fd.exe /kill)
+       sleep 2
+       cp -f baculafd/Release/bacula-fd.exe /bacula/bin 
+       @echo "Please start Bacula from the Service Menu"
+
+installer: winbacula.exe
+
+#
+# Build installer
+#
+winbacula.exe: bacula
+       ${MAKENSIS} winbacula.nsi
+
+clean:
+       (cd zlib; env MAKEFLAGS= ${NMAKE} /f win32/Makefile.msc clean)
+       (cd pthreads; env MAKEFLAGS= ${NMAKE} clean)
+       (cd baculafd; make clean)
+
+distclean: clean
+       rm -rf baculafd/Release baculafd/Debug
+       rm -f pthreads/*.lib pthreads/*.dll pthreads/*.exe pthreads/*.exp
+       rm -f winbacula-*.exe
index 5de4a6ddc07f102ff819b9865b27dbf274e407ea..599aa87383653d607c1e38cfee6383ebac704554 100644 (file)
@@ -3,7 +3,7 @@
 ;Written by Joost Verburg
 
 !define MUI_PRODUCT "Bacula" ;Define your own software name here
-!define MUI_VERSION "1.32f-3" ;Define your own software version here
+!define MUI_VERSION "1.33.4" ;Define your own software version here
 
 !include "MUI.nsh"
 !include "util.nsh"
@@ -157,4 +157,4 @@ Section "Uninstall"
   ;Display the Finish header
   !insertmacro MUI_UNFINISHHEADER
 
-SectionEnd
\ No newline at end of file
+SectionEnd
index 84d08d10efdad562b7778e995b1dcacd0586e1f6..1545d22fa09beac0f5921aab29c9179e9c134955 100755 (executable)
@@ -8,7 +8,3 @@ nmake VCE
 cd ..
 cd baculafd
 nmake CFG="baculafd - Win32 Release" /f baculafd.mak
-cd ..
-makensis bacula.nsi
-
-
diff --git a/bacula/src/win32/winbacula.nsi.in b/bacula/src/win32/winbacula.nsi.in
new file mode 100755 (executable)
index 0000000..ab50bb5
--- /dev/null
@@ -0,0 +1,271 @@
+; winbacula.nsi
+;
+; written by Michel Meyers (michel@tcnnet.dyndns.org)
+;
+; ChangeLog
+; v0.1 - initial release (still a lot to do)
+
+;!define TEMP1 $R0 ;Temp variable
+!define VERSION '@VERSION@-@LSMDATE@'
+
+SetCompressor lzma
+SetCompressorDictSize 32
+
+; The name of the installer
+Name "Bacula Client"
+
+; The file to write
+OutFile "winbacula-${VERSION}.exe"
+
+; The default installation directory
+InstallDir "c:\bacula"
+
+DirText "Setup will install the Bacula Client v${VERSION} to the directory specified below. To install in a different folder, click Browse and select another folder.$\n$\nNote to CYGWIN users: please choose your CYGWIN root directory."
+Page directory
+Page instfiles
+UninstPage uninstConfirm
+UninstPage instfiles
+
+;Icon "${NSISDIR}\Contrib\Icons\modern-install.ico"
+;UninstallIcon "${NSISDIR}\Contrib\Icons\modern-uninstall.ico"
+;CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
+
+; The text to prompt the user to enter a directory
+;ComponentText "This will extract the temporary files needed for controlling your PC remotely."
+; The stuff to install
+
+; -- written by Alexis de Valence --
+; GetONEParameter
+
+; Usage:
+;   Push 3                 ; to get the 3rd parameter of the command line
+;   Call GetONEParameter
+;   Pop $R0                ; saves the result in $R0
+; returns an empty string if not found
+
+Function GetONEParameter
+   Exch $R0
+   Push $R1
+   Push $R2
+   Push $R3
+   Push $R4
+   Push $R5
+   Push $R6
+
+; init variables
+   IntOp $R5 $R0 + 1
+   StrCpy $R2 0
+   StrCpy $R4 1
+   StrCpy $R6 0
+
+   loop3: ; looking for a char that's not a space
+     IntOp $R2 $R2 + 1
+     StrCpy $R0 $CMDLINE 1 $R2
+     StrCmp $R0 " " loop3
+     StrCpy $R3 $R2   ; found the begining of the current parameter
+
+
+   loop:          ; scanning for the end of the current parameter
+
+     StrCpy $R0 $CMDLINE 1 $R2
+     StrCmp $R0 " " loop2
+     StrCmp $R0 "" last
+     IntOp $R2 $R2 + 1
+     Goto loop
+
+   last: ; there will be no other parameter to extract
+   StrCpy $R6 1
+
+   loop2: ; found the end of the current parameter
+
+   IntCmp $R4 $R5 0 NextParam end
+   StrCpy $R6 1 ; to quit after this process
+
+   IntOp $R1 $R2 - $R3 ;number of letter of current parameter
+   StrCpy $R0 $CMDLINE $R1 $R3        ; stores the result in R0
+
+   NextParam:
+   IntCmp $R6 1 end ; leave if found or if not enough parameters
+
+   ; process the next parameter
+   IntOp $R4 $R4 + 1
+
+   Goto loop3
+
+   end:
+
+   Pop $R6  ; restore R0 - R6 to their initial value
+   Pop $R5
+   Pop $R4
+   Pop $R3
+   Pop $R2
+   Pop $R1
+
+   Exch $R0    ;Puts the result on the stack
+
+ FunctionEnd
+
+; -- written by Michel Meyers --
+; ParameterGiven - checks first 9 parameters on the command line
+; Usage:
+;   Push "/parameter"                 ; to check command line for /parameter
+;   Call ParameterGiven
+;   Pop $R0                ; saves the result in $R0 (result = true or false)
+
+ Function ParameterGiven
+   Exch $R0
+   Push $R1
+   Push $R2
+   Push $R3
+   
+   StrCpy $R1 0
+   StrCpy $R3 0
+   loopme:
+   StrCmp $R1 9 AllChecked
+   IntOp $R1 $R1 + 1
+   Push $R1
+   Call GetONEParameter
+   Pop $R2                ; saves the result in $R2
+   StrCmp $R0 $R2 Found
+   Goto loopme
+   
+   Found:
+   StrCpy $R3 1
+   Goto loopme
+   
+   AllChecked:
+   Exch $R3
+  
+ FunctionEnd
+
+Section "Install"
+
+  ; /cygwin on command line forces install dir to c:\cygwin\bacula (useful for silent install)
+  Push "/cygwin"
+  Call ParameterGiven
+  Pop $6
+  StrCmp $6 0 NoCygwin
+  StrCpy $INSTDIR "c:\cygwin\bacula"
+  NoCygwin:
+
+  ; Check for existing installation
+  StrCpy $7 0
+  IfFileExists "$INSTDIR\bin\bacula-fd.conf" Upgrade NoUpgrade
+  Upgrade:
+    StrCpy $7 1
+    ; Shutdown any baculas that could be running
+    ExecWait '"$INSTDIR\bin\bacula-fd.exe" /kill'
+  NoUpgrade:
+
+  ; Set output path to the installation directory.
+  SetOutPath "$INSTDIR\bin"
+  CreateDirectory "$INSTDIR"
+  CreateDirectory "$INSTDIR\bin"
+  CreateDirectory "$INSTDIR\working"
+  CreateDirectory "c:\tmp"
+  ; Put files there
+  File baculafd\Release\bacula-fd.exe
+  File pthreads\pthreadVCE.dll
+  IfFileExists "$INSTDIR\bacula-fd.conf" newconf 
+  File bacula-fd.conf
+  goto do_service
+  newconf:
+  File /oname=bacula-fd.conf.new bacula-fd.conf
+       
+
+  ; If /service was given jump to the service install part
+  do_service:
+  Push "/service"
+  Call ParameterGiven
+  Pop $5
+  StrCmp $5 1 Service
+  
+  ; If silent install and not /service don't ask questions and goto NoService...
+  IfSilent NoService
+
+  ; If already installed as service skip it too
+  ReadRegDWORD $9 HKLM "Software\Bacula" "InstalledService"
+  StrCmp $9 "1" NoService  
+
+  ; Install as service?
+  MessageBox MB_YESNO|MB_ICONQUESTION "Do you want to install the Bacula Client as a service (automatically starts with your PC)?" IDNO NoService
+  Service:
+    ExecWait '"$INSTDIR\bin\bacula-fd.exe" /install'
+    StrCpy $9 "1"
+    WriteRegDWORD HKLM "Software\Bacula" "InstalledService" "1"
+  NoService:
+
+  ; Write the uninstall keys for Windows
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "DisplayName" "Bacula Client"
+  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula" "UninstallString" '"$INSTDIR\uninstall.exe"'
+  SetOutPath "$INSTDIR"
+  WriteUninstaller "uninstall.exe"
+
+  ; Create bacula-fd.conf and have the user edit it (skipped if silent)
+  IfSilent NoReminder
+  StrCmp $7 "1" NoReminder  ; skip if it is an upgrade
+  MessageBox MB_OK "Please edit $INSTDIR\bin\bacula-fd.conf according to your requirements/installation! Also remember to put a shortcut into your start menu if you didn't install the client as a service."
+  CopyFiles /SILENT "$INSTDIR\bin\bacula-fd.conf.new" "$INSTDIR\bin\bacula-fd.conf"
+  Exec 'write "$INSTDIR\bin\bacula-fd.conf"'  ; spawn wordpad with the file to be edited
+  NoReminder:
+
+  ; Start the client? (default skipped if silent, use /start to force starting)
+  Push "/start"
+  Call ParameterGiven
+  Pop $8
+  StrCmp $8 "1" Start
+  IfSilent NoStart
+  MessageBox MB_YESNO|MB_ICONQUESTION  "Would you like to start the Bacula Client now?" IDNO NoStart
+  Start:
+    Exec '"$INSTDIR\bin\bacula-fd.exe" -c "$INSTDIR\bin\bacula-fd.conf"'
+  NoStart:
+
+SectionEnd
+
+
+; Uninstall section
+
+UninstallText "This will uninstall the Bacula Client. Hit next to continue."
+
+Section "Uninstall"
+  
+  ; Shutdown any baculas that could be running
+  ExecWait '"$INSTDIR\bin\bacula-fd.exe" /kill'
+
+  ReadRegDWORD $9 HKLM "Software\Bacula" "InstalledService"
+  StrCmp $9 "" NoService
+  ; Remove bacula service
+  ExecWait '"$INSTDIR\bin\bacula-fd.exe" /remove'
+  NoService:
+  
+  ; remove registry keys
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Bacula"
+  DeleteRegKey HKLM "Software\Bacula"
+
+  ; remove files and uninstaller (preserving config for now)
+  CopyFiles /SILENT "$INSTDIR\bin\bacula-fd.conf" "$INSTDIR\bacula-fd.conf"
+  Delete /REBOOTOK "$INSTDIR\bin\*.*"
+  CopyFiles /SILENT "$INSTDIR\bacula-fd.conf" "$INSTDIR\bin\bacula-fd.conf"
+  Delete /REBOOTOK "$INSTDIR\bacula-fd.conf"
+  Delete /REBOOTOK "$INSTDIR\uninstall.exe"
+
+  ; Check for existing installation
+  MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to delete the current configuration file ($INSTDIR\bin\bacula-fd.conf)?" IDNO LeaveConfig
+  Delete /REBOOTOK "$INSTDIR\bin\bacula-fd.conf"
+  ; remove directories used
+  RMDir "$INSTDIR\bin"
+  RMDir "$INSTDIR\working"
+  RMDir "$INSTDIR"
+  RMDir "C:\tmp"
+  LeaveConfig:
+  
+  ; If we need to reboot we'll ask
+  IfRebootFlag Reboot Continue
+  Reboot:
+  MessageBox MB_YESNO|MB_ICONQUESTION "Some files will only be deleted after restarting. Reboot now?" IDNO Continue
+    Reboot
+  Continue:
+
+SectionEnd
+
+; eof