2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 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 and included
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 Kern Sibbald.
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
41 extern "C" int initgroups(const char *,int);
45 static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
46 static pthread_cond_t timer = PTHREAD_COND_INITIALIZER;
49 * This routine will sleep (sec, microsec). Note, however, that if a
50 * signal occurs, it will return early. It is up to the caller
51 * to recall this routine if he/she REALLY wants to sleep the
54 int bmicrosleep(int32_t sec, int32_t usec)
56 struct timespec timeout;
62 timeout.tv_nsec = usec * 1000;
65 stat = nanosleep(&timeout, NULL);
66 if (!(stat < 0 && errno == ENOSYS)) {
69 /* If we reach here it is because nanosleep is not supported by the OS */
72 /* Do it the old way */
73 gettimeofday(&tv, &tz);
74 timeout.tv_nsec += tv.tv_usec * 1000;
75 timeout.tv_sec += tv.tv_sec;
76 while (timeout.tv_nsec >= 1000000000) {
77 timeout.tv_nsec -= 1000000000;
81 Dmsg2(200, "pthread_cond_timedwait sec=%lld usec=%d\n", sec, usec);
82 /* Note, this unlocks mutex during the sleep */
84 stat = pthread_cond_timedwait(&timer, &timer_mutex, &timeout);
87 Dmsg2(200, "pthread_cond_timedwait stat=%d ERR=%s\n", stat,
95 * Guarantee that the string is properly terminated */
96 char *bstrncpy(char *dest, const char *src, int maxlen)
98 strncpy(dest, src, maxlen-1);
104 * Guarantee that the string is properly terminated */
105 char *bstrncpy(char *dest, POOL_MEM &src, int maxlen)
107 strncpy(dest, src.c_str(), maxlen-1);
113 char *bstrncat(char *dest, const char *src, int maxlen)
115 strncat(dest, src, maxlen-1);
120 char *bstrncat(char *dest, POOL_MEM &src, int maxlen)
122 strncat(dest, src.c_str(), maxlen-1);
128 * Allows one or both pointers to be NULL
130 bool bstrcmp(const char *s1, const char *s2)
132 if (s1 == s2) return true;
133 if (s1 == NULL || s2 == NULL) return false;
134 return strcmp(s1, s2) == 0;
138 * Get character length of UTF-8 string
141 * U-00000000 - U-0000007F: 0xxxxxxx
142 * U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
143 * U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
144 * U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
145 * U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
146 * U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
148 int cstrlen(const char *str)
150 uint8_t *p = (uint8_t *)str;
153 if ((*p & 0xC0) != 0xC0) {
158 if ((*p & 0xD0) == 0xC0) {
163 if ((*p & 0xF0) == 0xD0) {
168 if ((*p & 0xF8) == 0xF0) {
173 if ((*p & 0xFC) == 0xF8) {
178 if ((*p & 0xFE) == 0xFC) {
183 p++; /* Shouln't get here but must advance */
191 void *bmalloc(size_t size)
196 buf = sm_malloc(file, line, size);
202 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
208 void *b_malloc(const char *file, int line, size_t size)
213 buf = sm_malloc(file, line, size);
219 e_msg(file, line, M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
225 void bfree(void *buf)
228 sm_free(__FILE__, __LINE__, buf);
234 void *brealloc (void *buf, size_t size)
237 buf = sm_realloc(__FILE__, __LINE__, buf, size);
239 buf = realloc(buf, size);
243 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
249 void *bcalloc(size_t size1, size_t size2)
253 buf = calloc(size1, size2);
256 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
261 /* Code now in src/lib/bsnprintf.c */
262 #ifndef USE_BSNPRINTF
268 int bsnprintf(char *str, int32_t size, const char *fmt, ...)
273 va_start(arg_ptr, fmt);
274 len = bvsnprintf(str, size, fmt, arg_ptr);
280 * Implement vsnprintf()
282 int bvsnprintf(char *str, int32_t size, const char *format, va_list ap)
284 #ifdef HAVE_VSNPRINTF
286 len = vsnprintf(str, size, format, ap);
294 buflen = size > BIG_BUF ? size : BIG_BUF;
295 buf = get_memory(buflen);
296 len = vsprintf(buf, format, ap);
298 Emsg0(M_ABORT, 0, _("Buffer overflow.\n"));
300 memcpy(str, buf, len);
301 str[len] = 0; /* len excludes the null */
306 #endif /* USE_BSNPRINTF */
308 #ifndef HAVE_LOCALTIME_R
310 struct tm *localtime_r(const time_t *timep, struct tm *tm)
312 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
316 ltm = localtime(timep);
318 memcpy(tm, ltm, sizeof(struct tm));
321 return ltm ? tm : NULL;
323 #endif /* HAVE_LOCALTIME_R */
325 #ifndef HAVE_READDIR_R
329 int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
331 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
337 ndir = readdir(dirp);
340 memcpy(entry, ndir, sizeof(struct dirent));
341 strcpy(entry->d_name, ndir->d_name);
351 #endif /* HAVE_READDIR_R */
354 int b_strerror(int errnum, char *buf, size_t bufsiz)
356 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
362 msg = strerror(errnum);
364 msg = _("Bad errno");
367 bstrncpy(buf, msg, bufsiz);
373 /* These routines are not normally turned on */
375 void b_memset(const char *file, int line, void *mem, int val, size_t num)
377 /* Testing for 2000 byte zero at beginning of Volume block */
378 if (num > 1900 && num < 3000) {
379 Pmsg3(000, _("Memset for %d bytes at %s:%d\n"), (int)num, file, line);
381 memset(mem, val, num);
385 #if !defined(HAVE_WIN32)
386 static int del_pid_file_ok = FALSE;
390 * Create a standard "Unix" pid file.
392 void create_pid_file(char *dir, const char *progname, int port)
394 #if !defined(HAVE_WIN32)
398 POOLMEM *fname = get_pool_memory(PM_FNAME);
401 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
402 if (stat(fname, &statp) == 0) {
403 /* File exists, see what we have */
405 if ((pidfd = open(fname, O_RDONLY|O_BINARY, 0)) < 0 ||
406 read(pidfd, &pidbuf, sizeof(pidbuf)) < 0 ||
407 sscanf(pidbuf, "%d", &oldpid) != 1) {
409 Emsg2(M_ERROR_TERM, 0, _("Cannot open pid file. %s ERR=%s\n"), fname,
412 /* Some OSes (IRIX) don't bother to clean out the old pid files after a crash, and
413 * since they use a deterministic algorithm for assigning PIDs, we can have
414 * pid conflicts with the old PID file after a reboot.
415 * The intent the following code is to check if the oldpid read from the pid
416 * file is the same as the currently executing process's pid,
417 * and if oldpid == getpid(), skip the attempt to
418 * kill(oldpid,0), since the attempt is guaranteed to succeed,
419 * but the success won't actually mean that there is an
420 * another Bacula process already running.
421 * For more details see bug #797.
423 if ((oldpid != (int)getpid()) && (kill(oldpid, 0) != -1 || errno != ESRCH)) {
424 Emsg3(M_ERROR_TERM, 0, _("%s is already running. pid=%d\nCheck file %s\n"),
425 progname, oldpid, fname);
427 /* He is not alive, so take over file ownership */
428 unlink(fname); /* remove stale pid file */
430 /* Create new pid file */
431 if ((pidfd = open(fname, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0640)) >= 0) {
432 len = sprintf(pidbuf, "%d\n", (int)getpid());
433 write(pidfd, pidbuf, len);
435 del_pid_file_ok = TRUE; /* we created it so we can delete it */
438 Emsg2(M_ERROR_TERM, 0, _("Could not open pid file. %s ERR=%s\n"), fname,
441 free_pool_memory(fname);
447 * Delete the pid file if we created it
449 int delete_pid_file(char *dir, const char *progname, int port)
451 #if !defined(HAVE_WIN32)
452 POOLMEM *fname = get_pool_memory(PM_FNAME);
454 if (!del_pid_file_ok) {
455 free_pool_memory(fname);
458 del_pid_file_ok = FALSE;
459 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
461 free_pool_memory(fname);
469 uint64_t last_jobs_addr;
470 uint64_t reserved[20];
473 static struct s_state_hdr state_hdr = {
480 * Open and read the state file for the daemon
482 void read_state_file(char *dir, const char *progname, int port)
487 POOLMEM *fname = get_pool_memory(PM_FNAME);
488 struct s_state_hdr hdr;
489 int hdr_size = sizeof(hdr);
491 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
492 /* If file exists, see what we have */
493 // Dmsg1(10, "O_BINARY=%d\n", O_BINARY);
494 if ((sfd = open(fname, O_RDONLY|O_BINARY)) < 0) {
496 Dmsg3(010, "Could not open state file. sfd=%d size=%d: ERR=%s\n",
497 sfd, sizeof(hdr), be.bstrerror());
500 if ((stat=read(sfd, &hdr, hdr_size)) != hdr_size) {
502 Dmsg4(010, "Could not read state file. sfd=%d stat=%d size=%d: ERR=%s\n",
503 sfd, (int)stat, hdr_size, be.bstrerror());
506 if (hdr.version != state_hdr.version) {
507 Dmsg2(010, "Bad hdr version. Wanted %d got %d\n",
508 state_hdr.version, hdr.version);
512 if (strcmp(hdr.id, state_hdr.id) != 0) {
513 Dmsg0(000, "State file header id invalid.\n");
516 // Dmsg1(010, "Read header of %d bytes.\n", sizeof(hdr));
517 if (!read_last_jobs_list(sfd, hdr.last_jobs_addr)) {
528 free_pool_memory(fname);
532 * Write the state file
534 void write_state_file(char *dir, const char *progname, int port)
538 POOLMEM *fname = get_pool_memory(PM_FNAME);
540 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
541 /* Create new state file */
543 if ((sfd = open(fname, O_CREAT|O_WRONLY|O_BINARY, 0640)) < 0) {
545 Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, be.bstrerror());
546 Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, be.bstrerror());
549 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
551 Dmsg1(000, "Write hdr error: ERR=%s\n", be.bstrerror());
554 // Dmsg1(010, "Wrote header of %d bytes\n", sizeof(state_hdr));
555 state_hdr.last_jobs_addr = sizeof(state_hdr);
556 state_hdr.reserved[0] = write_last_jobs_list(sfd, state_hdr.last_jobs_addr);
557 // Dmsg1(010, "write last job end = %d\n", (int)state_hdr.reserved[0]);
558 if (lseek(sfd, 0, SEEK_SET) < 0) {
560 Dmsg1(000, "lseek error: ERR=%s\n", be.bstrerror());
563 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
565 Pmsg1(000, _("Write final hdr error: ERR=%s\n"), be.bstrerror());
569 // Dmsg1(010, "rewrote header = %d\n", sizeof(state_hdr));
577 free_pool_memory(fname);
582 * Drop to privilege new userid and new gid if non-NULL
584 void drop(char *uname, char *gname)
586 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
587 struct passwd *passw = NULL;
588 struct group *group = NULL;
593 Dmsg2(900, "uname=%s gname=%s\n", uname?uname:"NONE", gname?gname:"NONE");
594 if (!uname && !gname) {
595 return; /* Nothing to do */
599 if ((passw = getpwnam(uname)) == NULL) {
601 Emsg2(M_ERROR_TERM, 0, _("Could not find userid=%s: ERR=%s\n"), uname,
605 if ((passw = getpwuid(getuid())) == NULL) {
607 Emsg1(M_ERROR_TERM, 0, _("Could not find password entry. ERR=%s\n"),
610 uname = passw->pw_name;
613 /* Any OS uname pointer may get overwritten, so save name, uid, and gid */
614 bstrncpy(username, uname, sizeof(username));
618 if ((group = getgrnam(gname)) == NULL) {
620 Emsg2(M_ERROR_TERM, 0, _("Could not find group=%s: ERR=%s\n"), gname,
625 if (initgroups(username, gid)) {
628 Emsg3(M_ERROR_TERM, 0, _("Could not initgroups for group=%s, userid=%s: ERR=%s\n"),
629 gname, username, be.bstrerror());
631 Emsg2(M_ERROR_TERM, 0, _("Could not initgroups for userid=%s: ERR=%s\n"),
632 username, be.bstrerror());
638 Emsg2(M_ERROR_TERM, 0, _("Could not set group=%s: ERR=%s\n"), gname,
644 Emsg1(M_ERROR_TERM, 0, _("Could not set specified userid: %s\n"), username);
650 /* BSDI does not have this. This is a *poor* simulation */
653 strtoll(const char *ptr, char **endptr, int base)
655 return (long long int)strtod(ptr, endptr);
660 * Bacula's implementation of fgets(). The difference is that it handles
661 * being interrupted by a signal (e.g. a SIGCHLD).
664 char *bfgets(char *s, int size, FILE *fd)
669 for (int i=0; i < size-1; i++) {
673 } while (ch == EOF && ferror(fd) && (errno == EINTR || errno == EAGAIN));
683 if (ch == '\r') { /* Support for Mac/Windows file format */
685 if (ch != '\n') { /* Mac (\r only) */
686 (void)ungetc(ch, fd); /* Push next character back to fd */
699 * Make a "unique" filename. It is important that if
700 * called again with the same "what" that the result
701 * will be identical. This allows us to use the file
702 * without saving its name, and re-generate the name
703 * so that it can be deleted.
705 void make_unique_filename(POOLMEM **name, int Id, char *what)
707 Mmsg(name, "%s/%s.%s.%d.tmp", working_directory, my_name, what, Id);
710 char *escape_filename(const char *file_path)
712 if (file_path == NULL || strpbrk(file_path, "\"\\") == NULL) {
716 char *escaped_path = (char *)bmalloc(2 * (strlen(file_path) + 1));
717 char *cur_char = escaped_path;
720 if (*file_path == '\\' || *file_path == '"') {
724 *cur_char++ = *file_path++;