svn commit: r446563 - in head/audio/xmms2-scrobbler: . files

Eugene Grosbein eugen at FreeBSD.org
Tue Jul 25 09:08:32 UTC 2017


Author: eugen
Date: Tue Jul 25 09:08:31 2017
New Revision: 446563
URL: https://svnweb.freebsd.org/changeset/ports/446563

Log:
  Fix Lasf.fm API 1.x compatibility. User may disable new option APIFIX
  in case it breaks compatibility with alternative services.
  
  PR:		220992
  Submitted by:	Eugene Zheganin
  Approved by:	az (mentor)

Added:
  head/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c   (contents, props changed)
Modified:
  head/audio/xmms2-scrobbler/Makefile

Modified: head/audio/xmms2-scrobbler/Makefile
==============================================================================
--- head/audio/xmms2-scrobbler/Makefile	Tue Jul 25 09:01:05 2017	(r446562)
+++ head/audio/xmms2-scrobbler/Makefile	Tue Jul 25 09:08:31 2017	(r446563)
@@ -3,7 +3,7 @@
 
 PORTNAME=	xmms2-scrobbler
 PORTVERSION=	0.4.0
-PORTREVISION=	3
+PORTREVISION=	4
 CATEGORIES=	audio
 MASTER_SITES=	ftp://ftp.code-monkey.de/pub/${PORTNAME}/
 
@@ -24,7 +24,11 @@ PORTDOCS=	README
 
 SUB_FILES=	pkg-message
 
-OPTIONS_DEFINE=	DOCS
+OPTIONS_DEFINE=		APIFIX DOCS
+OPTIONS_DEFAULT=	APIFIX DOCS
+
+APIFIX_DESC=	Apply fix for Last.fm API 1.x
+APIFIX_EXTRA_PATCHES_ON=	${FILESDIR}/extra-patch-xmms2-scrobbler.c
 
 post-install:
 	@${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xmms2-scrobbler

Added: head/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/audio/xmms2-scrobbler/files/extra-patch-xmms2-scrobbler.c	Tue Jul 25 09:08:31 2017	(r446563)
@@ -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);


More information about the svn-ports-all mailing list