From: Wei Liu <wei.liu2@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: Wei Liu <wei.liu2@citrix.com>, Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [PATCH 2/6] xenconsoled: switch hypervisor log to use logfile abstraction
Date: Mon, 6 Jun 2016 16:59:37 +0100 [thread overview]
Message-ID: <1465228781-22754-3-git-send-email-wei.liu2@citrix.com> (raw)
In-Reply-To: <1465228781-22754-1-git-send-email-wei.liu2@citrix.com>
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@citrix.com>
---
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@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-06-06 15:59 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-06 15:59 [PATCH 0/6] xenconsoled: rotating log file abstration Wei Liu
2016-06-06 15:59 ` [PATCH 1/6] xenconsoled: introduce log file abstraction Wei Liu
2016-07-08 16:50 ` Ian Jackson
2016-06-06 15:59 ` Wei Liu [this message]
2016-07-08 16:58 ` [PATCH 2/6] xenconsoled: switch hypervisor log to use logfile abstraction Ian Jackson
2016-06-06 15:59 ` [PATCH 3/6] xenconsoled: switch guest " Wei Liu
2016-07-08 17:01 ` Ian Jackson
2016-06-06 15:59 ` [PATCH 4/6] xenconsoled: delete two now unused functions Wei Liu
2016-07-08 17:01 ` Ian Jackson
2016-06-06 15:59 ` [PATCH 5/6] xenconsoled: options to control log rotation Wei Liu
2016-07-08 17:02 ` Ian Jackson
2016-06-06 15:59 ` [PATCH 6/6] xenconsoled: handle --log-backups 0 in logfile_rollover Wei Liu
2016-07-08 17:03 ` Ian Jackson
2016-06-06 20:40 ` [PATCH 0/6] xenconsoled: rotating log file abstration Doug Goldstein
2016-06-07 8:07 ` Wei Liu
2016-06-07 9:44 ` David Vrabel
2016-06-07 9:55 ` Wei Liu
2016-06-07 10:17 ` David Vrabel
2016-06-07 10:21 ` Wei Liu
2016-06-07 10:29 ` David Vrabel
2016-06-07 10:34 ` Wei Liu
2016-06-07 10:35 ` David Vrabel
2016-06-07 10:43 ` Wei Liu
2016-07-02 10:24 ` Wei Liu
2016-07-04 17:07 ` Ian Jackson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1465228781-22754-3-git-send-email-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).