1 /*
2  * Copyright (C) 2022 Intel Corporation.
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <stdbool.h>
11 #include <string.h>
12 #include <termios.h>
13 #include <unistd.h>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <pthread.h>
17 #include <netinet/in.h>
18 #include <arpa/inet.h>
19 #include <sys/un.h>
20 #include "command.h"
21 #include "vmmapi.h"
22 #include "log.h"
23 
24 #define GEN_CMD_OBJ(cmd_name) \
25 	{.name = cmd_name,}
26 #define CMD_OBJS \
27 	GEN_CMD_OBJ(DESTROY), \
28 	GEN_CMD_OBJ(BLKRESCAN), \
29 	GEN_CMD_OBJ(REGISTER_VM_EVENT_CLIENT), \
30 
31 struct command dm_command_list[CMDS_NUM] = {CMD_OBJS};
32 
dispatch_command_handlers(void * arg)33 int dispatch_command_handlers(void *arg)
34 {
35 	struct command *cmd = (struct command *)arg;
36 	int ret = 0;
37 
38 	pr_info("Handle command %s in command monitor.\n", cmd->name);
39 	if (cmd->cmd_handler.fn) {
40 		ret = cmd->cmd_handler.fn(cmd->cmd_handler.arg, &cmd->para);
41 		pr_info("Command handler ret=%d.\n", ret);
42 	} else {
43 		pr_info("No handler for command: %s.\r\n", cmd->name);
44 	}
45 
46 	return 0;
47 }
find_command(const char * name)48 struct command *find_command(const char *name)
49 {
50 	for (int i = 0; (i < CMDS_NUM) && (name != NULL); i++) {
51 		if (strcmp(dm_command_list[i].name, name) == 0)
52 			return &dm_command_list[i];
53 	}
54 	return NULL;
55 }
56 
register_command_handler(cmd_handler * fn,struct handler_args * arg,const char * cmd_name)57 int register_command_handler(cmd_handler *fn, struct handler_args *arg, const char *cmd_name)
58 {
59 	struct command *cmd;
60 	struct handler_args *handler_arg;
61 
62 	if ((!fn) || (!arg) || (!cmd_name)) {
63 		pr_err("%s : Failed to register command_handler.\n", __func__);
64 		return -EINVAL;
65 	}
66 
67 	cmd = find_command(cmd_name);
68 	if (cmd == NULL) {
69 		pr_err("%s : invalid command name %s.\r\n", __func__, cmd_name);
70 		return -EINVAL;
71 	}
72 
73 	if (cmd->cmd_handler.fn != NULL) {
74 		pr_err("Failed to register command handler since the handler have already been registered.\n");
75 		return -EINVAL;
76 	}
77 	cmd->cmd_handler.fn = fn;
78 
79 	handler_arg = calloc(1, sizeof(*handler_arg));
80 	if (!handler_arg) {
81 		pr_err("Failed to allocate command handler argument.\r\n");
82 		return -ENOMEM;
83 	}
84 	cmd->cmd_handler.arg = handler_arg;
85 	cmd->cmd_handler.arg->channel_arg = arg->channel_arg;
86 	cmd->cmd_handler.arg->ctx_arg = arg->ctx_arg;
87 
88 	return 0;
89 }
90