Skip to content

Commit 2da5e7c

Browse files
KaigeFulijinxia
authored andcommitted
tools: acrnctl: Use new IPC lib to connect acrn-dm
this patch aim at 1. Use new IPC lib to connect acrn-dm. 2. Export list_vm, start_vm and stop_vm and acrnd will use them later. 3. Rename vmm releated struct and function Signed-off-by: Kaige Fu <kaige.fu@intel.com> Reviewed-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com> Reviewed-by: Yan, Like <like.yan@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 143c49b commit 2da5e7c

File tree

4 files changed

+269
-241
lines changed

4 files changed

+269
-241
lines changed

tools/acrn-manager/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ $(OUT_DIR)/libacrn-mngr.a: acrn_mngr.c acrn_mngr.h
99
ar -cr $@ $(OUT_DIR)/acrn_mngr.o
1010
cp ./acrn_mngr.h $(OUT_DIR)/
1111

12-
$(OUT_DIR)/acrnctl: acrnctl.c
13-
$(CC) -o $(OUT_DIR)/acrnctl acrnctl.c -I../../devicemodel/include -Wall -g
12+
$(OUT_DIR)/acrnctl: acrnctl.c acrn_mngr.h
13+
$(CC) -o $(OUT_DIR)/acrnctl acrnctl.c acrn_vm_ops.c -I../../devicemodel/include -L$(TOOLS_OUT) -lacrn-mngr -lpthread -Wall -g
1414

1515
.PHONY: clean
1616
clean:

