summaryrefslogtreecommitdiffstats
path: root/qarsh/qarsh_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'qarsh/qarsh_packet.c')
-rw-r--r--qarsh/qarsh_packet.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/qarsh/qarsh_packet.c b/qarsh/qarsh_packet.c
index bad614f..f3f5559 100644
--- a/qarsh/qarsh_packet.c
+++ b/qarsh/qarsh_packet.c
@@ -18,6 +18,8 @@ int parse_qp_runcmd(xmlXPathContextPtr ctxt, struct qa_packet *qp);
int parse_qp_cmdexit(xmlXPathContextPtr ctxt, struct qa_packet *qp);
int parse_qp_setuser(xmlXPathContextPtr ctxt, struct qa_packet *qp);
int parse_qp_kill(xmlXPathContextPtr ctxt, struct qa_packet *qp);
+int parse_qp_recvfile(xmlXPathContextPtr ctxt, struct qa_packet *qp);
+int parse_qp_sendfile(xmlXPathContextPtr ctxt, struct qa_packet *qp);
void string_qp_hello(xmlNodePtr node, struct qa_packet *qp);
void string_qp_returncode(xmlNodePtr node, struct qa_packet *qp);
@@ -26,11 +28,15 @@ void string_qp_ack(xmlNodePtr node, struct qa_packet *qp);
void string_qp_cmdexit(xmlNodePtr node, struct qa_packet *qp);
void string_qp_setuser(xmlNodePtr node, struct qa_packet *qp);
void string_qp_kill(xmlNodePtr node, struct qa_packet *qp);
+void string_qp_recvfile(xmlNodePtr node, struct qa_packet *qp);
+void string_qp_sendfile(xmlNodePtr node, struct qa_packet *qp);
void free_qp_hello(struct qa_packet *qp);
void free_qp_returncode(struct qa_packet *qp);
void free_qp_runcmd(struct qa_packet *qp);
void free_qp_setuser(struct qa_packet *qp);
+void free_qp_recvfile(struct qa_packet *qp);
+void free_qp_sendfile(struct qa_packet *qp);
void dump_qp_ack(struct qa_packet *qp);
void dump_qp_runcmd(struct qa_packet *qp);
@@ -38,6 +44,8 @@ void dump_qp_returncode(struct qa_packet *qp);
void dump_qp_cmdexit(struct qa_packet *qp);
void dump_qp_setuser(struct qa_packet *qp);
void dump_qp_kill(struct qa_packet *qp);
+void dump_qp_recvfile(struct qa_packet *qp);
+void dump_qp_sendfile(struct qa_packet *qp);
struct packet_internals {
@@ -95,6 +103,18 @@ struct packet_internals {
.pi_string = string_qp_kill,
.pi_free = NULL,
.pi_dump = dump_qp_kill
+ }, {
+ .pi_name = "recvfile",
+ .pi_parse = parse_qp_recvfile,
+ .pi_string = string_qp_recvfile,
+ .pi_free = free_qp_recvfile,
+ .pi_dump = dump_qp_recvfile
+ }, {
+ .pi_name = "sendfile",
+ .pi_parse = parse_qp_sendfile,
+ .pi_string = string_qp_sendfile,
+ .pi_free = free_qp_sendfile,
+ .pi_dump = dump_qp_sendfile
}
};
@@ -216,6 +236,44 @@ parse_qp_kill(xmlXPathContextPtr ctxt, struct qa_packet *qp)
return 0;
}
+int
+parse_qp_recvfile(xmlXPathContextPtr ctxt, struct qa_packet *qp)
+{
+ char *s;
+
+ qp->qp_recvfile.qp_path = get_xpath_string(ctxt, "param[@name='path']");
+
+ s = get_xpath_string(ctxt, "param[@name='if_port']");
+ qp->qp_recvfile.qp_if_port = atoi(s);
+ free(s);
+
+ s = get_xpath_string(ctxt, "param[@name='count']");
+ qp->qp_recvfile.qp_count = atoi(s);
+ free(s);
+
+ s = get_xpath_string(ctxt, "param[@name='mode']");
+ qp->qp_recvfile.qp_mode = atoi(s);
+ free(s);
+
+ return 0;
+}
+
+int
+parse_qp_sendfile(xmlXPathContextPtr ctxt, struct qa_packet *qp)
+{
+ char *s;
+
+ qp->qp_sendfile.qp_path = get_xpath_string(ctxt, "param[@name='path']");
+ s = get_xpath_string(ctxt, "param[@name='of_port']");
+ qp->qp_sendfile.qp_of_port = atoi(s);
+ free(s);
+ s = get_xpath_string(ctxt, "param[@name='count']");
+ qp->qp_sendfile.qp_count = atoi(s);
+ free(s);
+ return 0;
+}
+
+
struct qa_packet *
parse_packet(xmlXPathContextPtr ctxt)
{
@@ -377,6 +435,33 @@ void string_qp_kill(xmlNodePtr node, struct qa_packet *qp)
xmlAddChild(node, make_param("signal", tmpstr));
}
+void string_qp_recvfile(xmlNodePtr node, struct qa_packet *qp)
+{
+ char tmpstr[32];
+
+ xmlAddChild(node, make_param("path", qp->qp_recvfile.qp_path));
+
+ snprintf(tmpstr, 32, "%d", qp->qp_recvfile.qp_if_port);
+ xmlAddChild(node, make_param("if_port", tmpstr));
+
+ snprintf(tmpstr, 32, "%d", qp->qp_recvfile.qp_count);
+ xmlAddChild(node, make_param("count", tmpstr));
+
+ snprintf(tmpstr, 32, "%d", qp->qp_recvfile.qp_mode);
+ xmlAddChild(node, make_param("mode", tmpstr));
+}
+
+void string_qp_sendfile(xmlNodePtr node, struct qa_packet *qp)
+{
+ char tmpstr[32];
+
+ xmlAddChild(node, make_param("path", qp->qp_sendfile.qp_path));
+ snprintf(tmpstr, 32, "%d", qp->qp_sendfile.qp_of_port);
+ xmlAddChild(node, make_param("of_port", tmpstr));
+ snprintf(tmpstr, 32, "%d", qp->qp_sendfile.qp_count);
+ xmlAddChild(node, make_param("count", tmpstr));
+}
+
/* Must pass in a pointer, but not a malloc'ed pointer */
char *
qptostr(struct qa_packet *qp, char **qpstr, int *qpsize)
@@ -518,6 +603,38 @@ make_qp_kill(int sig)
return qp;
}
+struct qa_packet *
+make_qp_recvfile(const char *path, int if_port, size_t count, mode_t mode)
+{
+ struct qa_packet *qp;
+ qp = malloc(sizeof *qp);
+ assert(qp);
+ memset(qp, 0, sizeof *qp);
+
+ qp->qp_type = QP_RECVFILE;
+ qp->qp_recvfile.qp_path = strdup(path);
+ qp->qp_recvfile.qp_if_port = if_port;
+ qp->qp_recvfile.qp_count = count;
+ qp->qp_recvfile.qp_mode = mode;
+
+ return qp;
+}
+
+struct qa_packet *
+make_qp_sendfile(const char *path, int of_port, size_t count)
+{
+ struct qa_packet *qp;
+ qp = malloc(sizeof *qp);
+ assert(qp);
+ memset(qp, 0, sizeof *qp);
+
+ qp->qp_type = QP_SENDFILE;
+ qp->qp_sendfile.qp_path = strdup(path);
+ qp->qp_sendfile.qp_of_port = of_port;
+ qp->qp_sendfile.qp_count = count;
+ return qp;
+}
+
/*
* Packet deallocation functions
*/
@@ -547,6 +664,19 @@ free_qp_setuser(struct qa_packet *qp)
}
void
+free_qp_recvfile(struct qa_packet *qp)
+{
+ condfree(qp->qp_recvfile.qp_path);
+}
+
+void
+free_qp_sendfile(struct qa_packet *qp)
+{
+ condfree(qp->qp_sendfile.qp_path);
+}
+
+
+void
qpfree(struct qa_packet *qp)
{
if (qp) {
@@ -608,6 +738,23 @@ dump_qp_kill(struct qa_packet *qp)
}
void
+dump_qp_recvfile(struct qa_packet *qp)
+{
+ printf("\tpath: %s\n", qp->qp_recvfile.qp_path);
+ printf("\tif_port: %d\n", qp->qp_recvfile.qp_if_port);
+ printf("\tcount: %d\n", qp->qp_recvfile.qp_count);
+ printf("\tmode: %o\n", qp->qp_recvfile.qp_mode);
+}
+
+void
+dump_qp_sendfile(struct qa_packet *qp)
+{
+ printf("\tpath: %s\n", qp->qp_sendfile.qp_path);
+ printf("\tof_port: %d\n", qp->qp_sendfile.qp_of_port);
+ printf("\tcount: %d\n", qp->qp_sendfile.qp_count);
+}
+
+void
dump_qp(struct qa_packet *qp)
{
printf("%s #%d\n", QP_NAME(qp->qp_type), qp->qp_seq);