X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fbsys.c;h=548ab97b2a6fbdb4ba562230f641f709ada893cd;hb=3f8a3a045ea058657030f588a10f786449d00e0d;hp=be6582b3559589082731b50681448f4645ed953c;hpb=294e70bf254c14cc68094c7258519f229e26e0d0;p=bacula%2Fbacula diff --git a/bacula/src/lib/bsys.c b/bacula/src/lib/bsys.c index be6582b355..548ab97b2a 100644 --- a/bacula/src/lib/bsys.c +++ b/bacula/src/lib/bsys.c @@ -8,7 +8,7 @@ * Version $Id$ */ /* - Copyright (C) 2000-2005 Kern Sibbald + Copyright (C) 2000-2006 Kern Sibbald This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -113,6 +113,16 @@ char *bstrncat(char *dest, POOL_MEM &src, int maxlen) return dest; } +/* + * Allows one or both pointers to be NULL + */ +bool bstrcmp(const char *s1, const char *s2) +{ + if (s1 == s2) return true; + if (s1 == NULL || s2 == NULL) return false; + return strcmp(s1, s2) == 0; +} + /* * Get character length of UTF-8 string * @@ -173,7 +183,8 @@ void *bmalloc(size_t size) buf = malloc(size); if (buf == NULL) { - Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), strerror(errno)); + berrno be; + Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.strerror()); } return buf; } @@ -189,7 +200,8 @@ void *b_malloc(const char *file, int line, size_t size) buf = malloc(size); #endif if (buf == NULL) { - e_msg(file, line, M_ABORT, 0, _("Out of memory: ERR=%s\n"), strerror(errno)); + berrno be; + e_msg(file, line, M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.strerror()); } return buf; } @@ -199,7 +211,8 @@ void *brealloc (void *buf, size_t size) { buf = realloc(buf, size); if (buf == NULL) { - Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), strerror(errno)); + berrno be; + Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.strerror()); } return buf; } @@ -211,11 +224,14 @@ void *bcalloc (size_t size1, size_t size2) buf = calloc(size1, size2); if (buf == NULL) { - Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), strerror(errno)); + berrno be; + Emsg1(M_ABORT, 0, _("Out of memory: ERR=%s\n"), be.strerror()); } return buf; } +/* Code now in src/lib/bsnprintf.c */ +#ifndef USE_BSNPRINTF #define BIG_BUF 5000 /* @@ -259,6 +275,7 @@ int bvsnprintf(char *str, int32_t size, const char *format, va_list ap) return len; #endif } +#endif /* USE_BSNPRINTF */ #ifndef HAVE_LOCALTIME_R @@ -393,7 +410,7 @@ void b_memset(const char *file, int line, void *mem, int val, size_t num) { /* Testing for 2000 byte zero at beginning of Volume block */ if (num > 1900 && num < 3000) { - Pmsg3(000, "Memset for %d bytes at %s:%d\n", (int)num, file, line); + Pmsg3(000, _("Memset for %d bytes at %s:%d\n"), (int)num, file, line); } memset(mem, val, num); } @@ -479,6 +496,21 @@ static struct s_state_hdr state_hdr = { 0 }; +#ifdef HAVE_WIN32 +#undef open +#undef read +#undef write +#undef lseek +#undef close +#undef O_BINARY +#define open _open +#define read _read +#define write _write +#define lseek _lseeki64 +#define close _close +#define O_BINARY _O_BINARY +#endif + /* * Open and read the state file for the daemon */ @@ -486,6 +518,7 @@ void read_state_file(char *dir, const char *progname, int port) { int sfd; ssize_t stat; + bool ok = false; POOLMEM *fname = get_pool_memory(PM_FNAME); struct s_state_hdr hdr; int hdr_size = sizeof(hdr); @@ -493,10 +526,10 @@ void read_state_file(char *dir, const char *progname, int port) Mmsg(&fname, "%s/%s.%d.state", dir, progname, port); /* If file exists, see what we have */ // Dmsg1(10, "O_BINARY=%d\n", O_BINARY); - if ((sfd = open(fname, O_RDONLY|O_BINARY, 0)) < 0) { + if ((sfd = open(fname, O_RDONLY|O_BINARY)) < 0) { Dmsg3(010, "Could not open state file. sfd=%d size=%d: ERR=%s\n", sfd, sizeof(hdr), strerror(errno)); - goto bail_out; + goto bail_out; } if ((stat=read(sfd, &hdr, hdr_size)) != hdr_size) { Dmsg4(010, "Could not read state file. sfd=%d stat=%d size=%d: ERR=%s\n", @@ -506,6 +539,7 @@ void read_state_file(char *dir, const char *progname, int port) if (hdr.version != state_hdr.version) { Dmsg2(010, "Bad hdr version. Wanted %d got %d\n", state_hdr.version, hdr.version); + goto bail_out; } hdr.id[13] = 0; if (strcmp(hdr.id, state_hdr.id) != 0) { @@ -513,11 +547,17 @@ void read_state_file(char *dir, const char *progname, int port) goto bail_out; } // Dmsg1(010, "Read header of %d bytes.\n", sizeof(hdr)); - read_last_jobs_list(sfd, hdr.last_jobs_addr); + if (!read_last_jobs_list(sfd, hdr.last_jobs_addr)) { + goto bail_out; + } + ok = true; bail_out: if (sfd >= 0) { close(sfd); } + if (!ok) { + unlink(fname); + } free_pool_memory(fname); } @@ -527,17 +567,21 @@ bail_out: void write_state_file(char *dir, const char *progname, int port) { int sfd; + bool ok = false; POOLMEM *fname = get_pool_memory(PM_FNAME); Mmsg(&fname, "%s/%s.%d.state", dir, progname, port); /* Create new state file */ + unlink(fname); if ((sfd = open(fname, O_CREAT|O_WRONLY|O_BINARY, 0640)) < 0) { - Dmsg2(000, _("Could not create state file. %s ERR=%s\n"), fname, strerror(errno)); - Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, strerror(errno)); + berrno be; + Dmsg2(000, "Could not create state file. %s ERR=%s\n", fname, be.strerror()); + Emsg2(M_ERROR, 0, _("Could not create state file. %s ERR=%s\n"), fname, be.strerror()); goto bail_out; } if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) { - Dmsg1(000, "Write hdr error: ERR=%s\n", strerror(errno)); + berrno be; + Dmsg1(000, "Write hdr error: ERR=%s\n", be.strerror()); goto bail_out; } // Dmsg1(010, "Wrote header of %d bytes\n", sizeof(state_hdr)); @@ -545,17 +589,24 @@ void write_state_file(char *dir, const char *progname, int port) state_hdr.reserved[0] = write_last_jobs_list(sfd, state_hdr.last_jobs_addr); // Dmsg1(010, "write last job end = %d\n", (int)state_hdr.reserved[0]); if (lseek(sfd, 0, SEEK_SET) < 0) { - Dmsg1(000, "lseek error: ERR=%s\n", strerror(errno)); + berrno be; + Dmsg1(000, "lseek error: ERR=%s\n", be.strerror()); goto bail_out; } if (write(sfd, &state_hdr, sizeof(state_hdr)) != sizeof(state_hdr)) { - Pmsg1(000, "Write final hdr error: ERR=%s\n", strerror(errno)); + berrno be; + Pmsg1(000, _("Write final hdr error: ERR=%s\n"), be.strerror()); + goto bail_out; } + ok = true; // Dmsg1(010, "rewrote header = %d\n", sizeof(state_hdr)); bail_out: if (sfd >= 0) { close(sfd); } + if (!ok) { + unlink(fname); + } free_pool_memory(fname); } @@ -638,7 +689,7 @@ char *bfgets(char *s, int size, FILE *fd) *p = 0; } else { /* Mac (\r only) */ - ungetc(ch, fd); /* Push next character back to fd */ + (void)ungetc(ch, fd); /* Push next character back to fd */ } break; }