/* Return true of buffer has all zero bytes */
int is_buf_zero(char *buf, int len)
{
- uint64_t *ip = (uint64_t *)buf;
+ uint64_t *ip;
char *p;
int i, len64, done, rem;
+ if (buf[0] != 0) {
+ return 0;
+ }
+ ip = (uint64_t *)buf;
/* Optimize by checking uint64_t for zero */
- len64 = len >> sizeof(uint64_t);
+ len64 = len / sizeof(uint64_t);
for (i=0; i < len64; i++) {
if (ip[i] != 0) {
return 0;
}
}
- done = len64 << sizeof(uint64_t); /* bytes already checked */
+ done = len64 * sizeof(uint64_t); /* bytes already checked */
p = buf + done;
rem = len - done;
for (i = 0; i < rem; i++) {
/*
* Concatenate a string (str) onto a pool memory buffer pm
+ * Returns: length of concatenated string
*/
-void pm_strcat(POOLMEM **pm, char *str)
+int pm_strcat(POOLMEM **pm, 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
*/
-void pm_strcpy(POOLMEM **pm, char *str)
+int pm_strcpy(POOLMEM **pm, char *str)
{
int len = strlen(str) + 1;
*pm = check_pool_memory_size(*pm, len);
memcpy(*pm, str, len);
+ return len - 1;
}
*/
void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen)
{
- char *termstat, jstat[2];
+ char *jobstat;
+ char buf[100];
switch (JobStatus) {
- case JS_Terminated:
- termstat = _("OK");
- break;
- case JS_FatalError:
- case JS_ErrorTerminated:
- termstat = _("Error");
- break;
- case JS_Error:
- termstat = _("Non-fatal error");
- break;
- case JS_Canceled:
- termstat = _("Canceled");
- break;
- case JS_Differences:
- termstat = _("Verify differences");
- break;
- default:
- jstat[0] = last_job.JobStatus;
- jstat[1] = 0;
- termstat = jstat;
- break;
+ case JS_Created:
+ jobstat = _("Created");
+ break;
+ case JS_Running:
+ jobstat = _("Running");
+ break;
+ case JS_Blocked:
+ jobstat = _("Blocked");
+ break;
+ case JS_Terminated:
+ jobstat = _("OK");
+ break;
+ case JS_FatalError:
+ case JS_ErrorTerminated:
+ jobstat = _("Error");
+ break;
+ case JS_Error:
+ jobstat = _("Non-fatal error");
+ break;
+ case JS_Canceled:
+ jobstat = _("Canceled");
+ break;
+ case JS_Differences:
+ jobstat = _("Verify differences");
+ break;
+ case JS_WaitFD:
+ jobstat = _("Waiting on FD");
+ break;
+ case JS_WaitSD:
+ jobstat = _("Wait on SD");
+ break;
+ case JS_WaitMedia:
+ jobstat = _("Wait for new Volume");
+ break;
+ case JS_WaitMount:
+ jobstat = _("Waiting for mount");
+ break;
+ case JS_WaitStoreRes:
+ jobstat = _("Waiting for Storage resource");
+ break;
+ case JS_WaitJobRes:
+ jobstat = _("Waiting for Job resource");
+ break;
+ case JS_WaitClientRes:
+ jobstat = _("Waiting for Client resource");
+ break;
+ case JS_WaitMaxJobs:
+ jobstat = _("Waiting on Max Jobs");
+ break;
+ case JS_WaitStartTime:
+ jobstat = _("Waiting for Start Time");
+ break;
+ case JS_WaitPriority:
+ jobstat = _("Waiting on Priority");
+ break;
+
+ default:
+ if (JobStatus == 0) {
+ buf[0] = 0;
+ } else {
+ bsnprintf(buf, sizeof(buf), _("Unknown Job termination status=%d"), JobStatus);
+ }
+ jobstat = buf;
+ break;
}
- bstrncpy(msg, termstat, maxlen);
+ bstrncpy(msg, jobstat, maxlen);
}
/*
case L_VERIFY_VOLUME_TO_CATALOG:
str = _("Verify Volume to Catalog");
break;
+ case L_VERIFY_DISK_TO_CATALOG:
+ str = _("Verify Disk to Catalog");
+ break;
case L_VERIFY_DATA:
str = _("Verify Data");
break;
+ case L_NONE:
+ str = " ";
+ break;
default:
str = _("Unknown Job Level");
break;
/*
* Edit job codes into main command line
* %% = %
- * %j = Job name
- * %t = Job type (Backup, ...)
+ * %c = Client's name
+ * %d = Director's name
* %e = Job Exit code
* %i = JobId
+ * %j = Unique Job name
* %l = job level
- * %c = Client's name
+ * %n = Unadorned Job name
+ * %t = Job type (Backup, ...)
* %r = Recipients
- * %d = Director's name
+ * %v = Volume name
*
* omsg = edited output message
* imsg = input string containing edit codes (%x)
{
char *p, *str;
char add[20];
+ char name[MAX_NAME_LENGTH];
*omsg = 0;
Dmsg1(200, "edit_job_codes: %s\n", imsg);
case 'l':
str = job_level_to_str(jcr->JobLevel);
break;
+ case 'n':
+ bstrncpy(name, jcr->Job, sizeof(name));
+ /* There are three periods after the Job name */
+ for (int i=0; i<3; i++) {
+ if ((str=strrchr(name, '.')) != NULL) {
+ *str = 0;
+ }
+ }
+ str = name;
+ break;
case 'r':
str = to;
break;
case 't':
str = job_type_to_str(jcr->JobType);
break;
+ case 'v':
+ if (jcr->VolumeName && jcr->VolumeName[0]) {
+ str = jcr->VolumeName;
+ } else {
+ str = "";
+ }
+ break;
default:
add[0] = '%';
add[1] = *p;