[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/6] xenconsoled: switch hypervisor log to use logfile abstraction
To minimise code churn, copy and paste a some existing functions and adapt them to write to logfile. The functions to deal with fd directly will go away eventually. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/console/daemon/io.c | 95 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 24 deletions(-) diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 7e6a886..228c4af 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -21,6 +21,7 @@ #include "utils.h" #include "io.h" +#include "logfile.h" #include <xenevtchn.h> #include <xengnttab.h> #include <xenstore.h> @@ -71,7 +72,7 @@ extern int discard_overflowed_data; static int log_time_hv_needts = 1; static int log_time_guest_needts = 1; -static int log_hv_fd = -1; +static struct logfile *log_hv_file; static xengnttab_handle *xgt_handle = NULL; @@ -127,6 +128,15 @@ static int write_all(int fd, const char* buf, size_t len) return 0; } +static int write_logfile(struct logfile *logfile, const char *buf, + size_t len) +{ + ssize_t r = logfile_append(logfile, buf, len); + + if (r < 0) return -1; + return 0; +} + static int write_with_timestamp(int fd, const char *data, size_t sz, int *needts) { @@ -158,6 +168,38 @@ static int write_with_timestamp(int fd, const char *data, size_t sz, return 0; } +static int write_logfile_with_timestamp(struct logfile *logfile, + const char *data, size_t sz, + int *needts) +{ + char ts[32]; + time_t now = time(NULL); + const struct tm *tmnow = localtime(&now); + size_t tslen = strftime(ts, sizeof(ts), "[%Y-%m-%d %H:%M:%S] ", tmnow); + const char *last_byte = data + sz - 1; + + while (data <= last_byte) { + const char *nl = memchr(data, '\n', last_byte + 1 - data); + int found_nl = (nl != NULL); + if (!found_nl) + nl = last_byte; + + if ((*needts && logfile_append(logfile, ts, tslen)) + || logfile_append(logfile, data, nl + 1 - data)) + return -1; + + *needts = found_nl; + data = nl + 1; + if (found_nl) { + // If we printed a newline, strip all \r following it + while (data <= last_byte && *data == '\r') + data++; + } + } + + return 0; +} + static void buffer_append(struct domain *dom) { struct buffer *buffer = &dom->buffer; @@ -265,29 +307,33 @@ static bool domain_is_valid(int domid) return ret; } -static int create_hv_log(void) +static struct logfile *create_hv_log(void) { char logfile[PATH_MAX]; - int fd; + struct logfile *tmp; + snprintf(logfile, PATH_MAX-1, "%s/hypervisor.log", log_dir); logfile[PATH_MAX-1] = '\0'; - fd = open(logfile, O_WRONLY|O_CREAT|O_APPEND, 0644); - if (fd == -1) + tmp = logfile_new(logfile, 0644); + + if (!tmp) dolog(LOG_ERR, "Failed to open log %s: %d (%s)", logfile, errno, strerror(errno)); - if (fd != -1 && log_time_hv) { - if (write_with_timestamp(fd, "Logfile Opened\n", - strlen("Logfile Opened\n"), - &log_time_hv_needts) < 0) { + + if (tmp && log_time_hv) { + if (write_logfile_with_timestamp(tmp, "Logfile Opened\n", + strlen("Logfile Opened\n"), + &log_time_hv_needts) < 0) { dolog(LOG_ERR, "Failed to log opening timestamp " - "in %s: %d (%s)", logfile, errno, + "in %s: %d (%s)", tmp->basepath, errno, strerror(errno)); - close(fd); - return -1; + logfile_free(tmp); + return NULL; } } - return fd; + + return tmp; } static int create_domain_log(struct domain *dom) @@ -929,10 +975,11 @@ static void handle_hv_logs(xenevtchn_handle *xce_handle, bool force) break; if (log_time_hv) - logret = write_with_timestamp(log_hv_fd, buffer, size, - &log_time_hv_needts); + logret = write_logfile_with_timestamp(log_hv_file, + buffer, size, + &log_time_hv_needts); else - logret = write_all(log_hv_fd, buffer, size); + logret = write_logfile(log_hv_file, buffer, size); if (logret < 0) dolog(LOG_ERR, "Failed to write hypervisor log: " @@ -955,9 +1002,9 @@ static void handle_log_reload(void) } if (log_hv) { - if (log_hv_fd != -1) - close(log_hv_fd); - log_hv_fd = create_hv_log(); + if (log_hv_file) + logfile_free(log_hv_file); + log_hv_file = create_hv_log(); } } @@ -1017,8 +1064,8 @@ void handle_io(void) errno, strerror(errno)); goto out; } - log_hv_fd = create_hv_log(); - if (log_hv_fd == -1) + log_hv_file = create_hv_log(); + if (!log_hv_file) goto out; log_hv_evtchn = xenevtchn_bind_virq(xce_handle, VIRQ_CON_RING); if (log_hv_evtchn == -1) { @@ -1199,9 +1246,9 @@ void handle_io(void) current_array_size = 0; out: - if (log_hv_fd != -1) { - close(log_hv_fd); - log_hv_fd = -1; + if (log_hv_file) { + logfile_free(log_hv_file); + log_hv_file = NULL; } if (xce_handle != NULL) { xenevtchn_close(xce_handle); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |