summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2011-09-20 11:50:02 +0200
committerLars-Dominik Braun <lars@6xq.net>2011-11-09 20:10:04 +0100
commit16b279c3ad45bb469b4319b929202a0b30a4d2ce (patch)
treee2831d9008c2a61db5df9e1597d6eb14f108f912
parentcacd2a4db3f821115e773011721c9343a87ea47a (diff)
downloadpianobar-16b279c3ad45bb469b4319b929202a0b30a4d2ce.tar.gz
pianobar-16b279c3ad45bb469b4319b929202a0b30a4d2ce.tar.bz2
pianobar-16b279c3ad45bb469b4319b929202a0b30a4d2ce.zip
waitress: split WaitressFetchCall, part 2: write
Currently leaks memory...
-rw-r--r--src/libwaitress/waitress.c75
-rw-r--r--src/libwaitress/waitress.h1
2 files changed, 47 insertions, 29 deletions
diff --git a/src/libwaitress/waitress.c b/src/libwaitress/waitress.c
index 1697258..b08985c 100644
--- a/src/libwaitress/waitress.c
+++ b/src/libwaitress/waitress.c
@@ -704,41 +704,22 @@ static WaitressReturn_t WaitressConnect (WaitressHandle_t *waith) {
return WAITRESS_RET_OK;
}
-/* Receive data from host and call *callback ()
- * @param waitress handle
- * @return WaitressReturn_t
+/* Write http header/post data to socket
*/
-WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
-/* FIXME: compiler macros are ugly... */
-#define FINISH(ret) wRet = ret; goto finish;
+static WaitressReturn_t WaitressSendRequest (WaitressHandle_t *waith) {
#define WRITE_RET(buf, count) \
if ((wRet = WaitressPollWrite (waith->request.sockfd, buf, count, \
waith->socktimeout)) != WAITRESS_RET_OK) { \
- FINISH (wRet); \
- }
-#define READ_RET(buf, count, size) \
- if ((wRet = WaitressPollRead (waith->request.sockfd, buf, count, \
- waith->socktimeout, size)) != WAITRESS_RET_OK) { \
- FINISH (wRet); \
+ return wRet; \
}
- char *buf = NULL;
- ssize_t recvSize = 0;
- WaitressReturn_t wRet = WAITRESS_RET_OK;
- /* header parser vars */
- char *nextLine = NULL, *thisLine = NULL;
- enum {HDRM_HEAD, HDRM_LINES, HDRM_FINISHED} hdrParseMode = HDRM_HEAD;
- unsigned int bufFilled = 0;
-
- /* initialize */
- memset (&waith->request, 0, sizeof (waith->request));
- waith->request.dataHandler = WaitressHandleIdentity;
-
- if ((wRet = WaitressConnect (waith)) != WAITRESS_RET_OK) {
- return wRet;
- }
+ assert (waith != NULL);
+ assert (waith->request.buf != NULL);
const char *path = waith->url.path;
+ char * const buf = waith->request.buf;
+ WaitressReturn_t wRet = WAITRESS_RET_OK;
+
if (waith->url.path == NULL) {
/* avoid NULL pointer deref */
path = "";
@@ -747,7 +728,6 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
++path;
}
- buf = malloc (WAITRESS_BUFFER_SIZE * sizeof (*buf));
/* send request */
if (WaitressProxyEnabled (waith)) {
snprintf (buf, WAITRESS_BUFFER_SIZE,
@@ -794,6 +774,44 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
WRITE_RET (waith->postData, strlen (waith->postData));
}
+ return WAITRESS_RET_OK;
+#undef WRITE_RET
+}
+
+/* Receive data from host and call *callback ()
+ * @param waitress handle
+ * @return WaitressReturn_t
+ */
+WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) {
+/* FIXME: compiler macros are ugly... */
+#define FINISH(ret) wRet = ret; goto finish;
+#define READ_RET(buf, count, size) \
+ if ((wRet = WaitressPollRead (waith->request.sockfd, buf, count, \
+ waith->socktimeout, size)) != WAITRESS_RET_OK) { \
+ FINISH (wRet); \
+ }
+
+ ssize_t recvSize = 0;
+ WaitressReturn_t wRet = WAITRESS_RET_OK;
+ /* header parser vars */
+ char *nextLine = NULL, *thisLine = NULL;
+ enum {HDRM_HEAD, HDRM_LINES, HDRM_FINISHED} hdrParseMode = HDRM_HEAD;
+ unsigned int bufFilled = 0;
+
+ /* initialize */
+ memset (&waith->request, 0, sizeof (waith->request));
+ waith->request.dataHandler = WaitressHandleIdentity;
+
+ if ((wRet = WaitressConnect (waith)) != WAITRESS_RET_OK) {
+ return wRet;
+ }
+
+ waith->request.buf = malloc (WAITRESS_BUFFER_SIZE * sizeof (*waith->request.buf));
+ if ((wRet = WaitressSendRequest (waith)) != WAITRESS_RET_OK) {
+ return wRet;
+ }
+
+ char * const buf = waith->request.buf;
/* receive answer */
nextLine = buf;
while (hdrParseMode != HDRM_FINISHED) {
@@ -900,7 +918,6 @@ finish:
return wRet;
#undef FINISH
-#undef WRITE_RET
#undef READ_RET
}
diff --git a/src/libwaitress/waitress.h b/src/libwaitress/waitress.h
index ed7d4dc..cbf17c1 100644
--- a/src/libwaitress/waitress.h
+++ b/src/libwaitress/waitress.h
@@ -71,6 +71,7 @@ typedef struct {
struct {
size_t contentLength, contentReceived, chunkSize;
int sockfd;
+ char *buf;
/* first argument is WaitressHandle_t, but that's not defined here */
WaitressHandlerReturn_t (*dataHandler) (void *, char *, const size_t);
} request;