aboutsummaryrefslogtreecommitdiffstats
path: root/src/command.c
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2006-07-30 03:43:38 +0000
committerEric Wong <normalperson@yhbt.net>2006-07-30 03:43:38 +0000
commit4cf5d04ca15bc28ee4636d1dccb858763513e571 (patch)
tree7898902e786f5763643a513ea96bcada8a2559cc /src/command.c
parent4d5b8509eb46cff40890b781018669233a79e414 (diff)
downloadmpd-4cf5d04ca15bc28ee4636d1dccb858763513e571.tar.gz
mpd-4cf5d04ca15bc28ee4636d1dccb858763513e571.tar.xz
mpd-4cf5d04ca15bc28ee4636d1dccb858763513e571.zip
interface/connection malloc reductions from mpd-ke
This patch massively reduces the amount of heap allocations at the interface/command layer. Most commands with minimal output should not allocate memory from the heap at all. Things like repeatedly polling status, currentsong, and volume changes should be faster as a result, and more importantly, not a source of memory fragmentation. These changes should be safe in that there's no way for a remote-client to corrupt memory or otherwise do bad stuff to MPD, but an extra set of eyes to review would be good. Of course there's never any warranty :) No longer do we use FILE * structures in the interface, which means we don't have to allocate any new memory for most connections. Now, before you go on about losing the buffering that FILE * +implies+, remember that myfprintf() never took advantage of any of the stdio buffering features. To reduce the diff and make bugs easier to spot in the diff, I've kept myfprintf in places where we write to files (and not network interfaces). Expect myfprintf to go away entirely soon (we'll use fprintf for writing regular files). git-svn-id: https://svn.musicpd.org/mpd/trunk@4483 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/command.c')
-rw-r--r--src/command.c518
1 files changed, 255 insertions, 263 deletions
diff --git a/src/command.c b/src/command.c
index cf4a37ae7..53ed8de90 100644
--- a/src/command.c
+++ b/src/command.c
@@ -111,9 +111,9 @@
typedef struct _CommandEntry CommandEntry;
-typedef int (*CommandHandlerFunction) (FILE *, int *, int, char **);
+typedef int (*CommandHandlerFunction) (int, int *, int, char **);
typedef int (*CommandListHandlerFunction)
- (FILE *, int *, int, char **, ListNode *, CommandEntry *);
+ (int, int *, int, char **, struct strnode *, CommandEntry *);
/* if min: -1 don't check args *
* if max: -1 no max args */
@@ -131,7 +131,7 @@ int command_listNum = 0;
static CommandEntry *getCommandEntryFromString(char *string, int *permission);
-List *commandList;
+static List *commandList;
CommandEntry *newCommandEntry(void)
{
@@ -163,14 +163,14 @@ static void addCommand(char *name,
insertInList(commandList, cmd->cmd, cmd);
}
-static int handleUrlHandlers(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleUrlHandlers(int fd, int *permission, int argc,
+ char *argv[])
{
- return printRemoteUrlHandlers(fp);
+ return printRemoteUrlHandlers(fd);
}
-static int handlePlay(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePlay(int fd, int *permission, int argc,
+ char *argv[])
{
int song = -1;
char *test;
@@ -178,16 +178,16 @@ static int handlePlay(FILE * fp, int *permission, int argc,
if (argc == 2) {
song = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
}
- return playPlaylist(fp, song, 0);
+ return playPlaylist(fd, song, 0);
}
-static int handlePlayId(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePlayId(int fd, int *permission, int argc,
+ char *argv[])
{
int id = -1;
char *test;
@@ -195,49 +195,49 @@ static int handlePlayId(FILE * fp, int *permission, int argc,
if (argc == 2) {
id = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
}
- return playPlaylistById(fp, id, 0);
+ return playPlaylistById(fd, id, 0);
}
-static int handleStop(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleStop(int fd, int *permission, int argc,
+ char *argv[])
{
- return stopPlaylist(fp);
+ return stopPlaylist(fd);
}
-static int handleCurrentSong(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleCurrentSong(int fd, int *permission, int argc,
+ char *argv[])
{
int song = getPlaylistCurrentSong();
if (song >= 0) {
- return playlistInfo(fp, song);
+ return playlistInfo(fd, song);
} else
return 0;
}
-static int handlePause(FILE * fp, int *permission,
- int argc, char **argv)
+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(fp, ACK_ERROR_ARG, "\"%s\" is not 0 or 1",
+ commandError(fd, ACK_ERROR_ARG, "\"%s\" is not 0 or 1",
argv[1]);
return -1;
}
- return playerSetPause(fp, pause);
+ return playerSetPause(fd, pause);
}
- return playerPause(fp);
+ return playerPause(fd);
}
-static int commandStatus(FILE * fp, int *permission, int argc,
- char **argv)
+static int commandStatus(int fd, int *permission, int argc,
+ char *argv[])
{
char *state = NULL;
int updateJobId;
@@ -257,204 +257,204 @@ static int commandStatus(FILE * fp, int *permission, int argc,
break;
}
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_VOLUME, getVolumeLevel());
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_REPEAT,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_VOLUME, getVolumeLevel());
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_REPEAT,
getPlaylistRepeatStatus());
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_RANDOM,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_RANDOM,
getPlaylistRandomStatus());
- myfprintf(fp, "%s: %li\n", COMMAND_STATUS_PLAYLIST,
+ fdprintf(fd, "%s: %li\n", COMMAND_STATUS_PLAYLIST,
getPlaylistVersion());
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_PLAYLIST_LENGTH,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_PLAYLIST_LENGTH,
getPlaylistLength());
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_CROSSFADE,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_CROSSFADE,
(int)(getPlayerCrossFade() + 0.5));
- myfprintf(fp, "%s: %s\n", COMMAND_STATUS_STATE, state);
+ fdprintf(fd, "%s: %s\n", COMMAND_STATUS_STATE, state);
song = getPlaylistCurrentSong();
if (song >= 0) {
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_SONG, song);
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_SONGID,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_SONG, song);
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_SONGID,
getPlaylistSongId(song));
}
if (getPlayerState() != PLAYER_STATE_STOP) {
- myfprintf(fp, "%s: %i:%i\n", COMMAND_STATUS_TIME,
+ fdprintf(fd, "%s: %i:%i\n", COMMAND_STATUS_TIME,
getPlayerElapsedTime(), getPlayerTotalTime());
- myfprintf(fp, "%s: %li\n", COMMAND_STATUS_BITRATE,
+ fdprintf(fd, "%s: %li\n", COMMAND_STATUS_BITRATE,
getPlayerBitRate(), getPlayerTotalTime());
- myfprintf(fp, "%s: %u:%i:%i\n", COMMAND_STATUS_AUDIO,
+ fdprintf(fd, "%s: %u:%i:%i\n", COMMAND_STATUS_AUDIO,
getPlayerSampleRate(), getPlayerBits(),
getPlayerChannels());
}
if ((updateJobId = isUpdatingDB())) {
- myfprintf(fp, "%s: %i\n", COMMAND_STATUS_UPDATING_DB,
+ fdprintf(fd, "%s: %i\n", COMMAND_STATUS_UPDATING_DB,
updateJobId);
}
if (getPlayerError() != PLAYER_ERROR_NOERROR) {
- myfprintf(fp, "%s: %s\n", COMMAND_STATUS_ERROR,
+ fdprintf(fd, "%s: %s\n", COMMAND_STATUS_ERROR,
getPlayerErrorStr());
}
return 0;
}
-static int handleKill(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleKill(int fd, int *permission, int argc,
+ char *argv[])
{
return COMMAND_RETURN_KILL;
}
-static int handleClose(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleClose(int fd, int *permission, int argc,
+ char *argv[])
{
return COMMAND_RETURN_CLOSE;
}
-static int handleAdd(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleAdd(int fd, int *permission, int argc,
+ char *argv[])
{
char *path = argv[1];
if (isRemoteUrl(path))
- return addToPlaylist(fp, path, 0);
+ return addToPlaylist(fd, path, 0);
- return addAllIn(fp, path);
+ return addAllIn(fd, path);
}
-static int handleAddId(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleAddId(int fd, int *permission, int argc,
+ char *argv[])
{
- return addToPlaylist(fp, argv[1], 1);
+ return addToPlaylist(fd, argv[1], 1);
}
-static int handleDelete(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
- return deleteFromPlaylist(fp, song);
+ return deleteFromPlaylist(fd, song);
}
-static int handleDeleteId(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
- return deleteFromPlaylistById(fp, id);
+ return deleteFromPlaylistById(fd, id);
}
-static int handlePlaylist(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePlaylist(int fd, int *permission, int argc,
+ char *argv[])
{
- return showPlaylist(fp);
+ return showPlaylist(fd);
}
-static int handleShuffle(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleShuffle(int fd, int *permission, int argc,
+ char *argv[])
{
- return shufflePlaylist(fp);
+ return shufflePlaylist(fd);
}
-static int handleClear(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleClear(int fd, int *permission, int argc,
+ char *argv[])
{
- return clearPlaylist(fp);
+ return clearPlaylist(fd);
}
-static int handleSave(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSave(int fd, int *permission, int argc,
+ char *argv[])
{
- return savePlaylist(fp, argv[1]);
+ return savePlaylist(fd, argv[1]);
}
-static int handleLoad(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleLoad(int fd, int *permission, int argc,
+ char *argv[])
{
- return loadPlaylist(fp, argv[1]);
+ return loadPlaylist(fd, argv[1]);
}
-static int handleListPlaylist(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleListPlaylist(int fd, int *permission, int argc,
+ char *argv[])
{
- return PlaylistInfo(fp, argv[1], 0);
+ return PlaylistInfo(fd, argv[1], 0);
}
-static int handleListPlaylistInfo(FILE * fp, int *permission,
- int argc, char **argv)
+static int handleListPlaylistInfo(int fd, int *permission,
+ int argc, char *argv[])
{
- return PlaylistInfo(fp, argv[1], 1);
+ return PlaylistInfo(fd, argv[1], 1);
}
-static int handleLsInfo(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleLsInfo(int fd, int *permission, int argc,
+ char *argv[])
{
if (argc == 1) {
- if (printDirectoryInfo(fp, NULL) < 0)
+ if (printDirectoryInfo(fd, NULL) < 0)
return -1;
else
- return lsPlaylists(fp, "");
+ return lsPlaylists(fd, "");
} else {
- if (printDirectoryInfo(fp, argv[1]) < 0)
+ if (printDirectoryInfo(fd, argv[1]) < 0)
return -1;
else
- return lsPlaylists(fp, argv[1]);
+ return lsPlaylists(fd, argv[1]);
}
}
-static int handleRm(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleRm(int fd, int *permission, int argc,
+ char *argv[])
{
- return deletePlaylist(fp, argv[1]);
+ return deletePlaylist(fd, argv[1]);
}
-static int handlePlaylistChanges(FILE * fp, int *permission,
- int argc, char **argv)
+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(fp, ACK_ERROR_ARG, "need a positive integer",
+ commandError(fd, ACK_ERROR_ARG, "need a positive integer",
NULL);
return -1;
}
- return playlistChanges(fp, version);
+ return playlistChanges(fd, version);
}
-static int handlePlaylistChangesPosId(FILE * fp, int *permission,
- int argc, char **argv)
+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(fp, ACK_ERROR_ARG, "need a positive integer",
+ commandError(fd, ACK_ERROR_ARG, "need a positive integer",
NULL);
return -1;
}
- return playlistChangesPosId(fp, version);
+ return playlistChangesPosId(fd, version);
}
-static int handlePlaylistInfo(FILE * fp, int *permission,
- int argc, char **argv)
+static int handlePlaylistInfo(int fd, int *permission,
+ int argc, char *argv[])
{
int song = -1;
char *test;
@@ -462,16 +462,16 @@ static int handlePlaylistInfo(FILE * fp, int *permission,
if (argc == 2) {
song = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
}
- return playlistInfo(fp, song);
+ return playlistInfo(fd, song);
}
-static int handlePlaylistId(FILE * fp, int *permission,
- int argc, char **argv)
+static int handlePlaylistId(int fd, int *permission,
+ int argc, char *argv[])
{
int id = -1;
char *test;
@@ -479,16 +479,16 @@ static int handlePlaylistId(FILE * fp, int *permission,
if (argc == 2) {
id = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"need a positive integer", NULL);
return -1;
}
}
- return playlistId(fp, id);
+ return playlistId(fd, id);
}
-static int handleFind(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleFind(int fd, int *permission, int argc,
+ char *argv[])
{
int ret;
@@ -498,19 +498,19 @@ static int handleFind(FILE * fp, int *permission, int argc,
&items);
if (numItems <= 0) {
- commandError(fp, ACK_ERROR_ARG, "incorrect arguments", NULL);
+ commandError(fd, ACK_ERROR_ARG, "incorrect arguments", NULL);
return -1;
}
- ret = findSongsIn(fp, NULL, numItems, items);
+ ret = findSongsIn(fd, NULL, numItems, items);
freeLocateTagItemArray(numItems, items);
return ret;
}
-static int handleSearch(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSearch(int fd, int *permission, int argc,
+ char *argv[])
{
int ret;
@@ -520,26 +520,26 @@ static int handleSearch(FILE * fp, int *permission, int argc,
&items);
if (numItems <= 0) {
- commandError(fp, ACK_ERROR_ARG, "incorrect arguments", NULL);
+ commandError(fd, ACK_ERROR_ARG, "incorrect arguments", NULL);
return -1;
}
- ret = searchForSongsIn(fp, NULL, numItems, items);
+ ret = searchForSongsIn(fd, NULL, numItems, items);
freeLocateTagItemArray(numItems, items);
return ret;
}
-static int listHandleUpdate(FILE * fp,
+static int listHandleUpdate(int fd,
int *permission,
int argc,
- char **argv,
- ListNode * commandNode, CommandEntry * cmd)
+ char *argv[],
+ struct strnode *cmdnode, CommandEntry *cmd)
{
static List *pathList = NULL;
CommandEntry *nextCmd = NULL;
- ListNode *nextNode = commandNode->nextNode;;
+ struct strnode *next = cmdnode->next;
if (!pathList)
pathList = makeList(NULL, 1);
@@ -549,13 +549,11 @@ static int listHandleUpdate(FILE * fp,
else
insertInList(pathList, "", NULL);
- if (nextNode) {
- nextCmd = getCommandEntryFromString((void *)nextNode->data,
- permission);
- }
+ if(next)
+ nextCmd = getCommandEntryFromString(next->data, permission);
if (cmd != nextCmd) {
- int ret = updateInit(fp, pathList);
+ int ret = updateInit(fd, pathList);
freeList(pathList);
pathList = NULL;
return ret;
@@ -564,113 +562,113 @@ static int listHandleUpdate(FILE * fp,
return 0;
}
-static int handleUpdate(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, pathList);
+ ret = updateInit(fd, pathList);
freeList(pathList);
return ret;
}
- return updateInit(fp, NULL);
+ return updateInit(fd, NULL);
}
-static int handleNext(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleNext(int fd, int *permission, int argc,
+ char *argv[])
{
- return nextSongInPlaylist(fp);
+ return nextSongInPlaylist(fd);
}
-static int handlePrevious(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePrevious(int fd, int *permission, int argc,
+ char *argv[])
{
- return previousSongInPlaylist(fp);
+ return previousSongInPlaylist(fd);
}
-static int handleListAll(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleListAll(int fd, int *permission, int argc,
+ char *argv[])
{
char *directory = NULL;
if (argc == 2)
directory = argv[1];
- return printAllIn(fp, directory);
+ return printAllIn(fd, directory);
}
-static int handleVolume(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG, "need an integer", NULL);
+ commandError(fd, ACK_ERROR_ARG, "need an integer", NULL);
return -1;
}
- return changeVolumeLevel(fp, change, 1);
+ return changeVolumeLevel(fd, change, 1);
}
-static int handleSetVol(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG, "need an integer", NULL);
+ commandError(fd, ACK_ERROR_ARG, "need an integer", NULL);
return -1;
}
- return changeVolumeLevel(fp, level, 0);
+ return changeVolumeLevel(fd, level, 0);
}
-static int handleRepeat(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG, "need an integer", NULL);
+ commandError(fd, ACK_ERROR_ARG, "need an integer", NULL);
return -1;
}
- return setPlaylistRepeatStatus(fp, status);
+ return setPlaylistRepeatStatus(fd, status);
}
-static int handleRandom(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG, "need an integer", NULL);
+ commandError(fd, ACK_ERROR_ARG, "need an integer", NULL);
return -1;
}
- return setPlaylistRandomStatus(fp, status);
+ return setPlaylistRandomStatus(fd, status);
}
-static int handleStats(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleStats(int fd, int *permission, int argc,
+ char *argv[])
{
- return printStats(fp);
+ return printStats(fd);
}
-static int handleClearError(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleClearError(int fd, int *permission, int argc,
+ char *argv[])
{
clearPlayerError();
return 0;
}
-static int handleList(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleList(int fd, int *permission, int argc,
+ char *argv[])
{
int numConditionals = 0;
LocateTagItem *conditionals = NULL;
@@ -678,7 +676,7 @@ static int handleList(FILE * fp, int *permission, int argc,
int ret;
if (tagType < 0) {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not known", argv[1]);
return -1;
}
@@ -686,7 +684,7 @@ static int handleList(FILE * fp, int *permission, int argc,
/* for compatibility with < 0.12.0 */
if (argc == 3) {
if (tagType != TAG_ITEM_ALBUM) {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"should be \"%s\" for 3 arguments",
mpdTagItemKeys[TAG_ITEM_ALBUM]);
return -1;
@@ -701,13 +699,13 @@ static int handleList(FILE * fp, int *permission, int argc,
&conditionals);
if (numConditionals < 0) {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"not able to parse args", NULL);
return -1;
}
}
- ret = listAllUniqueTags(fp, tagType, numConditionals, conditionals);
+ ret = listAllUniqueTags(fd, tagType, numConditionals, conditionals);
if (conditionals)
freeLocateTagItemArray(numConditionals, conditionals);
@@ -715,8 +713,8 @@ static int handleList(FILE * fp, int *permission, int argc,
return ret;
}
-static int handleMove(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleMove(int fd, int *permission, int argc,
+ char *argv[])
{
int from;
int to;
@@ -724,21 +722,21 @@ static int handleMove(FILE * fp, int *permission, int argc,
from = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
to = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[2]);
return -1;
}
- return moveSongInPlaylist(fp, from, to);
+ return moveSongInPlaylist(fd, from, to);
}
-static int handleMoveId(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleMoveId(int fd, int *permission, int argc,
+ char *argv[])
{
int id;
int to;
@@ -746,21 +744,21 @@ static int handleMoveId(FILE * fp, int *permission, int argc,
id = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
to = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[2]);
return -1;
}
- return moveSongInPlaylistById(fp, id, to);
+ return moveSongInPlaylistById(fd, id, to);
}
-static int handleSwap(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSwap(int fd, int *permission, int argc,
+ char *argv[])
{
int song1;
int song2;
@@ -768,21 +766,21 @@ static int handleSwap(FILE * fp, int *permission, int argc,
song1 = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
song2 = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG, "\"%s\" is not a integer",
+ commandError(fd, ACK_ERROR_ARG, "\"%s\" is not a integer",
argv[2]);
return -1;
}
- return swapSongsInPlaylist(fp, song1, song2);
+ return swapSongsInPlaylist(fd, song1, song2);
}
-static int handleSwapId(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSwapId(int fd, int *permission, int argc,
+ char *argv[])
{
int id1;
int id2;
@@ -790,21 +788,21 @@ static int handleSwapId(FILE * fp, int *permission, int argc,
id1 = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
id2 = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG, "\"%s\" is not a integer",
+ commandError(fd, ACK_ERROR_ARG, "\"%s\" is not a integer",
argv[2]);
return -1;
}
- return swapSongsInPlaylistById(fp, id1, id2);
+ return swapSongsInPlaylistById(fd, id1, id2);
}
-static int handleSeek(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSeek(int fd, int *permission, int argc,
+ char *argv[])
{
int song;
int time;
@@ -812,21 +810,21 @@ static int handleSeek(FILE * fp, int *permission, int argc,
song = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
time = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[2]);
return -1;
}
- return seekSongInPlaylist(fp, song, time);
+ return seekSongInPlaylist(fd, song, time);
}
-static int handleSeekId(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleSeekId(int fd, int *permission, int argc,
+ char *argv[])
{
int id;
int time;
@@ -834,40 +832,40 @@ static int handleSeekId(FILE * fp, int *permission, int argc,
id = strtol(argv[1], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[1]);
return -1;
}
time = strtol(argv[2], &test, 10);
if (*test != '\0') {
- commandError(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer", argv[2]);
return -1;
}
- return seekSongInPlaylistById(fp, id, time);
+ return seekSongInPlaylistById(fd, id, time);
}
-static int handleListAllInfo(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleListAllInfo(int fd, int *permission, int argc,
+ char *argv[])
{
char *directory = NULL;
if (argc == 2)
directory = argv[1];
- return printInfoForAllIn(fp, directory);
+ return printInfoForAllIn(fd, directory);
}
-static int handlePing(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePing(int fd, int *permission, int argc,
+ char *argv[])
{
return 0;
}
-static int handlePassword(FILE * fp, int *permission, int argc,
- char **argv)
+static int handlePassword(int fd, int *permission, int argc,
+ char *argv[])
{
if (getPermissionFromPassword(argv[1], permission) < 0) {
- commandError(fp, ACK_ERROR_PASSWORD, "incorrect password",
+ commandError(fd, ACK_ERROR_PASSWORD, "incorrect password",
NULL);
return -1;
}
@@ -875,15 +873,15 @@ static int handlePassword(FILE * fp, int *permission, int argc,
return 0;
}
-static int handleCrossfade(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer >= 0", argv[1]);
return -1;
}
@@ -893,49 +891,49 @@ static int handleCrossfade(FILE * fp, int *permission, int argc,
return 0;
}
-static int handleEnableDevice(FILE * fp, int *permission, int argc,
- char **argv)
+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(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer >= 0", argv[1]);
return -1;
}
- return enableAudioDevice(fp, device);
+ return enableAudioDevice(fd, device);
}
-static int handleDisableDevice(FILE * fp, int *permission,
- int argc, char **argv)
+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(fp, ACK_ERROR_ARG,
+ commandError(fd, ACK_ERROR_ARG,
"\"%s\" is not a integer >= 0", argv[1]);
return -1;
}
- return disableAudioDevice(fp, device);
+ return disableAudioDevice(fd, device);
}
-static int handleDevices(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleDevices(int fd, int *permission, int argc,
+ char *argv[])
{
- printAudioDevices(fp);
+ printAudioDevices(fd);
return 0;
}
/* don't be fooled, this is the command handler for "commands" command */
-static int handleCommands(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleCommands(int fd, int *permission, int argc,
+ char *argv[])
{
ListNode *node = commandList->firstNode;
CommandEntry *cmd;
@@ -943,7 +941,7 @@ static int handleCommands(FILE * fp, int *permission, int argc,
while (node != NULL) {
cmd = (CommandEntry *) node->data;
if (cmd->reqPermission == (*permission & cmd->reqPermission)) {
- myfprintf(fp, "command: %s\n", cmd->cmd);
+ fdprintf(fd, "command: %s\n", cmd->cmd);
}
node = node->nextNode;
@@ -952,8 +950,8 @@ static int handleCommands(FILE * fp, int *permission, int argc,
return 0;
}
-static int handleNotcommands(FILE * fp, int *permission, int argc,
- char **argv)
+static int handleNotcommands(int fd, int *permission, int argc,
+ char *argv[])
{
ListNode *node = commandList->firstNode;
CommandEntry *cmd;
@@ -962,7 +960,7 @@ static int handleNotcommands(FILE * fp, int *permission, int argc,
cmd = (CommandEntry *) node->data;
if (cmd->reqPermission != (*permission & cmd->reqPermission)) {
- myfprintf(fp, "command: %s\n", cmd->cmd);
+ fdprintf(fd, "command: %s\n", cmd->cmd);
}
node = node->nextNode;
@@ -1065,15 +1063,15 @@ void finishCommands(void)
freeList(commandList);
}
-static int checkArgcAndPermission(CommandEntry * cmd, FILE * fp,
- int permission, int argc, char **argv)
+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 (fp) {
- commandError(fp, ACK_ERROR_PERMISSION,
+ if (fd) {
+ commandError(fd, ACK_ERROR_PERMISSION,
"you don't have permission for \"%s\"",
cmd->cmd);
}
@@ -1084,22 +1082,22 @@ static int checkArgcAndPermission(CommandEntry * cmd, FILE * fp,
return 0;
if (min == max && max != argc) {
- if (fp) {
- commandError(fp, ACK_ERROR_ARG,
+ if (fd) {
+ commandError(fd, ACK_ERROR_ARG,
"wrong number of arguments for \"%s\"",
argv[0]);
}
return -1;
} else if (argc < min) {
- if (fp) {
- commandError(fp, ACK_ERROR_ARG,
+ if (fd) {
+ commandError(fd, ACK_ERROR_ARG,
"too few arguments for \"%s\"",
argv[0]);
}
return -1;
} else if (argc > max && max /* != 0 */ ) {
- if (fp) {
- commandError(fp, ACK_ERROR_ARG,
+ if (fd) {
+ commandError(fd, ACK_ERROR_ARG,
"too many arguments for \"%s\"",
argv[0]);
}
@@ -1108,11 +1106,10 @@ static int checkArgcAndPermission(CommandEntry * cmd, FILE * fp,
return 0;
}
-static CommandEntry *getCommandEntryAndCheckArgcAndPermission(FILE * fp,
+static CommandEntry *getCommandEntryAndCheckArgcAndPermission(int fd,
int *permission,
- int
- argc,
- char **argv)
+ int argc,
+ char *argv[])
{
static char unknown[] = "";
CommandEntry *cmd;
@@ -1123,8 +1120,8 @@ static CommandEntry *getCommandEntryAndCheckArgcAndPermission(FILE * fp,
return NULL;
if (!findInList(commandList, argv[0], (void *)&cmd)) {
- if (fp) {
- commandError(fp, ACK_ERROR_UNKNOWN,
+ if (fd) {
+ commandError(fd, ACK_ERROR_UNKNOWN,
"unknown command \"%s\"", argv[0]);
}
return NULL;
@@ -1132,7 +1129,7 @@ static CommandEntry *getCommandEntryAndCheckArgcAndPermission(FILE * fp,
current_command = cmd->cmd;
- if (checkArgcAndPermission(cmd, fp, *permission, argc,
+ if (checkArgcAndPermission(cmd, fd, *permission, argc,
argv) < 0) {
return NULL;
}
@@ -1149,14 +1146,14 @@ static CommandEntry *getCommandEntryFromString(char *string, int *permission)
if (0 == argc)
return NULL;
- cmd = getCommandEntryAndCheckArgcAndPermission(NULL, permission,
+ cmd = getCommandEntryAndCheckArgcAndPermission(0, permission,
argc, argv);
return cmd;
}
-static int processCommandInternal(FILE * fp, int *permission,
- char *commandString, ListNode * commandNode)
+static int processCommandInternal(int fd, int *permission,
+ char *commandString, struct strnode *cmdnode)
{
int argc;
char *argv[COMMAND_ARGV_MAX] = { 0 };
@@ -1168,13 +1165,13 @@ static int processCommandInternal(FILE * fp, int *permission,
if (argc == 0)
return 0;
- if ((cmd = getCommandEntryAndCheckArgcAndPermission(fp, permission,
+ if ((cmd = getCommandEntryAndCheckArgcAndPermission(fd, permission,
argc, argv))) {
- if (NULL == commandNode || NULL == cmd->listHandler) {
- ret = cmd->handler(fp, permission, argc, argv);
+ if (!cmdnode || !cmd->listHandler) {
+ ret = cmd->handler(fd, permission, argc, argv);
} else {
- ret = cmd->listHandler(fp, permission, argc, argv,
- commandNode, cmd);
+ ret = cmd->listHandler(fd, permission, argc, argv,
+ cmdnode, cmd);
}
}
@@ -1183,37 +1180,32 @@ static int processCommandInternal(FILE * fp, int *permission,
return ret;
}
-int processListOfCommands(FILE * fp, int *permission, int *expired,
- int listOK, List * list)
+int processListOfCommands(int fd, int *permission, int *expired,
+ int listOK, struct strnode *list)
{
- ListNode *node = list->firstNode;
- ListNode *tempNode;
+ struct strnode *cur = list;
int ret = 0;
command_listNum = 0;
- while (node != NULL) {
+ while (cur) {
DEBUG("processListOfCommands: process command \"%s\"\n",
- node->data);
- ret = processCommandInternal(fp, permission, (char *)node->data,
- node);
+ cur->data);
+ ret = processCommandInternal(fd, permission, cur->data, cur);
DEBUG("processListOfCommands: command returned %i\n", ret);
- tempNode = node->nextNode;
- deleteNodeFromList(list, node);
- node = tempNode;
if (ret != 0 || (*expired) != 0)
- node = NULL;
+ goto out;
else if (listOK)
- myfprintf(fp, "list_OK\n");
+ fdprintf(fd, "list_OK\n");
command_listNum++;
+ cur = cur->next;
}
-
+out:
command_listNum = 0;
-
return ret;
}
-int processCommand(FILE * fp, int *permission, char *commandString)
+int processCommand(int fd, int *permission, char *commandString)
{
- return processCommandInternal(fp, permission, commandString, NULL);
+ return processCommandInternal(fd, permission, commandString, NULL);
}