diff options
Diffstat (limited to 'vold/cmd_dispatch.c')
-rw-r--r-- | vold/cmd_dispatch.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/vold/cmd_dispatch.c b/vold/cmd_dispatch.c new file mode 100644 index 000000000..ab65fd966 --- /dev/null +++ b/vold/cmd_dispatch.c @@ -0,0 +1,115 @@ + +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <unistd.h> +#include <errno.h> + +#include "vold.h" +#include "cmd_dispatch.h" +#include "ums.h" +#include "volmgr.h" + +struct cmd_dispatch { + char *cmd; + int (* dispatch) (char *); +}; + +static void dispatch_cmd(char *cmd); +static int do_send_ums_status(char *cmd); +static int do_set_ums_enable(char *cmd); +static int do_mount_volume(char *cmd); +static int do_eject_media(char *cmd); +static int do_format_media(char *cmd); + +static struct cmd_dispatch dispatch_table[] = { + { VOLD_CMD_ENABLE_UMS, do_set_ums_enable }, + { VOLD_CMD_DISABLE_UMS, do_set_ums_enable }, + { VOLD_CMD_SEND_UMS_STATUS, do_send_ums_status }, + { VOLD_CMD_MOUNT_VOLUME, do_mount_volume }, + { VOLD_CMD_EJECT_MEDIA, do_eject_media }, + { VOLD_CMD_FORMAT_MEDIA, do_format_media }, + { NULL, NULL } +}; + +int process_framework_command(int socket) +{ + int rc; + char buffer[101]; + + if ((rc = read(socket, buffer, sizeof(buffer) -1)) < 0) { + LOGE("Unable to read framework command (%s)", strerror(errno)); + return -errno; + } else if (!rc) + return -ECONNRESET; + + int start = 0; + int i; + + buffer[rc] = 0; + + for (i = 0; i < rc; i++) { + if (buffer[i] == 0) { + dispatch_cmd(buffer + start); + start = i + 1; + } + } + return 0; +} + +static void dispatch_cmd(char *cmd) +{ + struct cmd_dispatch *c; + + LOG_VOL("dispatch_cmd(%s):", cmd); + + for (c = dispatch_table; c->cmd != NULL; c++) { + if (!strncmp(c->cmd, cmd, strlen(c->cmd))) { + c->dispatch(cmd); + return; + } + } + + LOGE("No cmd handlers defined for '%s'", cmd); +} + +static int do_send_ums_status(char *cmd) +{ + return ums_send_status(); +} + +static int do_set_ums_enable(char *cmd) +{ + if (!strcmp(cmd, VOLD_CMD_ENABLE_UMS)) + return volmgr_enable_ums(true); + + return volmgr_enable_ums(false); +} + +static int do_mount_volume(char *cmd) +{ + return volmgr_start_volume_by_mountpoint(&cmd[strlen("mount_volume:")]); +} + +static int do_format_media(char *cmd) +{ + return volmgr_format_volume(&cmd[strlen("format_media:")]); +} + +static int do_eject_media(char *cmd) +{ + return volmgr_stop_volume_by_mountpoint(&cmd[strlen("eject_media:")]); +} |