tools/acrn-manager/acrn_vm_ops.c

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
/**
2+
* Copyright (C) 2018 Intel Corporation
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
*/
5+
6+
#include <stdio.h>
7+
#include <stdlib.h>
8+
#include <time.h>
9+
#include <fcntl.h>
10+
#include <string.h>
11+
#include <errno.h>
12+
#include "acrnctl.h"
13+
#include "acrn_mngr.h"
14+
15+
/* List head of all vm */
16+
static LIST_HEAD(vmmngr_list_struct, vmmngr_struct) vmmngr_head;
17+
18+
static struct vmmngr_struct *vmmngr_list_add(char *name)
19+
{
20+
struct vmmngr_struct *s;
21+
22+
s = calloc(1, sizeof(struct vmmngr_struct));
23+
if (!s) {
24+
perror("alloc vmmngr_struct");
25+
return NULL;
26+
}
27+
28+
strncpy(s->name, name, MAX_NAME_LEN - 1);
29+
LIST_INSERT_HEAD(&vmmngr_head, s, list);
30+
31+
return s;
32+
}
33+
34+
struct vmmngr_struct *vmmngr_find(char *name)
35+
{
36+
struct vmmngr_struct *s;
37+
38+
LIST_FOREACH(s, &vmmngr_head, list)
39+
if (!strcmp(name, s->name))
40+
return s;
41+
return NULL;
42+
}
43+
44+
void get_vm_list(void)
45+
{
46+
char cmd[128] = { };
47+
char cmd_out[256] = { };
48+
char *vmname;
49+
char *pvmname = NULL;
50+
struct vmmngr_struct *s;
51+
size_t len = sizeof(cmd_out);
52+
53+
snprintf(cmd, sizeof(cmd),
54+
"find %s/add/ -name \"*.sh\" | "
55+
"sed \"s/\\/opt\\/acrn\\/conf\\/add\\///g\" | "
56+
"sed \"s/.sh//g\"", ACRNCTL_OPT_ROOT);
57+
shell_cmd(cmd, cmd_out, sizeof(cmd_out));
58+
59+
/* Properly null-terminate cmd_out */
60+
cmd_out[len - 1] = '\0';
61+
62+
vmname = strtok_r(cmd_out, "\n", &pvmname);
63+
while (vmname) {
64+
s = vmmngr_list_add(vmname);
65+
if (!s)
66+
continue;
67+
s->state = VM_CREATED;
68+
vmname = strtok_r(NULL, "\n", &pvmname);
69+
}
70+
71+
pvmname = NULL;
72+
73+
snprintf(cmd, sizeof(cmd),
74+
"find %s/ -name \"*monitor.*.socket\" | "
75+
"sed \"s/\\/run\\/acrn\\/mngr\\///g\" | "
76+
"awk -F. \'{ print $1 }\'", ACRN_DM_SOCK_ROOT);
77+
shell_cmd(cmd, cmd_out, sizeof(cmd_out));
78+
79+
/* Properly null-terminate cmd_out */
80+
cmd_out[len - 1] = '\0';
81+
82+
vmname = strtok_r(cmd_out, "\n", &pvmname);
83+
while (vmname) {
84+
s = vmmngr_find(vmname);
85+
if (s)
86+
s->state = VM_STARTED;
87+
else {
88+
s = vmmngr_list_add(vmname);
89+
if (s)
90+
s->state = VM_UNTRACKED;
91+
}
92+
vmname = strtok_r(NULL, "\n", &pvmname);
93+
}
94+
}
95+
96+
/* helper functions */
97+
int shell_cmd(const char *cmd, char *outbuf, int len)
98+
{
99+
FILE *ptr;
100+
char cmd_buf[256];
101+
int ret;
102+
103+
if (!outbuf)
104+
return system(cmd);
105+
106+
memset(cmd_buf, 0, sizeof(cmd_buf));
107+
memset(outbuf, 0, len);
108+
snprintf(cmd_buf, sizeof(cmd_buf), "%s 2>&1", cmd);
109+
ptr = popen(cmd_buf, "re");
110+
if (!ptr)
111+
return -1;
112+
113+
ret = fread(outbuf, 1, len, ptr);
114+
pclose(ptr);
115+
116+
return ret;
117+
}
118+
119+
static int send_msg(char *vmname, struct mngr_msg *req,
120+
struct mngr_msg *ack, size_t ack_len)
121+
{
122+
int fd, ret;
123+
124+
if (!vmname) {
125+
printf("No vmname provided\n");
126+
return -EINVAL;
127+
}
128+
129+
fd = mngr_open_un(vmname, MNGR_CLIENT);
130+
if (fd < 0) {
131+
printf("%s: Unable to open %s. line %d\n", __FUNCTION__,
132+
vmname, __LINE__);
133+
return -1;
134+
}
135+
136+
ret = mngr_send_msg(fd, req, ack, ack_len, 1);
137+
if (ret < 0) {
138+
printf("%s: Unable to send msg\n", __FUNCTION__);
139+
mngr_close(fd);
140+
return ret;
141+
}
142+
143+
mngr_close(fd);
144+
145+
return 0;
146+
}
147+
148+
int list_vm()
149+
{
150+
struct vmmngr_struct *s;
151+
int find = 0;
152+
153+
LIST_FOREACH(s, &vmmngr_head, list) {
154+
printf("%s\t\t%s\n", s->name, state_str[s->state]);
155+
find++;
156+
}
157+
158+
if (!find)
159+
printf("There are no VMs\n");
160+
161+
return 0;
162+
}
163+
164+
int start_vm(char *vmname)
165+
{
166+
char cmd[128];
167+
168+
snprintf(cmd, sizeof(cmd), "bash %s/add/%s.sh $(cat %s/add/%s.args)",
169+
ACRNCTL_OPT_ROOT, vmname, ACRNCTL_OPT_ROOT, vmname);
170+
171+
return system(cmd);
172+
}
173+
174+
int stop_vm(char *vmname)
175+
{
176+
struct req_dm_stop req;
177+
struct ack_dm_stop ack;
178+
179+
req.msg.magic = MNGR_MSG_MAGIC;
180+
req.msg.msgid = DM_STOP;
181+
req.msg.timestamp = time(NULL);
182+
req.msg.len = sizeof(req);
183+
184+
send_msg(vmname, (struct mngr_msg *)&req,
185+
(struct mngr_msg *)&ack, sizeof(ack));
186+
if (ack.err) {
187+
printf("Error happens when try to stop vm. errno(%d)\n",
188+
ack.err);
189+
}
190+
191+
return ack.err;
192+
}

0 commit comments

Comments
 (0)