diff options
author | J. Alexander Treuman <jat@spatialrift.net> | 2007-05-28 15:50:45 +0000 |
---|---|---|
committer | J. Alexander Treuman <jat@spatialrift.net> | 2007-05-28 15:50:45 +0000 |
commit | 4e05a161e54fe05902b99eff521aa0759b102f05 (patch) | |
tree | 9014ab8ce74e4fb2f0115c5518c62879bc269324 /trunk/src/command.c | |
parent | e45bc035931b2c9ef13b85f98a3d4833a8dec8a9 (diff) | |
download | mpd-4e05a161e54fe05902b99eff521aa0759b102f05.tar.gz mpd-4e05a161e54fe05902b99eff521aa0759b102f05.tar.xz mpd-4e05a161e54fe05902b99eff521aa0759b102f05.zip |
Making branch for 0.13.0 fixes.
git-svn-id: https://svn.musicpd.org/mpd/branches/branch-0.13.0-fixes@6330 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'trunk/src/command.c')
-rw-r--r-- | trunk/src/command.c | 1299 |
1 files changed, 0 insertions, 1299 deletions
diff --git a/trunk/src/command.c b/trunk/src/command.c deleted file mode 100644 index 84a30db2b..000000000 --- a/trunk/src/command.c +++ /dev/null @@ -1,1299 +0,0 @@ -/* the Music Player Daemon (MPD) - * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) - * This project's homepage is: http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "command.h" -#include "player.h" -#include "playlist.h" -#include "ls.h" -#include "directory.h" -#include "volume.h" -#include "stats.h" -#include "myfprintf.h" -#include "list.h" -#include "permission.h" -#include "buffer2array.h" -#include "log.h" -#include "tag.h" -#include "utils.h" -#include "storedPlaylist.h" - -#include <assert.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#define COMMAND_PLAY "play" -#define COMMAND_PLAYID "playid" -#define COMMAND_STOP "stop" -#define COMMAND_PAUSE "pause" -#define COMMAND_STATUS "status" -#define COMMAND_KILL "kill" -#define COMMAND_CLOSE "close" -#define COMMAND_ADD "add" -#define COMMAND_ADDID "addid" -#define COMMAND_DELETE "delete" -#define COMMAND_DELETEID "deleteid" -#define COMMAND_PLAYLIST "playlist" -#define COMMAND_SHUFFLE "shuffle" -#define COMMAND_CLEAR "clear" -#define COMMAND_SAVE "save" -#define COMMAND_LOAD "load" -#define COMMAND_LISTPLAYLIST "listplaylist" -#define COMMAND_LISTPLAYLISTINFO "listplaylistinfo" -#define COMMAND_LSINFO "lsinfo" -#define COMMAND_RM "rm" -#define COMMAND_PLAYLISTINFO "playlistinfo" -#define COMMAND_PLAYLISTID "playlistid" -#define COMMAND_FIND "find" -#define COMMAND_SEARCH "search" -#define COMMAND_UPDATE "update" -#define COMMAND_NEXT "next" -#define COMMAND_PREVIOUS "previous" -#define COMMAND_LISTALL "listall" -#define COMMAND_VOLUME "volume" -#define COMMAND_REPEAT "repeat" -#define COMMAND_RANDOM "random" -#define COMMAND_STATS "stats" -#define COMMAND_CLEAR_ERROR "clearerror" -#define COMMAND_LIST "list" -#define COMMAND_MOVE "move" -#define COMMAND_MOVEID "moveid" -#define COMMAND_SWAP "swap" -#define COMMAND_SWAPID "swapid" -#define COMMAND_SEEK "seek" -#define COMMAND_SEEKID "seekid" -#define COMMAND_LISTALLINFO "listallinfo" -#define COMMAND_PING "ping" -#define COMMAND_SETVOL "setvol" -#define COMMAND_PASSWORD "password" -#define COMMAND_CROSSFADE "crossfade" -#define COMMAND_URL_HANDLERS "urlhandlers" -#define COMMAND_PLCHANGES "plchanges" -#define COMMAND_PLCHANGESPOSID "plchangesposid" -#define COMMAND_CURRENTSONG "currentsong" -#define COMMAND_ENABLE_DEV "enableoutput" -#define COMMAND_DISABLE_DEV "disableoutput" -#define COMMAND_DEVICES "outputs" -#define COMMAND_COMMANDS "commands" -#define COMMAND_NOTCOMMANDS "notcommands" -#define COMMAND_PLAYLISTCLEAR "playlistclear" -#define COMMAND_PLAYLISTADD "playlistadd" -#define COMMAND_PLAYLISTFIND "playlistfind" -#define COMMAND_PLAYLISTSEARCH "playlistsearch" -#define COMMAND_PLAYLISTMOVE "playlistmove" -#define COMMAND_PLAYLISTDELETE "playlistdelete" -#define COMMAND_TAGTYPES "tagtypes" -#define COMMAND_COUNT "count" -#define COMMAND_RENAME "rename" - -#define COMMAND_STATUS_VOLUME "volume" -#define COMMAND_STATUS_STATE "state" -#define COMMAND_STATUS_REPEAT "repeat" -#define COMMAND_STATUS_RANDOM "random" -#define COMMAND_STATUS_PLAYLIST "playlist" -#define COMMAND_STATUS_PLAYLIST_LENGTH "playlistlength" -#define COMMAND_STATUS_SONG "song" -#define COMMAND_STATUS_SONGID "songid" -#define COMMAND_STATUS_TIME "time" -#define COMMAND_STATUS_BITRATE "bitrate" -#define COMMAND_STATUS_ERROR "error" -#define COMMAND_STATUS_CROSSFADE "xfade" -#define COMMAND_STATUS_AUDIO "audio" -#define COMMAND_STATUS_UPDATING_DB "updating_db" - -/* - * The most we ever use is for search/find, and that limits it to the - * number of tags we can have. Add one for the command, and one extra - * to catch errors clients may send us - */ -#define COMMAND_ARGV_MAX (2+(TAG_NUM_OF_ITEM_TYPES*2)) - -typedef struct _CommandEntry CommandEntry; - -typedef int (*CommandHandlerFunction) (int, int *, int, char **); -typedef int (*CommandListHandlerFunction) - (int, int *, int, char **, struct strnode *, CommandEntry *); - -/* if min: -1 don't check args * - * if max: -1 no max args */ -struct _CommandEntry { - char *cmd; - int min; - int max; - int reqPermission; - CommandHandlerFunction handler; - CommandListHandlerFunction listHandler; -}; - -static char *current_command; -static int command_listNum; - -static CommandEntry *getCommandEntryFromString(char *string, int *permission); - -static List *commandList; - -static CommandEntry *newCommandEntry(void) -{ - CommandEntry *cmd = xmalloc(sizeof(CommandEntry)); - cmd->cmd = NULL; - cmd->min = 0; - cmd->max = 0; - cmd->handler = NULL; - cmd->listHandler = NULL; - cmd->reqPermission = 0; - return cmd; -} - -static void addCommand(char *name, - int reqPermission, - int minargs, - int maxargs, - CommandHandlerFunction handler_func, - CommandListHandlerFunction listHandler_func) -{ - CommandEntry *cmd = newCommandEntry(); - cmd->cmd = name; - cmd->min = minargs; - cmd->max = maxargs; - cmd->handler = handler_func; - cmd->listHandler = listHandler_func; - cmd->reqPermission = reqPermission; - - insertInList(commandList, cmd->cmd, cmd); -} - -static int handleUrlHandlers(int fd, int *permission, int argc, char *argv[]) -{ - return printRemoteUrlHandlers(fd); -} - -static int handleTagTypes(int fd, int *permission, int argc, char *argv[]) -{ - printTagTypes(fd); - return 0; -} - -static int handlePlay(int fd, int *permission, int argc, char *argv[]) -{ - int song = -1; - char *test; - - if (argc == 2) { - song = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "need a positive integer"); - return -1; - } - } - return playPlaylist(fd, song, 0); -} - -static int handlePlayId(int fd, int *permission, int argc, char *argv[]) -{ - int id = -1; - char *test; - - if (argc == 2) { - id = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "need a positive integer"); - return -1; - } - } - return playPlaylistById(fd, id, 0); -} - -static int handleStop(int fd, int *permission, int argc, char *argv[]) -{ - return stopPlaylist(fd); -} - -static int handleCurrentSong(int fd, int *permission, int argc, char *argv[]) -{ - int song = getPlaylistCurrentSong(); - - if (song >= 0) { - return playlistInfo(fd, song); - } else - return 0; -} - -static int handlePause(int fd, int *permission, int argc, char *argv[]) -{ - if (argc == 2) { - char *test; - int pause = strtol(argv[1], &test, 10); - if (*test != '\0' || (pause != 0 && pause != 1)) { - commandError(fd, ACK_ERROR_ARG, "\"%s\" is not 0 or 1", - argv[1]); - return -1; - } - return playerSetPause(fd, pause); - } - return playerPause(fd); -} - -static int commandStatus(int fd, int *permission, int argc, char *argv[]) -{ - char *state = NULL; - int updateJobId; - int song; - - /*syncPlayerAndPlaylist(); */ - playPlaylistIfPlayerStopped(); - switch (getPlayerState()) { - case PLAYER_STATE_STOP: - state = COMMAND_STOP; - break; - case PLAYER_STATE_PAUSE: - state = COMMAND_PAUSE; - break; - case PLAYER_STATE_PLAY: - state = COMMAND_PLAY; - break; - } - - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_VOLUME, getVolumeLevel()); - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_REPEAT, - getPlaylistRepeatStatus()); - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_RANDOM, - getPlaylistRandomStatus()); - fdprintf(fd, "%s: %li\n", COMMAND_STATUS_PLAYLIST, - getPlaylistVersion()); - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_PLAYLIST_LENGTH, - getPlaylistLength()); - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_CROSSFADE, - (int)(getPlayerCrossFade() + 0.5)); - - fdprintf(fd, "%s: %s\n", COMMAND_STATUS_STATE, state); - - song = getPlaylistCurrentSong(); - if (song >= 0) { - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_SONG, song); - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_SONGID, - getPlaylistSongId(song)); - } - if (getPlayerState() != PLAYER_STATE_STOP) { - fdprintf(fd, "%s: %i:%i\n", COMMAND_STATUS_TIME, - getPlayerElapsedTime(), getPlayerTotalTime()); - fdprintf(fd, "%s: %li\n", COMMAND_STATUS_BITRATE, - getPlayerBitRate()); - fdprintf(fd, "%s: %u:%i:%i\n", COMMAND_STATUS_AUDIO, - getPlayerSampleRate(), getPlayerBits(), - getPlayerChannels()); - } - - if ((updateJobId = isUpdatingDB())) { - fdprintf(fd, "%s: %i\n", COMMAND_STATUS_UPDATING_DB, - updateJobId); - } - - if (getPlayerError() != PLAYER_ERROR_NOERROR) { - fdprintf(fd, "%s: %s\n", COMMAND_STATUS_ERROR, - getPlayerErrorStr()); - } - - return 0; -} - -static int handleKill(int fd, int *permission, int argc, char *argv[]) -{ - return COMMAND_RETURN_KILL; -} - -static int handleClose(int fd, int *permission, int argc, char *argv[]) -{ - return COMMAND_RETURN_CLOSE; -} - -static int handleAdd(int fd, int *permission, int argc, char *argv[]) -{ - char *path = argv[1]; - - if (isRemoteUrl(path)) - return addToPlaylist(fd, path, 0); - - return addAllIn(fd, path); -} - -static int handleAddId(int fd, int *permission, int argc, char *argv[]) -{ - return addToPlaylist(fd, argv[1], 1); -} - -static int handleDelete(int fd, int *permission, int argc, char *argv[]) -{ - int song; - char *test; - - song = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need a positive integer"); - return -1; - } - return deleteFromPlaylist(fd, song); -} - -static int handleDeleteId(int fd, int *permission, int argc, char *argv[]) -{ - int id; - char *test; - - id = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need a positive integer"); - return -1; - } - return deleteFromPlaylistById(fd, id); -} - -static int handlePlaylist(int fd, int *permission, int argc, char *argv[]) -{ - return showPlaylist(fd); -} - -static int handleShuffle(int fd, int *permission, int argc, char *argv[]) -{ - return shufflePlaylist(fd); -} - -static int handleClear(int fd, int *permission, int argc, char *argv[]) -{ - return clearPlaylist(fd); -} - -static int handleSave(int fd, int *permission, int argc, char *argv[]) -{ - return savePlaylist(fd, argv[1]); -} - -static int handleLoad(int fd, int *permission, int argc, char *argv[]) -{ - return loadPlaylist(fd, argv[1]); -} - -static int handleListPlaylist(int fd, int *permission, int argc, char *argv[]) -{ - return PlaylistInfo(fd, argv[1], 0); -} - -static int handleListPlaylistInfo(int fd, int *permission, - int argc, char *argv[]) -{ - return PlaylistInfo(fd, argv[1], 1); -} - -static int handleLsInfo(int fd, int *permission, int argc, char *argv[]) -{ - char *path = ""; - - if (argc == 2) - path = argv[1]; - - if (printDirectoryInfo(fd, path) < 0) - return -1; - - if (isRootDirectory(path)) - return lsPlaylists(fd, path); - - return 0; -} - -static int handleRm(int fd, int *permission, int argc, char *argv[]) -{ - return deletePlaylist(fd, argv[1]); -} - -static int handleRename(int fd, int *permission, int argc, char *argv[]) -{ - return renameStoredPlaylist(fd, argv[1], argv[2]); -} - -static int handlePlaylistChanges(int fd, int *permission, - int argc, char *argv[]) -{ - unsigned long version; - char *test; - - version = strtoul(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need a positive integer"); - return -1; - } - return playlistChanges(fd, version); -} - -static int handlePlaylistChangesPosId(int fd, int *permission, - int argc, char *argv[]) -{ - unsigned long version; - char *test; - - version = strtoul(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need a positive integer"); - return -1; - } - return playlistChangesPosId(fd, version); -} - -static int handlePlaylistInfo(int fd, int *permission, int argc, char *argv[]) -{ - int song = -1; - char *test; - - if (argc == 2) { - song = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "need a positive integer"); - return -1; - } - } - return playlistInfo(fd, song); -} - -static int handlePlaylistId(int fd, int *permission, int argc, char *argv[]) -{ - int id = -1; - char *test; - - if (argc == 2) { - id = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "need a positive integer"); - return -1; - } - } - return playlistId(fd, id); -} - -static int handleFind(int fd, int *permission, int argc, char *argv[]) -{ - int ret; - - LocateTagItem *items; - int numItems = newLocateTagItemArrayFromArgArray(argv + 1, - argc - 1, - &items); - - if (numItems <= 0) { - commandError(fd, ACK_ERROR_ARG, "incorrect arguments"); - return -1; - } - - ret = findSongsIn(fd, NULL, numItems, items); - - freeLocateTagItemArray(numItems, items); - - return ret; -} - -static int handleSearch(int fd, int *permission, int argc, char *argv[]) -{ - int ret; - - LocateTagItem *items; - int numItems = newLocateTagItemArrayFromArgArray(argv + 1, - argc - 1, - &items); - - if (numItems <= 0) { - commandError(fd, ACK_ERROR_ARG, "incorrect arguments"); - return -1; - } - - ret = searchForSongsIn(fd, NULL, numItems, items); - - freeLocateTagItemArray(numItems, items); - - return ret; -} - -static int handleCount(int fd, int *permission, int argc, char *argv[]) -{ - int ret; - - LocateTagItem *items; - int numItems = newLocateTagItemArrayFromArgArray(argv + 1, - argc - 1, - &items); - - if (numItems <= 0) { - commandError(fd, ACK_ERROR_ARG, "incorrect arguments"); - return -1; - } - - ret = searchStatsForSongsIn(fd, NULL, numItems, items); - - freeLocateTagItemArray(numItems, items); - - return ret; -} - -static int handlePlaylistFind(int fd, int *permission, int argc, char *argv[]) -{ - LocateTagItem *items; - int numItems = newLocateTagItemArrayFromArgArray(argv + 1, - argc - 1, - &items); - - if (numItems <= 0) { - commandError(fd, ACK_ERROR_ARG, "incorrect arguments"); - return -1; - } - - findSongsInPlaylist(fd, numItems, items); - - freeLocateTagItemArray(numItems, items); - - return 0; -} - -static int handlePlaylistSearch(int fd, int *permission, int argc, char *argv[]) -{ - LocateTagItem *items; - int numItems = newLocateTagItemArrayFromArgArray(argv + 1, - argc - 1, - &items); - - if (numItems <= 0) { - commandError(fd, ACK_ERROR_ARG, "incorrect arguments"); - return -1; - } - - searchForSongsInPlaylist(fd, numItems, items); - - freeLocateTagItemArray(numItems, items); - - return 0; -} - -static int handlePlaylistDelete(int fd, int *permission, int argc, char *argv[]) { - char *playlist = argv[1]; - int from; - char *test; - - from = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - - return removeOneSongFromStoredPlaylistByPath(fd, playlist, from); -} - -static int handlePlaylistMove(int fd, int *permission, int argc, char *argv[]) -{ - char *playlist = argv[1]; - int from, to; - char *test; - - from = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - to = strtol(argv[3], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[3]); - return -1; - } - - return moveSongInStoredPlaylistByPath(fd, playlist, from, to); -} - -static int listHandleUpdate(int fd, - int *permission, - int argc, - char *argv[], - struct strnode *cmdnode, CommandEntry * cmd) -{ - static List *pathList; - CommandEntry *nextCmd = NULL; - struct strnode *next = cmdnode->next; - - if (!pathList) - pathList = makeList(NULL, 1); - - if (argc == 2) - insertInList(pathList, argv[1], NULL); - else - insertInList(pathList, "", NULL); - - if (next) - nextCmd = getCommandEntryFromString(next->data, permission); - - if (cmd != nextCmd) { - int ret = updateInit(fd, pathList); - freeList(pathList); - pathList = NULL; - return ret; - } - - return 0; -} - -static int handleUpdate(int fd, int *permission, int argc, char *argv[]) -{ - if (argc == 2) { - int ret; - List *pathList = makeList(NULL, 1); - insertInList(pathList, argv[1], NULL); - ret = updateInit(fd, pathList); - freeList(pathList); - return ret; - } - return updateInit(fd, NULL); -} - -static int handleNext(int fd, int *permission, int argc, char *argv[]) -{ - return nextSongInPlaylist(fd); -} - -static int handlePrevious(int fd, int *permission, int argc, char *argv[]) -{ - return previousSongInPlaylist(fd); -} - -static int handleListAll(int fd, int *permission, int argc, char *argv[]) -{ - char *directory = NULL; - - if (argc == 2) - directory = argv[1]; - return printAllIn(fd, directory); -} - -static int handleVolume(int fd, int *permission, int argc, char *argv[]) -{ - int change; - char *test; - - change = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need an integer"); - return -1; - } - return changeVolumeLevel(fd, change, 1); -} - -static int handleSetVol(int fd, int *permission, int argc, char *argv[]) -{ - int level; - char *test; - - level = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need an integer"); - return -1; - } - return changeVolumeLevel(fd, level, 0); -} - -static int handleRepeat(int fd, int *permission, int argc, char *argv[]) -{ - int status; - char *test; - - status = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need an integer"); - return -1; - } - return setPlaylistRepeatStatus(fd, status); -} - -static int handleRandom(int fd, int *permission, int argc, char *argv[]) -{ - int status; - char *test; - - status = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "need an integer"); - return -1; - } - return setPlaylistRandomStatus(fd, status); -} - -static int handleStats(int fd, int *permission, int argc, char *argv[]) -{ - return printStats(fd); -} - -static int handleClearError(int fd, int *permission, int argc, char *argv[]) -{ - clearPlayerError(); - return 0; -} - -static int handleList(int fd, int *permission, int argc, char *argv[]) -{ - int numConditionals = 0; - LocateTagItem *conditionals = NULL; - int tagType = getLocateTagItemType(argv[1]); - int ret; - - if (tagType < 0) { - commandError(fd, ACK_ERROR_ARG, "\"%s\" is not known", argv[1]); - return -1; - } - - if (tagType == LOCATE_TAG_ANY_TYPE) { - commandError(fd, ACK_ERROR_ARG, - "\"any\" is not a valid return tag type"); - return -1; - } - - /* for compatibility with < 0.12.0 */ - if (argc == 3) { - if (tagType != TAG_ITEM_ALBUM) { - commandError(fd, ACK_ERROR_ARG, - "should be \"%s\" for 3 arguments", - mpdTagItemKeys[TAG_ITEM_ALBUM]); - return -1; - } - conditionals = newLocateTagItem(mpdTagItemKeys[TAG_ITEM_ARTIST], - argv[2]); - numConditionals = 1; - } else { - numConditionals = - newLocateTagItemArrayFromArgArray(argv + 2, - argc - 2, &conditionals); - - if (numConditionals < 0) { - commandError(fd, ACK_ERROR_ARG, - "not able to parse args"); - return -1; - } - } - - ret = listAllUniqueTags(fd, tagType, numConditionals, conditionals); - - if (conditionals) - freeLocateTagItemArray(numConditionals, conditionals); - - return ret; -} - -static int handleMove(int fd, int *permission, int argc, char *argv[]) -{ - int from; - int to; - char *test; - - from = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - to = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - return moveSongInPlaylist(fd, from, to); -} - -static int handleMoveId(int fd, int *permission, int argc, char *argv[]) -{ - int id; - int to; - char *test; - - id = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - to = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - return moveSongInPlaylistById(fd, id, to); -} - -static int handleSwap(int fd, int *permission, int argc, char *argv[]) -{ - int song1; - int song2; - char *test; - - song1 = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - song2 = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "\"%s\" is not a integer", - argv[2]); - return -1; - } - return swapSongsInPlaylist(fd, song1, song2); -} - -static int handleSwapId(int fd, int *permission, int argc, char *argv[]) -{ - int id1; - int id2; - char *test; - - id1 = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - id2 = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, "\"%s\" is not a integer", - argv[2]); - return -1; - } - return swapSongsInPlaylistById(fd, id1, id2); -} - -static int handleSeek(int fd, int *permission, int argc, char *argv[]) -{ - int song; - int time; - char *test; - - song = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - time = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - return seekSongInPlaylist(fd, song, time); -} - -static int handleSeekId(int fd, int *permission, int argc, char *argv[]) -{ - int id; - int time; - char *test; - - id = strtol(argv[1], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[1]); - return -1; - } - time = strtol(argv[2], &test, 10); - if (*test != '\0') { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer", argv[2]); - return -1; - } - return seekSongInPlaylistById(fd, id, time); -} - -static int handleListAllInfo(int fd, int *permission, int argc, char *argv[]) -{ - char *directory = NULL; - - if (argc == 2) - directory = argv[1]; - return printInfoForAllIn(fd, directory); -} - -static int handlePing(int fd, int *permission, int argc, char *argv[]) -{ - return 0; -} - -static int handlePassword(int fd, int *permission, int argc, char *argv[]) -{ - if (getPermissionFromPassword(argv[1], permission) < 0) { - commandError(fd, ACK_ERROR_PASSWORD, "incorrect password"); - return -1; - } - - return 0; -} - -static int handleCrossfade(int fd, int *permission, int argc, char *argv[]) -{ - int time; - char *test; - - time = strtol(argv[1], &test, 10); - if (*test != '\0' || time < 0) { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer >= 0", argv[1]); - return -1; - } - - setPlayerCrossFade(time); - - return 0; -} - -static int handleEnableDevice(int fd, int *permission, int argc, char *argv[]) -{ - int device; - char *test; - - device = strtol(argv[1], &test, 10); - if (*test != '\0' || device < 0) { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer >= 0", argv[1]); - return -1; - } - - return enableAudioDevice(fd, device); -} - -static int handleDisableDevice(int fd, int *permission, int argc, char *argv[]) -{ - int device; - char *test; - - device = strtol(argv[1], &test, 10); - if (*test != '\0' || device < 0) { - commandError(fd, ACK_ERROR_ARG, - "\"%s\" is not a integer >= 0", argv[1]); - return -1; - } - - return disableAudioDevice(fd, device); -} - -static int handleDevices(int fd, int *permission, int argc, char *argv[]) -{ - printAudioDevices(fd); - - return 0; -} - -/* don't be fooled, this is the command handler for "commands" command */ -static int handleCommands(int fd, int *permission, int argc, char *argv[]) -{ - ListNode *node = commandList->firstNode; - CommandEntry *cmd; - - while (node != NULL) { - cmd = (CommandEntry *) node->data; - if (cmd->reqPermission == (*permission & cmd->reqPermission)) { - fdprintf(fd, "command: %s\n", cmd->cmd); - } - - node = node->nextNode; - } - - return 0; -} - -static int handleNotcommands(int fd, int *permission, int argc, char *argv[]) -{ - ListNode *node = commandList->firstNode; - CommandEntry *cmd; - - while (node != NULL) { - cmd = (CommandEntry *) node->data; - - if (cmd->reqPermission != (*permission & cmd->reqPermission)) { - fdprintf(fd, "command: %s\n", cmd->cmd); - } - - node = node->nextNode; - } - - return 0; -} - -static int handlePlaylistClear(int fd, int *permission, int argc, char *argv[]) -{ - return clearStoredPlaylist(fd, argv[1]); -} - -static int handlePlaylistAdd(int fd, int *permission, int argc, char *argv[]) -{ - char *playlist = argv[1]; - char *path = argv[2]; - - if (isRemoteUrl(path)) - return addToStoredPlaylist(fd, path, playlist); - - return addAllInToStoredPlaylist(fd, path, playlist); -} - -void initCommands(void) -{ - commandList = makeList(free, 1); - - /* addCommand(name, permission, min, max, handler, list handler); */ - addCommand(COMMAND_PLAY, PERMISSION_CONTROL, 0, 1, handlePlay, NULL); - addCommand(COMMAND_PLAYID, PERMISSION_CONTROL, 0, 1, handlePlayId, NULL); - addCommand(COMMAND_STOP, PERMISSION_CONTROL, 0, 0, handleStop, NULL); - addCommand(COMMAND_CURRENTSONG, PERMISSION_READ, 0, 0, handleCurrentSong, NULL); - addCommand(COMMAND_PAUSE, PERMISSION_CONTROL, 0, 1, handlePause, NULL); - addCommand(COMMAND_STATUS, PERMISSION_READ, 0, 0, commandStatus, NULL); - addCommand(COMMAND_KILL, PERMISSION_ADMIN, -1, -1, handleKill, NULL); - addCommand(COMMAND_CLOSE, PERMISSION_NONE, -1, -1, handleClose, NULL); - addCommand(COMMAND_ADD, PERMISSION_ADD, 1, 1, handleAdd, NULL); - addCommand(COMMAND_ADDID, PERMISSION_ADD, 1, 1, handleAddId, NULL); - addCommand(COMMAND_DELETE, PERMISSION_CONTROL, 1, 1, handleDelete, NULL); - addCommand(COMMAND_DELETEID, PERMISSION_CONTROL, 1, 1, handleDeleteId, NULL); - addCommand(COMMAND_PLAYLIST, PERMISSION_READ, 0, 0, handlePlaylist, NULL); - addCommand(COMMAND_PLAYLISTID, PERMISSION_READ, 0, 1, handlePlaylistId, NULL); - addCommand(COMMAND_SHUFFLE, PERMISSION_CONTROL, 0, 0, handleShuffle, NULL); - addCommand(COMMAND_CLEAR, PERMISSION_CONTROL, 0, 0, handleClear, NULL); - addCommand(COMMAND_SAVE, PERMISSION_CONTROL, 1, 1, handleSave, NULL); - addCommand(COMMAND_LOAD, PERMISSION_ADD, 1, 1, handleLoad, NULL); - addCommand(COMMAND_LISTPLAYLIST, PERMISSION_READ, 1, 1, handleListPlaylist, NULL); - addCommand(COMMAND_LISTPLAYLISTINFO, PERMISSION_READ, 1, 1, handleListPlaylistInfo, NULL); - addCommand(COMMAND_LSINFO, PERMISSION_READ, 0, 1, handleLsInfo, NULL); - addCommand(COMMAND_RM, PERMISSION_CONTROL, 1, 1, handleRm, NULL); - addCommand(COMMAND_PLAYLISTINFO, PERMISSION_READ, 0, 1, handlePlaylistInfo, NULL); - addCommand(COMMAND_FIND, PERMISSION_READ, 2, -1, handleFind, NULL); - addCommand(COMMAND_SEARCH, PERMISSION_READ, 2, -1, handleSearch, NULL); - addCommand(COMMAND_UPDATE, PERMISSION_ADMIN, 0, 1, handleUpdate, listHandleUpdate); - addCommand(COMMAND_NEXT, PERMISSION_CONTROL, 0, 0, handleNext, NULL); - addCommand(COMMAND_PREVIOUS, PERMISSION_CONTROL, 0, 0, handlePrevious, NULL); - addCommand(COMMAND_LISTALL, PERMISSION_READ, 0, 1, handleListAll, NULL); - addCommand(COMMAND_VOLUME, PERMISSION_CONTROL, 1, 1, handleVolume, NULL); - addCommand(COMMAND_REPEAT, PERMISSION_CONTROL, 1, 1, handleRepeat, NULL); - addCommand(COMMAND_RANDOM, PERMISSION_CONTROL, 1, 1, handleRandom, NULL); - addCommand(COMMAND_STATS, PERMISSION_READ, 0, 0, handleStats, NULL); - addCommand(COMMAND_CLEAR_ERROR, PERMISSION_CONTROL, 0, 0, handleClearError, NULL); - addCommand(COMMAND_LIST, PERMISSION_READ, 1, -1, handleList, NULL); - addCommand(COMMAND_MOVE, PERMISSION_CONTROL, 2, 2, handleMove, NULL); - addCommand(COMMAND_MOVEID, PERMISSION_CONTROL, 2, 2, handleMoveId, NULL); - addCommand(COMMAND_SWAP, PERMISSION_CONTROL, 2, 2, handleSwap, NULL); - addCommand(COMMAND_SWAPID, PERMISSION_CONTROL, 2, 2, handleSwapId, NULL); - addCommand(COMMAND_SEEK, PERMISSION_CONTROL, 2, 2, handleSeek, NULL); - addCommand(COMMAND_SEEKID, PERMISSION_CONTROL, 2, 2, handleSeekId, NULL); - addCommand(COMMAND_LISTALLINFO, PERMISSION_READ, 0, 1, handleListAllInfo, NULL); - addCommand(COMMAND_PING, PERMISSION_NONE, 0, 0, handlePing, NULL); - addCommand(COMMAND_SETVOL, PERMISSION_CONTROL, 1, 1, handleSetVol, NULL); - addCommand(COMMAND_PASSWORD, PERMISSION_NONE, 1, 1, handlePassword, NULL); - addCommand(COMMAND_CROSSFADE, PERMISSION_CONTROL, 1, 1, handleCrossfade, NULL); - addCommand(COMMAND_URL_HANDLERS, PERMISSION_READ, 0, 0, handleUrlHandlers, NULL); - addCommand(COMMAND_PLCHANGES, PERMISSION_READ, 1, 1, handlePlaylistChanges, NULL); - addCommand(COMMAND_PLCHANGESPOSID, PERMISSION_READ, 1, 1, handlePlaylistChangesPosId, NULL); - addCommand(COMMAND_ENABLE_DEV, PERMISSION_ADMIN, 1, 1, handleEnableDevice, NULL); - addCommand(COMMAND_DISABLE_DEV, PERMISSION_ADMIN, 1, 1, handleDisableDevice, NULL); - addCommand(COMMAND_DEVICES, PERMISSION_READ, 0, 0, handleDevices, NULL); - addCommand(COMMAND_COMMANDS, PERMISSION_NONE, 0, 0, handleCommands, NULL); - addCommand(COMMAND_NOTCOMMANDS, PERMISSION_NONE, 0, 0, handleNotcommands, NULL); - addCommand(COMMAND_PLAYLISTCLEAR, PERMISSION_CONTROL, 1, 1, handlePlaylistClear, NULL); - addCommand(COMMAND_PLAYLISTADD, PERMISSION_CONTROL, 2, 2, handlePlaylistAdd, NULL); - addCommand(COMMAND_PLAYLISTFIND, PERMISSION_READ, 2, -1, handlePlaylistFind, NULL); - addCommand(COMMAND_PLAYLISTSEARCH, PERMISSION_READ, 2, -1, handlePlaylistSearch, NULL); - addCommand(COMMAND_PLAYLISTMOVE, PERMISSION_CONTROL, 3, 3, handlePlaylistMove, NULL); - addCommand(COMMAND_PLAYLISTDELETE, PERMISSION_CONTROL, 2, 2, handlePlaylistDelete, NULL); - addCommand(COMMAND_TAGTYPES, PERMISSION_READ, 0, 0, handleTagTypes, NULL); - addCommand(COMMAND_COUNT, PERMISSION_READ, 2, -1, handleCount, NULL); - addCommand(COMMAND_RENAME, PERMISSION_CONTROL, 2, 2, handleRename, NULL); - - sortList(commandList); -} - -void finishCommands(void) -{ - freeList(commandList); -} - -static int checkArgcAndPermission(CommandEntry * cmd, int fd, - int permission, int argc, char *argv[]) -{ - int min = cmd->min + 1; - int max = cmd->max + 1; - - if (cmd->reqPermission != (permission & cmd->reqPermission)) { - if (fd) { - commandError(fd, ACK_ERROR_PERMISSION, - "you don't have permission for \"%s\"", - cmd->cmd); - } - return -1; - } - - if (min == 0) - return 0; - - if (min == max && max != argc) { - if (fd) { - commandError(fd, ACK_ERROR_ARG, - "wrong number of arguments for \"%s\"", - argv[0]); - } - return -1; - } else if (argc < min) { - if (fd) { - commandError(fd, ACK_ERROR_ARG, - "too few arguments for \"%s\"", argv[0]); - } - return -1; - } else if (argc > max && max /* != 0 */ ) { - if (fd) { - commandError(fd, ACK_ERROR_ARG, - "too many arguments for \"%s\"", argv[0]); - } - return -1; - } else - return 0; -} - -static CommandEntry *getCommandEntryAndCheckArgcAndPermission(int fd, - int *permission, - int argc, - char *argv[]) -{ - static char unknown[] = ""; - CommandEntry *cmd; - - current_command = unknown; - - if (argc == 0) - return NULL; - - if (!findInList(commandList, argv[0], (void *)&cmd)) { - if (fd) { - commandError(fd, ACK_ERROR_UNKNOWN, - "unknown command \"%s\"", argv[0]); - } - return NULL; - } - - current_command = cmd->cmd; - - if (checkArgcAndPermission(cmd, fd, *permission, argc, argv) < 0) { - return NULL; - } - - return cmd; -} - -static CommandEntry *getCommandEntryFromString(char *string, int *permission) -{ - CommandEntry *cmd = NULL; - char *argv[COMMAND_ARGV_MAX] = { NULL }; - int argc = buffer2array(string, argv, COMMAND_ARGV_MAX); - - if (0 == argc) - return NULL; - - cmd = getCommandEntryAndCheckArgcAndPermission(0, permission, - argc, argv); - - return cmd; -} - -static int processCommandInternal(int fd, int *permission, - char *commandString, struct strnode *cmdnode) -{ - int argc; - char *argv[COMMAND_ARGV_MAX] = { NULL }; - CommandEntry *cmd; - int ret = -1; - - argc = buffer2array(commandString, argv, COMMAND_ARGV_MAX); - - if (argc == 0) - return 0; - - if ((cmd = getCommandEntryAndCheckArgcAndPermission(fd, permission, - argc, argv))) { - if (!cmdnode || !cmd->listHandler) { - ret = cmd->handler(fd, permission, argc, argv); - } else { - ret = cmd->listHandler(fd, permission, argc, argv, - cmdnode, cmd); - } - } - - current_command = NULL; - - return ret; -} - -int processListOfCommands(int fd, int *permission, int *expired, - int listOK, struct strnode *list) -{ - struct strnode *cur = list; - int ret = 0; - - command_listNum = 0; - - while (cur) { - DEBUG("processListOfCommands: process command \"%s\"\n", - cur->data); - ret = processCommandInternal(fd, permission, cur->data, cur); - DEBUG("processListOfCommands: command returned %i\n", ret); - if (ret != 0 || (*expired) != 0) - goto out; - else if (listOK) - fdprintf(fd, "list_OK\n"); - command_listNum++; - cur = cur->next; - } -out: - command_listNum = 0; - return ret; -} - -int processCommand(int fd, int *permission, char *commandString) -{ - return processCommandInternal(fd, permission, commandString, NULL); -} - -mpd_fprintf_ void commandError(int fd, int error, const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - - if (current_command && fd != STDERR_FILENO) { - fdprintf(fd, "ACK [%i@%i] {%s} ", - (int)error, command_listNum, current_command); - vfdprintf(fd, fmt, args); - fdprintf(fd, "\n"); - current_command = NULL; - } else { - fdprintf(STDERR_FILENO, "ACK [%i@%i] ", - (int)error, command_listNum); - vfdprintf(STDERR_FILENO, fmt, args); - fdprintf(STDERR_FILENO, "\n"); - } - - va_end(args); -} |