diff options
Diffstat (limited to 'qarsh/qarsh_packet.c')
-rw-r--r-- | qarsh/qarsh_packet.c | 147 |
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); |