]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/util.c
- Add a kludge to detect bad date/times, which cause a seg fault in
[bacula/bacula] / bacula / src / lib / util.c
index 013c9102d3a6ee1e0387b031894c623969459a2b..7ac8df6863ada6348de1b4a074bf2270fc49bf8b 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -88,6 +88,21 @@ bash_spaces(char *str)
    }
 }
 
+/* Convert spaces to non-space character. 
+ * This makes scanf of fields containing spaces easier.
+ */
+void
+bash_spaces(POOL_MEM &pm)
+{
+   char *str = pm.c_str();
+   while (*str) {
+      if (*str == ' ')
+        *str = 0x1;
+      str++;
+   }
+}
+
+
 /* Convert non-space characters (0x1) back into spaces */
 void
 unbash_spaces(char *str)
@@ -99,12 +114,53 @@ unbash_spaces(char *str)
    }
 }
 
+/* Convert non-space characters (0x1) back into spaces */
+void
+unbash_spaces(POOL_MEM &pm)
+{
+   char *str = pm.c_str();
+   while (*str) {
+     if (*str == 0x1)
+        *str = ' ';
+     str++;
+   }
+}
+
+#ifdef WIN32
+extern long _timezone;
+extern int _daylight;
+extern long _dstbias;
+extern "C" void __tzset(void);
+extern "C" int _isindst(struct tm *);
+#endif
 
 char *encode_time(time_t time, char *buf)
 {
    struct tm tm;
    int n = 0;
 
+#ifdef WIN32
+    /*
+     * Gross kludge to avoid a seg fault in Microsoft's CRT localtime_r(),
+     * which incorrectly references a NULL returned from gmtime() if
+     * the time (adjusted for the current timezone) is invalid.
+     * This could happen if you have a bad date/time, or perhaps if you
+     * moved a file from one timezone to another?
+     */
+    struct tm *gtm;
+    time_t gtime;
+    __tzset();
+    gtime = time - _timezone;
+    if (!(gtm = gmtime(&gtime))) {
+       return buf;
+    }
+    if (_daylight && _isindst(gtm)) {
+       gtime -= _dstbias;
+       if (!gmtime(&gtime)) {
+         return buf;
+       }
+    }
+#endif
    if (localtime_r(&time, &tm)) {
       n = sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d",
                   tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
@@ -113,33 +169,6 @@ char *encode_time(time_t time, char *buf)
    return buf+n;
 }
 
-/*
- * Concatenate a string (str) onto a pool memory buffer pm
- *   Returns: length of concatenated string
- */
-int pm_strcat(POOLMEM **pm, const char *str)
-{
-   int pmlen = strlen(*pm);
-   int len = strlen(str) + 1;
-
-   *pm = check_pool_memory_size(*pm, pmlen + len);
-   memcpy(*pm+pmlen, str, len);
-   return pmlen + len - 1;
-}
-
-
-/*
- * Copy a string (str) into a pool memory buffer pm
- *   Returns: length of string copied
- */
-int pm_strcpy(POOLMEM **pm, const char *str)
-{
-   int len = strlen(str) + 1;
-
-   *pm = check_pool_memory_size(*pm, len);
-   memcpy(*pm, str, len);
-   return len - 1;
-}
 
 
 /*
@@ -147,7 +176,7 @@ int pm_strcpy(POOLMEM **pm, const char *str)
  */
 void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen)
 {
-   char *jobstat;
+   const char *jobstat;
    char buf[100];
 
    switch (JobStatus) {
@@ -222,9 +251,9 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen)
 /*
  * Convert Job Termination Status into a string
  */
-char *job_status_to_str(int stat) 
+const char *job_status_to_str(int stat) 
 {
-   char *str;
+   const char *str;
 
    switch (stat) {
    case JS_Terminated:
@@ -254,9 +283,9 @@ char *job_status_to_str(int stat)
 /*
  * Convert Job Type into a string
  */
-char *job_type_to_str(int type) 
+const char *job_type_to_str(int type) 
 {
-   char *str;
+   const char *str;
 
    switch (type) {
    case JT_BACKUP:
@@ -281,9 +310,9 @@ char *job_type_to_str(int type)
 /*
  * Convert Job Level into a string
  */
-char *job_level_to_str(int level) 
+const char *job_level_to_str(int level) 
 {
-   char *str;
+   const char *str;
 
    switch (level) {
    case L_BASE:
@@ -364,7 +393,7 @@ int do_shell_expansion(char *name, int name_len)
    POOLMEM *cmd;
    BPIPE *bpipe;
    char line[MAXSTRING];
-   char *shellcmd;
+   const char *shellcmd;
 
    /* Check if any meta characters are present */
    len = strlen(meta);