diff options
Diffstat (limited to 'libwardrobe/src/main.c')
-rw-r--r-- | libwardrobe/src/main.c | 139 |
1 files changed, 46 insertions, 93 deletions
diff --git a/libwardrobe/src/main.c b/libwardrobe/src/main.c index 1872c69..af0a32b 100644 --- a/libwardrobe/src/main.c +++ b/libwardrobe/src/main.c @@ -1,5 +1,6 @@ /* -Copyright (c) 2008 Lars-Dominik Braun +Copyright (c) 2008-2009 + Lars-Dominik Braun <PromyLOPh@lavabit.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -24,98 +25,36 @@ THE SOFTWARE. #include <stdlib.h> #include <string.h> #include <stdio.h> -#include <curl/curl.h> +#include <waitress.h> #include "wardrobe.h" #include "md5.h" #include "config.h" -#define WARDROBE_HTTP_BUFFER_SIZE 10000 +#define WARDROBE_HTTP_SEND_SIZE 10*1024 +#define WARDROBE_HTTP_RECV_SIZE 1024 +#define WARDROBE_URL_SIZE 1024 -void WardrobeSongInit (WardrobeSong_t *ws) { - memset (ws, 0, sizeof (*ws)); -} - -/* callback for curl, writes data to buffer - * @param received data - * @param block size - * @param blocks received - * @param write data into this buffer - * @return written bytes - */ -size_t WardrobeCurlRetToVar (void *ptr, size_t size, size_t nmemb, - void *stream) { - char *streamPtr = stream; - - if ((strlen (streamPtr) + nmemb) > (WARDROBE_HTTP_BUFFER_SIZE - 1)) { - printf ("buffer overflow...\n"); - return 0; - } else { - memcpy (streamPtr+strlen(streamPtr), ptr, size*nmemb); - return size*nmemb; - } -} - -/* receive data from url using GET method - * @param initialized curl handle - * @param call this url - * @param put received data here, memory is allocated by this function - * @return nothing yet - */ -void WardrobeHttpGet (CURL *ch, const char *url, char **retData) { - /* Let's hope nothing will be bigger than this... */ - char curlRet[WARDROBE_HTTP_BUFFER_SIZE]; - - memset (curlRet, 0, sizeof (curlRet)); - - curl_easy_setopt (ch, CURLOPT_URL, url); - curl_easy_setopt (ch, CURLOPT_HTTPGET, 1L); - curl_easy_setopt (ch, CURLOPT_WRITEFUNCTION, WardrobeCurlRetToVar); - curl_easy_setopt (ch, CURLOPT_WRITEDATA, (void *) curlRet); - - curl_easy_perform (ch); - - *retData = strdup (curlRet); -} - -/* post data to url and receive answer as string - * @param initialized curl handle - * @param call this url - * @param post this data - * @param put received data here, memory is allocated by this function - * @return nothing yet +/* Initialize song structure + * @param wardrobe sond */ -void WardrobeHttpPost (CURL *ch, const char *url, const char *postData, - char **retData) { - /* Let's hope nothing will be bigger than this... */ - char curlRet[WARDROBE_HTTP_BUFFER_SIZE]; - - memset (curlRet, 0, sizeof (curlRet)); - curl_easy_setopt (ch, CURLOPT_URL, url); - curl_easy_setopt (ch, CURLOPT_POSTFIELDS, postData); - curl_easy_setopt (ch, CURLOPT_WRITEFUNCTION, WardrobeCurlRetToVar); - curl_easy_setopt (ch, CURLOPT_WRITEDATA, (void *) curlRet); - - curl_easy_perform (ch); - - *retData = strdup (curlRet); +inline void WardrobeSongInit (WardrobeSong_t *ws) { + memset (ws, 0, sizeof (*ws)); } /* initialize wardrobe handle (setup curl, e.g.) * @param wardrobe handle */ -void WardrobeInit (WardrobeHandle_t *wh) { +inline void WardrobeInit (WardrobeHandle_t *wh) { memset (wh, 0, sizeof (*wh)); - wh->ch = curl_easy_init (); - curl_easy_setopt (wh->ch, CURLOPT_USERAGENT, PACKAGE); - curl_easy_setopt (wh->ch, CURLOPT_CONNECTTIMEOUT, 60); + WaitressInit (&wh->waith); } /* free () replacement that does some checks and zeros memory * @param pointer * @param size or 0 to disable zeroing */ -void WardrobeFree (void *ptr, size_t size) { +inline void WardrobeFree (void *ptr, size_t size) { if (ptr != NULL) { if (size > 0) { memset (ptr, 0, size); @@ -140,7 +79,7 @@ void WardrobeSongDestroy (WardrobeSong_t *ws) { void WardrobeDestroy (WardrobeHandle_t *wh) { WardrobeFree (wh->user, 0); WardrobeFree (wh->password, 0); - curl_easy_cleanup (wh->ch); + WaitressFree (&wh->waith); memset (wh, 0, sizeof (*wh)); } @@ -149,18 +88,22 @@ void WardrobeDestroy (WardrobeHandle_t *wh) { * @return _OK or error */ WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) { - char url[1024], tmp[100], *tmpDigest, *pwDigest, *ret; + /* 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]; WardrobeReturn_t fRet = WARDROBE_RET_ERR; time_t currTStamp = time (NULL); tmpDigest = WardrobeMd5Calc (wh->password); snprintf (tmp, sizeof (tmp), "%s%li", tmpDigest, currTStamp); pwDigest = WardrobeMd5Calc (tmp); - snprintf (url, sizeof (url), "http://post.audioscrobbler.com/" - "?hs=true&p=1.2&c=tst&v=1.0&u=%s&t=%li&a=%s", wh->user, - currTStamp, pwDigest); + snprintf (url, sizeof (url), "?hs=true&p=1.2&c=tst&v=1.0&u=%s&t=%li&a=%s", + wh->user, currTStamp, pwDigest); - WardrobeHttpGet (wh->ch, url, &ret); + WaitressSetHPP (&wh->waith, "post.audioscrobbler.com", "80", url); + if (WaitressFetchBuf (&wh->waith, ret, sizeof (ret)) != WAITRESS_RET_OK) { + return WARDROBE_RET_CONNECT_ERR; + } /* parse answer */ if (memcmp (ret, "OK", 2) == 0) { @@ -178,9 +121,13 @@ WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) { } else { printf ("buffer overflow!\n"); } - if (newlines[4] - newlines[3]-1 < sizeof (wh->postUrl)) { - memcpy (wh->postUrl, newlines[3]+1, newlines[4] - + if (newlines[4] - newlines[3]-1 < sizeof (postUrl)) { + memset (postUrl, 0, sizeof (postUrl)); + memcpy (postUrl, newlines[3]+1, newlines[4] - newlines[3]-1); + WaitressSplitUrl (postUrl, wh->postHost, sizeof (wh->postHost), + wh->postPort, sizeof (wh->postPort), wh->postPath, + sizeof (wh->postPath)); } else { printf ("buffer overflow!\n"); } @@ -195,7 +142,6 @@ WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) { WardrobeFree (tmpDigest, WARDROBE_MD5_DIGEST_LEN); WardrobeFree (pwDigest, WARDROBE_MD5_DIGEST_LEN); - WardrobeFree (ret, 0); return fRet; } @@ -207,30 +153,33 @@ WardrobeReturn_t WardrobeHandshake (WardrobeHandle_t *wh) { */ WardrobeReturn_t WardrobeSendSong (WardrobeHandle_t *wh, const WardrobeSong_t *ws) { - char postContent[10000]; - char *urlencArtist, *urlencTitle, *urlencAlbum, *ret; + char postContent[WARDROBE_HTTP_SEND_SIZE]; + char *urlencArtist, *urlencTitle, *urlencAlbum, ret[WARDROBE_HTTP_RECV_SIZE]; WardrobeReturn_t fRet = WARDROBE_RET_ERR; - urlencArtist = curl_easy_escape (wh->ch, ws->artist, 0); - urlencTitle = curl_easy_escape (wh->ch, ws->title, 0); - urlencAlbum = curl_easy_escape (wh->ch, ws->album, 0); + urlencArtist = WaitressUrlEncode (ws->artist); + urlencTitle = WaitressUrlEncode (ws->title); + urlencAlbum = WaitressUrlEncode (ws->album); snprintf (postContent, sizeof (postContent), "s=%s&a[0]=%s&t[0]=%s&" "i[0]=%li&o[0]=P&r[0]=&l[0]=%li&b[0]=%s&n[0]=&m[0]=", wh->authToken, urlencArtist, urlencTitle, ws->started, ws->length, urlencAlbum); - WardrobeHttpPost (wh->ch, wh->postUrl, postContent, &ret); + WaitressSetHPP (&wh->waith, wh->postHost, wh->postPort, wh->postPath); + if (WaitressFetchBuf (&wh->waith, ret, sizeof (ret)) != WAITRESS_RET_OK) { + return WARDROBE_RET_CONNECT_ERR; + } + if (memcmp (ret, "OK", 2) == 0) { fRet = WARDROBE_RET_OK; } else if (memcmp (ret, "BADSESSION", 10) == 0) { fRet = WARDROBE_RET_BADSESSION; } - curl_free (urlencArtist); - curl_free (urlencTitle); - curl_free (urlencAlbum); - WardrobeFree (ret, 0); + WardrobeFree (urlencArtist, 0); + WardrobeFree (urlencTitle, 0); + WardrobeFree (urlencAlbum, 0); return fRet; } @@ -293,6 +242,10 @@ const char *WardrobeErrorToString (WardrobeReturn_t ret) { return "Bad session. Try to login again."; break; + case WARDROBE_RET_CONNECT_ERR: + return "Connection failed."; + break; + default: return "Unknown Error."; break; |