From 41058dac793069f1423b0e8a14bb19369d7f04a1 Mon Sep 17 00:00:00 2001 From: Moritz Grimm Date: Wed, 22 Apr 2015 19:29:20 +0200 Subject: [PATCH] Use log API for all regular output messages This makes ezstream log via syslog and stderr. The "real-time status line" remains unaffected. While here, make the output more concise and consistent. --- src/configfile.c | 176 ++++++++++++++----------------------- src/configfile.h | 2 - src/ezstream.c | 222 ++++++++++++++++++++--------------------------- src/metadata.c | 136 ++++++++++++----------------- src/playlist.c | 97 +++++++++------------ src/util.c | 69 +++++++-------- 6 files changed, 290 insertions(+), 412 deletions(-) diff --git a/src/configfile.c b/src/configfile.c index b58c8cb..682965b 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -17,12 +17,14 @@ # include "config.h" #endif -#include "ezstream.h" - #include "compat.h" -#include "cfg.h" +#include "ezstream.h" + +#include + #include "configfile.h" +#include "log.h" #include "util.h" #include "xalloc.h" @@ -77,6 +79,13 @@ getFormatDecoder(const char *match) return (blankString); } +#define CFGERROR_TOO_MANY(x) \ + do { \ + log_error("%s[%ld]: more than one <%s> element", \ + fileName, xmlGetLineNo(cur), (x)); \ + config_error++; \ + } while (0) + int parseConfig(const char *fileName) { @@ -90,14 +99,14 @@ parseConfig(const char *fileName) xmlLineNumbersDefault(1); if ((doc = xmlParseFile(fileName)) == NULL) { - printf("%s: Parse error (not well-formed XML.)\n", fileName); + log_error("%s: not well-formed", fileName); return (0); } cur = xmlDocGetRootElement(doc); if (cur == NULL) { - printf("%s: Parse error (empty XML document.)\n", fileName); + log_error("%s: empty document", fileName); xmlFreeDoc(doc); return (0); } @@ -116,9 +125,7 @@ parseConfig(const char *fileName) for (cur = cur->xmlChildrenNode; cur != NULL; cur = cur->next) { if (!xmlStrcmp(cur->name, (const xmlChar *)"url")) { if (ezConfig.URL != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("url"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -129,9 +136,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"sourceuser")) { if (ezConfig.username != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("sourceuser"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -142,9 +147,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"sourcepassword")) { if (ezConfig.password != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("sourcepassword"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -155,9 +158,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"format")) { if (ezConfig.format != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("format"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -172,15 +173,13 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"filename")) { if (ezConfig.fileName != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("filename"); continue; } if (cur->xmlChildrenNode != NULL) { ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); if (strlen(ls_xmlContentPtr) > PATH_MAX - 1) { - printf("%s[%ld]: Error: Path or filename in is too long\n", + log_error("%s[%ld]: path or filename in too long", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -191,15 +190,13 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"metadata_progname")) { if (ezConfig.metadataProgram != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("metadata_progname"); continue; } if (cur->xmlChildrenNode != NULL) { ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); if (strlen(ls_xmlContentPtr) > PATH_MAX - 1) { - printf("%s[%ld]: Error: Path or filename in is too long\n", + log_error("%s[%ld]: path or filename in too long", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -210,9 +207,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"metadata_format")) { if (ezConfig.metadataFormat != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("metadata_format"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -230,9 +225,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"metadata_refreshinterval")) { if (refresh_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("metadata_refreshinterval"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -240,7 +233,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.metadataRefreshInterval = (int)strtonum(ls_xmlContentPtr, -1LL, (long long)INT_MAX, &errstr); if (errstr) { - printf("%s[%ld]: Error: In : '%s' is %s\n", + log_error("%s[%ld]: : %s: %s", fileName, xmlGetLineNo(cur), ls_xmlContentPtr, errstr); config_error++; continue; @@ -251,9 +244,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"playlist_program")) { if (program_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("playlist_program"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -262,7 +253,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.fileNameIsProgram = (int)strtonum(ls_xmlContentPtr, 0LL, 1LL, &errstr); if (errstr) { - printf("%s[%ld]: Error: may only contain 1 or 0\n", + log_error("%s[%ld]: may only contain 1 or 0", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -273,9 +264,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"shuffle")) { if (shuffle_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("shuffle"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -284,7 +273,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.shuffle = (int)strtonum(ls_xmlContentPtr, 0LL, 1LL, &errstr); if (errstr) { - printf("%s[%ld]: Error: may only contain 1 or 0\n", + log_error("%s[%ld]: may only contain 1 or 0", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -295,9 +284,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"stream_once")) { if (streamOnce_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("stream_once"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -306,7 +293,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.streamOnce = (int)strtonum(ls_xmlContentPtr, 0LL, 1LL, &errstr); if (errstr) { - printf("%s[%ld]: Error: may only contain 1 or 0\n", + log_error("%s[%ld]: may only contain 1 or 0", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -317,9 +304,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"reconnect_tries")) { if (reconnect_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("reconnect_tries"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -328,7 +313,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.reconnectAttempts = (unsigned int)strtonum(ls_xmlContentPtr, 0LL, (long long)UINT_MAX, &errstr); if (errstr) { - printf("%s[%ld]: Error: In : '%s' is %s\n", + log_error("%s[%ld]: : %s: %s", fileName, xmlGetLineNo(cur), ls_xmlContentPtr, errstr); config_error++; continue; @@ -339,9 +324,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfoname")) { if (ezConfig.serverName != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfoname"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -352,9 +335,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfourl")) { if (ezConfig.serverURL != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfourl"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -365,9 +346,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfogenre")) { if (ezConfig.serverGenre != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfogenre"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -378,9 +357,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfodescription")) { if (ezConfig.serverDescription != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfodescription"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -391,9 +368,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfobitrate")) { if (ezConfig.serverBitrate != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfobitrate"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -405,9 +380,7 @@ parseConfig(const char *fileName) if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfochannels")) { if (ezConfig.serverChannels != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfochannels"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -418,9 +391,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfosamplerate")) { if (ezConfig.serverSamplerate != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfosamplerate"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -431,9 +402,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfoquality")) { if (ezConfig.serverQuality != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfoquality"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -444,9 +413,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur->name, (const xmlChar *)"svrinfopublic")) { if (svrinfopublic_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("svrinfopublic"); continue; } if (cur->xmlChildrenNode != NULL) { @@ -455,7 +422,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); ezConfig.serverPublic = (int)strtonum(ls_xmlContentPtr, 0LL, 1LL, &errstr); if (errstr) { - printf("%s[%ld]: Error: may only contain 1 or 0\n", + log_error("%s[%ld]: may only contain 1 or 0", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -473,9 +440,7 @@ parseConfig(const char *fileName) cur2 = cur2->next) { if (!xmlStrcmp(cur2->name, (const xmlChar *)"enable")) { if (enable_set) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur)); - config_error++; + CFGERROR_TOO_MANY("enable"); continue; } if (cur2->xmlChildrenNode != NULL) { @@ -484,7 +449,7 @@ parseConfig(const char *fileName) ls_xmlContentPtr = (char *)xmlNodeListGetString(doc, cur2->xmlChildrenNode, 1); ezConfig.reencode = (int)strtonum(ls_xmlContentPtr, 0LL, 1LL, &errstr); if (errstr) { - printf("%s[%ld]: Error: may only contain 1 or 0\n", + log_error("%s[%ld]: may only contain 1 or 0", fileName, xmlGetLineNo(cur)); config_error++; continue; @@ -503,9 +468,7 @@ parseConfig(const char *fileName) cur3 != NULL; cur3 = cur3->next) { if (!xmlStrcmp(cur3->name, (const xmlChar *)"format")) { if (pformatEncDec->format != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur3)); - config_error++; + CFGERROR_TOO_MANY("format"); continue; } if (cur3->xmlChildrenNode != NULL) { @@ -520,9 +483,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur3->name, (const xmlChar *)"match")) { if (pformatEncDec->match != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur3)); - config_error++; + CFGERROR_TOO_MANY("match"); continue; } if (cur3->xmlChildrenNode != NULL) { @@ -537,9 +498,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur3->name, (const xmlChar *)"decode")) { if (pformatEncDec->decoder != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur3)); - config_error++; + CFGERROR_TOO_MANY("decode"); continue; } if (cur3->xmlChildrenNode != NULL) { @@ -557,9 +516,7 @@ parseConfig(const char *fileName) } if (!xmlStrcmp(cur3->name, (const xmlChar *)"encode")) { if (pformatEncDec->encoder != NULL) { - printf("%s[%ld]: Error: Cannot have multiple elements\n", - fileName, xmlGetLineNo(cur3)); - config_error++; + CFGERROR_TOO_MANY("encode"); continue; } if (cur3->xmlChildrenNode != NULL) { @@ -589,8 +546,7 @@ parseConfig(const char *fileName) return (1); freeConfig(&ezConfig); - printf("%s: %u configuration error(s) in %s\n", cfg_progname(), - config_error, fileName); + log_error("%s: %u configuration error(s)", fileName, config_error); return (0); } @@ -659,14 +615,14 @@ checkDecoderLine(const char *str, const char *file, long line) errors = 0; if ((p = strstr(str, STRING_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: `%s' placeholder not allowed in decoder command\n", + log_error("%s[%ld]: '%s' placeholder not allowed in decoder command", file, line, STRING_PLACEHOLDER); errors++; } if ((p = strstr(str, TRACK_PLACEHOLDER)) != NULL) { p += strlen(TRACK_PLACEHOLDER); if ((p = strstr(p, TRACK_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in decoder command", file, line, TRACK_PLACEHOLDER); errors++; } else @@ -675,7 +631,7 @@ checkDecoderLine(const char *str, const char *file, long line) if ((p = strstr(str, METADATA_PLACEHOLDER)) != NULL) { p += strlen(METADATA_PLACEHOLDER); if ((p = strstr(p, METADATA_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in decoder command", file, line, METADATA_PLACEHOLDER); errors++; } @@ -683,7 +639,7 @@ checkDecoderLine(const char *str, const char *file, long line) if ((p = strstr(str, ARTIST_PLACEHOLDER)) != NULL) { p += strlen(ARTIST_PLACEHOLDER); if ((p = strstr(p, ARTIST_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in decoder command", file, line, ARTIST_PLACEHOLDER); errors++; } @@ -691,14 +647,14 @@ checkDecoderLine(const char *str, const char *file, long line) if ((p = strstr(str, TITLE_PLACEHOLDER)) != NULL) { p += strlen(TITLE_PLACEHOLDER); if ((p = strstr(p, TITLE_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in decoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in decoder command", file, line, TITLE_PLACEHOLDER); errors++; } } if (!have_track) { - printf("%s[%ld]: Error: The decoder command requires the '%s' track placeholder\n", + log_error("%s[%ld]: decoder command requires '%s' track placeholder", file, line, TRACK_PLACEHOLDER); errors++; } @@ -714,19 +670,19 @@ checkEncoderLine(const char *str, const char *file, long line) errors = 0; if ((p = strstr(str, TRACK_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: `%s' placeholder not allowed in encoder command\n", + log_error("%s[%ld]: '%s' placeholder not allowed in encoder command", file, line, TRACK_PLACEHOLDER); errors++; } if ((p = strstr(str, STRING_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: `%s' placeholder not allowed in encoder command\n", + log_error("%s[%ld]: '%s' placeholder not allowed in encoder command", file, line, STRING_PLACEHOLDER); errors++; } if ((p = strstr(str, METADATA_PLACEHOLDER)) != NULL) { p += strlen(METADATA_PLACEHOLDER); if ((p = strstr(p, METADATA_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in encoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in encoder command", file, line, METADATA_PLACEHOLDER); errors++; } @@ -734,7 +690,7 @@ checkEncoderLine(const char *str, const char *file, long line) if ((p = strstr(str, ARTIST_PLACEHOLDER)) != NULL) { p += strlen(ARTIST_PLACEHOLDER); if ((p = strstr(p, ARTIST_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in encoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in encoder command", file, line, ARTIST_PLACEHOLDER); errors++; } @@ -742,7 +698,7 @@ checkEncoderLine(const char *str, const char *file, long line) if ((p = strstr(str, TITLE_PLACEHOLDER)) != NULL) { p += strlen(TITLE_PLACEHOLDER); if ((p = strstr(p, TITLE_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in encoder command\n", + log_error("%s[%ld]: more than one '%s' placeholder in encoder command", file, line, TITLE_PLACEHOLDER); errors++; } @@ -759,14 +715,14 @@ checkFormatLine(const char *str, const char *file, long line) errors = 0; if ((p = strstr(str, METADATA_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: `%s' placeholder not allowed in \n", + log_error("%s[%ld]: '%s' placeholder not allowed in ", file, line, METADATA_PLACEHOLDER); errors++; } if ((p = strstr(str, TRACK_PLACEHOLDER)) != NULL) { p += strlen(TRACK_PLACEHOLDER); if ((p = strstr(p, TRACK_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in \n", + log_error("%s[%ld]: more than one '%s' placeholder in ", file, line, TRACK_PLACEHOLDER); errors++; } @@ -774,7 +730,7 @@ checkFormatLine(const char *str, const char *file, long line) if ((p = strstr(str, STRING_PLACEHOLDER)) != NULL) { p += strlen(STRING_PLACEHOLDER); if ((p = strstr(p, STRING_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in \n", + log_error("%s[%ld]: more than one '%s' placeholder in ", file, line, STRING_PLACEHOLDER); errors++; } @@ -782,7 +738,7 @@ checkFormatLine(const char *str, const char *file, long line) if ((p = strstr(str, ARTIST_PLACEHOLDER)) != NULL) { p += strlen(ARTIST_PLACEHOLDER); if ((p = strstr(p, ARTIST_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in \n", + log_error("%s[%ld]: more than one '%s' placeholder in ", file, line, ARTIST_PLACEHOLDER); errors++; } @@ -790,7 +746,7 @@ checkFormatLine(const char *str, const char *file, long line) if ((p = strstr(str, TITLE_PLACEHOLDER)) != NULL) { p += strlen(TITLE_PLACEHOLDER); if ((p = strstr(p, TITLE_PLACEHOLDER)) != NULL) { - printf("%s[%ld]: Error: Multiple `%s' placeholders in \n", + log_error("%s[%ld]: more than one '%s' placeholder in ", file, line, TITLE_PLACEHOLDER); errors++; } diff --git a/src/configfile.h b/src/configfile.h index c701e49..d70fc41 100644 --- a/src/configfile.h +++ b/src/configfile.h @@ -16,8 +16,6 @@ #ifndef __CONFIGFILE_H__ #define __CONFIGFILE_H__ -#include - #define MP3_FORMAT "MP3" #define VORBIS_FORMAT "VORBIS" #define THEORA_FORMAT "THEORA" diff --git a/src/ezstream.c b/src/ezstream.c index 5b9f1de..5069b49 100644 --- a/src/ezstream.c +++ b/src/ezstream.c @@ -17,6 +17,8 @@ # include "config.h" #endif +#include "compat.h" + #include "ezstream.h" #ifdef HAVE_SIGNAL_H @@ -25,9 +27,9 @@ #include -#include "compat.h" - +#include "cfg.h" #include "configfile.h" +#include "log.h" #include "metadata.h" #include "playlist.h" #include "util.h" @@ -132,33 +134,33 @@ urlParse(const char *url, char **hostname, unsigned short *port, const char *errstr; if (hostname == NULL || port == NULL || mountname == NULL) { - printf("%s: urlParse(): Internal error: Bad arguments\n", - cfg_progname()); - exit(1); + log_alert("urlParse: bad arguments"); + abort(); } if (strncmp(url, "http://", strlen("http://")) != 0) { - printf("%s: Error: Invalid : Not an HTTP address\n", - cfg_progname()); + log_error("invalid : not an HTTP address"); return (0); } p1 = url + strlen("http://"); p2 = strchr(p1, ':'); if (p2 == NULL) { - printf("%s: Error: Invalid : Missing port\n", - cfg_progname()); + log_error("invalid : missing port"); return (0); } hostsiz = (p2 - p1) + 1; + if (hostsiz <= 1) { + log_error("invalid : missing host"); + return (0); + } *hostname = xmalloc(hostsiz); strlcpy(*hostname, p1, hostsiz); p2++; p3 = strchr(p2, '/'); if (p3 == NULL || p3 - p2 >= (int)sizeof(tmpPort)) { - printf("%s: Error: Invalid : Missing mountpoint or too long port number\n", - cfg_progname()); + log_error("invalid : mountpoint missing, or port number too long"); xfree(*hostname); return (0); } @@ -166,8 +168,7 @@ urlParse(const char *url, char **hostname, unsigned short *port, strlcpy(tmpPort, p2, (p3 - p2) + 1UL); *port = (unsigned short)strtonum(tmpPort, 1LL, (long long)USHRT_MAX, &errstr); if (errstr) { - printf("%s: Error: Invalid : Port '%s' is %s\n", - cfg_progname(), tmpPort, errstr); + log_error("invalid : port: %s is %s", tmpPort, errstr); xfree(*hostname); return (0); } @@ -261,8 +262,8 @@ buildCommandString(const char *extension, const char *fileName, decoder = xstrdup(getFormatDecoder(extension)); if (strlen(decoder) == 0) { - printf("%s: Unknown extension '%s', cannot decode '%s'\n", - cfg_progname(), extension, fileName); + log_error("cannot decode: %s: unknown file extension %s", + fileName, extension); xfree(localTitle); xfree(localArtist); xfree(localMetaString); @@ -317,11 +318,9 @@ buildCommandString(const char *extension, const char *fileName, encoder = xstrdup(getFormatEncoder(pezConfig->format)); if (strlen(encoder) == 0) { - if (cfg_verbosity()) - printf("%s: Passing through%s%s data from the decoder\n", - cfg_progname(), - (strcmp(pezConfig->format, THEORA_FORMAT) != 0) ? " (unsupported) " : " ", - pezConfig->format); + log_notice("passing through%s%s data from the decoder", + (strcmp(pezConfig->format, THEORA_FORMAT) != 0) ? " (unsupported) " : " ", + pezConfig->format); commandStringLen = strlen(newDecoder) + 1; commandString = xcalloc(commandStringLen, sizeof(char)); strlcpy(commandString, newDecoder, commandStringLen); @@ -387,8 +386,7 @@ getMetadataString(const char *format, metadata_t *mdata) char *tmp, *str; if (mdata == NULL) { - printf("%s: getMetadataString(): Internal error: NULL metadata_t\n", - cfg_progname()); + log_alert("getMetadataString: bad argument"); abort(); } @@ -460,8 +458,7 @@ setMetadata(shout_t *shout, metadata_t *mdata, char **mdata_copy) int ret = SHOUTERR_SUCCESS; if (shout == NULL) { - printf("%s: setMetadata(): Internal error: NULL shout_t\n", - cfg_progname()); + log_alert("setMetadata: bad argument"); abort(); } @@ -472,8 +469,7 @@ setMetadata(shout_t *shout, metadata_t *mdata, char **mdata_copy) return 1; if ((shout_mdata = shout_metadata_new()) == NULL) { - printf("%s: shout_metadata_new(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, "shout_metadata_new"); exit(1); } @@ -488,8 +484,7 @@ setMetadata(shout_t *shout, metadata_t *mdata, char **mdata_copy) */ if (shout_metadata_add(shout_mdata, "charset", "UTF-8") != SHOUTERR_SUCCESS) { /* Assume SHOUTERR_MALLOC */ - printf("%s: shout_metadata_add(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, "shout_metadata_add"); exit(1); } @@ -500,31 +495,29 @@ setMetadata(shout_t *shout, metadata_t *mdata, char **mdata_copy) songInfo = metadata_assemble_string(mdata); if (artist[0] != '\0' && title[0] != '\0') { if (shout_metadata_add(shout_mdata, "artist", artist) != SHOUTERR_SUCCESS) { - printf("%s: shout_metadata_add(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, + "shout_metadata_add"); exit(1); } if (shout_metadata_add(shout_mdata, "title", title) != SHOUTERR_SUCCESS) { - printf("%s: shout_metadata_add(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, + "shout_metadata_add"); exit(1); } } else { if (shout_metadata_add(shout_mdata, "song", songInfo) != SHOUTERR_SUCCESS) { - printf("%s: shout_metadata_add(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, + "shout_metadata_add"); exit(1); } } } else if (shout_metadata_add(shout_mdata, "song", songInfo) != SHOUTERR_SUCCESS) { - printf("%s: shout_metadata_add(): %s\n", cfg_progname(), - strerror(ENOMEM)); + log_syserr(ALERT, ENOMEM, "shout_metadata_add"); exit(1); } if ((ret = shout_set_metadata(shout, shout_mdata)) != SHOUTERR_SUCCESS) - printf("%s: shout_set_metadata(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_warning("shout_set_metadata: %s", shout_get_error(shout)); shout_metadata_free(shout_mdata); @@ -583,8 +576,7 @@ openResource(shout_t *shout, const char *fileName, int *popenFlag, *p = tolower((int)*p); if (strlen(extension) == 0) { - printf("%s: Error: Cannot determine file type of '%s'\n", - cfg_progname(), fileName); + log_error("%s: cannot determine file type", fileName); return (filep); } @@ -607,17 +599,15 @@ openResource(shout_t *shout, const char *fileName, int *popenFlag, *mdata_p = mdata; else metadata_free(&mdata); - if (cfg_verbosity() > 1) - printf("%s: Running command `%s`\n", cfg_progname(), - pCommandString); + log_info("running command: %s", pCommandString); if (cfg_quiet_stderr()) { int fd; stderr_fd = dup(fileno(stderr)); if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) == -1) { - printf("%s: Cannot open %s for redirecting STDERR output: %s\n", - cfg_progname(), _PATH_DEVNULL, strerror(errno)); + log_alert("%s: %s", _PATH_DEVNULL, + strerror(errno)); exit(1); } @@ -629,13 +619,13 @@ openResource(shout_t *shout, const char *fileName, int *popenFlag, fflush(NULL); errno = 0; if ((filep = popen(pCommandString, "r")) == NULL) { - printf("%s: popen(): Error while executing '%s'", - cfg_progname(), pCommandString); /* popen() does not set errno reliably ... */ if (errno) - printf(": %s\n", strerror(errno)); + log_error("execution error: %s: %s", + pCommandString, strerror(errno)); else - printf("\n"); + log_error("execution error: %s", + pCommandString); } else { *popenFlag = 1; } @@ -655,9 +645,10 @@ openResource(shout_t *shout, const char *fileName, int *popenFlag, else metadata_free(&mdata); - if ((filep = fopen(fileName, "rb")) == NULL) - printf("%s: %s: %s\n", cfg_progname(), fileName, - strerror(errno)); + if ((filep = fopen(fileName, "rb")) == NULL) { + log_error("%s: %s", fileName, strerror(errno)); + return (NULL); + } return (filep); } @@ -668,41 +659,41 @@ reconnectServer(shout_t *shout, int closeConn) unsigned int i; int close_conn = closeConn; - printf("%s: Connection to %s lost\n", cfg_progname(), pezConfig->URL); + log_warning("%s: connection lost", pezConfig->URL); i = 0; while (++i) { - printf("%s: Attempting reconnection #", cfg_progname()); if (pezConfig->reconnectAttempts > 0) - printf("%u/%u: ", i, pezConfig->reconnectAttempts); + log_notice("reconnect: %s: attempt #%u/%u ...", + pezConfig->URL, i, pezConfig->reconnectAttempts); else - printf("%u: ", i); + log_notice("reconnect: %s: attempt #%u ...", + pezConfig->URL, i); if (close_conn == 0) close_conn = 1; else shout_close(shout); if (shout_open(shout) == SHOUTERR_SUCCESS) { - printf("OK\n%s: Reconnect to %s successful\n", - cfg_progname(), pezConfig->URL); + log_notice("reconnect: %s: success", + pezConfig->URL); return (1); } - printf("FAILED: %s\n", shout_get_error(shout)); + log_warning("reconnect failed: %s: %s", + pezConfig->URL, shout_get_error(shout)); if (pezConfig->reconnectAttempts > 0 && i >= pezConfig->reconnectAttempts) break; - printf("%s: Waiting 5s for %s to come back ...\n", - cfg_progname(), pezConfig->URL); if (quit) return (0); else sleep(5); }; - printf("%s: Giving up\n", cfg_progname()); + log_warning("reconnect failed: giving up"); return (0); } @@ -737,8 +728,7 @@ sendStream(shout_t *shout, FILE *filepstream, const char *fileName, struct timeval callTime, currentTime; if (startTime == NULL) { - printf("%s: sendStream(): Internal error: startTime is NULL\n", - cfg_progname()); + log_alert("sendStream: bad argument"); abort(); } @@ -759,8 +749,7 @@ sendStream(shout_t *shout, FILE *filepstream, const char *fileName, shout_sync(shout); if (shout_send(shout, buff, bytes_read) != SHOUTERR_SUCCESS) { - printf("%s: shout_send(): %s\n", cfg_progname(), - shout_get_error(shout)); + log_error("shout_send: %s", shout_get_error(shout)); if (reconnectServer(shout, 1)) break; else { @@ -774,8 +763,7 @@ sendStream(shout_t *shout, FILE *filepstream, const char *fileName, if (rereadPlaylist_notify) { rereadPlaylist_notify = 0; if (!pezConfig->fileNameIsProgram) - printf("%s: SIGHUP signal received, will reread playlist after this file\n", - cfg_progname()); + log_notice("HUP signal received: playlist re-read scheduled"); } if (skipTrack) { skipTrack = 0; @@ -847,11 +835,10 @@ sendStream(shout_t *shout, FILE *filepstream, const char *fileName, clearerr(filepstream); ret = STREAM_CONT; } else if (errno == EBADF && isStdin) - printf("%s: No (more) data available on standard input\n", - cfg_progname()); + log_notice("no (more) data available on standard input"); else - printf("%s: sendStream(): Error while reading '%s': %s\n", - cfg_progname(), fileName, strerror(errno)); + log_error("sendStream: %s: %s", fileName, + strerror(errno)); } return (ret); @@ -872,7 +859,7 @@ streamFile(shout_t *shout, const char *fileName) if ((filepstream = openResource(shout, fileName, &popenFlag, &mdata, &isStdin, &songLen)) == NULL) { if (++resource_errors > 100) { - printf("%s: Too many errors -- giving up.\n", cfg_progname()); + log_error("too many errors; giving up"); return (0); } /* Continue with next resource on failure: */ @@ -887,11 +874,7 @@ streamFile(shout_t *shout, const char *fileName) if ((metaData = UTF8toCHAR(tmp, ICONV_REPLACE)) == NULL) metaData = xstrdup("(unknown title)"); xfree(tmp); - printf("%s: Streaming ``%s''", cfg_progname(), metaData); - if (cfg_verbosity()) - printf(" (file: %s)\n", fileName); - else - printf("\n"); + log_notice("streaming: %s (%s)", metaData, fileName); xfree(metaData); /* MP3 streams are special, so set the metadata explicitly: */ @@ -900,7 +883,7 @@ streamFile(shout_t *shout, const char *fileName) metadata_free(&mdata); } else if (isStdin) - printf("%s: Streaming from standard input\n", cfg_progname()); + log_notice("streaming: standard input"); if (songLen > 0) songLenStr = xstrdup(getTimeString(songLen)); @@ -922,9 +905,8 @@ streamFile(shout_t *shout, const char *fileName) } if (ret == STREAM_SKIP || skipTrack) { skipTrack = 0; - if (!isStdin && cfg_verbosity()) - printf("%s: SIGUSR1 signal received, skipping current track\n", - cfg_progname()); + if (!isStdin) + log_notice("USR1 signal received: skipping current track"); retval = 1; ret = STREAM_DONE; } @@ -936,9 +918,8 @@ streamFile(shout_t *shout, const char *fileName) char *mdataStr = NULL; metadata_t *prog_mdata; - if (cfg_verbosity() > 1) - printf("%s: Querying '%s' for fresh metadata\n", - cfg_progname(), pezConfig->metadataProgram); + log_info("running metadata program: %s", + pezConfig->metadataProgram); if ((prog_mdata = getMetadata(pezConfig->metadataProgram)) == NULL) { retval = 0; ret = STREAM_DONE; @@ -950,9 +931,7 @@ streamFile(shout_t *shout, const char *fileName) continue; } metadata_free(&prog_mdata); - if (cfg_verbosity() > 1) - printf("%s: New metadata: ``%s''\n", - cfg_progname(), mdataStr); + log_info("new metadata: %s", mdataStr); xfree(mdataStr); } } @@ -988,9 +967,8 @@ streamPlaylist(shout_t *shout, const char *fileName) } else { if ((playlist = playlist_read(fileName)) == NULL) return (0); - if (cfg_verbosity() && playlist_get_num_items(playlist) == 0) - printf("%s: Warning: Playlist '%s' is empty\n", - cfg_progname(), fileName); + if (playlist_get_num_items(playlist) == 0) + log_notice("%s: playlist empty", fileName); } } else { /* @@ -1014,7 +992,7 @@ streamPlaylist(shout_t *shout, const char *fileName) rereadPlaylist = rereadPlaylist_notify = 0; if (pezConfig->fileNameIsProgram) continue; - printf("%s: Rereading playlist\n", cfg_progname()); + log_notice("rereading playlist"); if (!playlist_reread(&playlist)) return (0); if (pezConfig->shuffle) @@ -1107,22 +1085,22 @@ main(int argc, char *argv[]) struct stat st; if (stat(configFile, &st) == -1) { - printf("%s: %s\n", configFile, strerror(errno)); + log_error("%s: %s", configFile, strerror(errno)); return (ez_shutdown(2)); } if (cfg_verbosity() && (st.st_mode & (S_IRGRP | S_IROTH))) - printf("%s: Warning: %s is group and/or world readable\n", - cfg_progname(), configFile); + log_warning("%s: group and/or world readable", + configFile); if (st.st_mode & (S_IWGRP | S_IWOTH)) { - printf("%s: Error: %s is group and/or world writeable\n", - cfg_progname(), configFile); + log_error("%s: group and/or world writeable", + configFile); return (ez_shutdown(2)); } #else FILE *tmp; if ((tmp = fopen(configFile, "r")) == NULL) { - printf("%s: %s\n", configFile, strerror(errno)); + log_error("%s: %s", configFile, strerror(errno)); usage(); return (ez_shutdown(2)); } @@ -1134,34 +1112,25 @@ main(int argc, char *argv[]) return (ez_shutdown(2)); if (pezConfig->URL == NULL) { - printf("%s: Error: Missing \n", configFile); + log_error("%s: missing ", configFile); return (ez_shutdown(2)); } if (!urlParse(pezConfig->URL, &host, &port, &mount)) { - printf("Must be of the form ``http://server:port/mountpoint''\n"); - return (ez_shutdown(2)); - } - if (strlen(host) == 0) { - printf("%s: Error: Invalid : Missing server:\n", configFile); - printf("Must be of the form ``http://server:port/mountpoint''\n"); - return (ez_shutdown(2)); - } - if (strlen(mount) == 0) { - printf("%s: Error: Invalid : Missing mountpoint:\n", configFile); - printf("Must be of the form ``http://server:port/mountpoint''\n"); + log_error("%s: : must be of the form ``http://server:port/mountpoint''", + configFile); return (ez_shutdown(2)); } if (pezConfig->password == NULL) { - printf("%s: Error: Missing \n", configFile); + log_error("%s: missing", configFile); return (ez_shutdown(2)); } if (pezConfig->fileName == NULL) { - printf("%s: Error: Missing \n", configFile); + log_error("%s: missing", configFile); return (ez_shutdown(2)); } if (pezConfig->format == NULL) { - printf("%s: Warning: Missing :\n", configFile); - printf("Specify a stream format of either MP3, VORBIS or THEORA\n"); + log_error("%s: missing or unsupported value", + configFile); } if ((shout = stream_setup(host, port, mount)) == NULL) @@ -1180,8 +1149,7 @@ main(int argc, char *argv[]) # endif for (i = 0; i < sizeof(ezstream_signals) / sizeof(int); i++) { if (sigaction(ezstream_signals[i], &act, NULL) == -1) { - printf("%s: sigaction(): %s\n", - cfg_progname(), strerror(errno)); + log_syserr(ERROR, errno, "sigaction"); return (ez_shutdown(1)); } } @@ -1191,8 +1159,7 @@ main(int argc, char *argv[]) */ act.sa_handler = SIG_IGN; if (sigaction(SIGPIPE, &act, NULL) == -1) { - printf("%s: sigaction(): %s\n", - cfg_progname(), strerror(errno)); + log_syserr(ERROR, errno, "sigaction"); return (ez_shutdown(1)); } #endif /* HAVE_SIGNALS */ @@ -1200,8 +1167,7 @@ main(int argc, char *argv[]) if (shout_open(shout) == SHOUTERR_SUCCESS) { int cont; - printf("%s: Connected to http://%s:%hu%s\n", cfg_progname(), - host, port, mount); + log_notice("connected: http://%s:%hu%s", host, port, mount); if (pezConfig->fileNameIsProgram || strrcasecmp(pezConfig->fileName, ".m3u") == 0 || @@ -1210,10 +1176,6 @@ main(int argc, char *argv[]) else playlistMode = 0; - if (cfg_verbosity() && pezConfig->fileNameIsProgram) - printf("%s: Using program '%s' to get filenames for streaming\n", - cfg_progname(), pezConfig->fileName); - do { if (playlistMode) { cont = streamPlaylist(shout, pezConfig->fileName); @@ -1228,14 +1190,16 @@ main(int argc, char *argv[]) shout_close(shout); } else - printf("%s: Connection to http://%s:%hu%s failed: %s\n", cfg_progname(), + log_error("connection failed: http://%s:%hu%s: %s", host, port, mount, shout_get_error(shout)); - if (quit) - printf("\r%s: SIGINT or SIGTERM received\n", cfg_progname()); + if (quit) { + if (cfg_quiet_stderr() && cfg_verbosity()) + printf("\r"); + log_notice("INT or TERM signal received"); + } - if (cfg_verbosity()) - printf("%s: Exiting ...\n", cfg_progname()); + log_info("exiting"); xfree(host); xfree(mount); diff --git a/src/metadata.c b/src/metadata.c index eefda53..ba8890d 100644 --- a/src/metadata.c +++ b/src/metadata.c @@ -30,7 +30,7 @@ #endif /* HAVE_VORBISFILE */ #include -#include "cfg.h" +#include "log.h" #include "metadata.h" #include "util.h" #include "xalloc.h" @@ -93,8 +93,7 @@ metadata_use_taglib(metadata_t *md, FILE **filep) char *str; if (md == NULL || md->filename == NULL) { - printf("%s: metadata_use_taglib(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_use_taglib: bad arguments"); abort(); } @@ -145,8 +144,7 @@ metadata_use_taglib(metadata_t *md, FILE **filep) (void)md; (void)filep; - printf("%s: Internal error: metadata_use_taglib() called without TagLib support\n", - cfg_progname()); + log_alert("metadata_use_taglib() called without TagLib support"); abort(); } #endif /* HAVE_TAGLIB */ @@ -158,8 +156,7 @@ metadata_use_self(metadata_t *md, FILE **filep) (void)md; (void)filep; - printf("%s: Internal error: metadata_use_self() called with TagLib support\n", - cfg_progname()); + log_alert("metadata_use_self() called with TagLib support"); abort(); } #else @@ -169,8 +166,7 @@ metadata_use_self(metadata_t *md, FILE **filep) if (md == NULL || filep == NULL || *filep == NULL || md->filename == NULL) { - printf("%s: metadata_use_self(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_use_self: bad arguments"); abort(); } @@ -195,28 +191,27 @@ metadata_use_self(metadata_t *md, FILE **filep) if ((ret = ov_open(*filep, &vf, NULL, 0L)) != 0) { switch (ret) { case OV_EREAD: - printf("%s: ov_open(): %s: Media read error\n", - cfg_progname(), md->filename); + log_error("%s: media read error", + md->filename); break; case OV_ENOTVORBIS: - printf("%s: ov_open(): %s: Invalid Vorbis bitstream\n", - cfg_progname(), md->filename); + log_error("%s: invalid Vorbis bitstream", + md->filename); break; case OV_EVERSION: - printf("%s: ov_open(): %s: Vorbis version mismatch\n", - cfg_progname(), md->filename); + log_error("%s: Vorbis version mismatch", + md->filename); break; case OV_EBADHEADER: - printf("%s: ov_open(): %s: Invalid Vorbis bitstream header\n", - cfg_progname(), md->filename); + log_error("%s: invalid Vorbis bitstream header", + md->filename); break; case OV_EFAULT: - printf("%s: Fatal: Internal libvorbisfile fault\n", - cfg_progname()); + log_alert("libvorbisfile fault"); abort(); default: - printf("%s: ov_open(): %s: ov_read() returned unknown error\n", - cfg_progname(), md->filename); + log_error("%s: unknown error", + md->filename); break; } } else { @@ -253,8 +248,7 @@ void metadata_clean_md(metadata_t *md) { if (md == NULL) { - printf("%s: Internal error: metadata_clean_md(): NULL argument\n", - cfg_progname()); + log_alert("metadata_clean_md: bad argument"); abort(); } @@ -278,8 +272,7 @@ metadata_get_extension(char *buf, size_t siz, const char *filename) char *p; if (buf == NULL || siz == 0 || filename == NULL) { - printf("%s: metadata_get_extension(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_extension: bad arguments"); abort(); } @@ -298,14 +291,13 @@ metadata_get_name(const char *file) char *p1, *p2, *name; if (file == NULL) { - printf("%s: metadata_get_name(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_name: bad arguments"); abort(); } if ((p1 = basename(filename)) == NULL) { - printf("%s: Internal error: basename() failed with '%s'\n", - cfg_progname(), filename); + log_alert("basename: unexpected failure with input: %s", + filename); exit(1); } @@ -325,8 +317,7 @@ void metadata_process_md(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_process_md(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_process_md: bad arguments"); abort(); } @@ -377,8 +368,7 @@ metadata_file(const char *filename, int normalize) metadata_t *md; if (filename == NULL || strlen(filename) == 0) { - printf("%s: metadata_file(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_file: bad arguments"); abort(); } @@ -404,8 +394,7 @@ metadata_program(const char *program, int normalize) #endif if (program == NULL || strlen(program) == 0) { - printf("%s: metadata_program(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_program: bad arguments"); abort(); } @@ -415,24 +404,24 @@ metadata_program(const char *program, int normalize) #ifdef HAVE_STAT if (stat(program, &st) == -1) { - printf("%s: %s: %s\n", cfg_progname(), program, strerror(errno)); + log_error("%s: %s", program, strerror(errno)); metadata_free(&md); return (NULL); } if (st.st_mode & (S_IWGRP | S_IWOTH)) { - printf("%s: Error: %s is group and/or world writeable\n", - cfg_progname(), program); + log_error("%s: group and/or world writeable", + program); metadata_free(&md); return (NULL); } if (!(st.st_mode & (S_IEXEC | S_IXGRP | S_IXOTH))) { - printf("%s: %s: Not an executable program\n", cfg_progname(), program); + log_error("%s: not an executable program", program); metadata_free(&md); return (NULL); } #else if ((filep = fopen(program, "r")) == NULL) { - printf("%s: %s: %s\n", cfg_progname(), program, strerror(errno)); + log_error("%s: %s", program, strerror(errno)); metadata_free(&md); return (NULL); } @@ -468,19 +457,17 @@ metadata_file_update(metadata_t *md) FILE *filep; if (md == NULL) { - printf("%s: metadata_file_update(): Internal error: NULL argument\n", - cfg_progname()); + log_alert("metadata_file_update: bad argument"); abort(); } if (md->program) { - printf("%s: metadata_file_update(): Internal error: Called with program handle\n", - cfg_progname()); + log_alert("metadata_file_update: called with program handle"); abort(); } if ((filep = fopen(md->filename, "rb")) == NULL) { - printf("%s: %s: %s\n", cfg_progname(), md->filename, strerror(errno)); + log_error("%s: %s", md->filename, strerror(errno)); return (0); } @@ -503,14 +490,12 @@ metadata_program_update(metadata_t *md, enum metadata_request md_req) char command[PATH_MAX + sizeof(" artist")]; if (md == NULL) { - printf("%s: metadata_program_update(): Internal error: NULL argument\n", - cfg_progname()); + log_alert("metadata_program_update: bad argument"); abort(); } if (!md->program) { - printf("%s: metadata_program_update(): Internal error: Received file handle\n", - cfg_progname()); + log_alert("metadata_program_update: called with file handle"); abort(); } @@ -545,42 +530,37 @@ metadata_program_update(metadata_t *md, enum metadata_request md_req) } break; default: - printf("%s: metadata_program_update(): Internal error: Unknown md_req\n", - cfg_progname()); + log_alert("metadata_program_update: unknown md_req"); abort(); } fflush(NULL); errno = 0; - if (cfg_verbosity() > 1) - printf("%s: Running command `%s`\n", cfg_progname(), - command); + log_debug("running command: %s", command); if ((filep = popen(command, "r")) == NULL) { - printf("%s: playlist_run_program(): Error while executing '%s'", - cfg_progname(), command); /* popen() does not set errno reliably ... */ if (errno) - printf(": %s\n", strerror(errno)); + log_error("execution error: %s: %s", command, + strerror(errno)); else - printf("\n"); + log_error("execution error: %s", command); return (0); } if (fgets(buf, (int)sizeof(buf), filep) == NULL) { if (ferror(filep)) - printf("%s: Error while reading output from program '%s': %s\n", - cfg_progname(), md->filename, strerror(errno)); + log_error("%s: output read error: %s", md->filename, + strerror(errno)); pclose(filep); - printf("%s: FATAL: External program '%s' not (or no longer) usable.\n", - cfg_progname(), md->filename); + log_alert("program not (or no longer) usable: %s", + md->filename); exit(1); } pclose(filep); if (strlen(buf) == sizeof(buf) - 1) - printf("%s: Warning: Metadata string received via '%s' is too long and has been truncated\n", - cfg_progname(), command); + log_warning("metadata output truncated: %s", command); buf[strcspn(buf, "\n")] = '\0'; buf[strcspn(buf, "\r")] = '\0'; @@ -588,8 +568,8 @@ metadata_program_update(metadata_t *md, enum metadata_request md_req) switch (md_req) { case METADATA_STRING: if (strlen(buf) == 0) { - printf("%s: Warning: Empty metadata string received from '%s'\n", - cfg_progname(), md->filename); + log_warning("metadata output empty: %s", + md->filename); md->string = xstrdup(""); } else md->string = xstrdup(buf); @@ -604,8 +584,7 @@ metadata_program_update(metadata_t *md, enum metadata_request md_req) break; case METADATA_ALL: default: - printf("%s: metadata_program_update(): Internal error: METADATA_ALL in code unreachable by METADATA_ALL\n", - cfg_progname()); + log_alert("metadata_program_update: METADATA_ALL in code unreachable by METADATA_ALL"); abort(); } @@ -622,14 +601,12 @@ const char * metadata_get_string(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_get_string(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_string: bad argument"); abort(); } if (md->string == NULL) { - printf("%s: metadata_get_string(): Internal error: md->string cannot be NULL\n", - cfg_progname()); + log_alert("metadata_get_string: md->string is NULL"); abort(); } @@ -640,8 +617,7 @@ const char * metadata_get_artist(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_get_artist(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_artist: bad argument"); abort(); } @@ -655,8 +631,7 @@ const char * metadata_get_title(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_get_title(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_title: bad argument"); abort(); } @@ -670,8 +645,7 @@ const char * metadata_get_filename(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_get_filename(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_filename: bad argument"); abort(); } @@ -686,8 +660,7 @@ int metadata_get_length(metadata_t *md) { if (md == NULL) { - printf("%s: metadata_get_length(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_get_length: bad argument"); abort(); } @@ -701,8 +674,7 @@ metadata_assemble_string(metadata_t *md) char *str; if (md == NULL) { - printf("%s: metadata_assemble_string(): Internal error: Bad arguments\n", - cfg_progname()); + log_alert("metadata_assemble_string: bad argument"); abort(); } diff --git a/src/playlist.c b/src/playlist.c index 2d197f5..e8765d2 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -20,7 +20,7 @@ #include "ezstream.h" -#include "cfg.h" +#include "log.h" #include "playlist.h" #include "xalloc.h" @@ -61,9 +61,8 @@ playlist_add(playlist_t *pl, const char *entry) size_t num; if (pl == NULL || entry == NULL) { - printf("%s: playlist_add(): Internal error: Bad arguments\n", - cfg_progname()); - exit(1); + log_alert("playlist_add: bad arguments"); + abort(); } num = pl->num + 1; @@ -133,7 +132,7 @@ playlist_read(const char *filename) pl = playlist_create(filename); if ((filep = fopen(filename, "r")) == NULL) { - printf("%s: %s: %s\n", cfg_progname(), filename, strerror(errno)); + log_error("%s: %s", filename, strerror(errno)); playlist_free(&pl); return (NULL); } @@ -141,7 +140,7 @@ playlist_read(const char *filename) pl = playlist_create("stdin"); if ((filep = fdopen(STDIN_FILENO, "r")) == NULL) { - printf("%s: stdin: %s\n", cfg_progname(), strerror(errno)); + log_error("stdin: %s", strerror(errno)); playlist_free(&pl); return (NULL); } @@ -154,7 +153,7 @@ playlist_read(const char *filename) if (strlen(buf) == sizeof(buf) - 1) { char skip_buf[2]; - printf("%s[%lu]: File or path name too long\n", + log_error("%s[%lu]: file or path name too long", pl->filename, line); /* Discard any excess chars in that line. */ while (fgets(skip_buf, (int)sizeof(skip_buf), filep) != NULL) { @@ -188,8 +187,8 @@ playlist_read(const char *filename) } } if (ferror(filep)) { - printf("%s: playlist_read(): Error while reading %s: %s\n", - cfg_progname(), pl->filename, strerror(errno)); + log_error("playlist_read: %s: %s", pl->filename, + strerror(errno)); fclose(filep); playlist_free(&pl); return (NULL); @@ -214,24 +213,24 @@ playlist_program(const char *filename) #ifdef HAVE_STAT if (stat(filename, &st) == -1) { - printf("%s: %s: %s\n", cfg_progname(), filename, strerror(errno)); + log_error("%s: %s", filename, strerror(errno)); playlist_free(&pl); return (NULL); } if (st.st_mode & (S_IWGRP | S_IWOTH)) { - printf("%s: Error: %s is group and/or world writeable\n", - cfg_progname(), filename); + log_error("%s: group and/or world writeable", + filename); playlist_free(&pl); return (NULL); } if (!(st.st_mode & (S_IEXEC | S_IXGRP | S_IXOTH))) { - printf("%s: %s: Not an executable program\n", cfg_progname(), filename); + log_error("%s: not an executable program", filename); playlist_free(&pl); return (NULL); } #else if ((filep = fopen(filename, "r")) == NULL) { - printf("%s: %s: %s\n", cfg_progname(), filename, strerror(errno)); + log_error("%s: %s", filename, strerror(errno)); playlist_free(&pl); return (NULL); } @@ -281,9 +280,8 @@ const char * playlist_get_next(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_get_next(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_get_next: bad argument"); + abort(); } if (pl->program) @@ -299,9 +297,8 @@ const char * playlist_peek_next(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_peek_next(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_peek_next: bad argument"); + abort(); } if (pl->program || pl->num == 0) @@ -314,9 +311,8 @@ void playlist_skip_next(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_skip_next(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_skip_next: bad argument"); + abort(); } if (pl->program || pl->num == 0) @@ -330,9 +326,8 @@ unsigned long playlist_get_num_items(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_get_position(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_get_position: bad argument"); + abort(); } if (pl->program) @@ -345,9 +340,8 @@ unsigned long playlist_get_position(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_get_position(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_get_position: bad argument"); + abort(); } if (pl->program) @@ -360,9 +354,8 @@ int playlist_set_position(playlist_t *pl, unsigned long idx) { if (pl == NULL) { - printf("%s: playlist_set_position(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_set_position: bad argument"); + abort(); } if (pl->program || idx > pl->num - 1) @@ -379,9 +372,8 @@ playlist_goto_entry(playlist_t *pl, const char *entry) unsigned long i; if (pl == NULL || entry == NULL) { - printf("%s: playlist_goto_entry(): Internal error: Bad arguments\n", - cfg_progname()); - exit(1); + log_alert("playlist_goto_entry: bad arguments"); + abort(); } if (pl->program) @@ -401,9 +393,8 @@ void playlist_rewind(playlist_t *pl) { if (pl == NULL) { - printf("%s: playlist_rewind(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_rewind: bad argument"); + abort(); } if (pl->program) @@ -418,9 +409,8 @@ playlist_reread(playlist_t **plist) playlist_t *new_pl, *pl; if (plist == NULL || *plist == NULL) { - printf("%s: playlist_reread(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_reread: bad argument"); + abort(); } pl = *plist; @@ -447,9 +437,8 @@ playlist_shuffle(playlist_t *pl) char *temp; if (pl == NULL) { - printf("%s: playlist_shuffle(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_shuffle: bad argument"); + abort(); } if (pl->program || pl->num < 2) @@ -485,9 +474,8 @@ playlist_run_program(playlist_t *pl) char buf[PATH_MAX]; if (pl == NULL) { - printf("%s: playlist_run_program(): Internal error: NULL argument\n", - cfg_progname()); - exit(1); + log_alert("playlist_run_program: bad argument"); + abort(); } if (!pl->program) @@ -495,14 +483,14 @@ playlist_run_program(playlist_t *pl) fflush(NULL); errno = 0; + log_debug("running command: %s", pl->filename); if ((filep = popen(pl->filename, "r")) == NULL) { - printf("%s: playlist_run_program(): Error while executing '%s'", - cfg_progname(), pl->filename); /* popen() does not set errno reliably ... */ if (errno) - printf(": %s\n", strerror(errno)); + log_error("execution error: %s: %s", pl->filename, + strerror(errno)); else - printf("\n"); + log_error("execution error: %s", pl->filename); return (NULL); } @@ -512,8 +500,8 @@ playlist_run_program(playlist_t *pl) pclose(filep); if (ferror(filep)) { - printf("%s: Error while reading output from program '%s': %s\n", - cfg_progname(), pl->filename, strerror(errnum)); + log_alert("%s: output read error: %s", pl->filename, + strerror(errnum)); exit(1); } @@ -524,8 +512,7 @@ playlist_run_program(playlist_t *pl) pclose(filep); if (strlen(buf) == sizeof(buf) - 1) { - printf("%s: Output from program '%s' too long\n", cfg_progname(), - pl->filename); + log_error("%s: output too long", pl->filename); return (NULL); } diff --git a/src/util.c b/src/util.c index 0fe3213..78fb8a1 100644 --- a/src/util.c +++ b/src/util.c @@ -36,8 +36,9 @@ #endif #include -#include "util.h" #include "configfile.h" +#include "log.h" +#include "util.h" #include "xalloc.h" #ifndef BUFSIZ @@ -88,42 +89,42 @@ stream_setup(const char *host, unsigned short port, const char *mount) shout_t *shout = NULL; if ((shout = shout_new()) == NULL) { - printf("%s: shout_new(): %s", cfg_progname(), strerror(ENOMEM)); + log_syserr(ERROR, ENOMEM, "shout_new"); return (NULL); } if (shout_set_host(shout, host) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_host(): %s\n", cfg_progname(), + log_error("shout_set_host: %s", shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_protocol(shout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_protocol(): %s\n", cfg_progname(), + log_error("shout_set_protocol: %s", shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_port(shout, port) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_port: %s\n", cfg_progname(), + log_error("shout_set_port: %s", shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_password(shout, pezConfig->password) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_password(): %s\n", cfg_progname(), + log_error("shout_set_password: %s", shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_mount(shout, mount) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_mount(): %s\n", cfg_progname(), + log_error("shout_set_mount: %s", shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_user(shout, "source") != SHOUTERR_SUCCESS) { - printf("%s: shout_set_user(): %s\n", cfg_progname(), + log_error("shout_set_user: %s", shout_get_error(shout)); shout_free(shout); return (NULL); @@ -131,87 +132,87 @@ stream_setup(const char *host, unsigned short port, const char *mount) if (!strcmp(pezConfig->format, MP3_FORMAT) && shout_set_format(shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_format(MP3): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_format(MP3): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if ((!strcmp(pezConfig->format, VORBIS_FORMAT) || !strcmp(pezConfig->format, THEORA_FORMAT)) && shout_set_format(shout, SHOUT_FORMAT_OGG) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_format(OGG): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_format(OGG): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->username && shout_set_user(shout, pezConfig->username) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_user(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_user: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverName && shout_set_name(shout, pezConfig->serverName) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_name(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_name: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverURL && shout_set_url(shout, pezConfig->serverURL) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_url(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_url: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverGenre && shout_set_genre(shout, pezConfig->serverGenre) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_genre(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_genre: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverDescription && shout_set_description(shout, pezConfig->serverDescription) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_description(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_description: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverBitrate && shout_set_audio_info(shout, SHOUT_AI_BITRATE, pezConfig->serverBitrate) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_audio_info(AI_BITRATE): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_audio_info(AI_BITRATE): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverChannels && shout_set_audio_info(shout, SHOUT_AI_CHANNELS, pezConfig->serverChannels) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_audio_info(AI_CHANNELS): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_audio_info(AI_CHANNELS): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverSamplerate && shout_set_audio_info(shout, SHOUT_AI_SAMPLERATE, pezConfig->serverSamplerate) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_audio_info(AI_SAMPLERATE): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_audio_info(AI_SAMPLERATE): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (pezConfig->serverQuality && shout_set_audio_info(shout, SHOUT_AI_QUALITY, pezConfig->serverQuality) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_audio_info(AI_QUALITY): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_audio_info(AI_QUALITY): %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } if (shout_set_public(shout, (unsigned int)pezConfig->serverPublic) != SHOUTERR_SUCCESS) { - printf("%s: shout_set_public(): %s\n", - cfg_progname(), shout_get_error(shout)); + log_error("shout_set_public: %s", + shout_get_error(shout)); shout_free(shout); return (NULL); } @@ -292,7 +293,7 @@ iconvert(const char *in_str, const char *from, const char *to, int mode) (cd = iconv_open("", from)) == (iconv_t)-1 && (cd = iconv_open(tocode, "")) == (iconv_t)-1) { xfree(tocode); - printf("%s: iconv_open(): %s\n", cfg_progname(), strerror(errno)); + log_syserr(ERROR, errno, "iconv_open"); return (xstrdup(in_str)); } @@ -331,7 +332,7 @@ iconvert(const char *in_str, const char *from, const char *to, int mode) } if (iconv_close(cd) == -1) { - printf("%s: iconv_close(): %s\n", cfg_progname(), strerror(errno)); + log_syserr(ERROR, errno, "iconv_close"); xfree(output); xfree(tocode); return (xstrdup(in_str));