aboutsummaryrefslogtreecommitdiffstats
path: root/src/command.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-09-07 13:39:31 +0200
committerMax Kellermann <max@duempel.org>2008-09-07 13:39:31 +0200
commit8d2830b3f9ab52e1b2dd54d82ae3aaf39e61abe8 (patch)
tree84f58989cf38f05cd9d55f4bc55bd1ce916d4958 /src/command.c
parent20feb0cbbab3c1516f0309a87c3d27f9801c7938 (diff)
downloadmpd-8d2830b3f9ab52e1b2dd54d82ae3aaf39e61abe8.tar.gz
mpd-8d2830b3f9ab52e1b2dd54d82ae3aaf39e61abe8.tar.xz
mpd-8d2830b3f9ab52e1b2dd54d82ae3aaf39e61abe8.zip
playlist: don't pass "fd" to playlist.c functions
The playlist library shouldn't talk to the client if possible. Introduce the "enum playlist_result" type which the caller (i.e. command.c) may use to generate an error message.
Diffstat (limited to '')
-rw-r--r--src/command.c162
1 files changed, 126 insertions, 36 deletions
diff --git a/src/command.c b/src/command.c
index 9015a3881..e9dc83ccb 100644
--- a/src/command.c
+++ b/src/command.c
@@ -220,6 +220,53 @@ static int mpd_fprintf__ check_int(int fd, int *dst,
return 0;
}
+static int print_playlist_result(int fd, enum playlist_result result)
+{
+ switch (result) {
+ case PLAYLIST_RESULT_SUCCESS:
+ return 0;
+
+ case PLAYLIST_RESULT_ERRNO:
+ commandError(fd, ACK_ERROR_SYSTEM, strerror(errno));
+ return -1;
+
+ case PLAYLIST_RESULT_NO_SUCH_SONG:
+ commandError(fd, ACK_ERROR_NO_EXIST, "No such song");
+ return -1;
+
+ case PLAYLIST_RESULT_NO_SUCH_LIST:
+ commandError(fd, ACK_ERROR_NO_EXIST, "No such playlist");
+ return -1;
+
+ case PLAYLIST_RESULT_LIST_EXISTS:
+ commandError(fd, ACK_ERROR_NO_EXIST,
+ "Playlist already exists");
+ return -1;
+
+ case PLAYLIST_RESULT_BAD_NAME:
+ commandError(fd, ACK_ERROR_ARG,
+ "playlist name is invalid: "
+ "playlist names may not contain slashes,"
+ " newlines or carriage returns");
+ return -1;
+
+ case PLAYLIST_RESULT_BAD_RANGE:
+ commandError(fd, ACK_ERROR_ARG, "Bad song index");
+ return -1;
+
+ case PLAYLIST_RESULT_NOT_PLAYING:
+ commandError(fd, ACK_ERROR_PLAYER_SYNC, "Not playing");
+ return -1;
+
+ case PLAYLIST_RESULT_TOO_LARGE:
+ commandError(fd, ACK_ERROR_PLAYLIST_MAX,
+ "playlist is at the max size");
+ return -1;
+ }
+
+ assert(0);
+}
+
static void addCommand(const char *name,
int reqPermission,
int minargs,
@@ -255,21 +302,25 @@ static int handlePlay(int fd, mpd_unused int *permission,
int argc, char *argv[])
{
int song = -1;
+ enum playlist_result result;
if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0)
return -1;
- return playPlaylist(fd, song, 0);
+ result = playPlaylist(song, 0);
+ return print_playlist_result(fd, result);
}
static int handlePlayId(int fd, mpd_unused int *permission,
int argc, char *argv[])
{
int id = -1;
+ enum playlist_result result;
if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0)
return -1;
- return playPlaylistById(fd, id, 0);
+ result = playPlaylistById(id, 0);
+ return print_playlist_result(fd, result);
}
static int handleStop(mpd_unused int fd, mpd_unused int *permission,
@@ -283,11 +334,13 @@ static int handleCurrentSong(int fd, mpd_unused int *permission,
mpd_unused int argc, mpd_unused char *argv[])
{
int song = getPlaylistCurrentSong();
+ enum playlist_result result;
- if (song >= 0) {
- return playlistInfo(fd, song);
- } else
+ if (song < 0)
return 0;
+
+ result = playlistInfo(fd, song);
+ return print_playlist_result(fd, result);
}
static int handlePause(int fd, mpd_unused int *permission,
@@ -384,54 +437,65 @@ static int handleAdd(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
char *path = argv[1];
+ enum playlist_result result;
if (isRemoteUrl(path))
- return addToPlaylist(fd, path, NULL);
+ return addToPlaylist(path, NULL);
- return addAllIn(fd, path);
+ result = addAllIn(fd, path);
+ return print_playlist_result(fd, result);
}
static int handleAddId(int fd, mpd_unused int *permission,
int argc, char *argv[])
{
int added_id;
- int ret = addToPlaylist(fd, argv[1], &added_id);
-
- if (!ret) {
- if (argc == 3) {
- int to;
- if (check_int(fd, &to, argv[2],
- check_integer, argv[2]) < 0)
- return -1;
- ret = moveSongInPlaylistById(fd, added_id, to);
- if (ret) { /* move failed */
- deleteFromPlaylistById(fd, added_id);
- return ret;
- }
+ enum playlist_result result = addToPlaylist(argv[1], &added_id);
+
+ if (result == PLAYLIST_RESULT_SUCCESS)
+ return result;
+
+ if (argc == 3) {
+ int to;
+ if (check_int(fd, &to, argv[2],
+ check_integer, argv[2]) < 0)
+ return -1;
+ result = moveSongInPlaylistById(added_id, to);
+ if (result != PLAYLIST_RESULT_SUCCESS) {
+ int ret = print_playlist_result(fd, result);
+ deleteFromPlaylistById(added_id);
+ return ret;
}
- fdprintf(fd, "Id: %d\n", added_id);
}
- return ret;
+
+ fdprintf(fd, "Id: %d\n", added_id);
+ return result;
}
static int handleDelete(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int song;
+ enum playlist_result result;
if (check_int(fd, &song, argv[1], need_positive) < 0)
return -1;
- return deleteFromPlaylist(fd, song);
+
+ result = deleteFromPlaylist(song);
+ return print_playlist_result(fd, result);
}
static int handleDeleteId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int id;
+ enum playlist_result result;
if (check_int(fd, &id, argv[1], need_positive) < 0)
return -1;
- return deleteFromPlaylistById(fd, id);
+
+ result = deleteFromPlaylistById(id);
+ return print_playlist_result(fd, result);
}
static int handlePlaylist(int fd, mpd_unused int *permission,
@@ -441,10 +505,10 @@ static int handlePlaylist(int fd, mpd_unused int *permission,
return 0;
}
-static int handleShuffle(int fd, mpd_unused int *permission,
+static int handleShuffle(mpd_unused int fd, mpd_unused int *permission,
mpd_unused int argc, mpd_unused char *argv[])
{
- shufflePlaylist(fd);
+ shufflePlaylist();
return 0;
}
@@ -458,7 +522,10 @@ static int handleClear(mpd_unused int fd, mpd_unused int *permission,
static int handleSave(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
- return savePlaylist(fd, argv[1]);
+ enum playlist_result result;
+
+ result = savePlaylist(argv[1]);
+ return print_playlist_result(fd, result);
}
static int handleLoad(int fd, mpd_unused int *permission,
@@ -499,7 +566,10 @@ static int handleLsInfo(int fd, mpd_unused int *permission,
static int handleRm(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
- return deletePlaylist(fd, argv[1]);
+ enum playlist_result result;
+
+ result = deletePlaylist(argv[1]);
+ return print_playlist_result(fd, result);
}
static int handleRename(int fd, mpd_unused int *permission,
@@ -532,20 +602,26 @@ static int handlePlaylistInfo(int fd, mpd_unused int *permission,
int argc, char *argv[])
{
int song = -1;
+ enum playlist_result result;
if (argc == 2 && check_int(fd, &song, argv[1], need_positive) < 0)
return -1;
- return playlistInfo(fd, song);
+
+ result = playlistInfo(fd, song);
+ return print_playlist_result(fd, result);
}
static int handlePlaylistId(int fd, mpd_unused int *permission,
int argc, char *argv[])
{
int id = -1;
+ enum playlist_result result;
if (argc == 2 && check_int(fd, &id, argv[1], need_positive) < 0)
return -1;
- return playlistId(fd, id);
+
+ result = playlistId(fd, id);
+ return print_playlist_result(fd, result);
}
static int handleFind(int fd, mpd_unused int *permission,
@@ -871,72 +947,86 @@ static int handleMove(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int from, to;
+ enum playlist_result result;
if (check_int(fd, &from, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0)
return -1;
- return moveSongInPlaylist(fd, from, to);
+ result = moveSongInPlaylist(from, to);
+ return print_playlist_result(fd, result);
}
static int handleMoveId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int id, to;
+ enum playlist_result result;
if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &to, argv[2], check_integer, argv[2]) < 0)
return -1;
- return moveSongInPlaylistById(fd, id, to);
+ result = moveSongInPlaylistById(id, to);
+ return print_playlist_result(fd, result);
}
static int handleSwap(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int song1, song2;
+ enum playlist_result result;
if (check_int(fd, &song1, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &song2, argv[2], check_integer, argv[2]) < 0)
return -1;
- return swapSongsInPlaylist(fd, song1, song2);
+ result = swapSongsInPlaylist(song1, song2);
+ return print_playlist_result(fd, result);
}
static int handleSwapId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int id1, id2;
+ enum playlist_result result;
if (check_int(fd, &id1, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &id2, argv[2], check_integer, argv[2]) < 0)
return -1;
- return swapSongsInPlaylistById(fd, id1, id2);
+ result = swapSongsInPlaylistById(id1, id2);
+ return print_playlist_result(fd, result);
}
static int handleSeek(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int song, seek_time;
+ enum playlist_result result;
if (check_int(fd, &song, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0)
return -1;
- return seekSongInPlaylist(fd, song, seek_time);
+
+ result = seekSongInPlaylist(song, seek_time);
+ return print_playlist_result(fd, result);
}
static int handleSeekId(int fd, mpd_unused int *permission,
mpd_unused int argc, char *argv[])
{
int id, seek_time;
+ enum playlist_result result;
if (check_int(fd, &id, argv[1], check_integer, argv[1]) < 0)
return -1;
if (check_int(fd, &seek_time, argv[2], check_integer, argv[2]) < 0)
return -1;
- return seekSongInPlaylistById(fd, id, seek_time);
+
+ result = seekSongInPlaylistById(id, seek_time);
+ return print_playlist_result(fd, result);
}
static int handleListAllInfo(int fd, mpd_unused int *permission,