diff options
author | Eugene Grosbein <eugen@FreeBSD.org> | 2017-07-25 09:08:31 +0000 |
---|---|---|
committer | Eugene Grosbein <eugen@FreeBSD.org> | 2017-07-25 09:08:31 +0000 |
commit | e9bef0ebb9196ebb2abee88aaeb283946bc6922a (patch) | |
tree | 1e4c9ea14202c2ce7e5f2f219e0270e951dc2540 /audio/xmms2-scrobbler/files | |
parent | 4db2bc30413c3be06cbdcc371f20c256c6b3a8f1 (diff) | |
download | ports-e9bef0ebb9196ebb2abee88aaeb283946bc6922a.tar.gz ports-e9bef0ebb9196ebb2abee88aaeb283946bc6922a.zip |
Notes
Diffstat (limited to 'audio/xmms2-scrobbler/files')
-rw-r--r-- | audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c b/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c new file mode 100644 index 000000000000..84380c0cf4d3 --- /dev/null +++ b/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c @@ -0,0 +1,196 @@ +--- src/xmms2-scrobbler.c.orig 2009-12-30 17:04:01 UTC ++++ src/xmms2-scrobbler.c +@@ -140,93 +140,126 @@ signal_handler (int sig) + keep_running = false; + } + +-static size_t +-handle_handshake_reponse (void *rawptr, size_t size, size_t nmemb, +- void *data) +-{ +- Server *server = data; +- size_t total = size * nmemb, left = total; +- char *ptr = rawptr, *newline; +- int len; ++char * get_line_from_response (char *answer, int lfpos) { ++ int lfpositions[10]; ++ int i, k, lfcounter, start, end, resultlen; + +- newline = memchr (ptr, '\n', left); +- if (!newline) { +- fprintf (stderr, "no newline (1)\n"); +- return total; +- } ++ char *result; + +- *newline = 0; ++#ifdef DEBUG ++ fprintf (stderr, "DEBUG: got string: %s\n", answer); ++#endif + +- if (strcmp (ptr, "OK")) { +- fprintf (stderr, "handshake failed\n"); +- return total; ++ /* marking the string */ ++ i = 0; ++ lfcounter = 0; ++ while (answer[i] != '\0') { ++ if (answer[i] == '\n' && lfcounter < 10) { ++ lfpositions[lfcounter] = i; ++ lfcounter++; ++#ifdef DEBUG ++ fprintf (stderr, "DEBUG: got LF location: %d\n", i); ++#endif + } ++ i++; ++ } ++ /* getting the actual line */ ++ /* getting the size of it */ + +- len = newline - ptr + 1; ++ start = lfpos - 1; ++ end = lfpos; ++#ifdef DEBUG ++ if (start >= 0) { ++ fprintf (stderr, "DEBUG: requested line starts at char no. %d and ends at %d.\n", lfpositions[start], lfpositions[end]); ++ } else { ++ fprintf (stderr, "DEBUG: requested line starts at the start of string and ends at char no. %d.\n", lfpositions[end]); ++ } ++#endif + +- left -= len; +- ptr += len; ++ if (start >= 0) { ++ resultlen = lfpositions[end] - lfpositions[start] + 1; ++ } else { ++ resultlen = lfpositions[end] + 1; ++ } ++#ifdef DEBUG ++ fprintf (stderr, "DEBUG: requested line will need %d bytes.\n", resultlen); ++#endif ++ result = malloc(resultlen); ++ bzero(result, resultlen); + +- newline = memchr (ptr, '\n', left); +- if (!newline) { +- fprintf (stderr, "no newline (1)\n"); +- return total; ++ /* bytecopying the line */ ++#ifdef DEBUG ++ if (start >= 0) { ++ fprintf (stderr, "DEBUG: copying the string from char no. %d to %d.\n", lfpositions[start], lfpositions[end]); ++ } else { ++ fprintf (stderr, "DEBUG: copying the string from the beginning to char no. %d.\n", lfpositions[end]); ++ } ++#endif ++ k = 0; ++ if (start >= 0) { ++ i = lfpositions[start]; ++ } else { ++ i = 0; ++ } ++ while (i < lfpositions[end]) { ++ /* don't copy LF themselves */ ++ if (answer[i] != '\n') { ++ result[k] = answer[i]; ++ k++; + } ++ i++; ++ } + +- *newline = 0; +- +- len = newline - ptr + 1; ++#ifdef DEBUG ++ fprintf (stderr, "DEBUG: returning string: %s\n", result); ++#endif ++ return(result); ++} + +- if (len > 255) { +- fprintf (stderr, "session ID is too long (%i characters)\n", len); +- return total; +- } ++static size_t ++handle_handshake_reponse (void *rawptr, size_t size, size_t nmemb, ++ void *data) ++{ ++ Server *server; ++ size_t total, left; ++ char *ptr, *status, *sessionid, *np_url, *subm_url; + +- strcpy (server->session_id, ptr); ++ server = data; ++ ptr = rawptr; ++ total = size * nmemb; ++ left = total; + +- left -= len; +- ptr += len; ++#ifdef DEBUG ++ fprintf (stderr, "DEBUG: got string \"%s\".\n", rawptr); ++#endif + +- /* now playing URL */ +- newline = memchr (ptr, '\n', left); +- if (!newline) { +- fprintf (stderr, "no newline (2)\n"); +- return total; ++ status = get_line_from_response(rawptr, 0); ++ ++ if (strcmp(status, "OK") != 0) { ++ fprintf (stderr, "WARNING: handshake failed: %s.\n", status); ++ return(total); + } + +- *newline = 0; +- +- len = newline - ptr + 1; +- +- if (len > 255) { +- fprintf (stderr, "now_playing URL is too long " +- "(%i characters)\n", len); +- return total; ++ sessionid = get_line_from_response(rawptr, 3); ++ if (strlen(sessionid) > 255) { ++ fprintf (stderr, "ERROR: session ID is too long (%ld characters).\n", strlen(sessionid)); ++ return(total); + } ++ strcpy (server->session_id, sessionid); + +- strcpy (server->np_url, ptr); +- +- left -= len; +- ptr += len; +- +- /* submission URL */ +- newline = memchr (ptr, '\n', left); +- if (!newline) { +- printf("no newline (3)\n"); +- return total; ++ np_url = get_line_from_response(rawptr, 6); ++ if (strlen(np_url) > 255) { ++ fprintf (stderr, "ERROR: nowplaying URL is too long (%ld characters).\n", strlen(np_url)); ++ return(total); + } ++ strcpy (server->np_url, np_url); + +- *newline = 0; +- +- len = newline - ptr + 1; +- +- if (len > 255) { +- fprintf (stderr, "submission URL is too long " +- "(%i characters)\n", len); +- return total; ++ subm_url = get_line_from_response(rawptr, 9); ++ if (strlen(sessionid) > 255) { ++ fprintf (stderr, "ERROR: submission URL is too long (%ld characters).\n", strlen(subm_url)); ++ return(total); + } +- +- strcpy (server->subm_url, ptr); ++ strcpy (server->subm_url, subm_url); + + fprintf (stderr, "got:\n'%s' '%s' '%s'\n", + server->session_id, server->np_url, server->subm_url); |