From 128a5fa4a599b72e6cb9c9f3954aec62dd3b3181 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Thu, 8 Oct 2009 20:45:38 +0200
Subject: player_control: allocate getPlayerErrorStr() result

This lets us eliminate the static fixed-size buffer.
---
 src/command.c        |  7 +++++--
 src/player_control.c | 32 +++++++++++++-------------------
 src/player_control.h |  5 +++++
 3 files changed, 23 insertions(+), 21 deletions(-)

(limited to 'src')

diff --git a/src/command.c b/src/command.c
index 165e21c96..c48ea845d 100644
--- a/src/command.c
+++ b/src/command.c
@@ -454,6 +454,7 @@ handle_status(struct client *client,
 {
 	const char *state = NULL;
 	int updateJobId;
+	char *error;
 	int song;
 
 	switch (getPlayerState()) {
@@ -515,10 +516,12 @@ handle_status(struct client *client,
 			      updateJobId);
 	}
 
-	if (getPlayerError() != PLAYER_ERROR_NOERROR) {
+	error = getPlayerErrorStr();
+	if (error != NULL) {
 		client_printf(client,
 			      COMMAND_STATUS_ERROR ": %s\n",
-			      getPlayerErrorStr());
+			      error);
+		g_free(error);
 	}
 
 	song = playlist_get_next_song(&g_playlist);
diff --git a/src/player_control.c b/src/player_control.c
index df80ac4ff..bef19917f 100644
--- a/src/player_control.c
+++ b/src/player_control.c
@@ -167,46 +167,40 @@ pc_errored_song_uri(void)
 
 char *getPlayerErrorStr(void)
 {
-	/* static OK here, only one user in main task */
-	static char error[MPD_PATH_MAX + 64]; /* still too much */
-	static const size_t errorlen = sizeof(error);
+	char *error;
 	char *uri;
 
-	*error = '\0'; /* likely */
-
 	switch (pc.error) {
 	case PLAYER_ERROR_NOERROR:
-		break;
+		return NULL;
 
 	case PLAYER_ERROR_FILENOTFOUND:
 		uri = pc_errored_song_uri();
-		snprintf(error, errorlen,
-			 "file \"%s\" does not exist or is inaccessible", uri);
+		error = g_strdup_printf("file \"%s\" does not exist or is inaccessible", uri);
 		g_free(uri);
-		break;
+		return error;
 
 	case PLAYER_ERROR_FILE:
 		uri = pc_errored_song_uri();
-		snprintf(error, errorlen, "problems decoding \"%s\"", uri);
+		error = g_strdup_printf("problems decoding \"%s\"", uri);
 		g_free(uri);
-		break;
+		return error;
 
 	case PLAYER_ERROR_AUDIO:
-		strcpy(error, "problems opening audio device");
-		break;
+		return g_strdup("problems opening audio device");
 
 	case PLAYER_ERROR_SYSTEM:
-		strcpy(error, "system error occured");
-		break;
+		return g_strdup("system error occured");
 
 	case PLAYER_ERROR_UNKTYPE:
 		uri = pc_errored_song_uri();
-		snprintf(error, errorlen,
-			 "file type of \"%s\" is unknown", uri);
+		error = g_strdup_printf("file type of \"%s\" is unknown", uri);
 		g_free(uri);
-		break;
+		return error;
 	}
-	return *error ? error : NULL;
+
+	assert(false);
+	return NULL;
 }
 
 void
diff --git a/src/player_control.h b/src/player_control.h
index 0cc3c73a8..9cf5b1377 100644
--- a/src/player_control.h
+++ b/src/player_control.h
@@ -122,6 +122,11 @@ enum player_state getPlayerState(void);
 
 void clearPlayerError(void);
 
+/**
+ * Returns the human-readable message describing the last error during
+ * playback, NULL if no error occurred.  The caller has to free the
+ * returned string.
+ */
 char *getPlayerErrorStr(void);
 
 enum player_error getPlayerError(void);
-- 
cgit v1.2.3