aboutsummaryrefslogtreecommitdiff
path: root/audio/xmms2-scrobbler/files
diff options
context:
space:
mode:
authorEugene Grosbein <eugen@FreeBSD.org>2017-07-25 09:08:31 +0000
committerEugene Grosbein <eugen@FreeBSD.org>2017-07-25 09:08:31 +0000
commite9bef0ebb9196ebb2abee88aaeb283946bc6922a (patch)
tree1e4c9ea14202c2ce7e5f2f219e0270e951dc2540 /audio/xmms2-scrobbler/files
parent4db2bc30413c3be06cbdcc371f20c256c6b3a8f1 (diff)
downloadports-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.c196
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);