diff options
| -rw-r--r-- | libpiano/src/http.c | 9 | ||||
| -rw-r--r-- | libpiano/src/http.h | 4 | ||||
| -rw-r--r-- | libpiano/src/main.c | 107 | ||||
| -rw-r--r-- | libwaitress/src/main.c | 46 | ||||
| -rw-r--r-- | libwaitress/src/waitress.h | 2 | ||||
| -rw-r--r-- | libwardrobe/src/main.c | 11 | 
6 files changed, 100 insertions, 79 deletions
| diff --git a/libpiano/src/http.c b/libpiano/src/http.c index f21b839..98b5e11 100644 --- a/libpiano/src/http.c +++ b/libpiano/src/http.c @@ -39,7 +39,7 @@ THE SOFTWARE.   *	@return _RET_OK or _RET_NET_ERROR   */  PianoReturn_t PianoHttpPost (WaitressHandle_t *waith, const char *postData, -		char *retData, size_t retDataSize) { +		char **retData) {  	PianoReturn_t pRet = PIANO_RET_NET_ERROR;  	char *reqPostData = PianoEncryptString (postData); @@ -51,7 +51,7 @@ PianoReturn_t PianoHttpPost (WaitressHandle_t *waith, const char *postData,  	waith->postData = reqPostData;  	waith->method = WAITRESS_METHOD_POST; -	if (WaitressFetchBuf (waith, retData, retDataSize) == WAITRESS_RET_OK) { +	if (WaitressFetchBuf (waith, retData) == WAITRESS_RET_OK) {  		pRet = PIANO_RET_OK;  	} @@ -66,13 +66,12 @@ PianoReturn_t PianoHttpPost (WaitressHandle_t *waith, const char *postData,   *	@param buffer size   *	@return _RET_OK or _RET_NET_ERROR   */ -PianoReturn_t PianoHttpGet (WaitressHandle_t *waith, char *retData, -		size_t retDataSize) { +PianoReturn_t PianoHttpGet (WaitressHandle_t *waith, char **retData) {  	waith->extraHeaders = NULL;  	waith->postData = NULL;  	waith->method = WAITRESS_METHOD_GET; -	if (WaitressFetchBuf (waith, retData, retDataSize) == WAITRESS_RET_OK) { +	if (WaitressFetchBuf (waith, retData) == WAITRESS_RET_OK) {  		return PIANO_RET_OK;  	}  	return PIANO_RET_NET_ERROR; diff --git a/libpiano/src/http.h b/libpiano/src/http.h index c56ef8b..de9fdad 100644 --- a/libpiano/src/http.h +++ b/libpiano/src/http.h @@ -27,7 +27,7 @@ THE SOFTWARE.  #include <waitress.h>  #include "piano.h" -PianoReturn_t PianoHttpPost (WaitressHandle_t *, const char *, char *, size_t); -PianoReturn_t PianoHttpGet (WaitressHandle_t *, char *, size_t); +PianoReturn_t PianoHttpPost (WaitressHandle_t *, const char *, char **); +PianoReturn_t PianoHttpGet (WaitressHandle_t *, char **);  #endif /* _HTTP_H */ diff --git a/libpiano/src/main.c b/libpiano/src/main.c index 844d757..d108c09 100644 --- a/libpiano/src/main.c +++ b/libpiano/src/main.c @@ -38,8 +38,6 @@ THE SOFTWARE.  #define PIANO_RPC_PORT "80"  #define PIANO_RPC_PATH "/radio/xmlrpc/v" PIANO_PROTOCOL_VERSION "?"  #define PIANO_SEND_BUFFER_SIZE 10000 -/* station responses are _huge_... */ -#define PIANO_RECV_BUFFER 100*1024  /* prototypes */  static PianoReturn_t PianoAddFeedback (PianoHandle_t *, const char *, const char *, @@ -189,7 +187,7 @@ void PianoDestroy (PianoHandle_t *ph) {   */  PianoReturn_t PianoConnect (PianoHandle_t *ph, const char *user,  		const char *password) { -	char retStr[PIANO_RECV_BUFFER], xmlSendBuf[PIANO_SEND_BUFFER_SIZE]; +	char *retStr, xmlSendBuf[PIANO_SEND_BUFFER_SIZE];  	PianoReturn_t ret;  	/* sync and throw away result (it's an encrypted timestamp, decrypt with @@ -199,7 +197,8 @@ PianoReturn_t PianoConnect (PianoHandle_t *ph, const char *user,  			"<params></params></methodCall>");  	snprintf (ph->waith.path, sizeof (ph->waith.path), PIANO_RPC_PATH  			"rid=%s&method=sync", ph->routeId); -	ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, sizeof (retStr)); +	ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr); +	PianoFree (retStr, 0);  	if (ret != PIANO_RET_OK) {  		return ret; @@ -216,9 +215,10 @@ PianoReturn_t PianoConnect (PianoHandle_t *ph, const char *user,  	snprintf (ph->waith.path, sizeof (ph->waith.path), PIANO_RPC_PATH  			"rid=%s&method=authenticateListener", ph->routeId); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseUserinfo (ph, retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -229,7 +229,7 @@ PianoReturn_t PianoConnect (PianoHandle_t *ph, const char *user,   *	@param piano handle filled with some authentication data by PianoConnect   */  PianoReturn_t PianoGetStations (PianoHandle_t *ph) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -241,9 +241,10 @@ PianoReturn_t PianoGetStations (PianoHandle_t *ph) {  			"rid=%s&lid=%s&method=getStations", ph->routeId,  			ph->user.listenerId); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseStations (ph, retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -255,7 +256,7 @@ PianoReturn_t PianoGetStations (PianoHandle_t *ph) {   */  PianoReturn_t PianoGetPlaylist (PianoHandle_t *ph, const char *stationId,  		PianoAudioFormat_t format) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	/* FIXME: remove static numbers */ @@ -276,9 +277,10 @@ PianoReturn_t PianoGetPlaylist (PianoHandle_t *ph, const char *stationId,  			ph->user.listenerId, stationId,  			PianoAudioFormatToString (format)); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParsePlaylist (ph, retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -339,7 +341,7 @@ static PianoReturn_t PianoAddFeedback (PianoHandle_t *ph, const char *stationId,  		const char *songMusicId, const char *songMatchingSeed,  		const char *songUserSeed, const char *songFocusTraitId,  		PianoSongRating_t rating) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret = PIANO_RET_ERR;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -369,9 +371,10 @@ static PianoReturn_t PianoAddFeedback (PianoHandle_t *ph, const char *stationId,  			(songFocusTraitId == NULL) ? "" : songFocusTraitId,  			(rating == PIANO_RATE_LOVE) ? "true" : "false"); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseSimple (retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -386,7 +389,7 @@ static PianoReturn_t PianoAddFeedback (PianoHandle_t *ph, const char *stationId,   */  PianoReturn_t PianoRenameStation (PianoHandle_t *ph, PianoStation_t *station,  		const char *newName) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	char *urlencodedNewName, *xmlencodedNewName;  	PianoReturn_t ret = PIANO_RET_ERR; @@ -408,12 +411,13 @@ PianoReturn_t PianoRenameStation (PianoHandle_t *ph, PianoStation_t *station,  			"rid=%s&lid=%s&method=setStationName&arg1=%s&arg2=%s",  			ph->routeId, ph->user.listenerId, station->id, urlencodedNewName); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		if ((ret = PianoXmlParseSimple (retStr)) == PIANO_RET_OK) {  			PianoFree (station->name, 0);  			station->name = strdup (newName);  		} +		PianoFree (retStr, 0);  	}  	PianoFree (urlencodedNewName, 0); @@ -428,7 +432,7 @@ PianoReturn_t PianoRenameStation (PianoHandle_t *ph, PianoStation_t *station,   *	@param station you want to delete   */  PianoReturn_t PianoDeleteStation (PianoHandle_t *ph, PianoStation_t *station) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret = PIANO_RET_ERR;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -442,8 +446,8 @@ PianoReturn_t PianoDeleteStation (PianoHandle_t *ph, PianoStation_t *station) {  	snprintf (ph->waith.path, sizeof (ph->waith.path), PIANO_RPC_PATH  			"rid=%s&lid=%s&method=removeStation&arg1=%s", ph->routeId,  			ph->user.listenerId, station->id); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		if ((ret = PianoXmlParseSimple (retStr)) == PIANO_RET_OK) {  			/* delete station from local station list */  			PianoStation_t *curStation = ph->stations, *lastStation = NULL; @@ -478,7 +482,7 @@ PianoReturn_t PianoDeleteStation (PianoHandle_t *ph, PianoStation_t *station) {   */  PianoReturn_t PianoSearchMusic (PianoHandle_t *ph,  		const char *searchStr, PianoSearchResult_t *searchResult) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	char *xmlencodedSearchStr, *urlencodedSearchStr;  	PianoReturn_t ret; @@ -499,9 +503,10 @@ PianoReturn_t PianoSearchMusic (PianoHandle_t *ph,  			"rid=%s&lid=%s&method=search&arg1=%s", ph->routeId,  			ph->user.listenerId, urlencodedSearchStr); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseSearch (retStr, searchResult); +		PianoFree (retStr, 0);  	}  	PianoFree (urlencodedSearchStr, 0); @@ -519,7 +524,7 @@ PianoReturn_t PianoSearchMusic (PianoHandle_t *ph,   */  PianoReturn_t PianoCreateStation (PianoHandle_t *ph, const char *type,  		const char *id) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -534,9 +539,10 @@ PianoReturn_t PianoCreateStation (PianoHandle_t *ph, const char *type,  			"rid=%s&lid=%s&method=createStation&arg1=%s%s", ph->routeId,  			ph->user.listenerId, type, id); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseCreateStation (ph, retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -553,7 +559,7 @@ PianoReturn_t PianoCreateStation (PianoHandle_t *ph, const char *type,   */  PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph,  		PianoStation_t *station, const char *musicId) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -569,9 +575,10 @@ PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph,  			"rid=%s&lid=%s&method=addSeed&arg1=%s&arg2=%s", ph->routeId,  			ph->user.listenerId, station->id, musicId); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseAddSeed (ph, retStr, station); +		PianoFree (retStr, 0);  	}  	return ret; @@ -583,7 +590,7 @@ PianoReturn_t PianoStationAddMusic (PianoHandle_t *ph,   *	@return _OK or error   */  PianoReturn_t PianoSongTired (PianoHandle_t *ph, const PianoSong_t *song) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -598,9 +605,10 @@ PianoReturn_t PianoSongTired (PianoHandle_t *ph, const PianoSong_t *song) {  			"rid=%s&lid=%s&method=addTiredSong&arg1=%s", ph->routeId,  			ph->user.listenerId, song->identity); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseSimple (retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -612,7 +620,7 @@ PianoReturn_t PianoSongTired (PianoHandle_t *ph, const PianoSong_t *song) {   */  PianoReturn_t PianoSetQuickmix (PianoHandle_t *ph) {  	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], valueBuf[1000], urlArgBuf[1000], -			retStr[PIANO_RECV_BUFFER]; +			*retStr;  	PianoReturn_t ret;  	PianoStation_t *curStation = ph->stations; @@ -652,9 +660,10 @@ PianoReturn_t PianoSetQuickmix (PianoHandle_t *ph) {  			"rid=%s&lid=%s&method=setQuickMix&arg1=RANDOM&arg2=%s",  			ph->routeId, ph->user.listenerId, urlArgBuf); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseSimple (retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -681,15 +690,16 @@ PianoStation_t *PianoFindStationById (PianoStation_t *stations,   *	@return _OK or error   */  PianoReturn_t PianoGetGenreStations (PianoHandle_t *ph) { -	char retStr[PIANO_RECV_BUFFER]; +	char *retStr;  	PianoReturn_t ret;  	snprintf (ph->waith.path, sizeof (ph->waith.path), "/xml/genre?r=%li",  			time (NULL)); -	if ((ret = PianoHttpGet (&ph->waith, retStr, sizeof (retStr))) == +	if ((ret = PianoHttpGet (&ph->waith, &retStr)) ==  			PIANO_RET_OK) {  		ret = PianoXmlParseGenreExplorer (ph, retStr); +		PianoFree (retStr, 0);  	}  	return ret; @@ -703,7 +713,7 @@ PianoReturn_t PianoGetGenreStations (PianoHandle_t *ph) {   */  PianoReturn_t PianoTransformShared (PianoHandle_t *ph,  		PianoStation_t *station) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -718,14 +728,15 @@ PianoReturn_t PianoTransformShared (PianoHandle_t *ph,  			"rid=%s&lid=%s&method=transformShared&arg1=%s", ph->routeId,  			ph->user.listenerId, station->id); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseTranformStation (retStr);  		/* though this call returns a bunch of "new" data only this one is  		 * changed and important (at the moment) */  		if (ret == PIANO_RET_OK) {  			station->isCreator = 1;  		} +		PianoFree (retStr, 0);  	}  	return ret; @@ -739,7 +750,7 @@ PianoReturn_t PianoTransformShared (PianoHandle_t *ph,   */  PianoReturn_t PianoExplain (PianoHandle_t *ph, const PianoSong_t *song,  		char **retExplain) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -755,9 +766,10 @@ PianoReturn_t PianoExplain (PianoHandle_t *ph, const PianoSong_t *song,  			"rid=%s&lid=%s&method=method=narrative&arg1=%s&arg2=%s",  			ph->routeId, ph->user.listenerId, song->stationId, song->musicId); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseNarrative (retStr, retExplain); +		PianoFree (retStr, 0);  	}  	return ret; @@ -771,7 +783,7 @@ PianoReturn_t PianoExplain (PianoHandle_t *ph, const PianoSong_t *song,   */  PianoReturn_t PianoSeedSuggestions (PianoHandle_t *ph, const char *musicId,  		unsigned int max, PianoSearchResult_t *searchResult) { -	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], retStr[PIANO_RECV_BUFFER]; +	char xmlSendBuf[PIANO_SEND_BUFFER_SIZE], *retStr;  	PianoReturn_t ret;  	snprintf (xmlSendBuf, sizeof (xmlSendBuf), "<?xml version=\"1.0\"?>" @@ -787,9 +799,10 @@ PianoReturn_t PianoSeedSuggestions (PianoHandle_t *ph, const char *musicId,  			"rid=%s&lid=%s&method=method=getSeedSuggestions&arg1=%s&arg2=%u",  			ph->routeId, ph->user.listenerId, musicId, max); -	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, retStr, -			sizeof (retStr))) == PIANO_RET_OK) { +	if ((ret = PianoHttpPost (&ph->waith, xmlSendBuf, &retStr)) == +			PIANO_RET_OK) {  		ret = PianoXmlParseSeedSuggestions (retStr, searchResult); +		PianoFree (retStr, 0);  	}  	return ret; diff --git a/libwaitress/src/main.c b/libwaitress/src/main.c index dbf1a74..cc06ec6 100644 --- a/libwaitress/src/main.c +++ b/libwaitress/src/main.c @@ -37,8 +37,7 @@ THE SOFTWARE.  typedef struct {  	char *buf; -	char *pos; -	size_t max; +	size_t pos;  } WaitressFetchBufCbBuffer_t;  inline void WaitressInit (WaitressHandle_t *waith) { @@ -178,40 +177,49 @@ inline void WaitressSetHPP (WaitressHandle_t *waith, const char *host,   *	@param data size   *	@param buffer structure   */ -static char WaitressFetchBufCb (void *recvData, size_t recvDataSize, void *extraData) { +static char WaitressFetchBufCb (void *recvData, size_t recvDataSize, +		void *extraData) {  	char *recvBytes = recvData;  	WaitressFetchBufCbBuffer_t *buffer = extraData; -	if (buffer->pos - buffer->buf + recvDataSize < buffer->max) { -		memcpy (buffer->pos, recvBytes, recvDataSize); -		buffer->pos += recvDataSize; -		*buffer->pos = '\0'; +	if (buffer->buf == NULL) { +		if ((buffer->buf = malloc (sizeof (*buffer->buf) * +				(recvDataSize + 1))) == NULL) { +			return 0; +		}  	} else { -		printf (PACKAGE ": Buffer overflow!\n"); -		return 0; +		char *newbuf; +		if ((newbuf = realloc (buffer->buf, +				sizeof (*buffer->buf) * +				(buffer->pos + recvDataSize + 1))) == NULL) { +			free (buffer->buf); +			return 0; +		} +		buffer->buf = newbuf;  	} +	memcpy (buffer->buf + buffer->pos, recvBytes, recvDataSize); +	buffer->pos += recvDataSize; +	*(buffer->buf+buffer->pos) = '\0';  	return 1;  }  /*	Fetch string. Beware! This overwrites your waith->data pointer   *	@param waitress handle - *	@param Connect to host - *	@param Port or service - *	@param Resource path - *	@param result buffer - *	@param result buffer size + *	@param result buffer, malloced (don't forget to free it yourself)   */ -WaitressReturn_t WaitressFetchBuf (WaitressHandle_t *waith, char *buf, -		size_t bufSize) { +WaitressReturn_t WaitressFetchBuf (WaitressHandle_t *waith, char **buf) {  	WaitressFetchBufCbBuffer_t buffer; +	WaitressReturn_t wRet; + +	memset (&buffer, 0, sizeof (buffer)); -	buffer.buf = buffer.pos = buf; -	buffer.max = bufSize;  	waith->data = &buffer;  	waith->callback = WaitressFetchBufCb; -	return WaitressFetchCall (waith); +	wRet = WaitressFetchCall (waith); +	*buf = buffer.buf; +	return wRet;  }  /*	write () wrapper with poll () timeout diff --git a/libwaitress/src/waitress.h b/libwaitress/src/waitress.h index 3bcf524..d8c379d 100644 --- a/libwaitress/src/waitress.h +++ b/libwaitress/src/waitress.h @@ -67,7 +67,7 @@ char WaitressSplitUrl (const char *, char *, size_t, char *, size_t, char *,  inline char WaitressSetUrl (WaitressHandle_t *, const char *);  inline void WaitressSetHPP (WaitressHandle_t *, const char *, const char *,  		const char *); -WaitressReturn_t WaitressFetchBuf (WaitressHandle_t *, char *, size_t); +WaitressReturn_t WaitressFetchBuf (WaitressHandle_t *, char **);  WaitressReturn_t WaitressFetchCall (WaitressHandle_t *);  #endif /* _WAITRESS_H */ diff --git a/libwardrobe/src/main.c b/libwardrobe/src/main.c index a734c26..e13c09d 100644 --- a/libwardrobe/src/main.c +++ b/libwardrobe/src/main.c @@ -32,7 +32,6 @@ THE SOFTWARE.  #include "config.h"  #define WARDROBE_HTTP_SEND_SIZE 10*1024 -#define WARDROBE_HTTP_RECV_SIZE 1024  #define WARDROBE_URL_SIZE 1024  /*	Initialize song structure @@ -90,7 +89,7 @@ void WardrobeDestroy (WardrobeHandle_t *wh) {  static WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) {  	/* md5 hash length + long integer max + NULL */  	char url[WARDROBE_URL_SIZE], tmp[32+55+1], *tmpDigest, *pwDigest, -			ret[WARDROBE_HTTP_RECV_SIZE], postUrl[1024]; +			*ret, postUrl[1024];  	WardrobeReturn_t fRet = WARDROBE_RET_ERR;  	time_t currTStamp = time (NULL); @@ -104,7 +103,7 @@ static WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) {  	wh->waith.method = WAITRESS_METHOD_GET;  	wh->waith.postData = NULL;  	wh->waith.extraHeaders = NULL; -	if (WaitressFetchBuf (&wh->waith, ret, sizeof (ret)) != WAITRESS_RET_OK) { +	if (WaitressFetchBuf (&wh->waith, &ret) != WAITRESS_RET_OK) {  		return WARDROBE_RET_CONNECT_ERR;  	} @@ -145,6 +144,7 @@ static WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) {  	WardrobeFree (tmpDigest, WARDROBE_MD5_DIGEST_LEN);  	WardrobeFree (pwDigest, WARDROBE_MD5_DIGEST_LEN); +	WardrobeFree (ret, 0);  	return fRet;  } @@ -157,7 +157,7 @@ static WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) {  static WardrobeReturn_t WardrobeSendSong (WardrobeHandle_t *wh,  		const WardrobeSong_t *ws) {  	char postContent[WARDROBE_HTTP_SEND_SIZE]; -	char *urlencArtist, *urlencTitle, *urlencAlbum, ret[WARDROBE_HTTP_RECV_SIZE]; +	char *urlencArtist, *urlencTitle, *urlencAlbum, *ret;  	WardrobeReturn_t fRet = WARDROBE_RET_ERR;  	urlencArtist = WaitressUrlEncode (ws->artist); @@ -173,7 +173,7 @@ static WardrobeReturn_t WardrobeSendSong (WardrobeHandle_t *wh,  	wh->waith.method = WAITRESS_METHOD_POST;  	wh->waith.postData = postContent;  	wh->waith.extraHeaders = "Content-Type: application/x-www-form-urlencoded\r\n"; -	if (WaitressFetchBuf (&wh->waith, ret, sizeof (ret)) != WAITRESS_RET_OK) { +	if (WaitressFetchBuf (&wh->waith, &ret) != WAITRESS_RET_OK) {  		return WARDROBE_RET_CONNECT_ERR;  	} @@ -186,6 +186,7 @@ static WardrobeReturn_t WardrobeSendSong (WardrobeHandle_t *wh,  	WardrobeFree (urlencArtist, 0);  	WardrobeFree (urlencTitle, 0);  	WardrobeFree (urlencAlbum, 0); +	WardrobeFree (ret, 0);  	return fRet;  } | 
