========================================================
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.
=== Done
- Add "Rerun failed levels = yes/no" to Job resource.
+- Fix CDROM make script to permit picking up already installed
+ static FD.
+
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, ...);
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,
term_msg);
Dmsg0(100, "Leave admin_cleanup()\n");
-}
+}
// 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,
// 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,
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,
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,
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,
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;
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;
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;
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) {
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;
}
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;
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++;
}
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++;
}
*p++ = '\n';
*p = 0;
Dmsg1(20, "%s", buf);
- Jmsg(jcr, M_RESTORED, 0, "%s", buf);
+ Jmsg(jcr, M_RESTORED, 1, "%s", buf);
}
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)
{
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);
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);
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;
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());
}
}
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());
}
/*
/*
* 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
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);
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);
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 */
}
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:
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:
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;
*
*/
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;
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;
* 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;
break;
}
- Jmsg(jcr, type, level, "%s", pool_buf);
+ Jmsg(jcr, type, mtime, "%s", pool_buf);
free_memory(pool_buf);
}
* 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;
}
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 */
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;
* 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;
break;
}
- Qmsg(jcr, type, level, "%s", pool_buf);
+ Qmsg(jcr, type, mtime, "%s", pool_buf);
free_memory(pool_buf);
}
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;
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);
/* */
#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