/* 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;
int do_shell_expansion(char *name, int name_len)
{
-/* ****FIXME***** this should work for Win32 too */
-#define UNIX
-#ifdef UNIX
-#ifndef PATH_MAX
-#define PATH_MAX 512
-#endif
-
- int pid, wpid, stat;
- int waitstatus;
- char *shellcmd;
- int i;
- char echout[PATH_MAX + 256];
- int pfd[2];
static char meta[] = "~\\$[]*?`'<>\"";
- int found = FALSE;
- int len;
+ bool found = false;
+ int len, i, stat;
+ POOLMEM *cmd;
+ BPIPE *bpipe;
+ char line[MAXSTRING];
+ char *shellcmd;
/* Check if any meta characters are present */
len = strlen(meta);
for (i = 0; i < len; i++) {
if (strchr(name, meta[i])) {
- found = TRUE;
+ found = true;
break;
}
}
- stat = 0;
if (found) {
-#ifdef nt
- /* If the filename appears to be a DOS filename,
- convert all backward slashes \ to Unix path
- separators / and insert a \ infront of spaces. */
- len = strlen(name);
- if (len >= 3 && name[1] == ':' && name[2] == '\\') {
- for (i=2; i<len; i++)
- if (name[i] == '\\')
- name[i] = '/';
- }
-#else
- /* Pass string off to the shell for interpretation */
- if (pipe(pfd) == -1)
- return 0;
- switch(pid = fork()) {
- case -1:
- break;
-
- case 0: /* child */
- /* look for shell */
- if ((shellcmd = getenv("SHELL")) == NULL) {
- shellcmd = "/bin/sh";
- }
-#ifdef xxx
- close(1); dup(pfd[1]); /* attach pipes to stdout and stderr */
- close(2); dup(pfd[1]);
- for (i = 3; i < 32; i++) /* close everything else */
- close(i);
-#endif
- close(pfd[0]); /* close stdin */
- dup2(pfd[1], 1); /* attach to stdout */
- dup2(pfd[1], 2); /* and stderr */
- strcpy(echout, "echo "); /* form echo command */
- bstrncat(echout, name, sizeof(echout));
- execl(shellcmd, shellcmd, "-c", echout, NULL); /* give to shell */
- exit(127); /* shouldn't get here */
-
- default: /* parent */
- /* read output from child */
- echout[0] = 0;
- do {
- i = read(pfd[0], echout, sizeof echout);
- } while (i == -1 && errno == EINTR);
-
- if (i > 0) {
- echout[--i] = 0; /* set end of string */
- /* look for first line. */
- while (--i >= 0) {
- if (echout[i] == '\n') {
- echout[i] = 0; /* keep only first one */
- }
- }
- }
- /* wait for child to exit */
- while ((wpid = wait(&waitstatus)) != pid && wpid != -1)
- { ; }
- strip_trailing_junk(echout);
- if (strlen(echout) > 0) {
- bstrncpy(name, echout, name_len);
- }
- stat = 1;
- break;
- }
- close(pfd[0]); /* close pipe */
- close(pfd[1]);
-#endif /* nt */
- }
- return stat;
-
-#endif /* UNIX */
-
-#if MSC | MSDOS | __WATCOMC__
-
- char prefix[100], *env, *getenv();
-
- /* Home directory reference? */
- if (*name == '~' && (env=getenv("HOME"))) {
- strcpy(prefix, env); /* copy HOME directory name */
- name++; /* skip over ~ in name */
- strcat(prefix, name);
- name--; /* get back to beginning */
- strcpy(name, prefix); /* move back into name */
+ cmd = get_pool_memory(PM_FNAME);
+ /* look for shell */
+ if ((shellcmd = getenv("SHELL")) == NULL) {
+ shellcmd = "/bin/sh";
+ }
+ pm_strcpy(&cmd, shellcmd);
+ pm_strcat(&cmd, " -c \"echo ");
+ pm_strcat(&cmd, name);
+ pm_strcat(&cmd, "\"");
+ Dmsg1(400, "Send: %s\n", cmd);
+ bpipe = open_bpipe(cmd, 0, "r");
+ *line = 0;
+ fgets(line, sizeof(line), bpipe->rfd);
+ strip_trailing_junk(line);
+ stat = close_bpipe(bpipe);
+ Dmsg2(400, "stat=%d got: %s\n", stat, line);
+ free_pool_memory(cmd);
+ if (stat == 0) {
+ bstrncpy(name, line, name_len);
+ }
}
return 1;
-#endif
-
}
/*
* 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);
str = job_status_to_str(jcr->JobStatus);
break;
case 'i':
- sprintf(add, "%d", jcr->JobId);
+ bsnprintf(add, sizeof(add), "%d", jcr->JobId);
str = add;
break;
case 'j': /* Job name */
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;