2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation plus additions
11 that are listed in the file LICENSE.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of John Walker.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Miscellaneous Bacula memory and thread safe routines
30 * Generally, these are interfaces to system or standard
33 * Bacula utility functions are in util.c
46 static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
47 static pthread_cond_t timer = PTHREAD_COND_INITIALIZER;
50 * This routine will sleep (sec, microsec). Note, however, that if a
51 * signal occurs, it will return early. It is up to the caller
52 * to recall this routine if he/she REALLY wants to sleep the
55 int bmicrosleep(time_t sec, long usec)
57 struct timespec timeout;
63 timeout.tv_nsec = usec * 1000;
66 stat = nanosleep(&timeout, NULL);
67 if (!(stat < 0 && errno == ENOSYS)) {
70 /* If we reach here it is because nanosleep is not supported by the OS */
73 /* Do it the old way */
74 gettimeofday(&tv, &tz);
75 timeout.tv_nsec += tv.tv_usec * 1000;
76 timeout.tv_sec += tv.tv_sec;
77 while (timeout.tv_nsec >= 1000000000) {
78 timeout.tv_nsec -= 1000000000;
82 Dmsg2(200, "pthread_cond_timedwait sec=%d usec=%d\n", sec, usec);
83 /* Note, this unlocks mutex during the sleep */
85 stat = pthread_cond_timedwait(&timer, &timer_mutex, &timeout);
88 Dmsg2(200, "pthread_cond_timedwait stat=%d ERR=%s\n", stat,
96 * Guarantee that the string is properly terminated */
97 char *bstrncpy(char *dest, const char *src, int maxlen)
99 strncpy(dest, src, maxlen-1);
105 * Guarantee that the string is properly terminated */
106 char *bstrncpy(char *dest, POOL_MEM &src, int maxlen)
108 strncpy(dest, src.c_str(), maxlen-1);
114 char *bstrncat(char *dest, const char *src, int maxlen)
116 strncat(dest, src, maxlen-1);
121 char *bstrncat(char *dest, POOL_MEM &src, int maxlen)
123 strncat(dest, src.c_str(), maxlen-1);
129 * Allows one or both pointers to be NULL
131 bool bstrcmp(const char *s1, const char *s2)
133 if (s1 == s2) return true;
134 if (s1 == NULL || s2 == NULL) return false;
135 return strcmp(s1, s2) == 0;
139 * Get character length of UTF-8 string
142 * U-00000000 - U-0000007F: 0xxxxxxx
143 * U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
144 * U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
145 * U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
146 * U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
147 * U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
149 int cstrlen(const char *str)
151 uint8_t *p = (uint8_t *)str;
154 if ((*p & 0xC0) != 0xC0) {
159 if ((*p & 0xD0) == 0xC0) {
164 if ((*p & 0xF0) == 0xD0) {
169 if ((*p & 0xF8) == 0xF0) {
174 if ((*p & 0xFC) == 0xF8) {
179 if ((*p & 0xFE) == 0xFC) {
184 p++; /* Shouln't get here but must advance */
192 void *bmalloc(size_t size)
197 buf = sm_malloc(file, line, size);
203 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
209 void *b_malloc(const char *file, int line, size_t size)
214 buf = sm_malloc(file, line, size);
220 e_msg(file, line, M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
226 void bfree(void *buf)
229 sm_free(__FILE__, __LINE__, buf);
235 void *brealloc (void *buf, size_t size)
238 buf = sm_realloc(__FILE__, __LINE__, buf, size);
240 buf = realloc(buf, size);
244 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
250 void *bcalloc(size_t size1, size_t size2)
254 buf = calloc(size1, size2);
257 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
262 /* Code now in src/lib/bsnprintf.c */
263 #ifndef USE_BSNPRINTF
269 int bsnprintf(char *str, int32_t size, const char *fmt, ...)
274 va_start(arg_ptr, fmt);
275 len = bvsnprintf(str, size, fmt, arg_ptr);
281 * Implement vsnprintf()
283 int bvsnprintf(char *str, int32_t size, const char *format, va_list ap)
285 #ifdef HAVE_VSNPRINTF
287 len = vsnprintf(str, size, format, ap);
295 buflen = size > BIG_BUF ? size : BIG_BUF;
296 buf = get_memory(buflen);
297 len = vsprintf(buf, format, ap);
299 Emsg0(M_ABORT, 0, _("Buffer overflow.\n"));
301 memcpy(str, buf, len);
302 str[len] = 0; /* len excludes the null */
307 #endif /* USE_BSNPRINTF */
309 #ifndef HAVE_LOCALTIME_R
311 struct tm *localtime_r(const time_t *timep, struct tm *tm)
313 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
317 ltm = localtime(timep);
319 memcpy(tm, ltm, sizeof(struct tm));
322 return ltm ? tm : NULL;
324 #endif /* HAVE_LOCALTIME_R */
326 #ifndef HAVE_READDIR_R
330 int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
332 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
338 ndir = readdir(dirp);
341 memcpy(entry, ndir, sizeof(struct dirent));
342 strcpy(entry->d_name, ndir->d_name);
352 #endif /* HAVE_READDIR_R */
355 int b_strerror(int errnum, char *buf, size_t bufsiz)
357 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
363 msg = strerror(errnum);
365 msg = _("Bad errno");
368 bstrncpy(buf, msg, bufsiz);
374 * These are mutex routines that do error checking
375 * for deadlock and such. Normally not turned on.
378 void _p(char *file, int line, pthread_mutex_t *m)
381 if ((errstat = pthread_mutex_trylock(m))) {
382 e_msg(file, line, M_ERROR, 0, _("Possible mutex deadlock.\n"));
383 /* We didn't get the lock, so do it definitely now */
384 if ((errstat=pthread_mutex_lock(m))) {
386 e_msg(file, line, M_ABORT, 0, _("Mutex lock failure. ERR=%s\n"),
387 be.bstrerror(errstat));
389 e_msg(file, line, M_ERROR, 0, _("Possible mutex deadlock resolved.\n"));
395 void _v(char *file, int line, pthread_mutex_t *m)
399 /* Note, this trylock *should* fail if the mutex is locked */
400 if ((errstat=pthread_mutex_trylock(m)) == 0) {
402 e_msg(file, line, M_ERROR, 0, _("Mutex unlock not locked. ERR=%s\n"),
403 be.bstrerror(errstat));
405 if ((errstat=pthread_mutex_unlock(m))) {
407 e_msg(file, line, M_ABORT, 0, _("Mutex unlock failure. ERR=%s\n"),
408 be.bstrerror(errstat));
414 void _p(pthread_mutex_t *m)
417 if ((errstat=pthread_mutex_lock(m))) {
419 e_msg(__FILE__, __LINE__, M_ABORT, 0, _("Mutex lock failure. ERR=%s\n"),
420 be.bstrerror(errstat));
424 void _v(pthread_mutex_t *m)
427 if ((errstat=pthread_mutex_unlock(m))) {
429 e_msg(__FILE__, __LINE__, M_ABORT, 0, _("Mutex unlock failure. ERR=%s\n"),
430 be.bstrerror(errstat));
434 #endif /* DEBUG_MUTEX */
437 /* These routines are not normally turned on */
439 void b_memset(const char *file, int line, void *mem, int val, size_t num)
441 /* Testing for 2000 byte zero at beginning of Volume block */
442 if (num > 1900 && num < 3000) {
443 Pmsg3(000, _("Memset for %d bytes at %s:%d\n"), (int)num, file, line);
445 memset(mem, val, num);
449 #if !defined(HAVE_WIN32)
450 static int del_pid_file_ok = FALSE;
454 * Create a standard "Unix" pid file.
456 void create_pid_file(char *dir, const char *progname, int port)
458 #if !defined(HAVE_WIN32)
462 POOLMEM *fname = get_pool_memory(PM_FNAME);
465 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
466 if (stat(fname, &statp) == 0) {
467 /* File exists, see what we have */
469 if ((pidfd = open(fname, O_RDONLY|O_BINARY, 0)) < 0 ||
470 read(pidfd, &pidbuf, sizeof(pidbuf)) < 0 ||
471 sscanf(pidbuf, "%d", &oldpid) != 1) {
472 Emsg2(M_ERROR_TERM, 0, _("Cannot open pid file. %s ERR=%s\n"), fname, strerror(errno));
474 /* Some OSes (IRIX) don't bother to clean out the old pid files after a crash, and
475 * since they use a deterministic algorithm for assigning PIDs, we can have
476 * pid conflicts with the old PID file after a reboot.
477 * The intent the following code is to check if the oldpid read from the pid
478 * file is the same as the currently executing process's pid,
479 * and if oldpid == getpid(), skip the attempt to
480 * kill(oldpid,0), since the attempt is guaranteed to succeed,
481 * but the success won't actually mean that there is an
482 * another Bacula process already running.
483 * For more details see bug #797.
485 if ((oldpid != (int)getpid()) && (kill(oldpid, 0) != -1 || errno != ESRCH)) {
486 Emsg3(M_ERROR_TERM, 0, _("%s is already running. pid=%d\nCheck file %s\n"),
487 progname, oldpid, fname);
489 /* He is not alive, so take over file ownership */
490 unlink(fname); /* remove stale pid file */
492 /* Create new pid file */
493 if ((pidfd = open(fname, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0640)) >= 0) {
494 len = sprintf(pidbuf, "%d\n", (int)getpid());
495 write(pidfd, pidbuf, len);
497 del_pid_file_ok = TRUE; /* we created it so we can delete it */
499 Emsg2(M_ERROR_TERM, 0, _("Could not open pid file. %s ERR=%s\n"), fname, strerror(errno));
501 free_pool_memory(fname);
507 * Delete the pid file if we created it
509 int delete_pid_file(char *dir, const char *progname, int port)
511 #if !defined(HAVE_WIN32)
512 POOLMEM *fname = get_pool_memory(PM_FNAME);
514 if (!del_pid_file_ok) {
515 free_pool_memory(fname);
518 del_pid_file_ok = FALSE;
519 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
521 free_pool_memory(fname);
529 uint64_t last_jobs_addr;
530 uint64_t reserved[20];
533 static struct s_state_hdr state_hdr = {
540 * Open and read the state file for the daemon
542 void read_state_file(char *dir, const char *progname, int port)
547 POOLMEM *fname = get_pool_memory(PM_FNAME);
548 struct s_state_hdr hdr;
549 int hdr_size = sizeof(hdr);
551 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
552 /* If file exists, see what we have */
553 // Dmsg1(10, "O_BINARY=%d\n", O_BINARY);
554 if ((sfd = open(fname, O_RDONLY|O_BINARY)) < 0) {
555 Dmsg3(010, "Could not open state file. sfd=%d size=%d: ERR=%s\n",
556 sfd, sizeof(hdr), strerror(errno));
559 if ((stat=read(sfd, &hdr, hdr_size)) != hdr_size) {
560 Dmsg4(010, "Could not read state file. sfd=%d stat=%d size=%d: ERR=%s\n",
561 sfd, (int)stat, hdr_size, strerror(errno));
564 if (hdr.version != state_hdr.version) {
565 Dmsg2(010, "Bad hdr version. Wanted %d got %d\n",
566 state_hdr.version, hdr.version);
570 if (strcmp(hdr.id, state_hdr.id) != 0) {
571 Dmsg0(000, "State file header id invalid.\n");
574 // Dmsg1(010, "Read header of %d bytes.\n", sizeof(hdr));
575 if (!read_last_jobs_list(sfd, hdr.last_jobs_addr)) {
586 free_pool_memory(fname);
590 * Write the state file
592 void write_state_file(char *dir, const char *progname, int port)
596 POOLMEM *fname = get_pool_memory(PM_FNAME);
598 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
599 /* Create new state file */
601 if ((sfd = open(fname, O_CREAT|O_WRONLY|O_BINARY, 0640)) < 0) {
603 Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, be.bstrerror());
604 Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, be.bstrerror());
607 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
609 Dmsg1(000, "Write hdr error: ERR=%s\n", be.bstrerror());
612 // Dmsg1(010, "Wrote header of %d bytes\n", sizeof(state_hdr));
613 state_hdr.last_jobs_addr = sizeof(state_hdr);
614 state_hdr.reserved[0] = write_last_jobs_list(sfd, state_hdr.last_jobs_addr);
615 // Dmsg1(010, "write last job end = %d\n", (int)state_hdr.reserved[0]);
616 if (lseek(sfd, 0, SEEK_SET) < 0) {
618 Dmsg1(000, "lseek error: ERR=%s\n", be.bstrerror());
621 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
623 Pmsg1(000, _("Write final hdr error: ERR=%s\n"), be.bstrerror());
627 // Dmsg1(010, "rewrote header = %d\n", sizeof(state_hdr));
635 free_pool_memory(fname);
640 * Drop to privilege new userid and new gid if non-NULL
642 void drop(char *uname, char *gname)
644 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
645 struct passwd *passw = NULL;
646 struct group *group = NULL;
651 Dmsg2(900, "uname=%s gname=%s\n", uname?uname:"NONE", gname?gname:"NONE");
652 if (!uname && !gname) {
653 return; /* Nothing to do */
657 if ((passw = getpwnam(uname)) == NULL) {
659 Emsg2(M_ERROR_TERM, 0, _("Could not find userid=%s: ERR=%s\n"), uname,
663 if ((passw = getpwuid(getuid())) == NULL) {
665 Emsg1(M_ERROR_TERM, 0, _("Could not find password entry. ERR=%s\n"),
668 uname = passw->pw_name;
671 /* Any OS uname pointer may get overwritten, so save name, uid, and gid */
672 bstrncpy(username, uname, sizeof(username));
676 if ((group = getgrnam(gname)) == NULL) {
678 Emsg2(M_ERROR_TERM, 0, _("Could not find group=%s: ERR=%s\n"), gname,
683 if (initgroups(username, gid)) {
686 Emsg3(M_ERROR_TERM, 0, _("Could not initgroups for group=%s, userid=%s: ERR=%s\n"),
687 gname, username, be.bstrerror());
689 Emsg2(M_ERROR_TERM, 0, _("Could not initgroups for userid=%s: ERR=%s\n"),
690 username, be.bstrerror());
696 Emsg2(M_ERROR_TERM, 0, _("Could not set group=%s: ERR=%s\n"), gname,
702 Emsg1(M_ERROR_TERM, 0, _("Could not set specified userid: %s\n"), username);
708 /* BSDI does not have this. This is a *poor* simulation */
711 strtoll(const char *ptr, char **endptr, int base)
713 return (long long int)strtod(ptr, endptr);
718 * Bacula's implementation of fgets(). The difference is that it handles
719 * being interrupted by a signal (e.g. a SIGCHLD).
722 char *bfgets(char *s, int size, FILE *fd)
727 for (int i=0; i < size-1; i++) {
731 } while (ch == EOF && ferror(fd) && (errno == EINTR || errno == EAGAIN));
741 if (ch == '\r') { /* Support for Mac/Windows file format */
743 if (ch != '\n') { /* Mac (\r only) */
744 (void)ungetc(ch, fd); /* Push next character back to fd */
757 * Make a "unique" filename. It is important that if
758 * called again with the same "what" that the result
759 * will be identical. This allows us to use the file
760 * without saving its name, and re-generate the name
761 * so that it can be deleted.
763 void make_unique_filename(POOLMEM **name, int Id, char *what)
765 Mmsg(name, "%s/%s.%s.%d.tmp", working_directory, my_name, what, Id);
768 char *escape_filename(const char *file_path)
770 if (file_path == NULL || strpbrk(file_path, "\"\\") == NULL) {
774 char *escaped_path = (char *)bmalloc(2 * (strlen(file_path) + 1));
775 char *cur_char = escaped_path;
778 if (*file_path == '\\' || *file_path == '"') {
782 *cur_char++ = *file_path++;