From 3ac71ba4690ad42f31f75787f4a6aec7b24df5e2 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Sun, 20 Nov 2005 06:42:03 +0000 Subject: [PATCH] Add Timo's metacharacter escaping code and codectype passed to scripts --- src/dispatch.c | 3 ++- src/ssc.c | 23 +++++++++++++++-------- src/ssc.h | 4 ++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/dispatch.c b/src/dispatch.c index cbb91ee7..4cd0c6b0 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -645,7 +645,8 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) { pwsc->threadno,pmp3->path); file_ptr = server_side_convert_open(pmp3->path, offset, - pmp3->song_length); + pmp3->song_length, + pmp3->codectype); if (file_ptr) { file_fd = fileno(file_ptr); } else { diff --git a/src/ssc.c b/src/ssc.c index 2a25496d..7823f66c 100644 --- a/src/ssc.c +++ b/src/ssc.c @@ -80,18 +80,18 @@ int server_side_convert(char *codectype) { * @param path char * to the real filename. * @param offset off_t to the point in file where the streaming starts. */ -FILE *server_side_convert_open(char *path, off_t offset, unsigned long len_ms) { +FILE *server_side_convert_open(char *path, off_t offset, unsigned long len_ms, char *codectype) { char *cmd; FILE *f; char *newpath; - char *metachars = "\"$`\\"; /* More?? */ + char *metachars = "\"\\!(){}#*?&<>`"; /* More?? */ char metacount = 0; char *src,*dst; src=path; while(*src) { if(strchr(metachars,*src)) - metacount++; + metacount+=5; src++; } @@ -104,9 +104,15 @@ FILE *server_side_convert_open(char *path, off_t offset, unsigned long len_ms) { dst=newpath; while(*src) { - if(strchr(metachars,*src)) - *dst++='\\'; - *dst++=*src++; + if(strchr(metachars,*src)) { + *dst++='"'; + *dst++='\''; + *dst++=*src++; + *dst++='\''; + *dst++='"'; + } else { + *dst++=*src++; + } } *dst='\0'; } else { @@ -117,8 +123,9 @@ FILE *server_side_convert_open(char *path, off_t offset, unsigned long len_ms) { cmd=(char *)malloc(strlen(config.ssc_prog) + strlen(path) + 64); - sprintf(cmd, "%s \"%s\" %ld %lu.%03lu", - config.ssc_prog, newpath, (long)offset, len_ms / 1000, len_ms % 1000); + sprintf(cmd, "%s \"%s\" %ld %lu.%03lu \"%s\"", + config.ssc_prog, newpath, (long)offset, len_ms / 1000, + len_ms % 1000, (codectype && *codectype) ? codectype : "*"); DPRINTF(E_INF,L_SCAN,"Executing %s\n",cmd); f = popen(cmd, "r"); free(newpath); diff --git a/src/ssc.h b/src/ssc.h index c75892e5..175abffb 100644 --- a/src/ssc.h +++ b/src/ssc.h @@ -26,11 +26,11 @@ #define SERVER_SIDE_CONVERT_DESCR " (converted to WAV)" extern int server_side_convert(char *codectype); -extern int server_side_convert_set(MP3FILE *pmp3); extern char *server_side_convert_path(char *path); extern FILE *server_side_convert_open(char *path, off_t offset, - unsigned long len_ms); + unsigned long len_ms, + char *codectype); extern void server_side_convert_close(FILE *f); #endif /* _SCC_H_ */