--- orig/mp3info-0.8.5a/mp3info.c Mon Nov 6 04:03:17 2006 +++ mp3info-0.8.5a/mp3info.c Thu Mar 19 12:33:27 2009 @@ -32,6 +32,7 @@ #undef __MAIN #include +char *escape_chars=NULL; char FILENAME_FORMAT_STRING[]="File: %F\n"; char ID3_FORMAT_STRING[]="Title: %-30t Track: %n\nArtist: %a\nAlbum: %-30l Year: %y\nComment: %-30c Genre: %g [%G]\n"; char TECH_FORMAT_STRING[]="Media Type: MPEG %2.1v Layer %L\nAudio: %r KB/s, %qKHz (%o)\nEmphasis: %e\nCRC: %E\nCopyright: %C\nOriginal: %O\nPadding: %p\nLength: %m:%02s\n"; @@ -66,7 +67,7 @@ - while ((c=getopt(argc,argv,"vhGidfxFt:a:l:y:c:n:g:p:r:"))!=-1) { + while ((c=getopt(argc,argv,"vhGidfxFmt:a:l:y:c:n:g:p:r:e:"))!=-1) { switch(c) { case 'v': /* View mode is now automatic when no changes are @@ -159,6 +160,12 @@ } break; case 'F': quickscan=0; break; + case 'e': + escape_chars = optarg; + break; + case 'm': + escape_chars = "'\"\b\n\r\t\\"; + break; } } --- orig/mp3info-0.8.5a/mp3info.h Fri Nov 10 00:14:52 2006 +++ mp3info-0.8.5a/mp3info.h Thu Mar 19 10:42:07 2009 @@ -111,6 +111,7 @@ extern int galphagenreindex [MAXGENRE+2]; #endif +extern char *escape_chars; void tagedit_curs(char *filename, int filenum, int fileoutof, id3tag *tag); --- orig/mp3info-0.8.5a/textfunc.c Mon Nov 6 08:59:12 2006 +++ mp3info-0.8.5a/textfunc.c Thu Mar 19 12:24:52 2009 @@ -24,6 +24,7 @@ */ #include "mp3info.h" +#include "libgen.h" char *layer_text[] = { "I", "II", "III" @@ -70,6 +71,8 @@ "\t-n track\tSpecify ID3 v1.1 track number\n"\ "\t-t title\tSpecify ID3 track title\n"\ "\t-y year\t\tSpecify ID3 copyright year\n\n"\ + "\t-m\t\tMySQL safe output\n"\ + "\t-e\t\tCharacters to escape\n"\ "\t-G\t\tDisplay valid genres\n"\ "\t-h\t\tDisplay this help page\n"\ "\t-x\t\tDisplay technical attributes of the MP3 file\n"\ @@ -85,6 +88,7 @@ "\n\t\tConversion Specifiers\n\n"\ "\t\t%%f\tFilename without the path (string)\n"\ "\t\t%%F\tFilename with the path (string)\n"\ + "\t\t%%d\tPath without filename (string)\n"\ "\t\t%%k\tFile size in KB (integer)\n"\ "\n\t\t%%a\tArtist (string)\n"\ "\t\t%%c\tComment (string)\n"\ @@ -217,7 +221,27 @@ } } +/* const char *escape_chars = "'\"\b\n\r\t\\%_"; */ +/* escape the chars so its sql safe */ +char *escape_string(char *str) +{ + static char buf[8192]; + char *src = str; + char *dest = buf; + /* we might want a cmdline flag to enable escaping */ + if (escape_chars == NULL || str == NULL) + return str; + + while (*src && dest < (buf + sizeof(buf) - 1)) { + if (strchr(escape_chars, *src)) + *dest++ = '\\'; + *dest++ = *src++; + } + *dest = '\0'; + return buf; +} + void format_output (char *format_string,mp3info *mp3, int vbr_report) { char genre[40]=""; @@ -242,16 +266,16 @@ mod[modlen]=0; mod[modlen-1]='s'; switch (*code) { - case 't': printf(mod,mp3->id3.title); break; + case 't': printf(mod,escape_string(mp3->id3.title)); break; case 'f': pos = (pos=strrchr(mp3->filename,'/')) ? pos+1 : mp3->filename; - printf(mod,pos); break; - case 'F': printf(mod,mp3->filename); break; - case 'a': printf(mod,mp3->id3.artist); break; - case 'l': printf(mod,mp3->id3.album); break; + printf(mod,escape_string(pos)); break; + case 'F': printf(mod,escape_string(mp3->filename)); break; + case 'a': printf(mod,escape_string(mp3->id3.artist)); break; + case 'l': printf(mod,escape_string(mp3->id3.album)); break; case 'k': mod[modlen-1] = 'd'; printf(mod,mp3->datasize / 1024); break; - case 'y': printf(mod,mp3->id3.year); break; - case 'c': printf(mod,mp3->id3.comment); break; + case 'y': printf(mod,escape_string(mp3->id3.year)); break; + case 'c': printf(mod,escape_string(mp3->id3.comment)); break; case 'n': if(mp3->id3_isvalid && mp3->id3.track[0]) { mod[modlen-1]='d'; printf(mod, (int) mp3->id3.track[0]); @@ -259,7 +283,7 @@ break; case 'g': if(mp3->id3_isvalid) { text_genre(mp3->id3.genre,genre); - printf(mod,genre); + printf(mod,escape_string(genre)); } break; case 'G': if(mp3->id3_isvalid) { @@ -348,6 +372,7 @@ } break; case '%': printf("%%"); break; + case 'd': printf(mod,escape_string(dirname(mp3->filename))); break; default: printf("%%%c",*(code=percent+1)); break; } format=code+1;