summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-02-22 16:40:05 +0100
committerHans de Goede <hdegoede@redhat.com>2013-02-22 17:54:23 +0100
commit765803fce0c880b471e6f2e03b6641a92d05a919 (patch)
tree9dccc7cda399ea177e850a10f970db1d42a2ace8 /src
parent029843152cbb72c5fc96eef332fbcb240c436b58 (diff)
downloadvd_agent-765803fce0c880b471e6f2e03b6641a92d05a919.tar.gz
vd_agent-765803fce0c880b471e6f2e03b6641a92d05a919.tar.xz
vd_agent-765803fce0c880b471e6f2e03b6641a92d05a919.zip
file-xfers: Improve debug logging
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/vdagent-file-xfers.c84
-rw-r--r--src/vdagent-file-xfers.h2
-rw-r--r--src/vdagent.c2
3 files changed, 54 insertions, 34 deletions
diff --git a/src/vdagent-file-xfers.c b/src/vdagent-file-xfers.c
index 5c59a6c..a562def 100644
--- a/src/vdagent-file-xfers.c
+++ b/src/vdagent-file-xfers.c
@@ -41,6 +41,7 @@
struct vdagent_file_xfers {
GHashTable *xfers;
struct udscs_connection *vdagentd;
+ int debug;
};
typedef struct AgentFileXferTask {
@@ -49,6 +50,7 @@ typedef struct AgentFileXferTask {
uint64_t read_bytes;
char *file_name;
uint64_t file_size;
+ int debug;
} AgentFileXferTask;
static void vdagent_file_xfer_task_free(gpointer data)
@@ -60,12 +62,17 @@ static void vdagent_file_xfer_task_free(gpointer data)
if (task->file_fd > 0) {
close(task->file_fd);
}
+
+ if (task->debug)
+ syslog(LOG_DEBUG, "file-xfer: Removing task %u %s",
+ task->id, task->file_name);
+
g_free(task->file_name);
g_free(task);
}
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd)
+ struct udscs_connection *vdagentd, int debug)
{
struct vdagent_file_xfers *xfers;
@@ -73,6 +80,7 @@ struct vdagent_file_xfers *vdagent_file_xfers_create(
xfers->xfers = g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, vdagent_file_xfer_task_free);
xfers->vdagentd = vdagentd;
+ xfers->debug = debug;
return xfers;
}
@@ -83,6 +91,18 @@ void vdagent_file_xfers_destroy(struct vdagent_file_xfers *xfers)
g_free(xfers);
}
+AgentFileXferTask *vdagent_file_xfers_get_task(
+ struct vdagent_file_xfers *xfers, uint32_t id)
+{
+ AgentFileXferTask *task;
+
+ task = g_hash_table_lookup(xfers->xfers, GUINT_TO_POINTER(id));
+ if (task == NULL)
+ syslog(LOG_ERR, "file-xfer: error can not find task %u", id);
+
+ return task;
+}
+
/* Parse start message then create a new file xfer task */
static AgentFileXferTask *vdagent_parse_start_msg(
VDAgentFileXferStartMessage *msg)
@@ -122,10 +142,10 @@ static AgentFileXferTask *vdagent_parse_start_msg(
error:
g_clear_error(&error);
- vdagent_file_xfer_task_free(task);
- if (keyfile) {
+ if (task)
+ vdagent_file_xfer_task_free(task);
+ if (keyfile)
g_key_file_free(keyfile);
- }
return NULL;
}
@@ -141,6 +161,7 @@ void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
goto error;
}
+ new->debug = xfers->debug;
desktop = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP);
if (desktop == NULL) {
goto error;
@@ -161,6 +182,10 @@ void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
g_hash_table_insert(xfers->xfers, GINT_TO_POINTER(msg->id), new);
+ if (xfers->debug)
+ syslog(LOG_DEBUG, "file-xfer: Adding task %u %s %"PRIu64" bytes",
+ new->id, file_path, new->file_size);
+
udscs_write(xfers->vdagentd, VDAGENTD_FILE_XFER_STATUS,
msg->id, VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA, NULL, 0);
g_free(file_path);
@@ -169,27 +194,28 @@ void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
error:
udscs_write(xfers->vdagentd, VDAGENTD_FILE_XFER_STATUS,
msg->id, VD_AGENT_FILE_XFER_STATUS_ERROR, NULL, 0);
- vdagent_file_xfer_task_free(new);
+ if (new)
+ vdagent_file_xfer_task_free(new);
g_free(file_path);
}
void vdagent_file_xfers_status(struct vdagent_file_xfers *xfers,
VDAgentFileXferStatusMessage *msg)
{
- syslog(LOG_INFO, "file-xfer: task %d received response %d",
- msg->id, msg->result);
-
- if (msg->result == VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA) {
- /* Do nothing */
- } else {
- /* Error, remove this task */
- gboolean found;
- found = g_hash_table_remove(xfers->xfers, GINT_TO_POINTER(msg->id));
- if (found) {
- syslog(LOG_DEBUG, "file-xfer: remove task %d", msg->id);
- } else {
- syslog(LOG_ERR, "file-xfer: can not find task %d", msg->id);
- }
+ AgentFileXferTask *task;
+
+ task = vdagent_file_xfers_get_task(xfers, msg->id);
+ if (!task)
+ return;
+
+ switch (msg->result) {
+ case VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA:
+ syslog(LOG_ERR, "file-xfer: task %u %s received unexpected 0 response",
+ task->id, task->file_name);
+ break;
+ default:
+ /* Cancel or Error, remove this task */
+ g_hash_table_remove(xfers->xfers, GINT_TO_POINTER(msg->id));
}
}
@@ -199,11 +225,9 @@ void vdagent_file_xfers_data(struct vdagent_file_xfers *xfers,
AgentFileXferTask *task;
int len;
- task = g_hash_table_lookup(xfers->xfers, GINT_TO_POINTER(msg->id));
- if (task == NULL) {
- syslog(LOG_INFO, "file-xfer: can not find task %d", msg->id);
- return ;
- }
+ task = vdagent_file_xfers_get_task(xfers, msg->id);
+ if (!task)
+ return;
len = write(task->file_fd, msg->data, msg->size);
if (len == -1) {
@@ -215,16 +239,12 @@ void vdagent_file_xfers_data(struct vdagent_file_xfers *xfers,
task->read_bytes += msg->size;
if (task->read_bytes >= task->file_size) {
- gboolean found;
if (task->read_bytes > task->file_size) {
syslog(LOG_ERR, "file-xfer: error received too much data");
}
- syslog(LOG_DEBUG, "file-xfer: task %d has completed", task->id);
- found = g_hash_table_remove(xfers->xfers, GINT_TO_POINTER(msg->id));
- if (found) {
- syslog(LOG_DEBUG, "file-xfer: remove task %d", msg->id);
- } else {
- syslog(LOG_ERR, "file-xfer: can not find task %d", msg->id);
- }
+ if (xfers->debug)
+ syslog(LOG_DEBUG, "file-xfer: task %u %s has completed",
+ task->id, task->file_name);
+ g_hash_table_remove(xfers->xfers, GINT_TO_POINTER(msg->id));
}
}
diff --git a/src/vdagent-file-xfers.h b/src/vdagent-file-xfers.h
index e51a18e..79ff732 100644
--- a/src/vdagent-file-xfers.h
+++ b/src/vdagent-file-xfers.h
@@ -27,7 +27,7 @@
struct vdagent_file_xfers;
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd);
+ struct udscs_connection *vdagentd, int debug);
void vdagent_file_xfers_destroy(struct vdagent_file_xfers *xfer);
void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
diff --git a/src/vdagent.c b/src/vdagent.c
index 0250ec8..ba199de 100644
--- a/src/vdagent.c
+++ b/src/vdagent.c
@@ -233,7 +233,7 @@ reconnect:
return 1;
}
- vdagent_file_xfers = vdagent_file_xfers_create(client);
+ vdagent_file_xfers = vdagent_file_xfers_create(client, debug);
while (client && !quit) {
FD_ZERO(&readfds);