diff options
author | David Troy <dave@popvox.com> | 2006-07-01 15:43:37 +0000 |
---|---|---|
committer | David Troy <dave@popvox.com> | 2006-07-01 15:43:37 +0000 |
commit | 5d52864609b3750bfeb7cda411802900aa190fc3 (patch) | |
tree | a7989cf5de2e99955310d8508582e6d19e8712d0 /src/xml.c | |
parent | 926f2742b7295cc83b2377535ebcaca2ad09936d (diff) | |
download | astmanproxy-5d52864609b3750bfeb7cda411802900aa190fc3.tar.gz astmanproxy-5d52864609b3750bfeb7cda411802900aa190fc3.tar.xz astmanproxy-5d52864609b3750bfeb7cda411802900aa190fc3.zip |
Cleanup 1.21pre into 1.21 (release)
git-svn-id: http://svncommunity.digium.com/svn/astmanproxy/trunk@129 f02b47b9-160a-0410-81a6-dc3441afb0ec
Diffstat (limited to 'src/xml.c')
-rw-r--r-- | src/xml.c | 235 |
1 files changed, 118 insertions, 117 deletions
@@ -1,10 +1,11 @@ -/* Asterisk Manager Proxy - Copyright (c) 2005 David C. Troy <dave@popvox.com> +/* Asterisk Manager Proxy + Copyright (c) 2005-2006 David C. Troy <dave@popvox.com> - This program is free software, distributed under the terms of - the GNU General Public License. + This program is free software, distributed under the terms of + the GNU General Public License. - XML I/O Handler + xml.c + XML I/O Handler */ #include "astmanproxy.h" @@ -21,138 +22,138 @@ int ParseXMLInput(char *xb, struct message *m); int _read(struct mansession *s, struct message *m) { - /* Note: No single line may be longer than MAX_LEN/s->inbuf, as per get_input */ - /* No XML Input may be longer than BUFSIZE */ + /* Note: No single line may be longer than MAX_LEN/s->inbuf, as per get_input */ + /* No XML Input may be longer than BUFSIZE */ - char line[MAX_LEN], xmlbuf[BUFSIZE]; - int res; + char line[MAX_LEN], xmlbuf[BUFSIZE]; + int res; - /* first let's read the whole xml block into our buffer */ - memset(xmlbuf, 0, sizeof xmlbuf); - for (;;) { - memset(line, 0, sizeof line); - res = get_input(s, line); + /* first let's read the whole xml block into our buffer */ + memset(xmlbuf, 0, sizeof xmlbuf); + for (;;) { + memset(line, 0, sizeof line); + res = get_input(s, line); - if (res > 0) { - if (*line == '\0' ) { - break; - } else if (strlen(xmlbuf) < (BUFSIZE - strlen(line)) ) - strcat(xmlbuf, line); - } else if (res < 0) - return res; - } + if (res > 0) { + if (*line == '\0' ) { + break; + } else if (strlen(xmlbuf) < (BUFSIZE - strlen(line)) ) + strcat(xmlbuf, line); + } else if (res < 0) + return res; + } - /* now, let's transform and copy into a standard message block */ - debugmsg("Got xml: %s", xmlbuf); - res = ParseXMLInput(xmlbuf, m); + /* now, let's transform and copy into a standard message block */ + debugmsg("Got xml: %s", xmlbuf); + res = ParseXMLInput(xmlbuf, m); - if (res < 0) - proxyerror_do(s, "Invalid XML Input"); + if (res < 0) + proxyerror_do(s, "Invalid XML Input"); - /* Return res>0 to process block, return res<0 to kill client, res=0, continue */ - return res; + /* Return res>0 to process block, return res<0 to kill client, res=0, continue */ + return res; } void *setdoctag(char *tag, struct mansession *s) { - /* if message came from a server, say so; otherwise it must be from proxy */ - /* right now there is no such thing as client<->client comms */ - if (s && s->server) - strcpy(tag, XML_SERVERTAG); - else - strcpy(tag, XML_PROXYTAG); + /* if message came from a server, say so; otherwise it must be from proxy */ + /* right now there is no such thing as client<->client comms */ + if (s && s->server) + strcpy(tag, XML_SERVERTAG); + else + strcpy(tag, XML_PROXYTAG); - return 0; + return 0; } int _write(struct mansession *s, struct message *m) { - int i; - char buf[BUFSIZE], outstring[MAX_LEN*3], xmlescaped[MAX_LEN*3], xmldoctag[MAX_LEN]; - char *dpos, *lpos; - - setdoctag(xmldoctag, m->session); - sprintf(buf, "<%s>\r\n", xmldoctag); - - pthread_mutex_lock(&s->lock); - ast_carefulwrite(s->fd, buf, strlen(buf), s->writetimeout); - - for (i=0; i<m->hdrcount; i++) { - memset(xmlescaped, 0, sizeof xmlescaped); - xml_quote_string(m->headers[i], xmlescaped); - lpos = xmlescaped; - dpos = strstr(lpos, ": "); - if (dpos && *(lpos)!= ' ' && strlen(xmlescaped)<30 ) { - strcpy(outstring, " <"); - strncat(outstring, lpos, dpos-lpos); - strcat(outstring, " Value=\""); - strncat(outstring, dpos+2, strlen(dpos)-2); - strcat(outstring, "\"/>\r\n"); - } else - sprintf(outstring, " <%s Value=\"%s\"/>\r\n", XML_UNPARSED, lpos); - ast_carefulwrite(s->fd, outstring, strlen(outstring), s->writetimeout); - } - sprintf(buf, "</%s>\r\n\r\n", xmldoctag); - ast_carefulwrite(s->fd, buf, strlen(buf), s->writetimeout); - pthread_mutex_unlock(&s->lock); - - return 0; + int i; + char buf[BUFSIZE], outstring[MAX_LEN*3], xmlescaped[MAX_LEN*3], xmldoctag[MAX_LEN]; + char *dpos, *lpos; + + setdoctag(xmldoctag, m->session); + sprintf(buf, "<%s>\r\n", xmldoctag); + + pthread_mutex_lock(&s->lock); + ast_carefulwrite(s->fd, buf, strlen(buf), s->writetimeout); + + for (i=0; i<m->hdrcount; i++) { + memset(xmlescaped, 0, sizeof xmlescaped); + xml_quote_string(m->headers[i], xmlescaped); + lpos = xmlescaped; + dpos = strstr(lpos, ": "); + if (dpos && *(lpos)!= ' ' && strlen(xmlescaped)<30 ) { + strcpy(outstring, " <"); + strncat(outstring, lpos, dpos-lpos); + strcat(outstring, " Value=\""); + strncat(outstring, dpos+2, strlen(dpos)-2); + strcat(outstring, "\"/>\r\n"); + } else + sprintf(outstring, " <%s Value=\"%s\"/>\r\n", XML_UNPARSED, lpos); + ast_carefulwrite(s->fd, outstring, strlen(outstring), s->writetimeout); + } + sprintf(buf, "</%s>\r\n\r\n", xmldoctag); + ast_carefulwrite(s->fd, buf, strlen(buf), s->writetimeout); + pthread_mutex_unlock(&s->lock); + + return 0; } /* Takes a single manager header line and converts xml entities */ void xml_quote_string(char *s, char *o) { - char *c; - c = s; - - do { - if (*c == '<') - strcat(o, "<"); - else if (*c == '>') - strcat(o, ">"); - else if (*c == '&') - strcat(o, "&"); - else if (*c == '"') - strcat(o, """); - else if (*c == '\n') - strcat(o, " "); - else - strncat(o, c, 1); - } while (*(c++)); - - return; + char *c; + c = s; + + do { + if (*c == '<') + strcat(o, "<"); + else if (*c == '>') + strcat(o, ">"); + else if (*c == '&') + strcat(o, "&"); + else if (*c == '"') + strcat(o, """); + else if (*c == '\n') + strcat(o, " "); + else + strncat(o, c, 1); + } while (*(c++)); + + return; } int ParseXMLInput(char *xb, struct message *m) { - char *b, *e, *bt, *et, tag[MAX_LEN], *i; - int res = 0; - - /* just an empty block; go home */ - if ( !(*xb) ) - return 0; - - /* initialize message block */ - memset(m, 0, sizeof(struct message) ); - - b = strstr(xb, XML_BEGIN_INPUT); - e = strstr(xb, XML_END_INPUT); - if (b && e) { - bt = strstr((char *)(b + strlen(XML_BEGIN_INPUT) + 1), "<"); - while (bt < e) { - et = strstr(bt+1, "<"); - memset(tag, 0, sizeof tag); - strncpy(tag, bt, (et-bt) ); - bt = et; - - strncpy( m->headers[m->hdrcount], tag+1, strstr(tag+1," ")-(tag+1) ); - strcat(m->headers[m->hdrcount], ": "); - i = strstr(tag+1, "\"") + 1; - strncat( m->headers[m->hdrcount], i, strstr(i, "\"") - i ); - debugmsg("parsed: %s", m->headers[m->hdrcount]); - m->hdrcount++; - } - res = 1; - } else - res = -1; - - return res; + char *b, *e, *bt, *et, tag[MAX_LEN], *i; + int res = 0; + + /* just an empty block; go home */ + if ( !(*xb) ) + return 0; + + /* initialize message block */ + memset(m, 0, sizeof(struct message) ); + + b = strstr(xb, XML_BEGIN_INPUT); + e = strstr(xb, XML_END_INPUT); + if (b && e) { + bt = strstr((char *)(b + strlen(XML_BEGIN_INPUT) + 1), "<"); + while (bt < e) { + et = strstr(bt+1, "<"); + memset(tag, 0, sizeof tag); + strncpy(tag, bt, (et-bt) ); + bt = et; + + strncpy( m->headers[m->hdrcount], tag+1, strstr(tag+1," ")-(tag+1) ); + strcat(m->headers[m->hdrcount], ": "); + i = strstr(tag+1, "\"") + 1; + strncat( m->headers[m->hdrcount], i, strstr(i, "\"") - i ); + debugmsg("parsed: %s", m->headers[m->hdrcount]); + m->hdrcount++; + } + res = 1; + } else + res = -1; + + return res; } |