diff options
author | Max Kellermann <max@duempel.org> | 2009-10-08 20:45:38 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-10-08 20:45:38 +0200 |
commit | 128a5fa4a599b72e6cb9c9f3954aec62dd3b3181 (patch) | |
tree | 5364277b05b9e98e636e76513e00dcf4015c2c3b | |
parent | a5960c20cc679132e049fc6da0f3d7d6fa34e361 (diff) | |
download | mpd-128a5fa4a599b72e6cb9c9f3954aec62dd3b3181.tar.gz mpd-128a5fa4a599b72e6cb9c9f3954aec62dd3b3181.tar.xz mpd-128a5fa4a599b72e6cb9c9f3954aec62dd3b3181.zip |
player_control: allocate getPlayerErrorStr() result
This lets us eliminate the static fixed-size buffer.
-rw-r--r-- | src/command.c | 7 | ||||
-rw-r--r-- | src/player_control.c | 32 | ||||
-rw-r--r-- | src/player_control.h | 5 |
3 files changed, 23 insertions, 21 deletions
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); |