diff --git a/devicemodel/core/monitor.c b/devicemodel/core/monitor.c index a69486a06..f8e1e71b3 100644 --- a/devicemodel/core/monitor.c +++ b/devicemodel/core/monitor.c @@ -225,28 +225,6 @@ int acrn_parse_intr_monitor(const char *opt) return 0; } - -/* helpers */ -/* Check if @path is a directory, and create if not exist */ -static int check_dir(const char *path) -{ - struct stat st; - - if (stat(path, &st)) { - if (mkdir(path, 0666)) { - perror(path); - return -1; - } - return 0; - } - - if (S_ISDIR(st.st_mode)) - return 0; - - fprintf(stderr, "%s exist, and not a directory!\n", path); - return -1; -} - struct vm_ops { char name[16]; void *arg; @@ -426,13 +404,13 @@ int monitor_init(struct vmctx *ctx) int ret; char path[128] = {}; - ret = check_dir("/run/acrn/"); + ret = check_dir(ACRN_DM_BASE_PATH, CHK_CREAT); if (ret) { fprintf(stderr, "%s %d\r\n", __FUNCTION__, __LINE__); goto dir_err; } - ret = check_dir("/run/acrn/mngr"); + ret = check_dir(ACRN_DM_SOCK_PATH, CHK_CREAT); if (ret) { fprintf(stderr, "%s %d\r\n", __FUNCTION__, __LINE__); goto dir_err; diff --git a/tools/acrn-manager/acrn_mngr.c b/tools/acrn-manager/acrn_mngr.c index fd250414c..4271b9e07 100644 --- a/tools/acrn-manager/acrn_mngr.c +++ b/tools/acrn-manager/acrn_mngr.c @@ -18,25 +18,32 @@ #include "acrn_mngr.h" /* helpers */ -/* Check if @path is a directory, and create if not exist */ -static int check_dir(const char *path) +/* Check if @path exists and if is a directory, if not existence, create or warn according to the flag */ +int check_dir(const char *path, int flags) { - struct stat st; + struct stat st; - if (stat(path, &st)) { - if (mkdir(path, 0666)) { - perror(path); - return -1; - } - return 0; - } + if (stat(path, &st)) { + if (flags) { + if (mkdir(path, 0666)) { + perror(path); + return -1; + } + return 0; + } else { + printf("%s doesn't exist!\n", path); + return -1; + } + } - if (S_ISDIR(st.st_mode)) - return 0; + if (S_ISDIR(st.st_mode)) + return 0; - return -1; + fprintf(stderr, "%s exist, and not a directory!\n", path); + return -1; } + #define MNGR_SOCK_FMT "/run/acrn/mngr/%s.%d.socket" #define MNGR_MAX_HANDLER 8 #define MNGR_MAX_CLIENT 4 @@ -489,8 +496,8 @@ static void close_client(struct mngr_fd *mfd) int mngr_open_un(const char *name, int flags) { - check_dir("/run/acrn"); - check_dir("/run/acrn/mngr"); + check_dir(ACRN_DM_BASE_PATH, CHK_ONLY); + check_dir(ACRN_DM_SOCK_PATH, CHK_ONLY); if (!name) { printf("%s: No socket name configured\n", __func__); diff --git a/tools/acrn-manager/acrn_mngr.h b/tools/acrn-manager/acrn_mngr.h index 91cad989e..bb8469ee2 100644 --- a/tools/acrn-manager/acrn_mngr.h +++ b/tools/acrn-manager/acrn_mngr.h @@ -9,8 +9,15 @@ #include #include -#define MNGR_MSG_MAGIC 0x67736d206d6d76 /* that is char[8] "mngr msg", on X86 */ -#define PATH_LEN 128 +#define MNGR_MSG_MAGIC 0x67736d206d6d76 /* that is char[8] "mngr msg", on X86 */ +#define PATH_LEN 128 + +#define ACRN_CONF_PATH "/usr/share/acrn/conf" +#define ACRN_CONF_PATH_ADD ACRN_CONF_PATH "/add" +#define ACRN_CONF_TIMER_LIST ACRN_CONF_PATH "/timer_list" + +#define ACRN_DM_BASE_PATH "/run/acrn" +#define ACRN_DM_SOCK_PATH "/run/acrn/mngr" struct mngr_msg { unsigned long long magic; /* Make sure you get a mngr_msg */ @@ -110,11 +117,14 @@ enum sos_lcs_msgid { #define MNGR_SERVER 1 /* create a server fd, which you can add handlers onto it */ #define MNGR_CLIENT 0 /* create a client, just send req and read ack */ +#define CHK_CREAT 1 /* create a directory, if not exist */ +#define CHK_ONLY 0 /* check if the directory exist only */ + /** * @brief create a descripter for vm management IPC * - * @param name: refer to a sock file under /run/acrn/mngr/[name].[pid].socket - * @param flags: MNGR_SERVER to create a server, MNGR_CLIENT to create a client + * @param name refer to a sock file under /run/acrn/mngr/[name].[pid].socket + * @param flags MNGR_SERVER to create a server, MNGR_CLIENT to create a client * * @return descripter ID (> 1024) on success, errno (< 0) on error. */ @@ -123,17 +133,17 @@ int mngr_open_un(const char *name, int flags); /** * @brief close descripter and release the resouces * - * @param desc: descripter to be closed + * @param desc descripter to be closed */ void mngr_close(int desc); /** * @brief add a handler for message specified by msg * - * @param desc: descripter to register handler to - * @param id: id of message to handle - * @param cb: handler callback - * @param param: param for the callback + * @param desc descripter to register handler to + * @param id id of message to handle + * @param cb handler callback + * @param param param for the callback * @return 0 on success, errno on error */ int mngr_add_handler(int desc, unsigned id, @@ -143,13 +153,22 @@ int mngr_add_handler(int desc, unsigned id, /** * @brief send a message and wait for ack * - * @param desc: descripter created using mngr_open_un - * @param req: pointer to message to send - * @param ack: pointer to ack struct, NULL if no ack required - * @param timeout: time to wait for ack, zero to blocking waiting + * @param desc descripter created using mngr_open_un + * @param req pointer to message to send + * @param ack pointer to ack struct, NULL if no ack required + * @param timeout time to wait for ack, zero to blocking waiting * @return len of ack messsage (0 if ack is NULL) on succes, errno on error */ int mngr_send_msg(int desc, struct mngr_msg *req, struct mngr_msg *ack, unsigned timeout); +/** + * @brief check @path existence and create or report error accoding to the flag + * + * @param path path to check + * @param flags CHK_CREAT to create directory, CHK_ONLY check directory only + * @return 0 on success, -1 on error + */ +int check_dir(const char *path, int flags); + #endif /* ACRN_MANAGER_H */ diff --git a/tools/acrn-manager/acrn_vm_ops.c b/tools/acrn-manager/acrn_vm_ops.c index 776611630..0f069cc48 100644 --- a/tools/acrn-manager/acrn_vm_ops.c +++ b/tools/acrn-manager/acrn_vm_ops.c @@ -27,26 +27,6 @@ const char *state_str[] = { [VM_UNTRACKED] = "untracked", }; -/* Check if @path is a directory, and create if not exist */ -static int check_dir(const char *path) -{ - struct stat st; - - if (stat(path, &st)) { - if (mkdir(path, 0666)) { - perror(path); - return -1; - } - return 0; - } - - if (S_ISDIR(st.st_mode)) - return 0; - - fprintf(stderr, "%s exist, and not a directory!\n", path); - return -1; -} - /* List head of all vm */ static pthread_mutex_t vmmngr_mutex = PTHREAD_MUTEX_INITIALIZER; struct vmmngr_list_struct vmmngr_head = { NULL }; @@ -131,7 +111,7 @@ static void _scan_alive_vm(void) int pid; int ret; - ret = check_dir(ACRN_DM_SOCK_PATH); + ret = check_dir(ACRN_DM_SOCK_PATH, CHK_ONLY); if (ret) { printf("%s: Failed to check directory %s, err: %d\n", __func__, ACRN_DM_SOCK_PATH, ret); return; @@ -228,13 +208,13 @@ static void _scan_added_vm(void) char suffix[PATH_LEN]; int ret; - ret = check_dir(ACRN_CONF_PATH); + ret = check_dir(ACRN_CONF_PATH, CHK_ONLY); if (ret) { printf("%s: Failed to check directory %s, err: %d\n", __func__, ACRN_CONF_PATH, ret); return; } - ret = check_dir(ACRN_CONF_PATH_ADD); + ret = check_dir(ACRN_CONF_PATH_ADD, CHK_ONLY); if (ret) { printf("%s: Failed to check directory %s, err: %d\n", __func__, ACRN_CONF_PATH_ADD, ret); return; diff --git a/tools/acrn-manager/acrnctl.c b/tools/acrn-manager/acrnctl.c index a73e137e3..645b9b0ad 100644 --- a/tools/acrn-manager/acrnctl.c +++ b/tools/acrn-manager/acrnctl.c @@ -86,7 +86,7 @@ static int check_name(const char *name) return -1; if (strnlen(name, MAX_VM_OS_NAME_LEN) >= MAX_VM_OS_NAME_LEN) { - printf("(%s) size exceed MAX_VM_OS_NAME_LEN:%u\n", name,MAX_VM_OS_NAME_LEN); + printf("(%s) size exceed MAX_VM_OS_NAME_LEN:%u\n", name, MAX_VM_OS_NAME_LEN); return -1; } @@ -425,7 +425,7 @@ static int acrnctl_do_stop(int argc, char *argv[]) return -1; } if (s->state == VM_CREATED) { - printf("%s is already (%s)\n", argv[1],state_str[s->state]); + printf("%s is already (%s)\n", argv[1], state_str[s->state]); return -1; } return stop_vm(argv[1]); @@ -490,15 +490,15 @@ static int acrnctl_do_del(int argc, char *argv[]) return -1; } if (s->state != VM_CREATED) { - printf("can't delete %s(%s)\n", argv[1],state_str[s->state]); + printf("can't delete %s(%s)\n", argv[1], state_str[s->state]); return -1; } - if (snprintf(cmd, sizeof(cmd), "rm -f %s/%s.sh",ACRN_CONF_PATH_ADD, argv[1]) >= sizeof(cmd)) { + if (snprintf(cmd, sizeof(cmd), "rm -f %s/%s.sh", ACRN_CONF_PATH_ADD, argv[1]) >= sizeof(cmd)) { printf("WARN: cmd is truncated\n"); return -1; } system(cmd); - if (snprintf(cmd, sizeof(cmd), "rm -f %s/%s.args",ACRN_CONF_PATH_ADD, argv[1]) >= sizeof(cmd)) { + if (snprintf(cmd, sizeof(cmd), "rm -f %s/%s.args", ACRN_CONF_PATH_ADD, argv[1]) >= sizeof(cmd)) { printf("WARN: cmd is truncated\n"); return -1; } @@ -547,7 +547,7 @@ static int acrnctl_do_pause(int argc, char *argv[]) ret = pause_vm(argv[1]); break; default: - printf("%s current state %s, can't pause\n",argv[1], state_str[s->state]); + printf("%s current state %s, can't pause\n", argv[1], state_str[s->state]); } return ret; @@ -573,7 +573,7 @@ static int acrnctl_do_continue(int argc, char *argv[]) ret = continue_vm(argv[1]); break; default: - printf("%s current state %s, can't continue\n",argv[1], state_str[s->state]); + printf("%s current state %s, can't continue\n", argv[1], state_str[s->state]); } return ret; @@ -596,7 +596,7 @@ static int acrnctl_do_suspend(int argc, char *argv[]) ret = suspend_vm(argv[1]); break; default: - printf("%s current state %s, can't suspend\n",argv[1], state_str[s->state]); + printf("%s current state %s, can't suspend\n", argv[1], state_str[s->state]); } return ret; @@ -626,7 +626,7 @@ static int acrnctl_do_resume(int argc, char *argv[]) printf("resume %s reason(0x%x\n", argv[1], reason); break; default: - printf("%s current state %s, can't resume\n",argv[1], state_str[s->state]); + printf("%s current state %s, can't resume\n", argv[1], state_str[s->state]); } return ret; @@ -677,13 +677,13 @@ static int acrnctl_do_reset(int argc, char *argv[]) break; } if (wait_vm_stop(argv[1], STOP_TIMEOUT)) { - printf("Failed to stop %s in %u sec, reset failed\n",argv[1], STOP_TIMEOUT); + printf("Failed to stop %s in %u sec, reset failed\n", argv[1], STOP_TIMEOUT); break; } ret = start_vm(argv[1]); break; default: - printf("%s current state: %s, can't reset\n",argv[1], state_str[s->state]); + printf("%s current state: %s, can't reset\n", argv[1], state_str[s->state]); } return ret; } diff --git a/tools/acrn-manager/acrnctl.h b/tools/acrn-manager/acrnctl.h index bf9591caa..71e73326b 100644 --- a/tools/acrn-manager/acrnctl.h +++ b/tools/acrn-manager/acrnctl.h @@ -10,12 +10,6 @@ #include #include "acrn_mngr.h" -#define ACRN_CONF_PATH "/usr/share/acrn/conf" -#define ACRN_CONF_PATH_ADD ACRN_CONF_PATH "/add" -#define ACRN_CONF_TIMER_LIST ACRN_CONF_PATH "/timer_list" - -#define ACRN_DM_SOCK_PATH "/run/acrn/mngr" - enum vm_state { VM_STATE_UNKNOWN = 0, VM_CREATED, /* VM created / awaiting start (boot) */ diff --git a/tools/acrn-manager/acrnd.c b/tools/acrn-manager/acrnd.c index 75bd378b7..5db66d683 100644 --- a/tools/acrn-manager/acrnd.c +++ b/tools/acrn-manager/acrnd.c @@ -670,7 +670,7 @@ static const char optString[] = "t"; int main(int argc, char *argv[]) { - int opt; + int opt, ret; while ((opt = getopt(argc, argv, optString)) != -1) { switch (opt) { @@ -688,6 +688,18 @@ int main(int argc, char *argv[]) platform_has_hw_ioc = 0; } + ret = check_dir(ACRN_DM_BASE_PATH, CHK_CREAT); + if (ret) { + fprintf(stderr, "%s %d\r\n", __FUNCTION__, __LINE__); + return -1; + } + + ret = check_dir(ACRN_DM_SOCK_PATH, CHK_CREAT); + if (ret) { + fprintf(stderr, "%s %d\r\n", __FUNCTION__, __LINE__); + return -1; + } + /* create listening thread */ acrnd_fd = mngr_open_un(ACRND_NAME, MNGR_SERVER); if (acrnd_fd < 0) {