#define FULL_LOCATION 1 /* set for file:line in Debug messages */
+/*
+ * This is where we define "Globals" because all the
+ * daemons include this file.
+ */
char *working_directory = NULL; /* working directory path stored here */
int verbose = 0; /* increase User messages */
int debug_level = 0; /* debug level */
time_t daemon_start_time = 0; /* Daemon start time */
char *version = VERSION " (" BDATE ")";
-
-char my_name[20]; /* daemon name is stored here */
+char my_name[30]; /* daemon name is stored here */
char *exepath = (char *)NULL;
char *exename = (char *)NULL;
int console_msg_pending = 0;
char con_fname[500]; /* Console filename */
FILE *con_fd = NULL; /* Console file descriptor */
brwlock_t con_lock; /* Console lock structure */
-
FILE *trace_fd = NULL;
+#ifdef HAVE_MYSQL
+char catalog_db[] = "MySQL";
+#else
+#ifdef HAVE_SQLITE
+char catalog_db[] = "SQLite";
+#else
+char catalog_db[] = "Internal";
+#endif
+#endif
+
+char *host_os = HOST_OS;
+char *distname = DISTNAME;
+char *distver = DISTVER;
+
/* Forward referenced functions */
/* Imported functions */
* non-NULL -> initialize jcr using Message resource
*/
void
-init_msg(void *vjcr, MSGS *msg)
+init_msg(JCR *jcr, MSGS *msg)
{
DEST *d, *dnew, *temp_chain = NULL;
- JCR *jcr = (JCR *)vjcr;
+ int i, fd;
+
+ /*
+ * Make sure we have fd's 0, 1, 2 open
+ * If we don't do this one of our sockets may open
+ * there and if we then use stdout, it could
+ * send total garbage to our socket.
+ *
+ */
+ fd = open("/dev/null", O_RDONLY, 0644);
+ if (fd > 2) {
+ close(fd);
+ } else {
+ for(i=1; fd + i <= 2; i++) {
+ dup2(fd, fd+i);
+ }
+ }
+
/*
* If msg is NULL, initialize global chain for STDOUT and syslog
*/
if (msg == NULL) {
- int i;
daemon_msgs = (MSGS *)malloc(sizeof(MSGS));
memset(daemon_msgs, 0, sizeof(MSGS));
for (i=1; i<=M_MAX; i++) {
jcr->Job, fd);
}
-int open_spool_file(void *vjcr, BSOCK *bs)
+int open_spool_file(JCR *jcr, BSOCK *bs)
{
POOLMEM *name = get_pool_memory(PM_MESSAGE);
- JCR *jcr = (JCR *)vjcr;
make_unique_spool_filename(jcr, &name, bs->fd);
- bs->spool_fd = fopen(name, "w+");
+ bs->spool_fd = fopen(mp_chr(name), "w+");
if (!bs->spool_fd) {
Jmsg(jcr, M_ERROR, 0, "fopen spool file %s failed: ERR=%s\n", name, strerror(errno));
free_pool_memory(name);
return 1;
}
-int close_spool_file(void *vjcr, BSOCK *bs)
+int close_spool_file(JCR *jcr, BSOCK *bs)
{
POOLMEM *name = get_pool_memory(PM_MESSAGE);
- JCR *jcr = (JCR *)vjcr;
make_unique_spool_filename(jcr, &name, bs->fd);
fclose(bs->spool_fd);
- unlink(name);
+ unlink(mp_chr(name));
free_pool_memory(name);
bs->spool_fd = NULL;
bs->spool = 0;
fflush(stdout);
if (!(bpipe = open_bpipe(*cmd, 120, "rw"))) {
- Jmsg(jcr, M_ERROR, 0, "open mail pipe %s failed: ERR=%s\n", *cmd, strerror(errno));
+ Jmsg(jcr, M_ERROR, 0, "open mail pipe %s failed: ERR=%s\n",
+ *cmd, strerror(errno));
}
return bpipe;
}
* Close the messages for this Messages resource, which means to close
* any open files, and dispatch any pending email messages.
*/
-void close_msg(void *vjcr)
+void close_msg(JCR *jcr)
{
MSGS *msgs;
- JCR *jcr = (JCR *)vjcr;
DEST *d;
BPIPE *bpipe;
POOLMEM *cmd, *line;
}
if (!(bpipe=open_mail_pipe(jcr, &cmd, d))) {
- Dmsg0(000, "open mail pipe failed.\n");
+ Pmsg0(000, "open mail pipe failed.\n");
goto rem_temp_file;
}
Dmsg0(150, "Opened mail pipe\n");
len = d->max_len+10;
line = get_memory(len);
rewind(d->fd);
- while (fgets(line, len, d->fd)) {
+ while (fgets(mp_chr(line), len, d->fd)) {
fputs(line, bpipe->wfd);
}
if (!close_wpipe(bpipe)) { /* close write pipe sending mail */
- Dmsg1(000, "close error: ERR=%s\n", strerror(errno));
+ Pmsg1(000, "close error: ERR=%s\n", strerror(errno));
}
/*
*/
if (msgs != daemon_msgs) {
/* read what mail prog returned -- should be nothing */
- while (fgets(line, len, bpipe->rfd)) {
+ while (fgets(mp_chr(line), len, bpipe->rfd)) {
Jmsg1(jcr, M_INFO, 0, _("Mail prog: %s"), line);
}
}
rem_temp_file:
/* Remove temp file */
fclose(d->fd);
- unlink(d->mail_filename);
+ unlink(mp_chr(d->mail_filename));
free_pool_memory(d->mail_filename);
d->mail_filename = NULL;
Dmsg0(150, "end mail or mail on error\n");
/*
* Handle sending the message to the appropriate place
*/
-void dispatch_message(void *vjcr, int type, int level, char *msg)
+void dispatch_message(JCR *jcr, int type, int level, char *msg)
{
DEST *d;
char dt[MAX_TIME_LENGTH];
POOLMEM *mcmd;
- JCR *jcr = (JCR *) vjcr;
int len;
MSGS *msgs;
BPIPE *bpipe;
case MD_MAIL_ON_ERROR:
Dmsg1(800, "MAIL for following msg: %s", msg);
if (!d->fd) {
- POOLMEM *name = get_pool_memory(PM_MESSAGE);
- make_unique_mail_filename(jcr, &name, d);
- d->fd = fopen(name, "w+");
+ POOLMEM *name = get_pool_memory(PM_MESSAGE);
+ make_unique_mail_filename(jcr, &mp_chr(name), d);
+ d->fd = fopen(mp_chr(name), "w+");
if (!d->fd) {
d->fd = stdout;
Emsg2(M_ERROR, 0, "fopen %s failed: ERR=%s\n", name, strerror(errno));
/*********************************************************************
*
- * subroutine prints a debug message if the level number
+ * This subroutine prints a debug message if the level number
* is less than or equal the debug_level. File and line numbers
* are included for more detail if desired, but not currently
* printed.
if (level < 0) {
details = FALSE;
-// level = -level;
- level = 0;
+ level = -level;
}
if (level <= debug_level) {
#endif
#ifdef FULL_LOCATION
if (details) {
- len= sprintf(buf, "%s: %s:%d ", my_name, file, line);
+ len = sprintf(buf, "%s: %s:%d ", my_name, file, line);
} else {
len = 0;
}
}
+/*********************************************************************
+ *
+ * This subroutine prints a message regardless of the debug level
+ *
+ * If the level is negative, the details of file and line number
+ * are not printed.
+ */
+void
+p_msg(char *file, int line, int level, char *fmt,...)
+{
+ char buf[5000];
+ int len;
+ va_list arg_ptr;
+
+#ifdef FULL_LOCATION
+ if (level >= 0) {
+ len = sprintf(buf, "%s: %s:%d ", my_name, file, line);
+ } else {
+ len = 0;
+ }
+#else
+ len = 0;
+#endif
+ va_start(arg_ptr, fmt);
+ bvsnprintf(buf+len, sizeof(buf)-len, (char *)fmt, arg_ptr);
+ va_end(arg_ptr);
+ fputs(buf, stdout);
+}
+
+
/*********************************************************************
*
* subroutine writes a debug message to the trace file if the level number
va_list arg_ptr;
int details = TRUE;
- return;
-
if (level < 0) {
details = FALSE;
level = -level;
*
*/
void
-Jmsg(void *vjcr, int type, int level, char *fmt,...)
+Jmsg(JCR *jcr, int type, int level, char *fmt,...)
{
char rbuf[5000];
va_list arg_ptr;
int len;
- JCR *jcr = (JCR *)vjcr;
MSGS *msgs;
char *job;
if (jcr && jcr->JobId == 0 && jcr->dir_bsock) {
BSOCK *dir = jcr->dir_bsock;
va_start(arg_ptr, fmt);
- dir->msglen = bvsnprintf(dir->msg, sizeof_pool_memory(dir->msg), fmt, arg_ptr);
+ dir->msglen = bvsnprintf(mp_chr(dir->msg), sizeof_pool_memory(dir->msg),
+ fmt, arg_ptr);
va_end(arg_ptr);
bnet_send(jcr->dir_bsock);
return;
len = sprintf(rbuf, "%s: %s Fatal error: ", my_name, job);
if (jcr) {
set_jcr_job_status(jcr, JS_FatalError);
- jcr->Errors++;
}
break;
case M_ERROR:
va_list arg_ptr;
int i, len, maxlen;
- i = sprintf(*pool_buf, "%s:%d ", file, line);
+ i = sprintf(mp_chr(*pool_buf), "%s:%d ", file, line);
again:
maxlen = sizeof_pool_memory(*pool_buf) - i - 1;
* If we come here, prefix the message with the file:line-number,
* then pass it on to the normal Jmsg routine.
*/
-void j_msg(char *file, int line, void *jcr, int type, int level, char *fmt,...)
+void j_msg(char *file, int line, JCR *jcr, int type, int level, char *fmt,...)
{
va_list arg_ptr;
int i, len, maxlen;