Package: cdtool Version: 2.1.8-release-1 Severity: normal Tags: patch
The 'cdown' tool in the cdtool package gets mildly confused when looking up a CD if it gets a multi-line reply for any one entry in that CD's description. For example the 'DTITLE' response can look like: DTITLE=the artist / the first part of the album title that goes DTITLE=on and on and takes two lines This will confuse 'cdown' (which expect DTITLE to occur just once). 'cdown' has a similar problem with TTITLE entries, which can span multiple lines, too For a specific freeddb entry with both problems, see http://www.freedb.org/freedb/misc/aa101a0d I have a very hacky patchy (see below) that 'fixes' the problem. I've only tested it on this one sample, so its not ready to be put back. I can clean the patch up, but figured I'd wait for some feedback. Upstream seems to be offline (the URLs in the README are stale), so I haven't tried pushing the patch there yet. -- System Information: Debian Release: 5.0.6 APT prefers stable APT policy: (500, 'stable') Architecture: i386 (i686) Kernel: Linux 2.6.26-2-686 (SMP w/1 CPU core) Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Shell: /bin/sh linked to /bin/bash Versions of packages cdtool depends on: ii libc6 2.7-18lenny6 GNU C Library: Shared libraries cdtool recommends no packages. cdtool suggests no packages. -- debconf information: cdtool/unknown_audiocd_device: -- Patch: diff -du cdtool-2.1.8.ORIG/cdown.c cdtool-2.1.8/cdown.c --- cdtool-2.1.8.ORIG/cdown.c 2005-10-17 12:11:59.000000000 -0700 +++ cdtool-2.1.8/cdown.c 2011-01-20 00:57:08.000000000 -0800 @@ -27,6 +27,9 @@ /* CHANGELOG * + * 0.7 Modification by Patrick Tullmann + * Handle wrap-around entries (e.g., http://www.freedb.org/freedb/misc/aa101a0d) + * * 0.6 Modifications by Max Vozeler * Relicensed under the GNU GPL with Byron's permission. * @@ -71,6 +74,7 @@ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> +#include <ctype.h> #include <errno.h> #include <netdb.h> #include <unistd.h> @@ -448,7 +452,11 @@ void readinfo(char *categ, char *discid) { char *message; char *firstword; - char *cdtitle; + char artist[1024]; + char cdname[1024]; + char trktitle[64][1024]; + int maxtrk = -1; + int i; netprintf(sock, "cddb read %s %s\n", categ, discid); message = getline(); @@ -466,29 +474,82 @@ return; printf ("%s\r\n", message); } + + // Start with empty names + memset(artist, 0, sizeof(artist)); + memset(cdname, 0, sizeof(cdname)); + artist[0] = '\0'; + cdname[0] = '\0'; + for (i = 0; i < 64; i++) { + memset(&(trktitle[i][0]), 0, sizeof(trktitle[i])); + } + do { message = getline(); firstword = strchr(message, '='); if (firstword != NULL) { - *firstword = '\0'; + *firstword = '\0'; /* split message at 'firstword' (overwrite '=') */ + firstword++; // skip the '\0' + + /* + * Only care about DTITLE and TTITLE entries. DTITLE gets + * parsed at first '/' into artist / album. + * + * Entries can be split on multiple lines: + * + * DTITLE=Kanye West / My Beautiful Dark Twisted Fantasy [US, B0014695-02 + * DTITLE=] + */ + if (strcmp(message, "DTITLE") == 0) { - cdtitle = strchr(firstword+1, '/'); - if (cdtitle == NULL) { - cdtitle = firstword+1; + if (cdname[0] == '\0') { + // Still parsing artists name + char* tmpname = strchr(firstword, '/'); + if (tmpname == NULL) { + strcat(artist, tmpname); // XXX overflow + } else { + *tmpname = ' '; // replace '/' with ' ' + while (tmpname > firstword && isspace(*tmpname)) --tmpname; // eat trailing spaces at the end of artist + ++tmpname; // preserve the non-space + *tmpname = '\0'; // truncate artist name + ++tmpname; + + // Save artist onto cd title + strcat(artist, firstword);// XXX overflow + + // Remainder is cdname: + while (isspace(*tmpname)) ++tmpname; // eat leading space at front of tmpname + + // Save + strcat(cdname, tmpname);// XXX overflow + } } else { - *cdtitle = ' '; - while(*--cdtitle == ' ') ; - *++cdtitle = '\0'; - while (*++cdtitle == ' ') ; + // DTITLE entry is just more cdname: + strcat(cdname, firstword); } - printf("cdname %s\n", cdtitle); - printf("artist %s\n", firstword+1); + } else if (strncmp(message, "TTITLE", 6) == 0) { - printf("track %s\n", firstword+1); + int tnum = atoi(message+6); + if (tnum < 0 || tnum > 64) { + fprintf(stderr, "Illegal track number in: %s\n", message); + } + strcat(&(trktitle[tnum][0]), firstword);// XXX overflow + + if (tnum > maxtrk) { + maxtrk = tnum; + } } } /* printf("%s\n", message);*/ } while (strcmp(message, ".") != 0); + + + printf("cdname %s\n", cdname); + printf("artist %s\n", artist); + for (i = 0; i < maxtrk; i++) { + printf("track %s\n", trktitle[i]); + } + printf("\n"); } -- To UNSUBSCRIBE, email to debian-qa-packages-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20110120091704.13913.36424.report...@cerberus.casapizza.net