X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Futil.c;h=0ef5a59c29f8f552ebf47d0005448416694a388d;hb=28b98a207e5834c4066b6565c4210220957452e4;hp=57fd42cd501f47cd5d7a6efd6a6541fc43bc0796;hpb=28346ad7fe97a74998f04157c8c63b39e4717ac8;p=bacula%2Fbacula diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index 57fd42cd50..0ef5a59c29 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -60,157 +60,6 @@ int is_buf_zero(char *buf, int len) return 1; } -/* - * 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, ch, len; - double val; - static int mod[] = {'*', 's', 'n', 'h', 'd', 'w', 'm', 'q', 'y', 0}; - static int mult[] = {1, 1, 60, 60*60, 60*60*24, 60*60*24*7, 60*60*24*30, - 60*60*24*91, 60*60*24*365}; - - /* Look for modifier */ - len = strlen(str); - ch = str[len - 1]; - i = 0; - if (B_ISALPHA(ch)) { - if (B_ISUPPER(ch)) { - ch = tolower(ch); - } - while (mod[++i] != 0) { - if (ch == mod[i]) { - len--; - str[len] = 0; /* strip modifier */ - break; - } - } - } - if (mod[i] == 0 || !is_a_number(str)) { - return 0; - } - val = strtod(str, NULL); - if (errno != 0 || val < 0) { - return 0; - } - *value = (utime_t)(val * mult[i]); - return 1; - -} - -/* - * Edit a utime "duration" into ASCII - */ -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"}; - int i; - uint32_t times; - - *buf = 0; - for (i=0; i<5; i++) { - times = val / mult[i]; - if (times > 0) { - val = val - (utime_t)times * mult[i]; - sprintf(mybuf, "%d %s%s ", times, mod[i], times>1?"s":""); - strcat(buf, mybuf); - } - } - if (val == 0 && strlen(buf) == 0) { - strcat(buf, "0 secs"); - } else if (val != 0) { - sprintf(mybuf, "%d sec%s", (uint32_t)val, val>1?"s":""); - strcat(buf, mybuf); - } - return buf; -} - -/* - * Check if specified string is a number or not. - * Taken from SQLite, cool, thanks. - */ -int is_a_number(const char *n) -{ - int digit_seen = 0; - - if( *n == '-' || *n == '+' ) { - n++; - } - while (B_ISDIGIT(*n)) { - digit_seen = 1; - n++; - } - if (digit_seen && *n == '.') { - n++; - while (B_ISDIGIT(*n)) { n++; } - } - if (digit_seen && (*n == 'e' || *n == 'E') - && (B_ISDIGIT(n[1]) || ((n[1]=='-' || n[1] == '+') && B_ISDIGIT(n[2])))) { - n += 2; /* skip e- or e+ or e digit */ - while (B_ISDIGIT(*n)) { n++; } - } - return digit_seen && *n==0; -} - - -/* - * Edit an integer number with commas, the supplied buffer - * must be at least 27 bytes long. The incoming number - * is always widened to 64 bits. - */ -char *edit_uint64_with_commas(uint64_t val, char *buf) -{ - sprintf(buf, "%" lld, val); - return add_commas(buf, buf); -} - -/* - * Edit an integer number, the supplied buffer - * must be at least 27 bytes long. The incoming number - * is always widened to 64 bits. - */ -char *edit_uint64(uint64_t val, char *buf) -{ - sprintf(buf, "%" lld, val); - return buf; -} - - -/* - * Add commas to a string, which is presumably - * a number. - */ -char *add_commas(char *val, char *buf) -{ - int len, nc; - char *p, *q; - int i; - - if (val != buf) { - strcpy(buf, val); - } - len = strlen(buf); - if (len < 1) { - len = 1; - } - nc = (len - 1) / 3; - p = buf+len; - q = p + nc; - *q-- = *p--; - for ( ; nc; nc--) { - for (i=0; i < 3; i++) { - *q-- = *p--; - } - *q-- = ','; - } - return buf; -} - /* Convert a string in place to lower case */ void lcase(char *str) @@ -246,96 +95,6 @@ unbash_spaces(char *str) } } -/* Strip any trailing junk from the command */ -void strip_trailing_junk(char *cmd) -{ - char *p; - p = cmd + strlen(cmd) - 1; - - /* strip trailing junk from command */ - while ((p >= cmd) && (*p == '\n' || *p == '\r' || *p == ' ')) - *p-- = 0; -} - -/* Strip any trailing slashes from a directory path */ -void strip_trailing_slashes(char *dir) -{ - char *p; - p = dir + strlen(dir) - 1; - - /* strip trailing slashes */ - while ((p >= dir) && (*p == '/')) - *p-- = 0; -} - -/* - * Skip spaces - * Returns: 0 on failure (EOF) - * 1 on success - * new address in passed parameter - */ -int skip_spaces(char **msg) -{ - char *p = *msg; - if (!p) { - return 0; - } - while (*p && *p == ' ') { - p++; - } - *msg = p; - return *p ? 1 : 0; -} - -/* - * Skip nonspaces - * Returns: 0 on failure (EOF) - * 1 on success - * new address in passed parameter - */ -int skip_nonspaces(char **msg) -{ - char *p = *msg; - - if (!p) { - return 0; - } - while (*p && *p != ' ') { - p++; - } - *msg = p; - return *p ? 1 : 0; -} - -/* folded search for string - case insensitive */ -int -fstrsch(char *a, char *b) /* folded case search */ -{ - register char *s1,*s2; - register char c1, c2; - - s1=a; - s2=b; - while (*s1) { /* do it the fast way */ - if ((*s1++ | 0x20) != (*s2++ | 0x20)) - return 0; /* failed */ - } - while (*a) { /* do it over the correct slow way */ - if (B_ISUPPER(c1 = *a)) { - c1 = tolower((int)c1); - } - if (B_ISUPPER(c2 = *b)) { - c2 = tolower((int)c2); - } - if (c1 != c2) { - return 0; - } - a++; - b++; - } - return 1; -} - char *encode_time(time_t time, char *buf) { @@ -393,8 +152,8 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) case JS_Error: termstat = _("Non-fatal error"); break; - case JS_Cancelled: - termstat = _("Cancelled"); + case JS_Canceled: + termstat = _("Canceled"); break; case JS_Differences: termstat = _("Verify differences"); @@ -405,8 +164,7 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) termstat = jstat; break; } - strncpy(msg, termstat, maxlen); - msg[maxlen-1] = 0; + bstrncpy(msg, termstat, maxlen); } /* @@ -427,8 +185,8 @@ char *job_status_to_str(int stat) case JS_FatalError: str = _("Fatal Error"); break; - case JS_Cancelled: - str = _("Cancelled"); + case JS_Canceled: + str = _("Canceled"); break; case JS_Differences: str = _("Differences"); @@ -476,6 +234,8 @@ char *job_level_to_str(int level) char *str; switch (level) { + case L_BASE: + str = _("Base"); case L_FULL: str = _("Full"); break; @@ -485,9 +245,6 @@ char *job_level_to_str(int level) case L_DIFFERENTIAL: str = _("Differential"); break; - case L_LEVEL: - str = _("Level"); - break; case L_SINCE: str = _("Since"); break; @@ -519,8 +276,8 @@ char *encode_mode(mode_t mode, char *buf) { char *cp = buf; - *cp++ = S_ISDIR(mode) ? 'd' : S_ISBLK(mode) ? 'b' : S_ISCHR(mode) ? 'c' : - S_ISLNK(mode) ? 'l' : '-'; + *cp++ = S_ISDIR(mode) ? 'd' : S_ISBLK(mode) ? 'b' : S_ISCHR(mode) ? 'c' : + S_ISLNK(mode) ? 'l' : S_ISFIFO(mode) ? 'f' : S_ISSOCK(mode) ? 's' : '-'; *cp++ = mode & S_IRUSR ? 'r' : '-'; *cp++ = mode & S_IWUSR ? 'w' : '-'; *cp++ = (mode & S_ISUID @@ -541,7 +298,7 @@ char *encode_mode(mode_t mode, char *buf) } -int do_shell_expansion(char *name) +int do_shell_expansion(char *name, int name_len) { /* ****FIXME***** this should work for Win32 too */ #define UNIX @@ -553,7 +310,6 @@ int do_shell_expansion(char *name) int pid, wpid, stat; int waitstatus; char *shellcmd; - void (*istat)(int), (*qstat)(int); int i; char echout[PATH_MAX + 256]; int pfd[2]; @@ -591,34 +347,40 @@ int do_shell_expansion(char *name) case 0: /* child */ /* look for shell */ - if ((shellcmd = getenv("SHELL")) == NULL) + if ((shellcmd = getenv("SHELL")) == NULL) { shellcmd = "/bin/sh"; - close(1); dup(pfd[1]); /* attach pipes to stdin and stdout */ - close(2); dup(pfd[1]); - for (i = 3; i < 32; i++) /* close everything else */ - close(i); + } + close(pfd[0]); /* close stdin */ + dup2(pfd[1], 1); /* attach to stdout */ + dup2(pfd[1], 2); /* and stderr */ strcpy(echout, "echo "); /* form echo command */ - strcat(echout, name); + 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 */ - i = read(pfd[0], echout, sizeof echout); - echout[--i] = 0; /* set end of string */ - /* look for first word or first line. */ - while (--i >= 0) { - if (echout[i] == ' ' || echout[i] == '\n') - echout[i] = 0; /* keep only first one */ + 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 */ + } + } } - istat = signal(SIGINT, SIG_IGN); - qstat = signal(SIGQUIT, SIG_IGN); /* wait for child to exit */ while ((wpid = wait(&waitstatus)) != pid && wpid != -1) { ; } - signal(SIGINT, istat); - signal(SIGQUIT, qstat); - strcpy(name, echout); + strip_trailing_junk(echout); + if (strlen(echout) > 0) { + bstrncpy(name, echout, name_len); + } stat = 1; break; } @@ -647,149 +409,6 @@ int do_shell_expansion(char *name) } -#define MAX_ARGV 100 -static void build_argc_argv(char *cmd, int *bargc, char *bargv[], int max_arg); - -/* - * Run an external program. Optionally wait a specified number - * of seconds. Program killed if wait exceeded. Optionally - * return the output from the program (normally a single line). - */ -int run_program(char *prog, int wait, POOLMEM *results) -{ - int stat = ETIME; - int chldstatus = 0; - pid_t pid1, pid2 = 0; - int pfd[2]; - char *bargv[MAX_ARGV]; - int bargc; - - - build_argc_argv(prog, &bargc, bargv, MAX_ARGV); -#ifdef xxxxxxxxxx - printf("argc=%d\n", bargc); - int i; - for (i=0; i 0) { - switch (pid2=fork()) { - case -1: - break; - case 0: /* child 2 */ - /* Time the worker process */ - sleep(wait); - if (kill(pid1, SIGTERM) == 0) { /* time expired kill it */ - exit(0); - } - sleep(3); - kill(pid1, SIGKILL); - exit(0); - default: /* parent */ - break; - } - } - - /* Parent continues here */ - int i; - if (results) { - i = read(pfd[0], results, sizeof_pool_memory(results) - 1); - if (--i < 0) { - i = 0; - } - results[i] = 0; /* set end of string */ - } - /* wait for worker child to exit */ - for ( ;; ) { - pid_t wpid; - wpid = waitpid(pid1, &chldstatus, 0); - if (wpid == pid1 || (errno != EINTR)) { - break; - } - } - if (WIFEXITED(chldstatus)) - stat = WEXITSTATUS(chldstatus); - - if (wait > 0) { - kill(pid2, SIGKILL); /* kill off timer process */ - waitpid(pid2, &chldstatus, 0); /* reap timer process */ - } - if (results) { - close(pfd[0]); /* close pipe */ - close(pfd[1]); - } - break; - } - return stat; -} - -/* - * Build argc and argv from a string - */ -static void build_argc_argv(char *cmd, int *bargc, char *bargv[], int max_argv) -{ - int i, quote; - char *p, *q; - int argc = 0; - - argc = 0; - for (i=0; iclient_name; + if (!str) { + str = ""; + } + break; + case 'd': + str = my_name; /* Director's name */ + break; + case 'e': + str = job_status_to_str(jcr->JobStatus); + break; + case 'i': + bsnprintf(add, sizeof(add), "%d", jcr->JobId); + str = add; + break; + case 'j': /* Job name */ + str = jcr->Job; + break; + case 'l': + str = job_level_to_str(jcr->JobLevel); + break; + case 'r': + str = to; + break; + case 't': + str = job_type_to_str(jcr->JobType); + break; + default: + add[0] = '%'; + add[1] = *p; + add[2] = 0; + str = add; + break; + } + } else { + add[0] = *p; + add[1] = 0; + str = add; + } + Dmsg1(1200, "add_str %s\n", str); + pm_strcat(&omsg, str); + Dmsg1(1200, "omsg=%s\n", omsg); + } + return omsg; +} + +void set_working_directory(char *wd) +{ + struct stat stat_buf; + + if (wd == NULL) { + Emsg0(M_ERROR_TERM, 0, _("Working directory not defined. Cannot continue.\n")); + } + if (stat(wd, &stat_buf) != 0) { + Emsg1(M_ERROR_TERM, 0, _("Working Directory: \"%s\" not found. Cannot continue.\n"), + wd); + } + if (!S_ISDIR(stat_buf.st_mode)) { + Emsg1(M_ERROR_TERM, 0, _("Working Directory: \"%s\" is not a directory. Cannot continue.\n"), + wd); + } + working_directory = wd; /* set global */ +}