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 static pthread_mutex_t timer_mutex = PTHREAD_MUTEX_INITIALIZER;
42 static pthread_cond_t timer = PTHREAD_COND_INITIALIZER;
45 * This routine will sleep (sec, microsec). Note, however, that if a
46 * signal occurs, it will return early. It is up to the caller
47 * to recall this routine if he/she REALLY wants to sleep the
50 int bmicrosleep(int32_t sec, int32_t usec)
52 struct timespec timeout;
58 timeout.tv_nsec = usec * 1000;
61 stat = nanosleep(&timeout, NULL);
62 if (!(stat < 0 && errno == ENOSYS)) {
65 /* If we reach here it is because nanosleep is not supported by the OS */
68 /* Do it the old way */
69 gettimeofday(&tv, &tz);
70 timeout.tv_nsec += tv.tv_usec * 1000;
71 timeout.tv_sec += tv.tv_sec;
72 while (timeout.tv_nsec >= 1000000000) {
73 timeout.tv_nsec -= 1000000000;
77 Dmsg2(200, "pthread_cond_timedwait sec=%lld usec=%d\n", sec, usec);
78 /* Note, this unlocks mutex during the sleep */
80 stat = pthread_cond_timedwait(&timer, &timer_mutex, &timeout);
83 Dmsg2(200, "pthread_cond_timedwait stat=%d ERR=%s\n", stat,
91 * Guarantee that the string is properly terminated */
92 char *bstrncpy(char *dest, const char *src, int maxlen)
94 strncpy(dest, src, maxlen-1);
100 * Guarantee that the string is properly terminated */
101 char *bstrncpy(char *dest, POOL_MEM &src, int maxlen)
103 strncpy(dest, src.c_str(), maxlen-1);
109 char *bstrncat(char *dest, const char *src, int maxlen)
111 int len = strlen(dest);
112 if (len < maxlen-1) {
113 strncpy(dest+len, src, maxlen-len-1);
119 char *bstrncat(char *dest, POOL_MEM &src, int maxlen)
122 int len = strlen(dest);
123 if (len < maxlen-1) {
124 strncpy(dest+len, src.c_str(), maxlen-len-1);
131 * Allows one or both pointers to be NULL
133 bool bstrcmp(const char *s1, const char *s2)
135 if (s1 == s2) return true;
136 if (s1 == NULL || s2 == NULL) return false;
137 return strcmp(s1, s2) == 0;
141 * Get character length of UTF-8 string
144 * U-00000000 - U-0000007F: 0xxxxxxx
145 * U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
146 * U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
147 * U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
148 * U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
149 * U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
151 int cstrlen(const char *str)
153 uint8_t *p = (uint8_t *)str;
156 if ((*p & 0xC0) != 0xC0) {
161 if ((*p & 0xD0) == 0xC0) {
166 if ((*p & 0xF0) == 0xD0) {
171 if ((*p & 0xF8) == 0xF0) {
176 if ((*p & 0xFC) == 0xF8) {
181 if ((*p & 0xFE) == 0xFC) {
186 p++; /* Shouln't get here but must advance */
194 void *bmalloc(size_t size)
199 buf = sm_malloc(file, line, size);
205 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
211 void *b_malloc(const char *file, int line, size_t size)
216 buf = sm_malloc(file, line, size);
222 e_msg(file, line, M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
228 void bfree(void *buf)
231 sm_free(__FILE__, __LINE__, buf);
237 void *brealloc (void *buf, size_t size)
240 buf = sm_realloc(__FILE__, __LINE__, buf, size);
242 buf = realloc(buf, size);
246 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
252 void *bcalloc(size_t size1, size_t size2)
256 buf = calloc(size1, size2);
259 Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.bstrerror());
264 /* Code now in src/lib/bsnprintf.c */
265 #ifndef USE_BSNPRINTF
271 int bsnprintf(char *str, int32_t size, const char *fmt, ...)
276 va_start(arg_ptr, fmt);
277 len = bvsnprintf(str, size, fmt, arg_ptr);
283 * Implement vsnprintf()
285 int bvsnprintf(char *str, int32_t size, const char *format, va_list ap)
287 #ifdef HAVE_VSNPRINTF
289 len = vsnprintf(str, size, format, ap);
297 buflen = size > BIG_BUF ? size : BIG_BUF;
298 buf = get_memory(buflen);
299 len = vsprintf(buf, format, ap);
301 Emsg0(M_ABORT, 0, _("Buffer overflow.\n"));
303 memcpy(str, buf, len);
304 str[len] = 0; /* len excludes the null */
309 #endif /* USE_BSNPRINTF */
311 #ifndef HAVE_LOCALTIME_R
313 struct tm *localtime_r(const time_t *timep, struct tm *tm)
315 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
319 ltm = localtime(timep);
321 memcpy(tm, ltm, sizeof(struct tm));
324 return ltm ? tm : NULL;
326 #endif /* HAVE_LOCALTIME_R */
328 #ifndef HAVE_READDIR_R
332 int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
334 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
340 ndir = readdir(dirp);
343 memcpy(entry, ndir, sizeof(struct dirent));
344 strcpy(entry->d_name, ndir->d_name);
354 #endif /* HAVE_READDIR_R */
357 int b_strerror(int errnum, char *buf, size_t bufsiz)
359 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
365 msg = strerror(errnum);
367 msg = _("Bad errno");
370 bstrncpy(buf, msg, bufsiz);
376 /* These routines are not normally turned on */
378 void b_memset(const char *file, int line, void *mem, int val, size_t num)
380 /* Testing for 2000 byte zero at beginning of Volume block */
381 if (num > 1900 && num < 3000) {
382 Pmsg3(000, _("Memset for %d bytes at %s:%d\n"), (int)num, file, line);
384 memset(mem, val, num);
388 #if !defined(HAVE_WIN32)
389 static int del_pid_file_ok = FALSE;
393 * Create a standard "Unix" pid file.
395 void create_pid_file(char *dir, const char *progname, int port)
397 #if !defined(HAVE_WIN32)
401 POOLMEM *fname = get_pool_memory(PM_FNAME);
404 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
405 if (stat(fname, &statp) == 0) {
406 /* File exists, see what we have */
408 if ((pidfd = open(fname, O_RDONLY|O_BINARY, 0)) < 0 ||
409 read(pidfd, &pidbuf, sizeof(pidbuf)) < 0 ||
410 sscanf(pidbuf, "%d", &oldpid) != 1) {
412 Emsg2(M_ERROR_TERM, 0, _("Cannot open pid file. %s ERR=%s\n"), fname,
415 /* Some OSes (IRIX) don't bother to clean out the old pid files after a crash, and
416 * since they use a deterministic algorithm for assigning PIDs, we can have
417 * pid conflicts with the old PID file after a reboot.
418 * The intent the following code is to check if the oldpid read from the pid
419 * file is the same as the currently executing process's pid,
420 * and if oldpid == getpid(), skip the attempt to
421 * kill(oldpid,0), since the attempt is guaranteed to succeed,
422 * but the success won't actually mean that there is an
423 * another Bacula process already running.
424 * For more details see bug #797.
426 if ((oldpid != (int)getpid()) && (kill(oldpid, 0) != -1 || errno != ESRCH)) {
427 Emsg3(M_ERROR_TERM, 0, _("%s is already running. pid=%d\nCheck file %s\n"),
428 progname, oldpid, fname);
430 /* He is not alive, so take over file ownership */
431 unlink(fname); /* remove stale pid file */
433 /* Create new pid file */
434 if ((pidfd = open(fname, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0640)) >= 0) {
435 len = sprintf(pidbuf, "%d\n", (int)getpid());
436 write(pidfd, pidbuf, len);
438 del_pid_file_ok = TRUE; /* we created it so we can delete it */
441 Emsg2(M_ERROR_TERM, 0, _("Could not open pid file. %s ERR=%s\n"), fname,
444 free_pool_memory(fname);
450 * Delete the pid file if we created it
452 int delete_pid_file(char *dir, const char *progname, int port)
454 #if !defined(HAVE_WIN32)
455 POOLMEM *fname = get_pool_memory(PM_FNAME);
457 if (!del_pid_file_ok) {
458 free_pool_memory(fname);
461 del_pid_file_ok = FALSE;
462 Mmsg(&fname, "%s/%s.%d.pid", dir, progname, port);
464 free_pool_memory(fname);
472 uint64_t last_jobs_addr;
473 uint64_t reserved[20];
476 static struct s_state_hdr state_hdr = {
483 * Open and read the state file for the daemon
485 void read_state_file(char *dir, const char *progname, int port)
490 POOLMEM *fname = get_pool_memory(PM_FNAME);
491 struct s_state_hdr hdr;
492 int hdr_size = sizeof(hdr);
494 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
495 /* If file exists, see what we have */
496 // Dmsg1(10, "O_BINARY=%d\n", O_BINARY);
497 if ((sfd = open(fname, O_RDONLY|O_BINARY)) < 0) {
499 Dmsg3(010, "Could not open state file. sfd=%d size=%d: ERR=%s\n",
500 sfd, sizeof(hdr), be.bstrerror());
503 if ((stat=read(sfd, &hdr, hdr_size)) != hdr_size) {
505 Dmsg4(010, "Could not read state file. sfd=%d stat=%d size=%d: ERR=%s\n",
506 sfd, (int)stat, hdr_size, be.bstrerror());
509 if (hdr.version != state_hdr.version) {
510 Dmsg2(010, "Bad hdr version. Wanted %d got %d\n",
511 state_hdr.version, hdr.version);
515 if (strcmp(hdr.id, state_hdr.id) != 0) {
516 Dmsg0(000, "State file header id invalid.\n");
519 // Dmsg1(010, "Read header of %d bytes.\n", sizeof(hdr));
520 if (!read_last_jobs_list(sfd, hdr.last_jobs_addr)) {
531 free_pool_memory(fname);
535 * Write the state file
537 void write_state_file(char *dir, const char *progname, int port)
541 POOLMEM *fname = get_pool_memory(PM_FNAME);
543 Mmsg(&fname, "%s/%s.%d.state", dir, progname, port);
544 /* Create new state file */
546 if ((sfd = open(fname, O_CREAT|O_WRONLY|O_BINARY, 0640)) < 0) {
548 Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, be.bstrerror());
549 Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, be.bstrerror());
552 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
554 Dmsg1(000, "Write hdr error: ERR=%s\n", be.bstrerror());
557 // Dmsg1(010, "Wrote header of %d bytes\n", sizeof(state_hdr));
558 state_hdr.last_jobs_addr = sizeof(state_hdr);
559 state_hdr.reserved[0] = write_last_jobs_list(sfd, state_hdr.last_jobs_addr);
560 // Dmsg1(010, "write last job end = %d\n", (int)state_hdr.reserved[0]);
561 if (lseek(sfd, 0, SEEK_SET) < 0) {
563 Dmsg1(000, "lseek error: ERR=%s\n", be.bstrerror());
566 if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) {
568 Pmsg1(000, _("Write final hdr error: ERR=%s\n"), be.bstrerror());
572 // Dmsg1(010, "rewrote header = %d\n", sizeof(state_hdr));
580 free_pool_memory(fname);
584 /* BSDI does not have this. This is a *poor* simulation */
587 strtoll(const char *ptr, char **endptr, int base)
589 return (long long int)strtod(ptr, endptr);
594 * Bacula's implementation of fgets(). The difference is that it handles
595 * being interrupted by a signal (e.g. a SIGCHLD).
598 char *bfgets(char *s, int size, FILE *fd)
603 for (int i=0; i < size-1; i++) {
607 } while (ch == EOF && ferror(fd) && (errno == EINTR || errno == EAGAIN));
617 if (ch == '\r') { /* Support for Mac/Windows file format */
619 if (ch != '\n') { /* Mac (\r only) */
620 (void)ungetc(ch, fd); /* Push next character back to fd */
633 * Make a "unique" filename. It is important that if
634 * called again with the same "what" that the result
635 * will be identical. This allows us to use the file
636 * without saving its name, and re-generate the name
637 * so that it can be deleted.
639 void make_unique_filename(POOLMEM **name, int Id, char *what)
641 Mmsg(name, "%s/%s.%s.%d.tmp", working_directory, my_name, what, Id);
644 char *escape_filename(const char *file_path)
646 if (file_path == NULL || strpbrk(file_path, "\"\\") == NULL) {
650 char *escaped_path = (char *)bmalloc(2 * (strlen(file_path) + 1));
651 char *cur_char = escaped_path;
654 if (*file_path == '\\' || *file_path == '"') {
658 *cur_char++ = *file_path++;