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.
/* 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])) {
/* 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;
}
*value = (utime_t)(val * mult[i]);
return 1;
-
}
/*
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;
* 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;
}
--- /dev/null
+; 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