• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Virtual machine Management Terminal User Interface


Commit MetaInfo

Révisionf270369f84409b7bd936b8dbcae7274c86af4bae (tree)
l'heure2023-01-29 20:30:54
AuteurKoine Yuusuke(koinec) <koinec@user...>
CommiterKoine Yuusuke(koinec)

Message de Log

Create guestconfig.[ch]

Change Summary

Modification

--- a/src/Makefile
+++ b/src/Makefile
@@ -42,6 +42,7 @@ OBJS_PARTS = common.o \
4242 hvthread.o \
4343 hvcmd.o \
4444 guestctl.o \
45+ guestconfig.o \
4546 vmbhyve.o \
4647 sshcmd.o \
4748 localcmd.o \
@@ -72,6 +73,7 @@ HEADER = vmtui.h \
7273 hvthread.h \
7374 hvcmd.h \
7475 guestctl.h \
76+ guestconfig.h \
7577 vmbhyve.h \
7678 sshcmd.h \
7779 localcmd.h \
@@ -168,6 +170,9 @@ hvcmd.o: hvcmd.c $(HEADER)
168170 guestctl.o: guestctl.c $(HEADER)
169171 $(CC) -c -o guestctl.o $(FLAGS_COMPILE) $(FLAGS_DEBUG) \
170172 guestctl.c
173+guestconfig.o: guestconfig.c $(HEADER)
174+ $(CC) -c -o guestconfig.o $(FLAGS_COMPILE) $(FLAGS_DEBUG) \
175+ guestconfig.c
171176 vmbhyve.o: vmbhyve.c $(HEADER)
172177 $(CC) -c -o vmbhyve.o $(FLAGS_COMPILE) $(FLAGS_DEBUG) \
173178 vmbhyve.c
@@ -215,34 +220,34 @@ $(TEST_TARGET): $(TEST_OBJS) $(OBJS_PARTS)
215220 $(CC) -o $(TEST_TARGET) $(TEST_FLAGS_LINKER) \
216221 $(TEST_OBJS) $(OBJS_PARTS)
217222
218-test_vmtui.o: test_vmtui.c
223+test_vmtui.o: test_vmtui.c $(HEADER)
219224 $(CC) -c -o test_vmtui.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
220225 test_vmtui.c
221-test_hvisor.o: test_hvisor.c
226+test_hvisor.o: test_hvisor.c $(HEADER)
222227 $(CC) -c -o test_hvisor.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
223228 test_hvisor.c
224-test_guest.o: test_guest.c
229+test_guest.o: test_guest.c $(HEADER)
225230 $(CC) -c -o test_guest.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
226231 test_guest.c
227-test_request.o: test_request.c
232+test_request.o: test_request.c $(HEADER)
228233 $(CC) -c -o test_request.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
229234 test_request.c
230-test_hvctl.o: test_hvctl.c
235+test_hvctl.o: test_hvctl.c $(HEADER)
231236 $(CC) -c -o test_hvctl.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
232237 test_hvctl.c
233-test_guestctl.o:test_guestctl.c
238+test_guestctl.o:test_guestctl.c $(HEADER)
234239 $(CC) -c -o test_guestctl.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
235240 test_guestctl.c
236-test_errinfo.o: test_errinfo.c
241+test_errinfo.o: test_errinfo.c $(HEADER)
237242 $(CC) -c -o test_errinfo.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
238243 test_errinfo.c
239-test_configfile.o: test_configfile.c
244+test_configfile.o: test_configfile.c $(HEADER)
240245 $(CC) -c -o test_configfile.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
241246 test_configfile.c
242-test_keyval.o: test_keyval.c
247+test_keyval.o: test_keyval.c $(HEADER)
243248 $(CC) -c -o test_keyval.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
244249 test_keyval.c
245-test_textbuf.o: test_textbuf.c
250+test_textbuf.o: test_textbuf.c $(HEADER)
246251 $(CC) -c -o test_textbuf.o $(TEST_FLAGS_COMPILE) $(FLAGS_DEBUG) \
247252 test_textbuf.c
248253
--- a/src/guest.h
+++ b/src/guest.h
@@ -32,22 +32,156 @@
3232
3333 #define GUEST_MAXLEN_NAME 128
3434
35-#define GUEST_LOADER_KEY "Loader"
36-#define GUEST_LOADER_PRI 0x00000000
37-#define GUEST_CPU_VCPUS_KEY "CPU/VCPUs"
38-#define GUEST_CPU_VCPUS_PRI 0x00000000
39-#define GUEST_MEM_SIZE_KEY "Memory/Size"
40-#define GUEST_MEM_SIZE_PRI 0x00000000
41-#define GUEST_VNC_HOST_KEY "VNC/Host"
42-#define GUEST_VNC_HOST_PRI 0x00000000
43-#define GUEST_VNC_PORT_KEY "VNC/Port"
44-#define GUEST_VNC_PORT_PRI 0x00000000
45-#define GUEST_AUTOSTART_KEY "AutoStart"
46-#define GUEST_AUTOSTART_PRI 0x00000000
47-#define GUEST_DATASTORE_NAME_KEY "DataStore/Size"
48-#define GUEST_DATASTORE_NAME_PRI 0x00050010
49-#define GUEST_DATASTORE_PATH_KEY "DataStore/Path"
50-#define GUEST_DATASTORE_PATH_PRI 0x00050020
35+// Loader ---
36+#define GUEST_LOADER_BASEPRI 0x01000000
37+#define GUEST_LOADER_BASEKEY "Loader"
38+#define GUEST_LOADER_LOADER_KEY GUEST_LOADER_BASEKEY"/Loader" // string
39+#define GUEST_LOADER_LOADER_PRI (GUEST_LOADER_BASEPRI|0x00000010)
40+#define GUEST_LOADER_BHYVELOADER_KEY GUEST_LOADER_BASEKEY"/BhyveLoader" // string
41+#define GUEST_LOADER_BHYVELOADER_PRI (GUEST_LOADER_BASEPRI|0x00000020)
42+#define GUEST_LOADER_TIMEOUT_KEY GUEST_LOADER_BASEKEY"/Timeout" // uint
43+#define GUEST_LOADER_TIMEOUT_PRI (GUEST_LOADER_BASEPRI|0x00000030)
44+// CPU ---
45+#define GUEST_CPU_BASEPRI 0x02000000
46+#define GUEST_CPU_VCPUS_KEY "CPU/VCPUs" // (uint)
47+#define GUEST_CPU_VCPUS_PRI (GUEST_CPU_BASEPRI|0x00000010)
48+#define GUEST_CPU_SOCKETS_KEY "CPU/Sockets" // uint
49+#define GUEST_CPU_SOCKETS_PRI (GUEST_CPU_BASEPRI|0x00000020)
50+#define GUEST_CPU_CORES_KEY "CPU/Cores" // uint
51+#define GUEST_CPU_CORES_PRI (GUEST_CPU_BASEPRI|0x00000020)
52+#define GUEST_CPU_THREADS_KEY "CPU/Threads" // uint
53+#define GUEST_CPU_THREADS_PRI (GUEST_CPU_BASEPRI|0x00000030)
54+// Memory ---
55+#define GUEST_MEM_BASEPRI 0x03000000
56+#define GUEST_MEM_SIZE_KEY "Memory/Size" // sfx. int
57+#define GUEST_MEM_SIZE_PRI (GUEST_MEM_BASEPRI|0x00000010)
58+#define GUEST_MEM_WIRED_KEY "Memory/Wired" // yes/no
59+#define GUEST_MEM_WIRED_PRI (GUEST_MEM_BASEPRI|0x00000020)
60+// Network ---
61+#define GUEST_NETWORK_BASEKEY "Network"
62+#define GUEST_NETWORK_BASEPRI 0x04000000
63+#define GUEST_NETWORK_ITEMS_KEY "Network/Items" // uint
64+#define GUEST_NETWORK_ITEMS_PRI (GUEST_NETWORK_BASEPRI|0x00000010)
65+#define GUEST_NETWORK_TYPE_SUBKEY "Type" // string
66+#define GUEST_NETWORK_TYPE_PRI (GUEST_NETWORK_BASEPRI|0x00010010)
67+#define GUEST_NETWORK_SWITCH_SUBKEY "Switch" // string
68+#define GUEST_NETWORK_SWITCH_PRI (GUEST_NETWORK_BASEPRI|0x00010020)
69+#define GUEST_NETWORK_DEVICE_SUBKEY "Device" // string
70+#define GUEST_NETWORK_DEVICE_PRI (GUEST_NETWORK_BASEPRI|0x00010030)
71+#define GUEST_NETWORK_MAC_SUBKEY "MAC" // string
72+#define GUEST_NETWORK_MAC_PRI (GUEST_NETWORK_BASEPRI|0x00010040)
73+#define GUEST_NETWORK_SPAN_SUBKEY "Span" // string
74+#define GUEST_NETWORK_SPAN_PRI (GUEST_NETWORK_BASEPRI|0x00010050)
75+// Disk ---
76+#define GUEST_DISK_BASEKEY "Disk"
77+#define GUEST_DISK_BASEPRI 0x05000000
78+#define GUEST_DISK_ITEMS_KEY "Disk/Items" // uint
79+#define GUEST_DISK_ITEMS_PRI (GUEST_DISK_BASEPRI|0x00000010)
80+#define GUEST_DISK_TYPE_SUBKEY "Type" // string
81+#define GUEST_DISK_TYPE_PRI (GUEST_DISK_BASEPRI|0x00010010)
82+#define GUEST_DISK_NAME_SUBKEY "Name" // string
83+#define GUEST_DISK_NAME_PRI (GUEST_DISK_BASEPRI|0x00010020)
84+#define GUEST_DISK_DEVICE_SUBKEY "Device" // string
85+#define GUEST_DISK_DEVICE_PRI (GUEST_DISK_BASEPRI|0x00010030)
86+#define GUEST_DISK_OPTION_SUBKEY "Option" // string
87+#define GUEST_DISK_OPTION_PRI (GUEST_DISK_BASEPRI|0x00010040)
88+#define GUEST_DISK_SIZE_SUBKEY "Size" // sfxint
89+#define GUEST_DISK_SIZE_PRI (GUEST_DISK_BASEPRI|0x00010050)
90+// Graphics (VNC) ---
91+#define GUEST_VNC_BASEPRI 0x06000000
92+#define GUEST_VNC_ENABLE_KEY "VNC/Enable" // yes/no
93+#define GUEST_VNC_ENABLE_PRI (GUEST_VNC_BASEPRI|0x00000010)
94+#define GUEST_VNC_HOST_KEY "VNC/Host" // string
95+#define GUEST_VNC_HOST_PRI (GUEST_VNC_BASEPRI|0x00000020)
96+#define GUEST_VNC_PORT_KEY "VNC/Port" // uint
97+#define GUEST_VNC_PORT_PRI (GUEST_VNC_BASEPRI|0x00000030)
98+#define GUEST_VNC_RESOLUTION_KEY "VNC/Resolution" // string
99+#define GUEST_VNC_RESOLUTION_PRI (GUEST_VNC_BASEPRI|0x00000040)
100+#define GUEST_VNC_WAIT_KEY "VNC/Wait" // yes/no
101+#define GUEST_VNC_WAIT_PRI (GUEST_VNC_BASEPRI|0x00000050)
102+#define GUEST_VNC_VGA_KEY "VNC/Vga" // string
103+#define GUEST_VNC_VGA_PRI (GUEST_VNC_BASEPRI|0x00000060)
104+// Grub ---
105+#define GUEST_GRUB_BASEKEY "Grub"
106+#define GUEST_GRUB_BASEPRI 0x07000000
107+#define GUEST_GRUB_RUNPARTITION_KEY "Grub/RunPartition" // string
108+#define GUEST_GRUB_RUNPARTITION_PRI (GUEST_GRUB_BASEPRI|0x00000010)
109+#define GUEST_GRUB_RUNDIR_KEY "Grub/RunDir" // string
110+#define GUEST_GRUB_RUNDIR_PRI (GUEST_GRUB_BASEPRI|0x00000020)
111+#define GUEST_GRUB_RUNFILE_KEY "Grub/RunFile" // string
112+#define GUEST_GRUB_RUNFILE_PRI (GUEST_GRUB_BASEPRI|0x00000030)
113+#define GUEST_GRUB_ITEMS_KEY "Grub/Items" // uint
114+#define GUEST_GRUB_ITEMS_PRI (GUEST_GRUB_BASEPRI|0x00000040)
115+#define GUEST_GRUB_INSTALL_SUBKEY "Install" // string
116+#define GUEST_GRUB_INSTALL_PRI (GUEST_GRUB_BASEPRI|0x00100010)
117+#define GUEST_GRUB_RUN_SUBKEY "Run" // string
118+#define GUEST_GRUB_RUN_PRI (GUEST_GRUB_BASEPRI|0x00100020)
119+// Others ---
120+#define GUEST_OTHERS_BASEPRI 0x09000000
121+#define GUEST_HOSTBRIDGE_KEY "Others/HostBridge" // string
122+#define GUEST_HOSTBRIDGE_PRI (GUEST_OTHERS_BASEPRI|0x00000010)
123+#define GUEST_COMPORTS_KEY "Others/ComPorts" // string
124+#define GUEST_COMPORTS_PRI (GUEST_OTHERS_BASEPRI|0x00000020)
125+#define GUEST_UTCTIME_KEY "Others/UTCtime" // yes/no
126+#define GUEST_UTCTIME_PRI (GUEST_OTHERS_BASEPRI|0x00000030)
127+#define GUEST_DEBUG_KEY "Others/Debug" // yes/no
128+#define GUEST_DEBUG_PRI (GUEST_OTHERS_BASEPRI|0x00000040)
129+#define GUEST_UUID_KEY "Others/UUID" // string
130+#define GUEST_UUID_PRI (GUEST_OTHERS_BASEPRI|0x00000050)
131+#define GUEST_IGNORE_BADMSR_KEY "Others/IgnoreBadMSR" // string
132+#define GUEST_IGNORE_BADMSR_PRI (GUEST_OTHERS_BASEPRI|0x00000060)
133+#define GUEST_VIRT_RANDOM_KEY "Others/VirtRandom" // yes/no
134+#define GUEST_VIRT_RANDOM_PRI (GUEST_OTHERS_BASEPRI|0x00000070)
135+#define GUEST_XHCI_MOUSE_KEY "Others/XHCImouse" // yes/no
136+#define GUEST_XHCI_MOUSE_PRI (GUEST_OTHERS_BASEPRI|0x00000080)
137+#define GUEST_AHCI_DEVLIMIT_KEY "Others/AHCIDeviceLimt" // uint
138+#define GUEST_AHCI_DEVLIMIT_PRI (GUEST_OTHERS_BASEPRI|0x00000090)
139+#define GUEST_START_SLOT_KEY "Others/UEFIStartSlot" // uint
140+#define GUEST_START_SLOT_PRI (GUEST_OTHERS_BASEPRI|0x000000a0)
141+#define GUEST_INSTALL_SLOT_KEY "Others/UEFIInstallSlot" // uint
142+#define GUEST_INSTALL_SLOT_PRI (GUEST_OTHERS_BASEPRI|0x000000b0)
143+
144+#define GUEST_PASSTHRU_ITEMS_KEY "Others/PassThru/Items" // uint
145+#define GUEST_PASSTHRU_ITEMS_PRI (GUEST_OTHERS_BASEPRI|0x00100000)
146+#define GUEST_PASSTHRU_BASEKEY "Others/PassThru" // string
147+#define GUEST_PASSTHRU_SUBKEY "Value" // string
148+#define GUEST_PASSTHRU_PRI (GUEST_OTHERS_BASEPRI|0x00110000)
149+
150+#define GUEST_VIRTCONSOLE_ITEMS_KEY "Others/VirtConsole/Items" // uint
151+#define GUEST_VIRTCONSOLE_ITEMS_PRI (GUEST_OTHERS_BASEPRI|0x00200000)
152+#define GUEST_VIRTCONSOLE_BASEKEY "Others/VirtConsole" // string
153+#define GUEST_VIRTCONSOLE_SUBKEY "Value" // string
154+#define GUEST_VIRTCONSOLE_PRI (GUEST_OTHERS_BASEPRI|0x00210000)
155+// Bhyve ---
156+#define GUEST_BHYVE_OPTIONS_KEY "Bhyve/BhyveOption" // string
157+#define GUEST_BHYVE_OPTIONS_PRI 0x0a000010
158+#define GUEST_BHYVE_PRESTART_KEY "Bhyve/PreStartScript" // strng
159+#define GUEST_BHYVE_PRESTART_PRI 0x0a000020
160+#define GUEST_BHYVE_PRIORITY_KEY "Bhyve/Priority" // sint
161+#define GUEST_BHYVE_PRIORITY_PRI 0x0a000030
162+#define GUEST_BHYVE_AUTOSTART_KEY "Bhyve/AutoStart"
163+#define GUEST_BHYVE_AUTOSTART_PRI 0x0a000040
164+// DataStore ---
165+#define GUEST_DATASTORE_NAME_KEY "DataStore/Size"
166+#define GUEST_DATASTORE_NAME_PRI 0x0b000010
167+#define GUEST_DATASTORE_PATH_KEY "DataStore/Path"
168+#define GUEST_DATASTORE_PATH_PRI 0x0b000020
169+// ZFS ---
170+#define GUEST_ZFS_DATASETOPTS_KEY "ZFS/DatasetOpts" // string
171+#define GUEST_ZFS_DATASETOPTS_PRI 0x0c000010
172+#define GUEST_ZFS_ZVOLOPTS_KEY "ZFS/ZVolOpts" // string
173+#define GUEST_ZFS_ZVOLOPTS_PRI 0x0c000020
174+// Resource Limitter ---
175+#define GUEST_LIMIT_CPU_PER_KEY "Limitter/CPU/Percent" // percent
176+#define GUEST_LIMIT_CPU_PER_PRI 0x0e000100
177+#define GUEST_LIMIT_DISK_READ_BPS_KEY "Limitter/Disk/Read/Bps" // uint
178+#define GUEST_LIMIT_DISK_READ_BPS_PRI 0x0e000211
179+#define GUEST_LIMIT_DISK_READ_IOPS_KEY "Limitter/Disk/Read/IOPS" // uint
180+#define GUEST_LIMIT_DISK_READ_IOPS_PRI 0x0e000212
181+#define GUEST_LIMIT_DISK_WRITE_BPS_KEY "Limitter/Disk/Write/Bps" // uint
182+#define GUEST_LIMIT_DISK_WRITE_BPS_PRI 0x0e000221
183+#define GUEST_LIMIT_DISK_WRITE_IOPS_KEY "Limitter/Disk/Write/IOPS" // uint
184+#define GUEST_LIMIT_DISK_WRITE_IOPS_PRI 0x0e000222
51185
52186
53187 typedef struct {
@@ -99,6 +233,11 @@ typedef struct {
99233 #define GUEST_STATUS_WAIT 0x00000002
100234 #define GUEST_STATUS_UNKNOWN 0xffffffff
101235
236+ DWord dw_option;
237+
238+ #define GUEST_OPTION_NONE 0x00000000
239+ #define GUEST_OPTION_NEW 0x00000001
240+
102241
103242 } Guest;
104243
@@ -151,6 +290,49 @@ void Guest_DeleteChain( Guest *p_guest );
151290 void Guest_Clear( Guest *p_guest, int i_id );
152291 #endif
153292
293+#define GUEST_SELECT_ITEMS_LOADER_LOADER 4
294+#define GUEST_SELECT_ITEMS_HOSTBRIDGE 3
295+#define GUEST_SELECT_ITEMS_COMPORTS 4
296+#define GUEST_SELECT_ITEMS_DISK_TYPE 4
297+#define GUEST_SELECT_ITEMS_DISK_DEVICE 5
298+#define GUEST_SELECT_ITEMS_NETWORK_TYPE 2
299+#define GUEST_SELECT_ITEMS_GRAPHICS_RES 9
300+#define GUEST_SELECT_ITEMS_GRAPHICS_WAIT 3
301+#define GUEST_SELECT_ITEMS_GRAPHICS_VGA 3
302+
303+#ifdef VMTUI_SRC_GUEST
304+char *gpstr_guest_select_loader_loader[]
305+ = { "bhyveload", "grub", "uefi", "uefi-csm" };
306+char *gpstr_guest_select_hostbridge[]
307+ = { "standard", "amd", "none" };
308+char *gpstr_guest_select_comports[]
309+ = { "com1", "com2", "com1 com2", "com2 com1" };
310+char *gpstr_guest_select_disk_type[]
311+ = { "virtio-blk", "ahci-hd", "ahci-cd", "nvme" };
312+char *gpstr_guest_select_disk_device[]
313+ = { "file", "zvol", "sparse-zvol", "custom", "iscsi" };
314+char *gpstr_guest_select_network_type[]
315+ = { "virtio-net", "e1000" };
316+char *gpstr_guest_select_graphics_res[]
317+ = { "1920x1200", "1920x1080", "1600x1200", "1600x900", "1280x1024",
318+ "1280x720", "1024x768" ,"800x600", "640x480" };
319+char *gpstr_guest_select_graphics_wait[]
320+ = { "no", "yes", "auto" };
321+char *gpstr_guest_select_graphics_vga[]
322+ = { "on", "off", "io" };
323+
324+#else
325+extern char *gpstr_guest_select_loader_loader[];
326+extern char *gpstr_guest_select_hostbridge[];
327+extern char *gpstr_guest_select_comports[];
328+extern char *gpstr_guest_select_disk_type[];
329+extern char *gpstr_guest_select_disk_device[];
330+extern char *gpstr_guest_select_network_type[];
331+extern char *gpstr_guest_select_graphics_res[];
332+extern char *gpstr_guest_select_graphics_wait[];
333+extern char *gpstr_guest_select_graphics_vga[];
334+#endif
335+
154336 #endif
155337
156338 /* EOF of @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
--- /dev/null
+++ b/src/guestconfig.c
@@ -0,0 +1,122 @@
1+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2+ VMTUI (Virtual machine Management Terminal User Interface)
3+
4+ Copyright(C) 2022- Koine Yuusuke(koinec). All Rights reserved.
5+
6+ Redistribution and use in source and binary forms, with or without
7+ modification, are permitted provided that the following conditions are met:
8+
9+ 1. Redistributions of source code must retain the above copyright notice,
10+ this list of conditions and the following disclaimer.
11+ 2. Redistributions in binary form must reproduce the above copyright
12+ notice, this list of conditions and the following disclaimer in the
13+ documentation and/or other materials provided with the distribution.
14+
15+ THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY EXPRESS
16+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18+ IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE LIABLE FOR ANY
19+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
26+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
27+
28+
29+#define VMTUI_SRC_GUESTCONFIG
30+#include "vmtui.h"
31+
32+/* ===========================================================================*/
33+int
34+ GuestConfig_ParseConfig(
35+ int i_guest,
36+ char *pstr_buf,
37+ int i_buflen )
38+{
39+ int i_len;
40+ char *pstr_next;
41+ char *pstr_line;
42+ char *pstr_key;
43+ char *pstr_value;
44+ char *pstr_end;
45+ Guest *p_guest;
46+
47+ pstr_next = pstr_buf;
48+
49+ while( NULL != (pstr_line = strsep( &pstr_next, "\n\r" ))) {
50+ if( '\0' == *pstr_line ) { continue; }
51+
52+ pstr_value = pstr_line;
53+
54+ pstr_key = strsep( &pstr_value, "=" );
55+ if( NULL == pstr_key ) { continue; }
56+
57+ // Cut value Double-Quote --
58+ if( NULL != pstr_value ) {
59+ if( '"' == *(pstr_value + 0) ) { pstr_value++; }
60+
61+ if( NULL == pstr_next) { pstr_end = (pstr_buf + i_buflen - 1); }
62+ else { pstr_end = pstr_next - 2; }
63+
64+ if(( pstr_value < pstr_end ) && ( '"' == *pstr_end ))
65+ { *pstr_end = '\0'; }
66+ }
67+
68+ ErrInfo_DebugMsg( pstr_value );
69+
70+ }
71+
72+ return 0x00;
73+}
74+
75+/* ===========================================================================*/
76+VMTUI_GUESTCONFIG_EXTERN
77+int
78+ GuestConfig_ReadConfig(
79+ int i_guest,
80+ HvConnect *p_hvcon )
81+{
82+ int i_err;
83+ char str_cmdline[128];
84+ //char str_datastore[KEYVAL_MAXLEN_STRVAL];
85+ Guest *p_guest;
86+ KeyVal_Data t_val;
87+
88+ // Read Config File ---
89+ p_guest = Guest_Ref( i_guest );
90+ assert( NULL != p_guest );
91+
92+ KeyVal_GetData( &t_val, &(p_guest->t_info), GUEST_DATASTORE_PATH_KEY );
93+ snprintf( str_cmdline, sizeof( str_cmdline ),
94+ "%s /bin/cat %s/%s/%s.conf",
95+ p_hvcon->sudo.str_cmdline,
96+ KEYVAL_DATA_STRING( t_val ), p_guest->str_vmname, p_guest->str_vmname );
97+
98+ Guest_Release( p_guest );
99+
100+ErrInfo_DebugMsg( str_cmdline );
101+
102+ // Exec. Cmd ---
103+ i_err = p_hvcon->ExecCmd( p_hvcon, str_cmdline );
104+
105+ // Analyze Cmd Result ---
106+ if( 0x00 != p_hvcon->i_exit ) {
107+ ErrInfo_Error( "Failed exec. get HyperVisor Info. command.",
108+ p_hvcon->i_id, GUEST_ID_NONE, REQUEST_ID_NONE, i_err,
109+ 0x00, 0x00, str_cmdline );
110+ return -0x01;
111+ }
112+
113+ // Parse Config File ---
114+//ErrInfo_DebugMsg( p_hvcon->str_buffer );
115+ GuestConfig_ParseConfig( i_guest, p_hvcon->str_buffer, p_hvcon->i_len );
116+
117+ return 0x00;
118+}
119+
120+
121+/* EOF of @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
122+
--- /dev/null
+++ b/src/guestconfig.h
@@ -0,0 +1,272 @@
1+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2+ VMTUI (Virtual machine Management Terminal User Interface)
3+
4+ Copyright(C) 2022- Koine Yuusuke(koinec). All Rights reserved.
5+
6+ Redistribution and use in source and binary forms, with or without
7+ modification, are permitted provided that the following conditions are met:
8+
9+ 1. Redistributions of source code must retain the above copyright notice,
10+ this list of conditions and the following disclaimer.
11+ 2. Redistributions in binary form must reproduce the above copyright
12+ notice, this list of conditions and the following disclaimer in the
13+ documentation and/or other materials provided with the distribution.
14+
15+ THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY EXPRESS
16+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18+ IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE LIABLE FOR ANY
19+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
26+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
27+
28+#ifndef VMTUI_HEADER_GUESTCONFIG
29+#define VMTUI_HEADER_GUESTCONFIG
30+
31+#include "vmtui.h"
32+
33+typedef struct {
34+ char *pstr_cfg_base_key;
35+ char *pstr_cfg_sub_key;
36+ Byte b_type;
37+
38+ #define GUESTCONFIG_TYPE_NONE 0x00
39+ #define GUESTCONFIG_TYPE_STRING 0x01
40+ #define GUESTCONFIG_TYPE_UINT 0x02
41+ #define GUESTCONFIG_TYPE_SINT 0x03
42+ #define GUESTCONFIG_TYPE_YESNO 0x04
43+ #define GUESTCONFIG_TYPE_SFXINT 0x05
44+ #define GUESTCONFIG_TYPE_PERCENT 0x06
45+ #define GUESTCONFIG_TYPE_SUBKEY 0x10
46+
47+ Byte b_counterid;
48+
49+ #define GUESTCONFIG_CNTID_DISK 0x00
50+ #define GUESTCONFIG_CNTID_NETWORK 0x01
51+ #define GUESTCONFIG_CNTID_GRUB 0x02
52+ #define GUESTCONFIG_CNTID_PASSTHRU 0x03
53+ #define GUESTCONFIG_CNTID_VIRTCONSOLE 0x04
54+ #define GUESTCONFIG_CNTID_NONE 0xff
55+
56+ char *pstr_keyval_base_key;
57+ char *pstr_keyval_sub_key;
58+ DWord dw_keyval_priority;
59+
60+ int i_selects;
61+ char **ppstr_select;
62+} GuestConfig_KeyTbl;
63+
64+#ifdef VMTUI_SRC_GUESTCONFIG
65+ #define VMTUI_GUESTCONFIG_EXTERN
66+#else
67+ #define VMTUI_GUESTCONFIG_EXTERN extern
68+#endif
69+VMTUI_GUESTCONFIG_EXTERN int GuestConfig_ReadConfig( int i_guest, HvConnect *p_hvcon );
70+
71+#ifdef VMTUI_SRC_GUESTCONFIG
72+static GuestConfig_KeyTbl lt_cfgtbl[] = {
73+ // Loader ---
74+ { "loader", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
75+ GUEST_LOADER_LOADER_KEY, NULL, GUEST_LOADER_LOADER_PRI,
76+ 4, gpstr_guest_select_loader_loader },
77+ { "bhyveload_loader", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
78+ GUEST_LOADER_BHYVELOADER_KEY, NULL, GUEST_LOADER_BHYVELOADER_PRI,
79+ 0, NULL },
80+ { "loader_timeout", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
81+ GUEST_LOADER_TIMEOUT_KEY, NULL, GUEST_LOADER_TIMEOUT_PRI,
82+ 0, NULL },
83+
84+ // CPU ---
85+ { "cpu_sockets", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
86+ GUEST_CPU_SOCKETS_KEY, NULL, GUEST_CPU_SOCKETS_PRI,
87+ 0, NULL },
88+ { "cpu_cores", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
89+ GUEST_CPU_CORES_KEY, NULL, GUEST_CPU_CORES_PRI,
90+ 0, NULL },
91+ { "cpu_threads", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
92+ GUEST_CPU_THREADS_KEY, NULL, GUEST_CPU_THREADS_PRI,
93+ 0, NULL },
94+
95+ // Memory ---
96+ { "memory", NULL, GUESTCONFIG_TYPE_SFXINT, GUESTCONFIG_CNTID_NONE,
97+ GUEST_MEM_SIZE_KEY, NULL, GUEST_MEM_SIZE_PRI,
98+ 0, NULL },
99+ { "wired_memory", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
100+ GUEST_MEM_WIRED_KEY, NULL, GUEST_MEM_WIRED_PRI,
101+ 0, NULL },
102+
103+ // Network ---
104+ { "network", "_type", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
105+ GUESTCONFIG_CNTID_NETWORK, GUEST_NETWORK_BASEKEY,
106+ GUEST_NETWORK_TYPE_SUBKEY, GUEST_NETWORK_TYPE_PRI,
107+ GUEST_SELECT_ITEMS_NETWORK_TYPE, gpstr_guest_select_network_type },
108+ { "network", "_switch", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
109+ GUESTCONFIG_CNTID_NETWORK, GUEST_NETWORK_BASEKEY,
110+ GUEST_NETWORK_SWITCH_SUBKEY, GUEST_NETWORK_SWITCH_PRI,
111+ 0, NULL },
112+ { "network", "_device", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
113+ GUESTCONFIG_CNTID_NETWORK, GUEST_NETWORK_BASEKEY,
114+ GUEST_NETWORK_DEVICE_SUBKEY, GUEST_NETWORK_DEVICE_PRI,
115+ 0, NULL },
116+ { "network", "_mac", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
117+ GUESTCONFIG_CNTID_NETWORK, GUEST_NETWORK_BASEKEY,
118+ GUEST_NETWORK_MAC_SUBKEY, GUEST_NETWORK_MAC_PRI,
119+ 0, NULL },
120+ { "network", "_span", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
121+ GUESTCONFIG_CNTID_NETWORK, GUEST_NETWORK_BASEKEY,
122+ GUEST_NETWORK_SPAN_SUBKEY, GUEST_NETWORK_SPAN_PRI,
123+ 0, NULL },
124+
125+ // Disk ---
126+ { "disk", "_type", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
127+ GUESTCONFIG_CNTID_DISK, GUEST_DISK_BASEKEY,
128+ GUEST_DISK_TYPE_SUBKEY, GUEST_DISK_TYPE_PRI,
129+ GUEST_SELECT_ITEMS_DISK_TYPE, gpstr_guest_select_disk_type },
130+ { "disk", "_name", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
131+ GUESTCONFIG_CNTID_DISK, GUEST_DISK_BASEKEY,
132+ GUEST_DISK_NAME_SUBKEY, GUEST_DISK_NAME_PRI,
133+ 0, NULL },
134+ { "disk", "_dev", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
135+ GUESTCONFIG_CNTID_DISK, GUEST_DISK_BASEKEY,
136+ GUEST_DISK_DEVICE_SUBKEY, GUEST_DISK_DEVICE_PRI,
137+ GUEST_SELECT_ITEMS_DISK_DEVICE, gpstr_guest_select_disk_device },
138+ { "disk", "_opts", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
139+ GUESTCONFIG_CNTID_DISK, GUEST_DISK_BASEKEY,
140+ GUEST_DISK_OPTION_SUBKEY, GUEST_DISK_OPTION_PRI,
141+ 0, NULL },
142+ { "disk", "_size", GUESTCONFIG_TYPE_SFXINT|GUESTCONFIG_TYPE_SUBKEY,
143+ GUESTCONFIG_CNTID_DISK, GUEST_DISK_BASEKEY,
144+ GUEST_DISK_SIZE_SUBKEY, GUEST_DISK_SIZE_PRI,
145+ 0, NULL },
146+
147+ // Graphics (VNC) ---
148+ { "graphics", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
149+ GUEST_VNC_ENABLE_KEY, NULL, GUEST_VNC_ENABLE_PRI,
150+ 0, NULL },
151+ { "graphics_listen", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
152+ GUEST_VNC_HOST_KEY, NULL, GUEST_VNC_HOST_PRI,
153+ 0, NULL },
154+ { "graphics_port", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
155+ GUEST_VNC_PORT_KEY, NULL, GUEST_VNC_PORT_PRI,
156+ 0, NULL },
157+ { "graphics_res", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
158+ GUEST_VNC_RESOLUTION_KEY, NULL, GUEST_VNC_RESOLUTION_PRI,
159+ GUEST_SELECT_ITEMS_GRAPHICS_RES, gpstr_guest_select_graphics_res },
160+ { "graphics_wait", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
161+ GUEST_VNC_WAIT_KEY, NULL, GUEST_VNC_WAIT_PRI,
162+ GUEST_SELECT_ITEMS_GRAPHICS_WAIT, gpstr_guest_select_graphics_wait },
163+ { "graphics_vga", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
164+ GUEST_VNC_VGA_KEY, NULL, GUEST_VNC_VGA_PRI,
165+ GUEST_SELECT_ITEMS_GRAPHICS_VGA, gpstr_guest_select_graphics_vga },
166+
167+ // Grub ---
168+ { "grub_install", "", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
169+ GUESTCONFIG_CNTID_GRUB, GUEST_GRUB_BASEKEY,
170+ GUEST_GRUB_INSTALL_SUBKEY, GUEST_GRUB_INSTALL_PRI,
171+ 0, NULL },
172+ { "grub_run", "", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
173+ GUESTCONFIG_CNTID_GRUB, GUEST_GRUB_BASEKEY,
174+ GUEST_GRUB_RUN_SUBKEY, GUEST_GRUB_RUN_PRI,
175+ 0, NULL },
176+ { "grub_run_partition", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
177+ GUEST_GRUB_RUNPARTITION_KEY,NULL, GUEST_GRUB_RUNPARTITION_PRI,
178+ 0, NULL },
179+ { "grub_run_dir", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
180+ GUEST_GRUB_RUNDIR_KEY, NULL, GUEST_GRUB_RUNDIR_PRI,
181+ 0, NULL },
182+ { "grub_run_file", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
183+ GUEST_GRUB_RUNFILE_KEY, NULL, GUEST_GRUB_RUNFILE_PRI,
184+ 0, NULL },
185+
186+ // Others ---
187+ { "hostbridge", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
188+ GUEST_HOSTBRIDGE_KEY, NULL, GUEST_HOSTBRIDGE_PRI,
189+ GUEST_SELECT_ITEMS_HOSTBRIDGE, gpstr_guest_select_hostbridge },
190+ { "comports", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
191+ GUEST_COMPORTS_KEY, NULL, GUEST_COMPORTS_PRI,
192+ GUEST_SELECT_ITEMS_COMPORTS, gpstr_guest_select_comports },
193+ { "utctime", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
194+ GUEST_UTCTIME_KEY, NULL, GUEST_UTCTIME_PRI,
195+ 0, NULL },
196+ { "debug", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
197+ GUEST_DEBUG_KEY, NULL, GUEST_DEBUG_PRI,
198+ 0, NULL },
199+ { "uuid", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
200+ GUEST_UUID_KEY, NULL, GUEST_UUID_PRI,
201+ 0, NULL },
202+ { "ignore_bad_msr", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
203+ GUEST_IGNORE_BADMSR_KEY, NULL, GUEST_IGNORE_BADMSR_PRI,
204+ 0, NULL },
205+ { "virt_random", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
206+ GUEST_VIRT_RANDOM_KEY, NULL, GUEST_VIRT_RANDOM_PRI,
207+ 0, NULL },
208+ { "xhci_mouse", NULL, GUESTCONFIG_TYPE_YESNO, GUESTCONFIG_CNTID_NONE,
209+ GUEST_XHCI_MOUSE_KEY, NULL, GUEST_XHCI_MOUSE_PRI,
210+ 0, NULL },
211+ { "ahci_device_limit", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
212+ GUEST_AHCI_DEVLIMIT_KEY, NULL, GUEST_AHCI_DEVLIMIT_PRI,
213+ 0, NULL },
214+ { "start_slot", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
215+ GUEST_START_SLOT_KEY, NULL, GUEST_START_SLOT_PRI,
216+ 0, NULL },
217+ { "install_slot", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
218+ GUEST_INSTALL_SLOT_KEY, NULL, GUEST_INSTALL_SLOT_PRI,
219+ 0, NULL },
220+
221+ { "passthru", "", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
222+ GUESTCONFIG_CNTID_PASSTHRU, GUEST_PASSTHRU_BASEKEY,
223+ GUEST_PASSTHRU_SUBKEY, GUEST_PASSTHRU_PRI,
224+ 0, NULL },
225+ { "virt_console", "", GUESTCONFIG_TYPE_STRING|GUESTCONFIG_TYPE_SUBKEY,
226+ GUESTCONFIG_CNTID_VIRTCONSOLE, GUEST_VIRTCONSOLE_BASEKEY,
227+ GUEST_VIRTCONSOLE_SUBKEY, GUEST_VIRTCONSOLE_PRI,
228+ 0, NULL },
229+
230+ // Bhyve ---
231+ { "bhyve_options", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
232+ GUEST_BHYVE_OPTIONS_KEY, NULL, GUEST_BHYVE_OPTIONS_PRI,
233+ 0, NULL },
234+ { "prestart", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
235+ GUEST_BHYVE_PRESTART_KEY, NULL, GUEST_BHYVE_PRESTART_PRI,
236+ 0, NULL },
237+ { "priority", NULL, GUESTCONFIG_TYPE_SINT, GUESTCONFIG_CNTID_NONE,
238+ GUEST_BHYVE_PRIORITY_KEY, NULL, GUEST_BHYVE_PRIORITY_PRI,
239+ 0, NULL },
240+
241+ // ZFS ---
242+ { "zfs_dataset_opts", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
243+ GUEST_ZFS_DATASETOPTS_KEY, NULL, GUEST_ZFS_DATASETOPTS_PRI,
244+ 0, NULL },
245+ { "zfs_zvol_opts", NULL, GUESTCONFIG_TYPE_STRING, GUESTCONFIG_CNTID_NONE,
246+ GUEST_ZFS_ZVOLOPTS_KEY, NULL, GUEST_ZFS_ZVOLOPTS_PRI,
247+ 0, NULL },
248+
249+ // Resource Limitter ---
250+ { "limit_pcpu", NULL, GUESTCONFIG_TYPE_PERCENT, GUESTCONFIG_CNTID_NONE,
251+ GUEST_LIMIT_CPU_PER_KEY, NULL, GUEST_LIMIT_CPU_PER_PRI,
252+ 0, NULL },
253+ { "limit_rbps", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
254+ GUEST_LIMIT_DISK_READ_BPS_KEY, NULL, GUEST_LIMIT_DISK_READ_BPS_PRI,
255+ 0, NULL },
256+ { "limit_wbps", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
257+ GUEST_LIMIT_DISK_WRITE_BPS_KEY, NULL, GUEST_LIMIT_DISK_WRITE_BPS_PRI,
258+ 0, NULL },
259+ { "limit_riops", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
260+ GUEST_LIMIT_DISK_READ_IOPS_KEY, NULL, GUEST_LIMIT_DISK_READ_IOPS_PRI,
261+ 0, NULL },
262+ { "limit_wiops", NULL, GUESTCONFIG_TYPE_UINT, GUESTCONFIG_CNTID_NONE,
263+ GUEST_LIMIT_DISK_WRITE_IOPS_KEY,NULL, GUEST_LIMIT_DISK_WRITE_IOPS_PRI,
264+ 0, NULL },
265+};
266+
267+#endif
268+
269+#endif
270+
271+/* EOF of @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
272+
--- a/src/tuiguest.c
+++ b/src/tuiguest.c
@@ -161,8 +161,8 @@ goto_TuiGuest_GeneratePageText_skipVNC:
161161
162162 // Loader --
163163 t_attr.i_attr = 0x00;
164- strncpy( t_attr.str_key, GUEST_LOADER_KEY, sizeof( t_attr.str_key ) );
165- KeyVal_GetData( &t_kval, &p_guest->t_info, GUEST_LOADER_KEY );
164+ strncpy( t_attr.str_key, GUEST_LOADER_LOADER_KEY, sizeof( t_attr.str_key ) );
165+ KeyVal_GetData( &t_kval, &p_guest->t_info, GUEST_LOADER_LOADER_KEY );
166166 snprintf( str_temp, sizeof( str_temp ), " %-22s: %s", "Loader", KEYVAL_DATA_STRING( t_kval ) );
167167 TextBuf_AppendLine( &lt_guest.t_textbuf, str_temp, 0, (void *)&t_attr );
168168
--- a/src/vmbhyve.c
+++ b/src/vmbhyve.c
@@ -182,6 +182,8 @@ int
182182 int i_gnow;
183183 int i_gtype;
184184 int i_vnc;
185+ int i_newflag = 0x00;
186+ int i_gnext;
185187 char *pstr_line;
186188 char *pstr_next;
187189 char *pstr_now;
@@ -191,6 +193,7 @@ int
191193 char c_unit;
192194 DWord dw_temp;
193195 HvConnect *p_hvcon;
196+ HVisor *p_hvisor;
194197 Guest *p_gnow;
195198 KeyVal_Data t_val;
196199
@@ -242,7 +245,8 @@ int
242245 memset( &t_val, 0x00, sizeof( KeyVal_Data ) );
243246 KEYVAL_DATA_SET_STRING( t_val, pstr_item[2] );
244247 i_err = KeyVal_SetData(
245- &(p_gnow->t_info), GUEST_LOADER_KEY, &t_val, GUEST_LOADER_PRI );
248+ &(p_gnow->t_info), GUEST_LOADER_LOADER_KEY,
249+ &t_val, GUEST_LOADER_LOADER_PRI );
246250
247251 // CPU cores ---
248252 i_temp = (int)strtol( pstr_item[3], NULL, 10 );
@@ -321,18 +325,46 @@ int
321325 { p_gnow->dw_status = GUEST_STATUS_UNKNOWN; }
322326 }
323327
328+ if( GUEST_OBTAIN_NEW == i_gtype ) {
329+ p_gnow->dw_option = GUEST_OPTION_NEW;
330+ i_newflag++;
331+ }
332+
324333 Guest_Release( p_gnow );
334+ }
325335
326- if( GUEST_OBTAIN_NEW == i_gtype ) {
336+ if( 0x00 == i_newflag ) { goto goto_VmBhyve_ExecReq_VMLIST_posst; }
337+
338+ // Get New Guest Detail Information ---
339+ p_hvisor = HVisor_Ref( p_hvcon->i_id );
340+ if( NULL == p_hvisor ) {
341+ goto goto_VmBhyve_ExecReq_VMLIST_posst;
342+ }
343+
344+ i_gnow = p_hvisor->guest.i_top;
345+
346+ HVisor_Release( p_hvisor );
347+
348+ while( REQUEST_ID_NONE != i_gnow ) {
349+ p_gnow = Guest_Use( i_gnow );
350+ if( NULL == p_gnow) { continue; }
351+ dw_temp = p_gnow->dw_option;
352+ p_gnow->dw_option &= ~GUEST_OPTION_NEW;
353+ i_gnext = p_gnow->hvisor.i_guest_next;
354+ Guest_Release( p_gnow );
355+
356+ if( GUEST_OPTION_NEW & dw_temp ) {
327357 // Get Datastore Path from HVisor info ---
328- GuestCtl_GetDataStorePath( i_gnow, p_hvcon->i_id, pstr_item[1] );
358+ GuestCtl_GetDataStorePath( i_gnow, p_hvcon->i_id, NULL );
329359
330360 // Get Guest Config file info ---
331-
361+ GuestConfig_ReadConfig( i_gnow, p_hvcon );
332362 }
333363
364+ i_gnow = i_gnext;
334365 }
335366
367+goto_VmBhyve_ExecReq_VMLIST_posst:
336368 return 0x00;
337369 }
338370
--- a/src/vmtui.h
+++ b/src/vmtui.h
@@ -87,6 +87,7 @@ typedef unsigned long QWord;
8787 #include "localcmd.h"
8888 #include "localshell.h"
8989 #include "guestctl.h"
90+#include "guestconfig.h"
9091 #include "vmbhyve.h"
9192 #include "hvcmd.h"
9293 #include "configfile.h"