From 6e4277cdf0020c5b0fcecfc57c07d32a19ee9115 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Mon, 15 Nov 2004 22:43:33 +0000 Subject: [PATCH] - Fix cancel bug in FD on /lib/tls with zero pid in pthread_kill. - Add date/time to all messages. - Make Qmsg use time message was queued rather than time printed. - Indent job output two spaces. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1698 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 9 +++- bacula/src/baconfig.h | 4 +- bacula/src/dird/admin.c | 12 +++--- bacula/src/dird/backup.c | 48 ++++++++++----------- bacula/src/dird/mac.c | 46 ++++++++++---------- bacula/src/dird/restore.c | 26 ++++++------ bacula/src/dird/verify.c | 56 ++++++++++++------------ bacula/src/filed/backup.c | 18 ++++---- bacula/src/filed/verify.c | 22 +++++----- bacula/src/lib/attr.c | 2 +- bacula/src/lib/btime.c | 13 ++++++ bacula/src/lib/btime.h | 1 + bacula/src/lib/jcr.c | 1 + bacula/src/lib/message.c | 89 +++++++++++++++++++++++++++------------ bacula/src/lib/message.h | 4 +- bacula/src/lib/protos.h | 4 +- bacula/src/version.h | 4 +- 17 files changed, 207 insertions(+), 152 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index 429c4dcbc2..e6df3623ea 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -11,12 +11,14 @@ Version 1.37 Kern (see below) ======================================================== For 1.36.1: -- Fix CDROM make script to permit picking up already installed - static FD. +- Fix orphanned buffers: + Orphaned buffer: 24 bytes allocated at line 808 of rufus-dir job.c + Orphaned buffer: 40 bytes allocated at line 45 of rufus-dir alist.c - Add dump of VolSessionId/Time and FileIndex with bls. - Add date/time to each Jmsg. 1.37 Items: +- Include within include - Implement a Pool of type Cleaning? - Implement VolReadTime and VolWriteTime in SD - Modify Backing up Your Database to include a bootstrap file. @@ -981,3 +983,6 @@ Block Position: 0 === Done - Add "Rerun failed levels = yes/no" to Job resource. +- Fix CDROM make script to permit picking up already installed + static FD. + diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index b11a446bca..da517642f6 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -417,8 +417,8 @@ struct JCR; void d_msg(const char *file, int line, int level, const char *fmt,...); void p_msg(const char *file, int line, int level, const char *fmt,...); void e_msg(const char *file, int line, int type, int level, const char *fmt,...); -void j_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...); -void q_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...); +void j_msg(const char *file, int line, JCR *jcr, int type, time_t mtime, const char *fmt,...); +void q_msg(const char *file, int line, JCR *jcr, int type, time_t mtime, const char *fmt,...); int m_msg(const char *file, int line, POOLMEM **msgbuf, const char *fmt,...); int m_msg(const char *file, int line, POOLMEM *&pool_buf, const char *fmt, ...); diff --git a/bacula/src/dird/admin.c b/bacula/src/dird/admin.c index db42e9af68..b26ae18c94 100644 --- a/bacula/src/dird/admin.c +++ b/bacula/src/dird/admin.c @@ -105,11 +105,11 @@ static void admin_cleanup(JCR *jcr, int TermCode) bstrftime(edt, sizeof(edt), jcr->jr.EndTime); Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -Start time: %s\n\ -End time: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + Start time: %s\n\ + End time: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, @@ -118,4 +118,4 @@ Termination: %s\n\n"), term_msg); Dmsg0(100, "Leave admin_cleanup()\n"); -} +} diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index e14a156b0b..d2f97aff81 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -442,30 +442,30 @@ static void backup_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr // bmicrosleep(15, 0); /* for debugging SIGHUP */ Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -Backup Level: %s%s\n\ -Client: %s\n\ -FileSet: \"%s\" %s\n\ -Pool: \"%s\"\n\ -Storage: \"%s\"\n\ -Start time: %s\n\ -End time: %s\n\ -FD Files Written: %s\n\ -SD Files Written: %s\n\ -FD Bytes Written: %s\n\ -SD Bytes Written: %s\n\ -Rate: %.1f KB/s\n\ -Software Compression: %s\n\ -Volume name(s): %s\n\ -Volume Session Id: %d\n\ -Volume Session Time: %d\n\ -Last Volume Bytes: %s\n\ -Non-fatal FD errors: %d\n\ -SD Errors: %d\n\ -FD termination status: %s\n\ -SD termination status: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + Backup Level: %s%s\n\ + Client: %s\n\ + FileSet: \"%s\" %s\n\ + Pool: \"%s\"\n\ + Storage: \"%s\"\n\ + Start time: %s\n\ + End time: %s\n\ + FD Files Written: %s\n\ + SD Files Written: %s\n\ + FD Bytes Written: %s\n\ + SD Bytes Written: %s\n\ + Rate: %.1f KB/s\n\ + Software Compression: %s\n\ + Volume name(s): %s\n\ + Volume Session Id: %d\n\ + Volume Session Time: %d\n\ + Last Volume Bytes: %s\n\ + Non-fatal FD errors: %d\n\ + SD Errors: %d\n\ + FD termination status: %s\n\ + SD termination status: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, diff --git a/bacula/src/dird/mac.c b/bacula/src/dird/mac.c index d8dec58e3b..273ad0917d 100644 --- a/bacula/src/dird/mac.c +++ b/bacula/src/dird/mac.c @@ -363,29 +363,29 @@ static void mac_cleanup(JCR *jcr, int TermCode, char *since, FILESET_DBR *fsr, // bmicrosleep(15, 0); /* for debugging SIGHUP */ Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -Backup Level: %s%s\n\ -Client: %s\n\ -FileSet: \"%s\" %s\n\ -Pool: \"%s\"\n\ -Start time: %s\n\ -End time: %s\n\ -FD Files Written: %s\n\ -SD Files Written: %s\n\ -FD Bytes Written: %s\n\ -SD Bytes Written: %s\n\ -Rate: %.1f KB/s\n\ -Software Compression: %s\n\ -Volume name(s): %s\n\ -Volume Session Id: %d\n\ -Volume Session Time: %d\n\ -Last Volume Bytes: %s\n\ -Non-fatal FD errors: %d\n\ -SD Errors: %d\n\ -FD termination status: %s\n\ -SD termination status: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + Backup Level: %s%s\n\ + Client: %s\n\ + FileSet: \"%s\" %s\n\ + Pool: \"%s\"\n\ + Start time: %s\n\ + End time: %s\n\ + FD Files Written: %s\n\ + SD Files Written: %s\n\ + FD Bytes Written: %s\n\ + SD Bytes Written: %s\n\ + Rate: %.1f KB/s\n\ + Software Compression: %s\n\ + Volume name(s): %s\n\ + Volume Session Id: %d\n\ + Volume Session Time: %d\n\ + Last Volume Bytes: %s\n\ + Non-fatal FD errors: %d\n\ + SD Errors: %d\n\ + FD termination status: %s\n\ + SD termination status: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index 05006a24b1..2cf91aef57 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -326,19 +326,19 @@ static void restore_cleanup(JCR *jcr, int TermCode) jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg)); Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -Client: %s\n\ -Start time: %s\n\ -End time: %s\n\ -Files Expected: %s\n\ -Files Restored: %s\n\ -Bytes Restored: %s\n\ -Rate: %.1f KB/s\n\ -FD Errors: %d\n\ -FD termination status: %s\n\ -SD termination status: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + Client: %s\n\ + Start time: %s\n\ + End time: %s\n\ + Files Expected: %s\n\ + Files Restored: %s\n\ + Bytes Restored: %s\n\ + Rate: %.1f KB/s\n\ + FD Errors: %d\n\ + FD termination status: %s\n\ + SD termination status: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 304f7cafd3..0a6fc56b0b 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -419,21 +419,21 @@ static void verify_cleanup(JCR *jcr, int TermCode) if (jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG) { jobstatus_to_ascii(jcr->SDJobStatus, sd_term_msg, sizeof(sd_term_msg)); Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -FileSet: %s\n\ -Verify Level: %s\n\ -Client: %s\n\ -Verify JobId: %d\n\ -Verify Job: %s\n\ -Start time: %s\n\ -End time: %s\n\ -Files Expected: %s\n\ -Files Examined: %s\n\ -Non-fatal FD errors: %d\n\ -FD termination status: %s\n\ -SD termination status: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + FileSet: %s\n\ + Verify Level: %s\n\ + Client: %s\n\ + Verify JobId: %d\n\ + Verify Job: %s\n\ + Start time: %s\n\ + End time: %s\n\ + Files Expected: %s\n\ + Files Examined: %s\n\ + Non-fatal FD errors: %d\n\ + FD termination status: %s\n\ + SD termination status: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, @@ -452,19 +452,19 @@ Termination: %s\n\n"), term_msg); } else { Jmsg(jcr, msg_type, 0, _("Bacula " VERSION " (" LSMDATE "): %s\n\ -JobId: %d\n\ -Job: %s\n\ -FileSet: %s\n\ -Verify Level: %s\n\ -Client: %s\n\ -Verify JobId: %d\n\ -Verify Job: %s\n\ -Start time: %s\n\ -End time: %s\n\ -Files Examined: %s\n\ -Non-fatal FD errors: %d\n\ -FD termination status: %s\n\ -Termination: %s\n\n"), + JobId: %d\n\ + Job: %s\n\ + FileSet: %s\n\ + Verify Level: %s\n\ + Client: %s\n\ + Verify JobId: %d\n\ + Verify Job: %s\n\ + Start time: %s\n\ + End time: %s\n\ + Files Examined: %s\n\ + Non-fatal FD errors: %d\n\ + FD termination status: %s\n\ + Termination: %s\n\n"), edt, jcr->jr.JobId, jcr->jr.Job, diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index 6492cc31c9..88fed3b615 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -176,7 +176,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) case FT_NOACCESS: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname, + Jmsg(jcr, M_NOTSAVED, 0, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; @@ -184,7 +184,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) case FT_NOFOLLOW: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not follow link %s: ERR=%s\n"), ff_pkt->fname, + Jmsg(jcr, M_NOTSAVED, 0, _(" Could not follow link %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; @@ -192,30 +192,30 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) case FT_NOSTAT: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, + Jmsg(jcr, M_NOTSAVED, 0, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; } case FT_DIRNOCHG: case FT_NOCHG: - Jmsg(jcr, M_SKIPPED, -1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_SKIPPED, 1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname); return 1; case FT_ISARCH: - Jmsg(jcr, M_NOTSAVED, -1, _(" Archive file not saved: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_NOTSAVED, 0, _(" Archive file not saved: %s\n"), ff_pkt->fname); return 1; case FT_NORECURSE: - Jmsg(jcr, M_SKIPPED, -1, _(" Recursion turned off. Directory skipped: %s\n"), + Jmsg(jcr, M_SKIPPED, 1, _(" Recursion turned off. Directory skipped: %s\n"), ff_pkt->fname); return 1; case FT_NOFSCHG: - Jmsg(jcr, M_SKIPPED, -1, _(" File system change prohibited. Directory skipped. %s\n"), + Jmsg(jcr, M_SKIPPED, 1, _(" File system change prohibited. Directory skipped. %s\n"), ff_pkt->fname); return 1; case FT_NOOPEN: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not open directory %s: ERR=%s\n"), ff_pkt->fname, + Jmsg(jcr, M_NOTSAVED, 0, _(" Could not open directory %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; @@ -252,7 +252,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) if (bopen(&ff_pkt->bfd, ff_pkt->fname, O_RDONLY | O_BINARY, 0) < 0) { ff_pkt->ff_errno = errno; berrno be; - Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, + Jmsg(jcr, M_NOTSAVED, 0, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; if (tid) { diff --git a/bacula/src/filed/verify.c b/bacula/src/filed/verify.c index f11edb4c31..ced8398772 100644 --- a/bacula/src/filed/verify.c +++ b/bacula/src/filed/verify.c @@ -111,41 +111,41 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt) case FT_NOACCESS: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); + Jmsg(jcr, M_NOTSAVED, 1, _(" Could not access %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; } case FT_NOFOLLOW: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not follow link %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); + Jmsg(jcr, M_NOTSAVED, 1, _(" Could not follow link %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; } case FT_NOSTAT: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); + Jmsg(jcr, M_NOTSAVED, 1, _(" Could not stat %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; } case FT_DIRNOCHG: case FT_NOCHG: - Jmsg(jcr, M_SKIPPED, -1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_SKIPPED, 1, _(" Unchanged file skipped: %s\n"), ff_pkt->fname); return 1; case FT_ISARCH: - Jmsg(jcr, M_SKIPPED, -1, _(" Archive file skipped: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_SKIPPED, 1, _(" Archive file skipped: %s\n"), ff_pkt->fname); return 1; case FT_NORECURSE: - Jmsg(jcr, M_SKIPPED, -1, _(" Recursion turned off. Directory skipped: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_SKIPPED, 1, _(" Recursion turned off. Directory skipped: %s\n"), ff_pkt->fname); return 1; case FT_NOFSCHG: - Jmsg(jcr, M_SKIPPED, -1, _(" File system change prohibited. Directory skipped: %s\n"), ff_pkt->fname); + Jmsg(jcr, M_SKIPPED, 1, _(" File system change prohibited. Directory skipped: %s\n"), ff_pkt->fname); return 1; case FT_NOOPEN: { berrno be; be.set_errno(ff_pkt->ff_errno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Could not open directory %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); + Jmsg(jcr, M_NOTSAVED, 1, _(" Could not open directory %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; } @@ -164,7 +164,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt) ff_pkt->ff_errno = errno; berrno be; be.set_errno(bfd.berrno); - Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open %s: ERR=%s.\n"), + Jmsg(jcr, M_NOTSAVED, 1, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; return 1; @@ -226,7 +226,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt) if (n < 0) { berrno be; be.set_errno(bfd.berrno); - Jmsg(jcr, M_ERROR, -1, _("Error reading file %s: ERR=%s\n"), + Jmsg(jcr, M_ERROR, 1, _("Error reading file %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; } @@ -248,7 +248,7 @@ static int verify_file(FF_PKT *ff_pkt, void *pkt) if (n < 0) { berrno be; be.set_errno(bfd.berrno); - Jmsg(jcr, M_ERROR, -1, _("Error reading file %s: ERR=%s\n"), + Jmsg(jcr, M_ERROR, 1, _("Error reading file %s: ERR=%s\n"), ff_pkt->fname, be.strerror()); jcr->Errors++; } diff --git a/bacula/src/lib/attr.c b/bacula/src/lib/attr.c index bd9746c64f..4091331aa4 100644 --- a/bacula/src/lib/attr.c +++ b/bacula/src/lib/attr.c @@ -208,5 +208,5 @@ void print_ls_output(JCR *jcr, ATTR *attr) *p++ = '\n'; *p = 0; Dmsg1(20, "%s", buf); - Jmsg(jcr, M_RESTORED, 0, "%s", buf); + Jmsg(jcr, M_RESTORED, 1, "%s", buf); } diff --git a/bacula/src/lib/btime.c b/bacula/src/lib/btime.c index aa798b7797..7eb3f1fc9b 100644 --- a/bacula/src/lib/btime.c +++ b/bacula/src/lib/btime.c @@ -53,6 +53,19 @@ char *bstrftime(char *dt, int maxlen, utime_t tim) return dt; } +/* Formatted time for user display: dd-Mon hh:mm */ +char *bstrftime_ny(char *dt, int maxlen, utime_t tim) +{ + time_t ttime = (time_t)tim; + struct tm tm; + + /* ***FIXME**** the format and localtime_r() should be user configurable */ + localtime_r(&ttime, &tm); + strftime(dt, maxlen, "%d-%b %H:%M", &tm); + return dt; +} + + /* Formatted time for user display: dd-Mon-yy hh:mm (no century) */ char *bstrftime_nc(char *dt, int maxlen, utime_t tim) { diff --git a/bacula/src/lib/btime.h b/bacula/src/lib/btime.h index d32891c672..8d21612470 100644 --- a/bacula/src/lib/btime.h +++ b/bacula/src/lib/btime.h @@ -41,6 +41,7 @@ int tm_woy(time_t stime); char *bstrutime(char *dt, int maxlen, utime_t tim); char *bstrftime(char *dt, int maxlen, utime_t tim); +char *bstrftime_ny(char *dt, int maxlen, utime_t tim); char *bstrftime_nc(char *dt, int maxlen, utime_t tim); utime_t str_to_utime(char *str); diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index e656eae57a..ebbfd79275 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -191,6 +191,7 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) Dmsg0(400, "Enter new_jcr\n"); jcr = (JCR *)malloc(size); memset(jcr, 0, size); + jcr->my_thread_id = pthread_self(); jcr->msg_queue = New(dlist(item, &item->link)); jcr->job_end_push.init(1, false); jcr->sched_time = time(NULL); diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index e1413790a8..03f7afaf62 100755 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -257,8 +257,9 @@ void init_console_msg(const char *wd) bsnprintf(con_fname, sizeof(con_fname), "%s/%s.conmsg", wd, my_name); fd = open(con_fname, O_CREAT|O_RDWR|O_BINARY, 0600); if (fd == -1) { + berrno be; Emsg2(M_ERROR_TERM, 0, _("Could not open console message file %s: ERR=%s\n"), - con_fname, strerror(errno)); + con_fname, be.strerror()); } if (lseek(fd, 0, SEEK_END) > 0) { console_msg_pending = 1; @@ -266,12 +267,14 @@ void init_console_msg(const char *wd) close(fd); con_fd = fopen(con_fname, "a+"); if (!con_fd) { + berrno be; Emsg2(M_ERROR, 0, _("Could not open console message file %s: ERR=%s\n"), - con_fname, strerror(errno)); + con_fname, be.strerror()); } if (rwl_init(&con_lock) != 0) { + berrno be; Emsg1(M_ERROR_TERM, 0, _("Could not get con mutex: ERR=%s\n"), - strerror(errno)); + be.strerror()); } } @@ -444,7 +447,8 @@ void close_msg(JCR *jcr) fputs(line, bpipe->wfd); } if (!close_wpipe(bpipe)) { /* close write pipe sending mail */ - Pmsg1(000, "close error: ERR=%s\n", strerror(errno)); + berrno be; + Pmsg1(000, "close error: ERR=%s\n", be.strerror()); } /* @@ -557,19 +561,39 @@ void term_msg() /* * Handle sending the message to the appropriate place */ -void dispatch_message(JCR *jcr, int type, int level, char *msg) +void dispatch_message(JCR *jcr, int type, time_t mtime, char *msg) { DEST *d; char dt[MAX_TIME_LENGTH]; POOLMEM *mcmd; - int len; + int len, dtlen; MSGS *msgs; BPIPE *bpipe; Dmsg2(800, "Enter dispatch_msg type=%d msg=%s\n", type, msg); + /* + * Most messages are prefixed by a date and time. If mtime is + * zero, then we use the current time. If mtime is 1 (special + * kludge), we do not prefix the date and time. Otherwise, + * we assume mtime is a time_t and use it. + */ + if (mtime == 0) { + mtime = time(NULL); + } + if (mtime == 1) { + *dt = 0; + dtlen = 0; + } else { + bstrftime_ny(dt, sizeof(dt), mtime); + dtlen = strlen(dt); + dt[dtlen++] = ' '; + dt[dtlen] = 0; + } + if (type == M_ABORT || type == M_ERROR_TERM) { #ifndef HAVE_WIN32 + fputs(dt, stdout); fputs(msg, stdout); /* print this here to INSURE that it is printed */ fflush(stdout); #endif @@ -603,10 +627,9 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg) if (con_fd) { Pw(con_lock); /* get write lock on console message file */ errno = 0; - bstrftime(dt, sizeof(dt), time(NULL)); - len = strlen(dt); - dt[len++] = ' '; - fwrite(dt, len, 1, con_fd); + if (dtlen) { + fwrite(dt, dtlen, 1, con_fd); + } len = strlen(msg); if (len > 0) { fwrite(msg, len, 1, con_fd); @@ -629,10 +652,11 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg) syslog(LOG_DAEMON|LOG_ERR, "%s", msg); break; case MD_OPERATOR: - Dmsg1(800, "OPERATOR for collowing msg: %s\n", msg); + Dmsg1(800, "OPERATOR for following msg: %s\n", msg); mcmd = get_pool_memory(PM_MESSAGE); if ((bpipe=open_mail_pipe(jcr, mcmd, d))) { int stat; + fputs(dt, bpipe->wfd); fputs(msg, bpipe->wfd); /* Messages to the operator go one at a time */ stat = close_bpipe(bpipe); @@ -654,15 +678,18 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg) make_unique_mail_filename(jcr, name, d); d->fd = fopen(name, "w+"); if (!d->fd) { + berrno be; d->fd = stdout; - Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", name, strerror(errno)); + Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", name, + be.strerror()); d->fd = NULL; free_pool_memory(name); break; } d->mail_filename = name; } - len = strlen(msg); + fputs(dt, d->fd); + len = strlen(msg) + dtlen;; if (len > d->max_len) { d->max_len = len; /* keep max line length */ } @@ -673,12 +700,15 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg) if (!d->fd) { d->fd = fopen(d->where, "w+"); if (!d->fd) { + berrno be; d->fd = stdout; - Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", d->where, strerror(errno)); + Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", d->where, + be.strerror()); d->fd = NULL; break; } } + fputs(dt, d->fd); fputs(msg, d->fd); break; case MD_APPEND: @@ -686,29 +716,34 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg) if (!d->fd) { d->fd = fopen(d->where, "a"); if (!d->fd) { + berrno be; d->fd = stdout; - Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", d->where, strerror(errno)); + Qmsg2(jcr, M_ERROR, 0, "fopen %s failed: ERR=%s\n", d->where, + be.strerror()); d->fd = NULL; break; } } + fputs(dt, d->fd); fputs(msg, d->fd); break; case MD_DIRECTOR: Dmsg1(800, "DIRECTOR for following msg: %s", msg); if (jcr && jcr->dir_bsock && !jcr->dir_bsock->errors) { bnet_fsend(jcr->dir_bsock, "Jmsg Job=%s type=%d level=%d %s", - jcr->Job, type, level, msg); + jcr->Job, type, mtime, msg); } break; case MD_STDOUT: Dmsg1(800, "STDOUT for following msg: %s", msg); if (type != M_ABORT && type != M_ERROR_TERM) { /* already printed */ + fputs(dt, stdout); fputs(msg, stdout); } break; case MD_STDERR: Dmsg1(800, "STDERR for following msg: %s", msg); + fputs(dt, stderr); fputs(msg, stderr); break; default: @@ -941,7 +976,7 @@ e_msg(const char *file, int line, int type, int level, const char *fmt,...) bvsnprintf(buf+len, sizeof(buf)-len, (char *)fmt, arg_ptr); va_end(arg_ptr); - dispatch_message(NULL, type, level, buf); + dispatch_message(NULL, type, 0, buf); if (type == M_ABORT) { char *p = 0; @@ -958,7 +993,7 @@ e_msg(const char *file, int line, int type, int level, const char *fmt,...) * */ void -Jmsg(JCR *jcr, int type, int level, const char *fmt,...) +Jmsg(JCR *jcr, int type, time_t mtime, const char *fmt,...) { char rbuf[5000]; va_list arg_ptr; @@ -1038,7 +1073,7 @@ Jmsg(JCR *jcr, int type, int level, const char *fmt,...) bvsnprintf(rbuf+len, sizeof(rbuf)-len, fmt, arg_ptr); va_end(arg_ptr); - dispatch_message(jcr, type, level, rbuf); + dispatch_message(jcr, type, mtime, rbuf); if (type == M_ABORT){ char *p = 0; @@ -1053,7 +1088,7 @@ Jmsg(JCR *jcr, int type, int level, const char *fmt,...) * If we come here, prefix the message with the file:line-number, * then pass it on to the normal Jmsg routine. */ -void j_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...) +void j_msg(const char *file, int line, JCR *jcr, int type, time_t mtime, const char *fmt,...) { va_list arg_ptr; int i, len, maxlen; @@ -1074,7 +1109,7 @@ void j_msg(const char *file, int line, JCR *jcr, int type, int level, const char break; } - Jmsg(jcr, type, level, "%s", pool_buf); + Jmsg(jcr, type, mtime, "%s", pool_buf); free_memory(pool_buf); } @@ -1196,7 +1231,7 @@ static pthread_mutex_t msg_queue_mutex = PTHREAD_MUTEX_INITIALIZER; * sending a message, it is a bit messy to recursively call * yourself when the bnet packet is not reentrant). */ -void Qmsg(JCR *jcr, int type, int level, const char *fmt,...) +void Qmsg(JCR *jcr, int type, time_t mtime, const char *fmt,...) { va_list arg_ptr; int len, maxlen; @@ -1218,13 +1253,13 @@ void Qmsg(JCR *jcr, int type, int level, const char *fmt,...) } item = (MQUEUE_ITEM *)malloc(sizeof(MQUEUE_ITEM) + strlen(pool_buf) + 1); item->type = type; - item->level = level; + item->mtime = time(NULL); strcpy(item->msg, pool_buf); P(msg_queue_mutex); /* If no jcr or dequeuing send to daemon to avoid recursion */ if (!jcr || jcr->dequeuing) { /* jcr==NULL => daemon message, safe to send now */ - Jmsg(NULL, item->type, item->level, "%s", item->msg); + Jmsg(NULL, item->type, item->mtime, "%s", item->msg); free(item); } else { /* Queue message for later sending */ @@ -1245,7 +1280,7 @@ void dequeue_messages(JCR *jcr) jcr->dequeuing = true; foreach_dlist(item, jcr->msg_queue) { // Dmsg1(000, "dequeue item=%lu\n", (long unsigned)item); - Jmsg(jcr, item->type, item->level, "%s", item->msg); + Jmsg(jcr, item->type, item->mtime, "%s", item->msg); } jcr->msg_queue->destroy(); jcr->dequeuing = false; @@ -1257,7 +1292,7 @@ void dequeue_messages(JCR *jcr) * If we come here, prefix the message with the file:line-number, * then pass it on to the normal Qmsg routine. */ -void q_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...) +void q_msg(const char *file, int line, JCR *jcr, int type, time_t mtime, const char *fmt,...) { va_list arg_ptr; int i, len, maxlen; @@ -1278,7 +1313,7 @@ void q_msg(const char *file, int line, JCR *jcr, int type, int level, const char break; } - Qmsg(jcr, type, level, "%s", pool_buf); + Qmsg(jcr, type, mtime, "%s", pool_buf); free_memory(pool_buf); } diff --git a/bacula/src/lib/message.h b/bacula/src/lib/message.h index 5c70ec0266..969aafd94a 100644 --- a/bacula/src/lib/message.h +++ b/bacula/src/lib/message.h @@ -120,14 +120,14 @@ typedef struct s_dest { struct MQUEUE_ITEM { dlink link; int type; - int level; + time_t mtime; char msg[1]; }; void d_msg(const char *file, int line, int level, const char *fmt,...); void e_msg(const char *file, int line, int type, int level, const char *fmt,...); -void Jmsg(JCR *jcr, int type, int level, const char *fmt,...); +void Jmsg(JCR *jcr, int type, time_t mtime, const char *fmt,...); extern int debug_level; extern int verbose; diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 007c9f22e3..bb055f2223 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -150,8 +150,8 @@ void term_msg (void); void close_msg (JCR *jcr); void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code); void rem_msg_dest (MSGS *msg, int dest, int type, char *where); -void Jmsg (JCR *jcr, int type, int level, const char *fmt, ...); -void dispatch_message (JCR *jcr, int type, int level, char *buf); +void Jmsg (JCR *jcr, int type, time_t mtime, const char *fmt, ...); +void dispatch_message (JCR *jcr, int type, time_t mtime, char *buf); void init_console_msg (const char *wd); void free_msgs_res (MSGS *msgs); void dequeue_messages (JCR *jcr); diff --git a/bacula/src/version.h b/bacula/src/version.h index 72635fce82..d6d8a4a25e 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #undef VERSION #define VERSION "1.37.1" -#define BDATE "12 November 2004" -#define LSMDATE "12Nov04" +#define BDATE "16 November 2004" +#define LSMDATE "16Nov04" /* Debug flags */ #undef DEBUG -- 2.39.5