X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Futil.c;h=8a3e56453cb491e77b648bdc581bbe39db81ccfe;hb=4132c9f33642f579d89700f36caced609d374d51;hp=50844211ebb921c9389b5a74d288fbc8a396db20;hpb=eb326beecb6fc8803ab73e6395c68c5a29ac8cc2;p=bacula%2Fbacula diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index 50844211eb..8a3e56453c 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -1,12 +1,12 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,12 +15,12 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. @@ -134,10 +134,11 @@ unbash_spaces(POOL_MEM &pm) } } -char *encode_time(time_t time, char *buf) +char *encode_time(utime_t utime, char *buf) { struct tm tm; int n = 0; + time_t time = utime; #if defined(HAVE_WIN32) /* @@ -194,6 +195,9 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) case JS_Error: jobstat = _("Non-fatal error"); break; + case JS_Warnings: + jobstat = _("OK -- with warnings"); + break; case JS_Canceled: jobstat = _("Canceled"); break; @@ -230,6 +234,18 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) case JS_WaitPriority: jobstat = _("Waiting on Priority"); break; + case JS_DataCommitting: + jobstat = _("SD committing Data"); + break; + case JS_DataDespooling: + jobstat = _("SD despooling Data"); + break; + case JS_AttrDespooling: + jobstat = _("SD despooling Attributes"); + break; + case JS_AttrInserting: + jobstat = _("Dir inserting Attributes"); + break; default: if (JobStatus == 0) { @@ -243,6 +259,56 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) bstrncpy(msg, jobstat, maxlen); } +/* + * Convert a JobStatus code into a human readable form - gui version + */ +void jobstatus_to_ascii_gui(int JobStatus, char *msg, int maxlen) +{ + const char *cnv = NULL; + switch (JobStatus) { + case JS_Terminated: + cnv = _("Completed successfully"); + break; + case JS_Warnings: + cnv = _("Completed with warnings"); + break; + case JS_ErrorTerminated: + cnv = _("Terminated with errors"); + break; + case JS_FatalError: + cnv = _("Fatal error"); + break; + case JS_Created: + cnv = _("Created, not yet running"); + break; + case JS_Canceled: + cnv = _("Canceled by user"); + break; + case JS_Differences: + cnv = _("Verify found differences"); + break; + case JS_WaitFD: + cnv = _("Waiting for File daemon"); + break; + case JS_WaitSD: + cnv = _("Waiting for Storage daemon"); + break; + case JS_WaitPriority: + cnv = _("Waiting for higher priority jobs"); + break; + case JS_AttrInserting: + cnv = _("Batch inserting file records"); + break; + }; + + if (cnv) { + bstrncpy(msg, cnv, maxlen); + } else { + jobstatus_to_ascii(JobStatus, msg, maxlen); + } +} + + /* * Convert Job Termination Status into a string */ @@ -254,6 +320,9 @@ const char *job_status_to_str(int stat) case JS_Terminated: str = _("OK"); break; + case JS_Warnings: + str = _("OK -- with warnings"); + break; case JS_ErrorTerminated: case JS_Error: str = _("Error"); @@ -280,43 +349,65 @@ const char *job_status_to_str(int stat) */ const char *job_type_to_str(int type) { - const char *str; + const char *str = NULL; switch (type) { case JT_BACKUP: str = _("Backup"); break; + case JT_MIGRATED_JOB: + str = _("Migrated Job"); + break; case JT_VERIFY: str = _("Verify"); break; case JT_RESTORE: str = _("Restore"); break; + case JT_CONSOLE: + str = _("Console"); + break; + case JT_SYSTEM: + str = _("System or Console"); + break; case JT_ADMIN: str = _("Admin"); break; - case JT_MIGRATE: - str = _("Migrate"); + case JT_ARCHIVE: + str = _("Archive"); + break; + case JT_JOB_COPY: + str = _("Job Copy"); break; case JT_COPY: str = _("Copy"); break; - case JT_CONSOLE: - str = _("Console"); - break; - case JT_SYSTEM: - str = _("System or Console"); + case JT_MIGRATE: + str = _("Migrate"); break; case JT_SCAN: str = _("Scan"); break; - default: - str = _("Unknown Type"); - break; } + if (!str) { + str = _("Unknown Type"); + } return str; } +/* Convert ActionOnPurge to string (Truncate, Erase, Destroy) + */ +char *action_on_purge_to_string(int aop, POOL_MEM &ret) +{ + if (aop & ON_PURGE_TRUNCATE) { + pm_strcpy(ret, _("Truncate")); + } + if (!aop) { + pm_strcpy(ret, _("None")); + } + return ret.c_str(); +} + /* * Convert Job Level into a string */ @@ -354,6 +445,9 @@ const char *job_level_to_str(int level) case L_VERIFY_DATA: str = _("Verify Data"); break; + case L_VIRTUAL_FULL: + str = _("Virtual Full"); + break; case L_NONE: str = " "; break; @@ -364,6 +458,33 @@ const char *job_level_to_str(int level) return str; } +const char *volume_status_to_str(const char *status) +{ + int pos; + const char *vs[] = { + NT_("Append"), _("Append"), + NT_("Archive"), _("Archive"), + NT_("Disabled"), _("Disabled"), + NT_("Full"), _("Full"), + NT_("Used"), _("Used"), + NT_("Cleaning"), _("Cleaning"), + NT_("Purged"), _("Purged"), + NT_("Recycle"), _("Recycle"), + NT_("Read-Only"), _("Read-Only"), + NT_("Error"), _("Error"), + NULL, NULL}; + + if (status) { + for (pos = 0 ; vs[pos] ; pos += 2) { + if ( !strcmp(vs[pos],status) ) { + return vs[pos+1]; + } + } + } + + return _("Invalid volume status"); +} + /*********************************************************************** * Encode the mode bits into a 10 character string like LS does @@ -468,6 +589,8 @@ void make_session_key(char *key, char *seed, int mode) unsigned char md5key[16], md5key1[16]; char s[1024]; +#define ss sizeof(s) + s[0] = 0; if (seed != NULL) { bstrncat(s, seed, sizeof(s)); @@ -488,41 +611,41 @@ void make_session_key(char *key, char *seed, int mode) char *p; p = s; - sprintf(s + strlen(s), "%lu", (unsigned long)GetCurrentProcessId()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetCurrentProcessId()); (void)getcwd(s + strlen(s), 256); - sprintf(s + strlen(s), "%lu", (unsigned long)GetTickCount()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetTickCount()); QueryPerformanceCounter(&li); - sprintf(s + strlen(s), "%lu", (unsigned long)li.LowPart); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)li.LowPart); GetSystemTimeAsFileTime(&ft); - sprintf(s + strlen(s), "%lu", (unsigned long)ft.dwLowDateTime); - sprintf(s + strlen(s), "%lu", (unsigned long)ft.dwHighDateTime); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwLowDateTime); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwHighDateTime); length = 256; GetComputerName(s + strlen(s), &length); length = 256; GetUserName(s + strlen(s), &length); } #else - sprintf(s + strlen(s), "%lu", (unsigned long)getpid()); - sprintf(s + strlen(s), "%lu", (unsigned long)getppid()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getpid()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getppid()); (void)getcwd(s + strlen(s), 256); - sprintf(s + strlen(s), "%lu", (unsigned long)clock()); - sprintf(s + strlen(s), "%lu", (unsigned long)time(NULL)); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)clock()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)time(NULL)); #if defined(Solaris) sysinfo(SI_HW_SERIAL,s + strlen(s), 12); #endif #if defined(HAVE_GETHOSTID) - sprintf(s + strlen(s), "%lu", (unsigned long) gethostid()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t) gethostid()); #endif gethostname(s + strlen(s), 256); - sprintf(s + strlen(s), "%u", (unsigned)getuid()); - sprintf(s + strlen(s), "%u", (unsigned)getgid()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getuid()); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getgid()); #endif MD5Init(&md5c); - MD5Update(&md5c, (unsigned char *)s, strlen(s)); + MD5Update(&md5c, (uint8_t *)s, strlen(s)); MD5Final(md5key, &md5c); - sprintf(s + strlen(s), "%lu", (unsigned long)((time(NULL) + 65121) ^ 0x375F)); + bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)((time(NULL) + 65121) ^ 0x375F)); MD5Init(&md5c); - MD5Update(&md5c, (unsigned char *)s, strlen(s)); + MD5Update(&md5c, (uint8_t *)s, strlen(s)); MD5Final(md5key1, &md5c); #define nextrand (md5key[j] ^ md5key1[j]) if (mode) { @@ -546,6 +669,39 @@ void make_session_key(char *key, char *seed, int mode) } #undef nextrand +void encode_session_key(char *encode, char *session, char *key, int maxlen) +{ + int i; + for (i=0; (i < maxlen-1) && session[i]; i++) { + if (session[i] == '-') { + encode[i] = '-'; + } else { + encode[i] = ((session[i] - 'A' + key[i]) & 0xF) + 'A'; + } + } + encode[i] = 0; + Dmsg3(000, "Session=%s key=%s encode=%s\n", session, key, encode); +} + +void decode_session_key(char *decode, char *session, char *key, int maxlen) +{ + int i, x; + + for (i=0; (i < maxlen-1) && session[i]; i++) { + if (session[i] == '-') { + decode[i] = '-'; + } else { + x = (session[i] - 'A' - key[i]) & 0xF; + if (x < 0) { + x += 16; + } + decode[i] = x + 'A'; + } + } + decode[i] = 0; + Dmsg3(000, "Session=%s key=%s decode=%s\n", session, key, decode); +} + /* @@ -562,17 +718,19 @@ void make_session_key(char *key, char *seed, int mode) * %t = Job type (Backup, ...) * %r = Recipients * %v = Volume name + * %b = Job Bytes + * %f = Job Files * * omsg = edited output message * imsg = input string containing edit codes (%x) * to = recepients list * */ -POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to) +POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to, job_code_callback_t callback) { char *p, *q; const char *str; - char add[20]; + char add[50]; char name[MAX_NAME_LENGTH]; int i; @@ -618,7 +776,7 @@ POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to) break; case 'l': if (jcr) { - str = job_level_to_str(jcr->JobLevel); + str = job_level_to_str(jcr->getJobLevel()); } else { str = _("*none*"); } @@ -647,9 +805,15 @@ POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to) str = _("*none*"); } break; + case 'f': /* Job Files */ + str = edit_uint64(jcr->JobFiles, add); + break; + case 'b': /* Job Bytes */ + str = edit_uint64(jcr->JobBytes, add); + break; case 't': if (jcr) { - str = job_type_to_str(jcr->JobType); + str = job_type_to_str(jcr->getJobType()); } else { str = _("*none*"); } @@ -666,10 +830,17 @@ POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to) } break; default: - add[0] = '%'; - add[1] = *p; - add[2] = 0; - str = add; + str = NULL; + if (callback != NULL) { + str = callback(jcr, p); + } + + if (!str) { + add[0] = '%'; + add[1] = *p; + add[2] = 0; + str = add; + } break; } } else {