summaryrefslogtreecommitdiffstats
path: root/runtime/io.c
diff options
context:
space:
mode:
authorhunt <hunt>2005-07-01 19:05:46 +0000
committerhunt <hunt>2005-07-01 19:05:46 +0000
commit5c826f9de142a9d4558e0b3aefab9c90d70c8c54 (patch)
tree0c74c4aa71cf3d437604baf86efaaa2207d51785 /runtime/io.c
parenteb703a46c2c7118700a54f632d8eb3ae03c61681 (diff)
downloadsystemtap-steved-5c826f9de142a9d4558e0b3aefab9c90d70c8c54.tar.gz
systemtap-steved-5c826f9de142a9d4558e0b3aefab9c90d70c8c54.tar.xz
systemtap-steved-5c826f9de142a9d4558e0b3aefab9c90d70c8c54.zip
2005-07-01 Martin Hunt <hunt@redhat.com>
* alloc.c (_stp_alloc): Call _stp_error(). (_stp_valloc): Ditto. * io.c (_stp_warn): New function. (_stp_exit): New function. (_stp_error): New function. (_stp_dbug): New function. * runtime.h (dbug): Call _stp_dbug() if DEBUG is defined.
Diffstat (limited to 'runtime/io.c')
-rw-r--r--runtime/io.c126
1 files changed, 110 insertions, 16 deletions
diff --git a/runtime/io.c b/runtime/io.c
index bc691ebf..dd74eea8 100644
--- a/runtime/io.c
+++ b/runtime/io.c
@@ -1,43 +1,137 @@
-#ifndef _IO_C_ /* -*- linux-c -*- */
+/* I/O for printing warnings, errors and debug messages
+ * Copyright (C) 2005 Red Hat Inc.
+ *
+ * This file is part of systemtap, and is free software. You can
+ * redistribute it and/or modify it under the terms of the GNU General
+ * Public License (GPL); either version 2, or (at your option) any
+ * later version.
+ */
+
+#ifndef _IO_C_
#define _IO_C_
#include "transport/transport.c"
/** @file io.c
- * @brief I/O functions
+ * @brief I/O for printing warnings, errors and debug messages.
*/
/** @addtogroup io I/O
- * I/O functions
* @{
*/
/** private buffer for _stp_log() */
#define STP_LOG_BUF_LEN 2047
+#define WARN_STRING "\033[33mWARNING: \033[0m"
+#define ERR_STRING "\033[31mERROR: \033[0m"
+
static char _stp_lbuf[NR_CPUS][STP_LOG_BUF_LEN + 1];
+enum code { INFO=0, WARN, ERROR, DBUG };
+
+void _stp_print_flush (void);
+void _stp_string_cat_cstr (String str1, const char *str2);
+
+static void _stp_vlog (enum code type, char *func, int line, const char *fmt, va_list args)
+{
+ int num, ret;
+ char *buf = &_stp_lbuf[get_cpu()][0];
+ int start = 0;
+
+ if (type == DBUG) {
+ start = scnprintf(buf, STP_LOG_BUF_LEN, "\033[36m%s:%d:\033[0m ", func, line);
+ } else if (type == WARN) {
+ strcpy (buf, WARN_STRING);
+ start = sizeof(WARN_STRING) - 1;
+ } else if (type == ERROR) {
+ strcpy (buf, ERR_STRING);
+ start = sizeof(ERR_STRING) - 1;
+ }
+
+ num = vscnprintf (buf + start, STP_LOG_BUF_LEN - start, fmt, args);
+ if (num + start) {
+ if (buf[num + start - 1] != '\n') {
+ buf[num + start] = '\n';
+ num++;
+ }
+ buf[num + start] = '\0';
+
+ ret = _stp_ctrl_send(STP_REALTIME_DATA, buf, start + num + 1, t->pid);
+ if (ret < 0)
+ atomic_inc(&_stp_transport_failures);
+#ifndef STP_NETLINK_ONLY
+ _stp_string_cat_cstr(_stp_stdout,buf);
+ _stp_print_flush();
+#endif
+ }
+ put_cpu();
+}
+
/** Logs Data.
- * This function sends the message immediately to stpd.
+ * This function sends the message immediately to stpd. It
+ * will also be sent over the bulk transport (relayfs) if it is
+ * being used. If the last character is not a newline, then one
+ * is added. This function is not as efficient as _stp_printf()
+ * and should only be used for urgent messages. You probably want
+ * dbug(), or _stp_warn().
* @param fmt A variable number of args.
- * @note Lines are limited in length by printk buffer. If there is
- * no newline in the format string, then other syslog output could
- * get appended to the SystemTap line.
* @todo Evaluate if this function is necessary.
*/
-
void _stp_log (const char *fmt, ...)
{
- int num, ret;
- char *buf = &_stp_lbuf[get_cpu()][0];
va_list args;
va_start(args, fmt);
- num = vscnprintf (buf, STP_LOG_BUF_LEN, fmt, args);
+ _stp_vlog (INFO, NULL, 0, fmt, args);
va_end(args);
- buf[num] = '\0';
+}
- ret = _stp_ctrl_send(STP_REALTIME_DATA, buf, num + 1, t->pid);
- if (ret < 0)
- atomic_inc (&_stp_transport_failures);
- put_cpu();
+/** Prints warning.
+ * This function sends a warning message immediately to stpd. It
+ * will also be sent over the bulk transport (relayfs) if it is
+ * being used. If the last character is not a newline, then one
+ * is added.
+ * @param fmt A variable number of args.
+ */
+void _stp_warn (const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ _stp_vlog (WARN, NULL, 0, fmt, args);
+ va_end(args);
+}
+
+/** Exits and unloads the module.
+ * This function sends a signal to stpd to tell it to
+ * unload the module and exit.
+ */
+void _stp_exit (void)
+{
+ schedule_work (&stp_exit);
+}
+
+/** Prints error message and exits.
+ * This function sends an error message immediately to stpd. It
+ * will also be sent over the bulk transport (relayfs) if it is
+ * being used. If the last character is not a newline, then one
+ * is added.
+ *
+ * After the error message is displayed, the module will be unloaded.
+ * @param fmt A variable number of args.
+ */
+void _stp_error (const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ _stp_vlog (ERROR, NULL, 0, fmt, args);
+ va_end(args);
+ _stp_exit();
+}
+
+static void _stp_dbug (char *func, int line, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ _stp_vlog (DBUG, func, line, fmt, args);
+ va_end(args);
}
/** @} */