summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasami Hiramatsu <mhiramat@redhat.com>2009-03-20 11:54:15 -0400
committerMasami Hiramatsu <mhiramat@redhat.com>2009-03-20 11:54:15 -0400
commitf0b8d2671fa56e0e1dcb4cc09fd6f7edf70f8fa3 (patch)
tree23e89323e440e216b7cb4bf359e1a2bda54edd40
parent0cf9ea606eb7677a1241595f7568dd4a6c243ef2 (diff)
downloadsystemtap-steved-f0b8d2671fa56e0e1dcb4cc09fd6f7edf70f8fa3.tar.gz
systemtap-steved-f0b8d2671fa56e0e1dcb4cc09fd6f7edf70f8fa3.tar.xz
systemtap-steved-f0b8d2671fa56e0e1dcb4cc09fd6f7edf70f8fa3.zip
PR6930: staprun: supports error message to syslog
Add an interface (eprintf) to output error messages to syslogd, because staprun has no stderr after detaching from console.
-rw-r--r--runtime/staprun/common.c21
-rw-r--r--runtime/staprun/mainloop.c2
-rw-r--r--runtime/staprun/staprun.h18
3 files changed, 33 insertions, 8 deletions
diff --git a/runtime/staprun/common.c b/runtime/staprun/common.c
index fd16b4b8..b8860248 100644
--- a/runtime/staprun/common.c
+++ b/runtime/staprun/common.c
@@ -344,3 +344,24 @@ int send_request(int type, void *data, int len)
if (rc < 0) return rc;
return (rc != len+4);
}
+
+#include <stdarg.h>
+
+static int use_syslog = 0;
+
+void eprintf(const char *fmt, ...)
+{
+ va_list va;
+ va_start(va, fmt);
+ if (use_syslog)
+ vsyslog(LOG_ERR, fmt, va);
+ else
+ vfprintf(stderr, fmt, va);
+ va_end(va);
+}
+
+void switch_syslog(const char *name)
+{
+ openlog(name, LOG_PID, LOG_DAEMON);
+ use_syslog = 1;
+}
diff --git a/runtime/staprun/mainloop.c b/runtime/staprun/mainloop.c
index db6ef6b7..e91e6302 100644
--- a/runtime/staprun/mainloop.c
+++ b/runtime/staprun/mainloop.c
@@ -468,7 +468,7 @@ int stp_main_loop(void)
}
#endif
case STP_OOB_DATA:
- fputs((char *)data, stderr);
+ eprintf("%s", (char *)data);
break;
case STP_EXIT:
{
diff --git a/runtime/staprun/staprun.h b/runtime/staprun/staprun.h
index 84cf63fc..4c43e3ee 100644
--- a/runtime/staprun/staprun.h
+++ b/runtime/staprun/staprun.h
@@ -33,31 +33,35 @@
#include <sys/wait.h>
#include <sys/statfs.h>
#include <linux/version.h>
+#include <syslog.h>
/* Include config.h to pick up dependency for --prefix usage. */
#include "config.h"
-#define dbug(level, args...) {if (verbose>=level) {fprintf(stderr,"%s:%s:%d ",__name__,__FUNCTION__, __LINE__); fprintf(stderr,args);}}
+extern void eprintf(const char *fmt, ...);
+extern void switch_syslog(const char *name);
+
+#define dbug(level, args...) do {if (verbose>=level) {eprintf("%s:%s:%d ",__name__,__FUNCTION__, __LINE__); eprintf(args);}} while (0)
extern char *__name__;
/* print to stderr */
-#define err(args...) fprintf(stderr,args)
+#define err(args...) eprintf(args)
/* better perror() */
#define perr(args...) do { \
int _errno = errno; \
- fputs("ERROR: ", stderr); \
- fprintf(stderr, args); \
- fprintf(stderr, ": %s\n", strerror(_errno)); \
+ eprintf("ERROR: "); \
+ eprintf(args); \
+ eprintf(": %s\n", strerror(_errno)); \
} while (0)
/* Error messages. Use these for serious errors, not informational messages to stderr. */
-#define _err(args...) do {fprintf(stderr,"%s:%s:%d: ERROR: ",__name__, __FUNCTION__, __LINE__); fprintf(stderr,args);} while(0)
+#define _err(args...) do {eprintf("%s:%s:%d: ERROR: ",__name__, __FUNCTION__, __LINE__); eprintf(args);} while(0)
#define _perr(args...) do { \
int _errno = errno; \
_err(args); \
- fprintf(stderr, ": %s\n", strerror(_errno)); \
+ eprintf(": %s\n", strerror(_errno)); \
} while (0)
#define overflow_error() _err("Internal buffer overflow. Please file a bug report.\n")