X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Futil.c;h=0ef5a59c29f8f552ebf47d0005448416694a388d;hb=28b98a207e5834c4066b6565c4210220957452e4;hp=a38eff903cacd5d380f0de46969ac94eb2d7dfa5;hpb=e1187372073c4190d58582372c26400b69af3b6f;p=bacula%2Fbacula diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index a38eff903c..0ef5a59c29 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -95,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) { @@ -324,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; @@ -364,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 @@ -386,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 @@ -398,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]; @@ -436,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; } @@ -500,7 +417,7 @@ int do_shell_expansion(char *name) from SpeakFreely by John Walker */ -void makeSessionKey(char *key, char *seed, int mode) +void make_session_key(char *key, char *seed, int mode) { int j, k; struct MD5Context md5c; @@ -584,11 +501,10 @@ void makeSessionKey(char *key, char *seed, int mode) * to = recepients list * */ -POOLMEM *edit_job_codes(void *mjcr, char *omsg, char *imsg, char *to) +POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, char *to) { char *p, *str; char add[20]; - JCR *jcr = (JCR *)mjcr; *omsg = 0; Dmsg1(200, "edit_job_codes: %s\n", imsg); @@ -611,7 +527,7 @@ POOLMEM *edit_job_codes(void *mjcr, char *omsg, char *imsg, char *to) 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 */ @@ -644,3 +560,21 @@ POOLMEM *edit_job_codes(void *mjcr, char *omsg, char *imsg, char *to) } 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 */ +}