From 4d9986488579772ea1c1f89ba693e59b95ba052f Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 25 Feb 2004 18:25:40 +0000 Subject: [PATCH] Implement kb,mb,and gb modifiers + add Makefile to win32 directory + Michel Meyers' nsi file git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1089 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/dird/dird.c | 2 +- bacula/src/lib/edit.c | 143 ++++++++-------- bacula/src/stored/stored.c | 2 +- bacula/src/win32/Makefile.in | 53 ++++++ bacula/src/win32/bacula.nsi | 4 +- bacula/src/win32/build.bat | 4 - bacula/src/win32/winbacula.nsi.in | 271 ++++++++++++++++++++++++++++++ 7 files changed, 394 insertions(+), 85 deletions(-) create mode 100644 bacula/src/win32/Makefile.in create mode 100755 bacula/src/win32/winbacula.nsi.in diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index b78e35d866..271a841d6d 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -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); } /* diff --git a/bacula/src/lib/edit.c b/bacula/src/lib/edit.c index ec5262890f..b9e24a7bc3 100644 --- a/bacula/src/lib/edit.c +++ b/bacula/src/lib/edit.c @@ -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; } diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index ddb3f7f5dd..54d8e2524d 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -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 index 0000000000..c41c38a44d --- /dev/null +++ b/bacula/src/win32/Makefile.in @@ -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 diff --git a/bacula/src/win32/bacula.nsi b/bacula/src/win32/bacula.nsi index 5de4a6ddc0..599aa87383 100644 --- a/bacula/src/win32/bacula.nsi +++ b/bacula/src/win32/bacula.nsi @@ -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 diff --git a/bacula/src/win32/build.bat b/bacula/src/win32/build.bat index 84d08d10ef..1545d22fa0 100755 --- a/bacula/src/win32/build.bat +++ b/bacula/src/win32/build.bat @@ -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 index 0000000000..ab50bb552f --- /dev/null +++ b/bacula/src/win32/winbacula.nsi.in @@ -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 -- 2.39.5