1 /******************************************************************************
2 * ventoy_http.c ---- ventoy http
3 * Copyright (c) 2021, longpanda <admin@ventoy.net>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 3 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
27 #if defined(_MSC_VER) || defined(WIN32)
31 #include <sys/types.h>
32 #include <sys/ioctl.h>
34 #include <sys/types.h>
35 #include <sys/mount.h>
37 #include <linux/limits.h>
42 #include <ventoy_define.h>
43 #include <ventoy_json.h>
44 #include <ventoy_util.h>
45 #include <ventoy_disk.h>
46 #include <ventoy_http.h>
47 #include "fat_filelib.h"
49 static const char *g_json_title_postfix
[bios_max
+ 1] =
51 "", "_legacy", "_uefi", "_ia32", "_aa64", "_mips", ""
54 static const char *g_ventoy_kbd_layout
[] =
56 "QWERTY_USA", "AZERTY", "CZECH_QWERTY", "CZECH_QWERTZ", "DANISH",
57 "DVORAK_USA", "FRENCH", "GERMAN", "ITALIANO", "JAPAN_106", "LATIN_USA",
58 "PORTU_BRAZIL", "QWERTY_UK", "QWERTZ", "QWERTZ_HUN", "QWERTZ_SLOV_CROAT",
59 "SPANISH", "SWEDISH", "TURKISH_Q", "VIETNAMESE",
63 static char g_ventoy_help_lang
[MAX_LANGUAGE
][8];
65 static char g_pub_path
[2 * MAX_PATH
];
66 static data_control g_data_control
[bios_max
+ 1];
67 static data_theme g_data_theme
[bios_max
+ 1];
68 static data_alias g_data_menu_alias
[bios_max
+ 1];
69 static data_tip g_data_menu_tip
[bios_max
+ 1];
70 static data_class g_data_menu_class
[bios_max
+ 1];
71 static data_image_list g_data_image_list
[bios_max
+ 1];
72 static data_image_list
*g_data_image_blacklist
= g_data_image_list
;
73 static data_auto_memdisk g_data_auto_memdisk
[bios_max
+ 1];
74 static data_password g_data_password
[bios_max
+ 1];
75 static data_conf_replace g_data_conf_replace
[bios_max
+ 1];
76 static data_injection g_data_injection
[bios_max
+ 1];
77 static data_auto_install g_data_auto_install
[bios_max
+ 1];
78 static data_persistence g_data_persistence
[bios_max
+ 1];
79 static data_dud g_data_dud
[bios_max
+ 1];
81 static char *g_pub_json_buffer
= NULL
;
82 static char *g_pub_save_buffer
= NULL
;
83 #define JSON_BUFFER g_pub_json_buffer
84 #define JSON_SAVE_BUFFER g_pub_save_buffer
86 static pthread_mutex_t g_api_mutex
;
87 static struct mg_context
*g_ventoy_http_ctx
= NULL
;
89 static int ventoy_is_kbd_valid(const char *key
)
93 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
95 if (strcmp(g_ventoy_kbd_layout
[i
], key
) == 0)
104 static const char * ventoy_real_path(const char *org
)
108 if (g_sysinfo
.pathcase
)
110 scnprintf(g_pub_path
, MAX_PATH
, "%s", org
);
111 count
= ventoy_path_case(g_pub_path
+ 1, 1);
125 static int ventoy_json_result(struct mg_connection
*conn
, const char *err
)
128 "HTTP/1.1 200 OK \r\n"
129 "Content-Type: application/json\r\n"
130 "Content-Length: %d\r\n"
132 (int)strlen(err
), err
);
137 static int ventoy_json_buffer(struct mg_connection
*conn
, const char *json_buf
, int json_len
)
140 "HTTP/1.1 200 OK \r\n"
141 "Content-Type: application/json\r\n"
142 "Content-Length: %d\r\n"
149 static void ventoy_free_path_node_list(path_node
*list
)
151 path_node
*next
= NULL
;
152 path_node
*node
= list
;
162 static path_node
* ventoy_path_node_add_array(VTOY_JSON
*array
)
164 path_node
*head
= NULL
;
165 path_node
*node
= NULL
;
166 path_node
*cur
= NULL
;
167 VTOY_JSON
*item
= NULL
;
169 for (item
= array
->pstChild
; item
; item
= item
->pstNext
)
171 node
= zalloc(sizeof(path_node
));
174 scnprintf(node
->path
, sizeof(node
->path
), "%s", item
->unData
.pcStrVal
);
175 vtoy_list_add(head
, cur
, node
);
182 static int ventoy_check_fuzzy_path(char *path
, int prefix
)
194 pos
= strchr(path
, '*');
197 for (cur
= pos
; *cur
; cur
++)
222 rc
= ventoy_is_directory_exist("%s%s", g_cur_dir
, path
);
226 rc
= ventoy_is_directory_exist("%s", path
);
247 return ventoy_is_file_exist("%s%s", g_cur_dir
, path
);
251 return ventoy_is_file_exist("%s", path
);
256 static int ventoy_path_list_cmp(path_node
*list1
, path_node
*list2
)
258 if (NULL
== list1
&& NULL
== list2
)
262 else if (list1
&& list2
)
264 while (list1
&& list2
)
266 if (strcmp(list1
->path
, list2
->path
))
275 if (list1
== NULL
&& list2
== NULL
)
288 static int ventoy_api_device_info(struct mg_connection
*conn
, VTOY_JSON
*json
)
294 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
295 VTOY_JSON_FMT_OBJ_BEGIN();
297 VTOY_JSON_FMT_STRN("dev_name", g_sysinfo
.cur_model
);
298 VTOY_JSON_FMT_STRN("dev_capacity", g_sysinfo
.cur_capacity
);
299 VTOY_JSON_FMT_STRN("dev_fs", g_sysinfo
.cur_fsname
);
300 VTOY_JSON_FMT_STRN("ventoy_ver", g_sysinfo
.cur_ventoy_ver
);
301 VTOY_JSON_FMT_SINT("part_style", g_sysinfo
.cur_part_style
);
302 VTOY_JSON_FMT_SINT("secure_boot", g_sysinfo
.cur_secureboot
);
304 VTOY_JSON_FMT_OBJ_END();
305 VTOY_JSON_FMT_END(pos
);
307 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
311 static int ventoy_api_sysinfo(struct mg_connection
*conn
, VTOY_JSON
*json
)
317 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
318 VTOY_JSON_FMT_OBJ_BEGIN();
319 VTOY_JSON_FMT_STRN("language", ventoy_get_os_language());
320 VTOY_JSON_FMT_STRN("curdir", g_cur_dir
);
323 VTOY_JSON_FMT_SINT("syntax_error", g_sysinfo
.syntax_error
);
324 g_sysinfo
.syntax_error
= 0;
326 VTOY_JSON_FMT_SINT("invalid_config", g_sysinfo
.invalid_config
);
327 g_sysinfo
.invalid_config
= 0;
329 #if defined(_MSC_VER) || defined(WIN32)
330 VTOY_JSON_FMT_STRN("os", "windows");
332 VTOY_JSON_FMT_STRN("os", "linux");
335 VTOY_JSON_FMT_OBJ_END();
336 VTOY_JSON_FMT_END(pos
);
338 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
342 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
348 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
349 VTOY_JSON_FMT_OBJ_BEGIN();
350 VTOY_JSON_FMT_SINT("status", 0);
351 VTOY_JSON_FMT_SINT("save_error", g_sysinfo
.config_save_error
);
352 g_sysinfo
.config_save_error
= 0;
353 VTOY_JSON_FMT_OBJ_END();
354 VTOY_JSON_FMT_END(pos
);
356 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
360 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
365 const char *path
= NULL
;
367 path
= vtoy_json_get_string_ex(json
, "path");
368 vtoy_json_get_int(json
, "dir", &dir
);
374 exist
= ventoy_is_directory_exist("%s", path
);
378 exist
= ventoy_is_file_exist("%s", path
);
382 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
383 VTOY_JSON_FMT_OBJ_BEGIN();
384 VTOY_JSON_FMT_SINT("exist", exist
);
385 VTOY_JSON_FMT_OBJ_END();
386 VTOY_JSON_FMT_END(pos
);
388 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
392 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
401 const char *path1
= NULL
;
402 const char *path2
= NULL
;
404 path1
= vtoy_json_get_string_ex(json
, "path1");
405 path2
= vtoy_json_get_string_ex(json
, "path2");
406 vtoy_json_get_int(json
, "dir1", &dir1
);
407 vtoy_json_get_int(json
, "dir2", &dir2
);
408 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
409 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
415 exist1
= ventoy_is_directory_exist("%s", path1
);
421 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
425 exist1
= ventoy_is_file_exist("%s", path1
);
434 exist2
= ventoy_is_directory_exist("%s", path2
);
440 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
444 exist2
= ventoy_is_file_exist("%s", path2
);
449 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
450 VTOY_JSON_FMT_OBJ_BEGIN();
451 VTOY_JSON_FMT_SINT("exist1", exist1
);
452 VTOY_JSON_FMT_SINT("exist2", exist2
);
453 VTOY_JSON_FMT_OBJ_END();
454 VTOY_JSON_FMT_END(pos
);
456 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
460 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
464 const char *path
= NULL
;
466 path
= vtoy_json_get_string_ex(json
, "path");
469 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
472 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
473 VTOY_JSON_FMT_OBJ_BEGIN();
474 VTOY_JSON_FMT_SINT("exist", exist
);
475 VTOY_JSON_FMT_OBJ_END();
476 VTOY_JSON_FMT_END(pos
);
478 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
485 void ventoy_data_default_control(data_control
*data
)
487 memset(data
, 0, sizeof(data_control
));
489 data
->secondary_menu
= 1;
490 data
->filter_dot_underscore
= 1;
491 data
->max_search_level
= -1;
492 data
->menu_timeout
= 0;
493 data
->secondary_menu_timeout
= 0;
495 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
496 strlcpy(data
->help_text_language
, "en_US");
499 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
501 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
502 data1
->treeview_style
!= data2
->treeview_style
||
503 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
504 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
505 data1
->max_search_level
!= data2
->max_search_level
||
506 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
507 data1
->filter_iso
!= data2
->filter_iso
||
508 data1
->filter_wim
!= data2
->filter_wim
||
509 data1
->filter_efi
!= data2
->filter_efi
||
510 data1
->filter_img
!= data2
->filter_img
||
511 data1
->filter_vhd
!= data2
->filter_vhd
||
512 data1
->filter_vtoy
!= data2
->filter_vtoy
||
513 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
514 data1
->linux_remount
!= data2
->linux_remount
||
515 data1
->secondary_menu
!= data2
->secondary_menu
||
516 data1
->menu_timeout
!= data2
->menu_timeout
||
517 data1
->secondary_menu_timeout
!= data2
->secondary_menu_timeout
)
522 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
523 strcmp(data1
->default_image
, data2
->default_image
) ||
524 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
525 strcmp(data1
->help_text_language
, data2
->help_text_language
))
533 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
536 data_control
*def
= g_data_control
+ bios_max
;
538 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
540 VTOY_JSON_FMT_KEY_L(L1
, title
);
541 VTOY_JSON_FMT_ARY_BEGIN_N();
543 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
544 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
545 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
546 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
548 if (data
->max_search_level
>= 0)
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
553 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
554 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
555 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
556 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
557 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
558 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
559 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
560 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
561 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_LINUX_REMOUNT", linux_remount
);
562 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SECONDARY_BOOT_MENU", secondary_menu
);
563 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
564 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SECONDARY_TIMEOUT", secondary_menu_timeout
);
566 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
567 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
569 if (strcmp(def
->default_search_root
, data
->default_search_root
))
571 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
574 if (strcmp(def
->default_image
, data
->default_image
))
576 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
579 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
580 VTOY_JSON_FMT_END(pos
);
585 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
591 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
592 VTOY_JSON_FMT_OBJ_BEGIN();
594 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
595 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
596 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
597 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
598 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
599 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
601 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
602 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
603 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
604 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
605 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
606 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
607 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
608 VTOY_JSON_FMT_SINT("linux_remount", ctrl
->linux_remount
);
609 VTOY_JSON_FMT_SINT("secondary_menu", ctrl
->secondary_menu
);
610 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
611 VTOY_JSON_FMT_SINT("secondary_menu_timeout", ctrl
->secondary_menu_timeout
);
612 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
613 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
616 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
620 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
621 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
625 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
629 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
630 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
632 VTOY_JSON_FMT_KEY("help_list");
633 VTOY_JSON_FMT_ARY_BEGIN();
635 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
637 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
639 VTOY_JSON_FMT_ARY_ENDEX();
642 VTOY_JSON_FMT_OBJ_END();
643 VTOY_JSON_FMT_END(pos
);
648 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
650 api_get_func(conn
, json
, control
);
654 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
658 data_control
*ctrl
= NULL
;
660 vtoy_json_get_int(json
, "index", &index
);
661 ctrl
= g_data_control
+ index
;
663 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
664 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
665 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
666 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
667 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
668 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
669 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
670 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
671 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
672 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
673 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
674 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
675 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
676 VTOY_JSON_INT("linux_remount", ctrl
->linux_remount
);
677 VTOY_JSON_INT("secondary_menu", ctrl
->secondary_menu
);
678 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
679 VTOY_JSON_INT("secondary_menu_timeout", ctrl
->secondary_menu_timeout
);
681 VTOY_JSON_STR("default_image", ctrl
->default_image
);
682 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
683 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
684 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
686 ret
= ventoy_data_save_all();
688 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
696 void ventoy_data_default_theme(data_theme
*data
)
698 memset(data
, 0, sizeof(data_theme
));
699 strlcpy(data
->gfxmode
, "1024x768");
700 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
701 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
702 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
705 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
707 if (data1
->display_mode
!= data2
->display_mode
||
708 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
709 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
710 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
711 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
717 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
722 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
731 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
734 path_node
*node
= NULL
;
735 data_theme
*def
= g_data_theme
+ bios_max
;
737 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
739 VTOY_JSON_FMT_KEY_L(L1
, title
);
740 VTOY_JSON_FMT_OBJ_BEGIN_N();
744 if (data
->filelist
->next
)
746 VTOY_JSON_FMT_KEY_L(L2
, "file");
747 VTOY_JSON_FMT_ARY_BEGIN_N();
749 for (node
= data
->filelist
; node
; node
= node
->next
)
751 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
754 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
756 if (def
->default_file
!= data
->default_file
)
758 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
763 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
767 if (data
->display_mode
!= def
->display_mode
)
769 if (display_mode_cli
== data
->display_mode
)
771 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
773 else if (display_mode_serial
== data
->display_mode
)
775 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
777 else if (display_mode_ser_console
== data
->display_mode
)
779 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
783 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
787 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
789 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
790 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
791 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
795 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
796 VTOY_JSON_FMT_ARY_BEGIN_N();
798 for (node
= data
->fontslist
; node
; node
= node
->next
)
800 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
803 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
806 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
807 VTOY_JSON_FMT_END(pos
);
813 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
816 path_node
*node
= NULL
;
818 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
819 VTOY_JSON_FMT_OBJ_BEGIN();
821 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
822 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
823 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
825 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
826 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
827 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
829 VTOY_JSON_FMT_KEY("filelist");
830 VTOY_JSON_FMT_ARY_BEGIN();
831 for (node
= data
->filelist
; node
; node
= node
->next
)
833 VTOY_JSON_FMT_OBJ_BEGIN();
834 VTOY_JSON_FMT_STRN("path", node
->path
);
835 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
836 VTOY_JSON_FMT_OBJ_ENDEX();
838 VTOY_JSON_FMT_ARY_ENDEX();
840 VTOY_JSON_FMT_KEY("fontslist");
841 VTOY_JSON_FMT_ARY_BEGIN();
842 for (node
= data
->fontslist
; node
; node
= node
->next
)
844 VTOY_JSON_FMT_OBJ_BEGIN();
845 VTOY_JSON_FMT_STRN("path", node
->path
);
846 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
847 VTOY_JSON_FMT_OBJ_ENDEX();
849 VTOY_JSON_FMT_ARY_ENDEX();
851 VTOY_JSON_FMT_OBJ_END();
852 VTOY_JSON_FMT_END(pos
);
857 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
859 api_get_func(conn
, json
, theme
);
863 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
867 data_theme
*data
= NULL
;
869 vtoy_json_get_int(json
, "index", &index
);
870 data
= g_data_theme
+ index
;
872 VTOY_JSON_INT("default_file", data
->default_file
);
873 VTOY_JSON_INT("display_mode", data
->display_mode
);
874 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
875 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
876 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
877 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
879 ret
= ventoy_data_save_all();
881 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
885 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
889 const char *path
= NULL
;
890 path_node
*node
= NULL
;
891 path_node
*cur
= NULL
;
892 data_theme
*data
= NULL
;
894 vtoy_json_get_int(json
, "index", &index
);
895 data
= g_data_theme
+ index
;
897 path
= VTOY_JSON_STR_EX("path");
900 node
= zalloc(sizeof(path_node
));
903 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
905 vtoy_list_add(data
->filelist
, cur
, node
);
909 ret
= ventoy_data_save_all();
911 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
915 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
919 const char *path
= NULL
;
920 path_node
*node
= NULL
;
921 path_node
*last
= NULL
;
922 data_theme
*data
= NULL
;
924 vtoy_json_get_int(json
, "index", &index
);
925 data
= g_data_theme
+ index
;
927 path
= VTOY_JSON_STR_EX("path");
930 vtoy_list_del(last
, node
, data
->filelist
, path
);
933 ret
= ventoy_data_save_all();
935 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
940 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
944 const char *path
= NULL
;
945 path_node
*node
= NULL
;
946 path_node
*cur
= NULL
;
947 data_theme
*data
= NULL
;
949 vtoy_json_get_int(json
, "index", &index
);
950 data
= g_data_theme
+ index
;
952 path
= VTOY_JSON_STR_EX("path");
955 node
= zalloc(sizeof(path_node
));
958 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
959 vtoy_list_add(data
->fontslist
, cur
, node
);
963 ret
= ventoy_data_save_all();
965 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
970 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
974 const char *path
= NULL
;
975 path_node
*node
= NULL
;
976 path_node
*last
= NULL
;
977 data_theme
*data
= NULL
;
979 vtoy_json_get_int(json
, "index", &index
);
980 data
= g_data_theme
+ index
;
982 path
= VTOY_JSON_STR_EX("path");
985 vtoy_list_del(last
, node
, data
->fontslist
, path
);
988 ret
= ventoy_data_save_all();
990 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
997 void ventoy_data_default_menu_alias(data_alias
*data
)
999 memset(data
, 0, sizeof(data_alias
));
1002 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
1004 data_alias_node
*list1
= NULL
;
1005 data_alias_node
*list2
= NULL
;
1007 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1011 else if (data1
->list
&& data2
->list
)
1013 list1
= data1
->list
;
1014 list2
= data2
->list
;
1016 while (list1
&& list2
)
1018 if ((list1
->type
!= list2
->type
) ||
1019 strcmp(list1
->path
, list2
->path
) ||
1020 strcmp(list1
->alias
, list2
->alias
))
1025 list1
= list1
->next
;
1026 list2
= list2
->next
;
1029 if (list1
== NULL
&& list2
== NULL
)
1044 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1047 data_alias_node
*node
= NULL
;
1049 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1051 VTOY_JSON_FMT_KEY_L(L1
, title
);
1052 VTOY_JSON_FMT_ARY_BEGIN_N();
1054 for (node
= data
->list
; node
; node
= node
->next
)
1056 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1058 if (node
->type
== path_type_file
)
1060 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1064 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1067 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1069 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1072 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1073 VTOY_JSON_FMT_END(pos
);
1079 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1083 data_alias_node
*node
= NULL
;
1085 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1086 VTOY_JSON_FMT_ARY_BEGIN();
1088 for (node
= data
->list
; node
; node
= node
->next
)
1090 VTOY_JSON_FMT_OBJ_BEGIN();
1092 VTOY_JSON_FMT_UINT("type", node
->type
);
1093 VTOY_JSON_FMT_STRN("path", node
->path
);
1094 if (node
->type
== path_type_file
)
1096 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1100 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1103 VTOY_JSON_FMT_SINT("valid", valid
);
1104 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1106 VTOY_JSON_FMT_OBJ_ENDEX();
1109 VTOY_JSON_FMT_ARY_END();
1110 VTOY_JSON_FMT_END(pos
);
1115 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1117 api_get_func(conn
, json
, menu_alias
);
1121 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1124 ret
= ventoy_data_save_all();
1126 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1130 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1134 int type
= path_type_file
;
1135 const char *path
= NULL
;
1136 const char *alias
= NULL
;
1137 data_alias_node
*node
= NULL
;
1138 data_alias_node
*cur
= NULL
;
1139 data_alias
*data
= NULL
;
1141 vtoy_json_get_int(json
, "index", &index
);
1142 data
= g_data_menu_alias
+ index
;
1144 vtoy_json_get_int(json
, "type", &type
);
1146 path
= VTOY_JSON_STR_EX("path");
1147 alias
= VTOY_JSON_STR_EX("alias");
1150 node
= zalloc(sizeof(data_alias_node
));
1154 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1155 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1157 vtoy_list_add(data
->list
, cur
, node
);
1161 ret
= ventoy_data_save_all();
1163 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1167 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1171 const char *path
= NULL
;
1172 data_alias_node
*last
= NULL
;
1173 data_alias_node
*node
= NULL
;
1174 data_alias
*data
= NULL
;
1176 vtoy_json_get_int(json
, "index", &index
);
1177 data
= g_data_menu_alias
+ index
;
1179 path
= VTOY_JSON_STR_EX("path");
1182 vtoy_list_del(last
, node
, data
->list
, path
);
1185 ret
= ventoy_data_save_all();
1187 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1194 void ventoy_data_default_menu_tip(data_tip
*data
)
1196 memset(data
, 0, sizeof(data_tip
));
1198 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1199 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1200 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1203 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1205 data_tip_node
*list1
= NULL
;
1206 data_tip_node
*list2
= NULL
;
1208 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1213 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1217 else if (data1
->list
&& data2
->list
)
1219 list1
= data1
->list
;
1220 list2
= data2
->list
;
1222 while (list1
&& list2
)
1224 if ((list1
->type
!= list2
->type
) ||
1225 strcmp(list1
->path
, list2
->path
) ||
1226 strcmp(list1
->tip
, list2
->tip
))
1231 list1
= list1
->next
;
1232 list2
= list2
->next
;
1235 if (list1
== NULL
&& list2
== NULL
)
1250 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1253 data_tip_node
*node
= NULL
;
1254 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1256 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1257 VTOY_JSON_FMT_KEY_L(L1
, title
);
1258 VTOY_JSON_FMT_OBJ_BEGIN_N();
1260 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1261 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1262 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1266 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1267 VTOY_JSON_FMT_ARY_BEGIN_N();
1269 for (node
= data
->list
; node
; node
= node
->next
)
1271 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1273 if (node
->type
== path_type_file
)
1275 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1279 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1281 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1283 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1286 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1289 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1291 VTOY_JSON_FMT_END(pos
);
1297 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1301 data_tip_node
*node
= NULL
;
1303 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1305 VTOY_JSON_FMT_OBJ_BEGIN();
1307 VTOY_JSON_FMT_STRN("left", data
->left
);
1308 VTOY_JSON_FMT_STRN("top", data
->top
);
1309 VTOY_JSON_FMT_STRN("color", data
->color
);
1311 VTOY_JSON_FMT_KEY("tips");
1312 VTOY_JSON_FMT_ARY_BEGIN();
1314 for (node
= data
->list
; node
; node
= node
->next
)
1316 VTOY_JSON_FMT_OBJ_BEGIN();
1318 VTOY_JSON_FMT_UINT("type", node
->type
);
1319 VTOY_JSON_FMT_STRN("path", node
->path
);
1320 if (node
->type
== path_type_file
)
1322 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1326 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1329 VTOY_JSON_FMT_SINT("valid", valid
);
1330 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1332 VTOY_JSON_FMT_OBJ_ENDEX();
1335 VTOY_JSON_FMT_ARY_ENDEX();
1337 VTOY_JSON_FMT_OBJ_END();
1338 VTOY_JSON_FMT_END(pos
);
1343 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1345 api_get_func(conn
, json
, menu_tip
);
1349 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1353 data_tip
*data
= NULL
;
1355 vtoy_json_get_int(json
, "index", &index
);
1356 data
= g_data_menu_tip
+ index
;
1358 VTOY_JSON_STR("left", data
->left
);
1359 VTOY_JSON_STR("top", data
->top
);
1360 VTOY_JSON_STR("color", data
->color
);
1362 ret
= ventoy_data_save_all();
1364 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1368 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1372 int type
= path_type_file
;
1373 const char *path
= NULL
;
1374 const char *tip
= NULL
;
1375 data_tip_node
*node
= NULL
;
1376 data_tip_node
*cur
= NULL
;
1377 data_tip
*data
= NULL
;
1379 vtoy_json_get_int(json
, "index", &index
);
1380 data
= g_data_menu_tip
+ index
;
1382 vtoy_json_get_int(json
, "type", &type
);
1384 path
= VTOY_JSON_STR_EX("path");
1385 tip
= VTOY_JSON_STR_EX("tip");
1388 node
= zalloc(sizeof(data_tip_node
));
1392 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1393 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1395 vtoy_list_add(data
->list
, cur
, node
);
1399 ret
= ventoy_data_save_all();
1401 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1405 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1409 const char *path
= NULL
;
1410 data_tip_node
*last
= NULL
;
1411 data_tip_node
*node
= NULL
;
1412 data_tip
*data
= NULL
;
1414 vtoy_json_get_int(json
, "index", &index
);
1415 data
= g_data_menu_tip
+ index
;
1417 path
= VTOY_JSON_STR_EX("path");
1420 vtoy_list_del(last
, node
, data
->list
, path
);
1423 ret
= ventoy_data_save_all();
1425 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1432 void ventoy_data_default_menu_class(data_class
*data
)
1434 memset(data
, 0, sizeof(data_class
));
1437 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1439 data_class_node
*list1
= NULL
;
1440 data_class_node
*list2
= NULL
;
1442 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1446 else if (data1
->list
&& data2
->list
)
1448 list1
= data1
->list
;
1449 list2
= data2
->list
;
1451 while (list1
&& list2
)
1453 if ((list1
->type
!= list2
->type
) ||
1454 strcmp(list1
->path
, list2
->path
) ||
1455 strcmp(list1
->class, list2
->class))
1460 list1
= list1
->next
;
1461 list2
= list2
->next
;
1464 if (list1
== NULL
&& list2
== NULL
)
1479 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1482 data_class_node
*node
= NULL
;
1484 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1486 VTOY_JSON_FMT_KEY_L(L1
, title
);
1487 VTOY_JSON_FMT_ARY_BEGIN_N();
1489 for (node
= data
->list
; node
; node
= node
->next
)
1491 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1493 if (node
->type
== class_type_key
)
1495 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1497 else if (node
->type
== class_type_dir
)
1499 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1503 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1505 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1507 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1510 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1511 VTOY_JSON_FMT_END(pos
);
1517 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1521 data_class_node
*node
= NULL
;
1523 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1524 VTOY_JSON_FMT_ARY_BEGIN();
1526 for (node
= data
->list
; node
; node
= node
->next
)
1528 VTOY_JSON_FMT_OBJ_BEGIN();
1530 VTOY_JSON_FMT_UINT("type", node
->type
);
1531 VTOY_JSON_FMT_STRN("path", node
->path
);
1533 if (node
->type
== class_type_key
)
1539 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1541 VTOY_JSON_FMT_SINT("valid", valid
);
1543 VTOY_JSON_FMT_STRN("class", node
->class);
1545 VTOY_JSON_FMT_OBJ_ENDEX();
1548 VTOY_JSON_FMT_ARY_END();
1549 VTOY_JSON_FMT_END(pos
);
1555 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1557 api_get_func(conn
, json
, menu_class
);
1561 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1564 ret
= ventoy_data_save_all();
1566 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1570 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1574 int type
= class_type_key
;
1575 const char *path
= NULL
;
1576 const char *class = NULL
;
1577 data_class_node
*node
= NULL
;
1578 data_class_node
*cur
= NULL
;
1579 data_class
*data
= NULL
;
1581 vtoy_json_get_int(json
, "index", &index
);
1582 data
= g_data_menu_class
+ index
;
1584 vtoy_json_get_int(json
, "type", &type
);
1586 path
= VTOY_JSON_STR_EX("path");
1587 class = VTOY_JSON_STR_EX("class");
1590 node
= zalloc(sizeof(data_class_node
));
1595 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1596 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1598 vtoy_list_add(data
->list
, cur
, node
);
1602 ret
= ventoy_data_save_all();
1604 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1608 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1612 const char *path
= NULL
;
1613 data_class_node
*last
= NULL
;
1614 data_class_node
*node
= NULL
;
1615 data_class
*data
= NULL
;
1617 vtoy_json_get_int(json
, "index", &index
);
1618 data
= g_data_menu_class
+ index
;
1620 path
= VTOY_JSON_STR_EX("path");
1623 vtoy_list_del(last
, node
, data
->list
, path
);
1626 ret
= ventoy_data_save_all();
1628 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1635 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1637 memset(data
, 0, sizeof(data_auto_memdisk
));
1640 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1642 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1645 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1648 path_node
*node
= NULL
;
1650 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1652 VTOY_JSON_FMT_KEY_L(L1
, title
);
1653 VTOY_JSON_FMT_ARY_BEGIN_N();
1655 for (node
= data
->list
; node
; node
= node
->next
)
1657 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1660 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1661 VTOY_JSON_FMT_END(pos
);
1666 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1670 path_node
*node
= NULL
;
1672 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1673 VTOY_JSON_FMT_ARY_BEGIN();
1675 for (node
= data
->list
; node
; node
= node
->next
)
1677 VTOY_JSON_FMT_OBJ_BEGIN();
1679 VTOY_JSON_FMT_STRN("path", node
->path
);
1680 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1681 VTOY_JSON_FMT_SINT("valid", valid
);
1683 VTOY_JSON_FMT_OBJ_ENDEX();
1686 VTOY_JSON_FMT_ARY_END();
1687 VTOY_JSON_FMT_END(pos
);
1692 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1694 api_get_func(conn
, json
, auto_memdisk
);
1698 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1702 ret
= ventoy_data_save_all();
1704 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1708 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1712 const char *path
= NULL
;
1713 path_node
*node
= NULL
;
1714 path_node
*cur
= NULL
;
1715 data_auto_memdisk
*data
= NULL
;
1717 vtoy_json_get_int(json
, "index", &index
);
1718 data
= g_data_auto_memdisk
+ index
;
1720 path
= VTOY_JSON_STR_EX("path");
1723 node
= zalloc(sizeof(path_node
));
1726 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1727 vtoy_list_add(data
->list
, cur
, node
);
1731 ret
= ventoy_data_save_all();
1733 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1737 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1741 const char *path
= NULL
;
1742 path_node
*last
= NULL
;
1743 path_node
*node
= NULL
;
1744 data_auto_memdisk
*data
= NULL
;
1746 vtoy_json_get_int(json
, "index", &index
);
1747 data
= g_data_auto_memdisk
+ index
;
1749 path
= VTOY_JSON_STR_EX("path");
1752 vtoy_list_del(last
, node
, data
->list
, path
);
1755 ret
= ventoy_data_save_all();
1757 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1764 void ventoy_data_default_image_list(data_image_list
*data
)
1766 memset(data
, 0, sizeof(data_image_list
));
1769 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1771 if (data1
->type
!= data2
->type
)
1773 if (data1
->list
|| data2
->list
)
1783 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1786 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1790 path_node
*node
= NULL
;
1800 prelen
= (int)strlen("image_list");
1802 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1804 if (data
->type
== 0)
1806 scnprintf(newtitle
, sizeof(newtitle
), "image_list%s", title
+ prelen
);
1810 scnprintf(newtitle
, sizeof(newtitle
), "image_blacklist%s", title
+ prelen
);
1812 VTOY_JSON_FMT_KEY_L(L1
, newtitle
);
1814 VTOY_JSON_FMT_ARY_BEGIN_N();
1816 for (node
= data
->list
; node
; node
= node
->next
)
1818 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1821 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1822 VTOY_JSON_FMT_END(pos
);
1827 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1831 path_node
*node
= NULL
;
1833 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1835 VTOY_JSON_FMT_OBJ_BEGIN();
1836 VTOY_JSON_FMT_SINT("type", data
->type
);
1838 VTOY_JSON_FMT_KEY("list");
1839 VTOY_JSON_FMT_ARY_BEGIN();
1841 for (node
= data
->list
; node
; node
= node
->next
)
1843 VTOY_JSON_FMT_OBJ_BEGIN();
1845 VTOY_JSON_FMT_STRN("path", node
->path
);
1846 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1847 VTOY_JSON_FMT_SINT("valid", valid
);
1849 VTOY_JSON_FMT_OBJ_ENDEX();
1852 VTOY_JSON_FMT_ARY_ENDEX();
1853 VTOY_JSON_FMT_OBJ_END();
1855 VTOY_JSON_FMT_END(pos
);
1860 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1862 api_get_func(conn
, json
, image_list
);
1866 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1870 data_image_list
*data
= NULL
;
1872 vtoy_json_get_int(json
, "index", &index
);
1873 data
= g_data_image_list
+ index
;
1875 VTOY_JSON_INT("type", data
->type
);
1877 ret
= ventoy_data_save_all();
1879 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1883 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1887 const char *path
= NULL
;
1888 path_node
*node
= NULL
;
1889 path_node
*cur
= NULL
;
1890 data_image_list
*data
= NULL
;
1892 vtoy_json_get_int(json
, "index", &index
);
1893 data
= g_data_image_list
+ index
;
1895 path
= VTOY_JSON_STR_EX("path");
1898 node
= zalloc(sizeof(path_node
));
1901 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1902 vtoy_list_add(data
->list
, cur
, node
);
1906 ret
= ventoy_data_save_all();
1908 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1912 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1916 const char *path
= NULL
;
1917 path_node
*last
= NULL
;
1918 path_node
*node
= NULL
;
1919 data_image_list
*data
= NULL
;
1921 vtoy_json_get_int(json
, "index", &index
);
1922 data
= g_data_image_list
+ index
;
1924 path
= VTOY_JSON_STR_EX("path");
1927 vtoy_list_del(last
, node
, data
->list
, path
);
1930 ret
= ventoy_data_save_all();
1932 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1939 void ventoy_data_default_password(data_password
*data
)
1941 memset(data
, 0, sizeof(data_password
));
1944 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1946 menu_password
*list1
= NULL
;
1947 menu_password
*list2
= NULL
;
1949 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1950 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1951 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1952 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1953 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1954 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1955 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1961 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1965 else if (data1
->list
&& data2
->list
)
1967 list1
= data1
->list
;
1968 list2
= data2
->list
;
1970 while (list1
&& list2
)
1972 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1977 list1
= list1
->next
;
1978 list2
= list2
->next
;
1981 if (list1
== NULL
&& list2
== NULL
)
1996 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1999 menu_password
*node
= NULL
;
2000 data_password
*def
= g_data_password
+ bios_max
;
2002 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2003 VTOY_JSON_FMT_KEY_L(L1
, title
);
2004 VTOY_JSON_FMT_OBJ_BEGIN_N();
2006 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
2007 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
2008 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
2009 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
2010 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
2011 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
2012 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
2016 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
2017 VTOY_JSON_FMT_ARY_BEGIN_N();
2019 for (node
= data
->list
; node
; node
= node
->next
)
2021 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2023 if (node
->type
== 0)
2025 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2029 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2031 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2033 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2036 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2039 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2041 VTOY_JSON_FMT_END(pos
);
2047 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2051 menu_password
*node
= NULL
;
2053 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2055 VTOY_JSON_FMT_OBJ_BEGIN();
2057 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2058 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2059 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2060 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2061 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2062 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2063 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2065 VTOY_JSON_FMT_KEY("list");
2066 VTOY_JSON_FMT_ARY_BEGIN();
2068 for (node
= data
->list
; node
; node
= node
->next
)
2070 VTOY_JSON_FMT_OBJ_BEGIN();
2072 VTOY_JSON_FMT_SINT("type", node
->type
);
2073 VTOY_JSON_FMT_STRN("path", node
->path
);
2074 if (node
->type
== path_type_file
)
2076 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2080 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2083 VTOY_JSON_FMT_SINT("valid", valid
);
2084 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2086 VTOY_JSON_FMT_OBJ_ENDEX();
2089 VTOY_JSON_FMT_ARY_ENDEX();
2091 VTOY_JSON_FMT_OBJ_END();
2092 VTOY_JSON_FMT_END(pos
);
2097 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2099 api_get_func(conn
, json
, password
);
2103 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2107 data_password
*data
= NULL
;
2109 vtoy_json_get_int(json
, "index", &index
);
2110 data
= g_data_password
+ index
;
2112 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2113 VTOY_JSON_STR("isopwd", data
->isopwd
);
2114 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2115 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2116 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2117 VTOY_JSON_STR("efipwd", data
->efipwd
);
2118 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2120 ret
= ventoy_data_save_all();
2122 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2126 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2131 const char *path
= NULL
;
2132 const char *pwd
= NULL
;
2133 menu_password
*node
= NULL
;
2134 menu_password
*cur
= NULL
;
2135 data_password
*data
= NULL
;
2137 vtoy_json_get_int(json
, "index", &index
);
2138 data
= g_data_password
+ index
;
2140 vtoy_json_get_int(json
, "type", &type
);
2142 path
= VTOY_JSON_STR_EX("path");
2143 pwd
= VTOY_JSON_STR_EX("pwd");
2146 node
= zalloc(sizeof(menu_password
));
2150 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2151 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2153 vtoy_list_add(data
->list
, cur
, node
);
2157 ret
= ventoy_data_save_all();
2159 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2163 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2167 const char *path
= NULL
;
2168 menu_password
*last
= NULL
;
2169 menu_password
*node
= NULL
;
2170 data_password
*data
= NULL
;
2172 vtoy_json_get_int(json
, "index", &index
);
2173 data
= g_data_password
+ index
;
2175 path
= VTOY_JSON_STR_EX("path");
2178 vtoy_list_del(last
, node
, data
->list
, path
);
2181 ret
= ventoy_data_save_all();
2183 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2190 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2192 memset(data
, 0, sizeof(data_conf_replace
));
2195 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2197 conf_replace_node
*list1
= NULL
;
2198 conf_replace_node
*list2
= NULL
;
2200 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2204 else if (data1
->list
&& data2
->list
)
2206 list1
= data1
->list
;
2207 list2
= data2
->list
;
2209 while (list1
&& list2
)
2211 if (list1
->image
!= list2
->image
||
2212 strcmp(list1
->path
, list2
->path
) ||
2213 strcmp(list1
->org
, list2
->org
) ||
2214 strcmp(list1
->new, list2
->new)
2220 list1
= list1
->next
;
2221 list2
= list2
->next
;
2224 if (list1
== NULL
&& list2
== NULL
)
2239 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2242 conf_replace_node
*node
= NULL
;
2244 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2246 VTOY_JSON_FMT_KEY_L(L1
, title
);
2247 VTOY_JSON_FMT_ARY_BEGIN_N();
2249 for (node
= data
->list
; node
; node
= node
->next
)
2251 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2253 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2254 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2255 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2258 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2261 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2264 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2265 VTOY_JSON_FMT_END(pos
);
2271 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2274 conf_replace_node
*node
= NULL
;
2276 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2277 VTOY_JSON_FMT_ARY_BEGIN();
2279 for (node
= data
->list
; node
; node
= node
->next
)
2281 VTOY_JSON_FMT_OBJ_BEGIN();
2283 VTOY_JSON_FMT_STRN("path", node
->path
);
2284 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2285 VTOY_JSON_FMT_STRN("org", node
->org
);
2286 VTOY_JSON_FMT_STRN("new", node
->new);
2287 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2288 VTOY_JSON_FMT_SINT("img", node
->image
);
2290 VTOY_JSON_FMT_OBJ_ENDEX();
2293 VTOY_JSON_FMT_ARY_END();
2294 VTOY_JSON_FMT_END(pos
);
2299 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2301 api_get_func(conn
, json
, conf_replace
);
2305 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2308 ret
= ventoy_data_save_all();
2310 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2314 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2319 const char *path
= NULL
;
2320 const char *org
= NULL
;
2321 const char *new = NULL
;
2322 conf_replace_node
*node
= NULL
;
2323 conf_replace_node
*cur
= NULL
;
2324 data_conf_replace
*data
= NULL
;
2326 vtoy_json_get_int(json
, "img", &image
);
2328 vtoy_json_get_int(json
, "index", &index
);
2329 data
= g_data_conf_replace
+ index
;
2331 path
= VTOY_JSON_STR_EX("path");
2332 org
= VTOY_JSON_STR_EX("org");
2333 new = VTOY_JSON_STR_EX("new");
2334 if (path
&& org
&& new)
2336 node
= zalloc(sizeof(conf_replace_node
));
2339 node
->image
= image
;
2340 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2341 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2342 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2344 vtoy_list_add(data
->list
, cur
, node
);
2348 ret
= ventoy_data_save_all();
2350 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2354 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2358 const char *path
= NULL
;
2359 conf_replace_node
*last
= NULL
;
2360 conf_replace_node
*node
= NULL
;
2361 data_conf_replace
*data
= NULL
;
2363 vtoy_json_get_int(json
, "index", &index
);
2364 data
= g_data_conf_replace
+ index
;
2366 path
= VTOY_JSON_STR_EX("path");
2369 vtoy_list_del(last
, node
, data
->list
, path
);
2372 ret
= ventoy_data_save_all();
2374 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2382 void ventoy_data_default_dud(data_dud
*data
)
2384 memset(data
, 0, sizeof(data_dud
));
2387 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2389 dud_node
*list1
= NULL
;
2390 dud_node
*list2
= NULL
;
2392 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2396 else if (data1
->list
&& data2
->list
)
2398 list1
= data1
->list
;
2399 list2
= data2
->list
;
2401 while (list1
&& list2
)
2403 if (strcmp(list1
->path
, list2
->path
))
2408 /* no need to compare dud list with default */
2409 list1
= list1
->next
;
2410 list2
= list2
->next
;
2413 if (list1
== NULL
&& list2
== NULL
)
2428 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2431 dud_node
*node
= NULL
;
2432 path_node
*pathnode
= NULL
;
2434 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2436 VTOY_JSON_FMT_KEY_L(L1
, title
);
2437 VTOY_JSON_FMT_ARY_BEGIN_N();
2439 for (node
= data
->list
; node
; node
= node
->next
)
2441 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2442 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2444 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2445 VTOY_JSON_FMT_ARY_BEGIN_N();
2446 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2448 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2450 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2452 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2455 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2456 VTOY_JSON_FMT_END(pos
);
2462 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2466 dud_node
*node
= NULL
;
2467 path_node
*pathnode
= NULL
;
2469 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2470 VTOY_JSON_FMT_ARY_BEGIN();
2472 for (node
= data
->list
; node
; node
= node
->next
)
2474 VTOY_JSON_FMT_OBJ_BEGIN();
2476 VTOY_JSON_FMT_STRN("path", node
->path
);
2477 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2478 VTOY_JSON_FMT_SINT("valid", valid
);
2481 VTOY_JSON_FMT_KEY("list");
2482 VTOY_JSON_FMT_ARY_BEGIN();
2483 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2485 VTOY_JSON_FMT_OBJ_BEGIN();
2486 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2488 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2489 VTOY_JSON_FMT_SINT("valid", valid
);
2490 VTOY_JSON_FMT_OBJ_ENDEX();
2492 VTOY_JSON_FMT_ARY_ENDEX();
2495 VTOY_JSON_FMT_OBJ_ENDEX();
2498 VTOY_JSON_FMT_ARY_END();
2499 VTOY_JSON_FMT_END(pos
);
2504 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2506 api_get_func(conn
, json
, dud
);
2510 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2513 ret
= ventoy_data_save_all();
2515 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2520 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2524 const char *path
= NULL
;
2525 dud_node
*node
= NULL
;
2526 dud_node
*cur
= NULL
;
2527 data_dud
*data
= NULL
;
2528 VTOY_JSON
*array
= NULL
;
2530 vtoy_json_get_int(json
, "index", &index
);
2531 data
= g_data_dud
+ index
;
2533 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2534 path
= VTOY_JSON_STR_EX("path");
2537 node
= zalloc(sizeof(dud_node
));
2540 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2541 node
->list
= ventoy_path_node_add_array(array
);
2543 vtoy_list_add(data
->list
, cur
, node
);
2547 ret
= ventoy_data_save_all();
2549 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2553 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2557 const char *path
= NULL
;
2558 dud_node
*last
= NULL
;
2559 dud_node
*node
= NULL
;
2560 data_dud
*data
= NULL
;
2562 vtoy_json_get_int(json
, "index", &index
);
2563 data
= g_data_dud
+ index
;
2565 path
= VTOY_JSON_STR_EX("path");
2568 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2571 ret
= ventoy_data_save_all();
2573 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2578 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2582 const char *path
= NULL
;
2583 const char *outpath
= NULL
;
2584 path_node
*pcur
= NULL
;
2585 path_node
*pnode
= NULL
;
2586 dud_node
*node
= NULL
;
2587 data_dud
*data
= NULL
;
2589 vtoy_json_get_int(json
, "index", &index
);
2590 data
= g_data_dud
+ index
;
2592 path
= VTOY_JSON_STR_EX("path");
2593 outpath
= VTOY_JSON_STR_EX("outpath");
2594 if (path
&& outpath
)
2596 for (node
= data
->list
; node
; node
= node
->next
)
2598 if (strcmp(outpath
, node
->path
) == 0)
2600 pnode
= zalloc(sizeof(path_node
));
2603 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2604 vtoy_list_add(node
->list
, pcur
, pnode
);
2612 ret
= ventoy_data_save_all();
2614 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2618 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2622 const char *path
= NULL
;
2623 const char *outpath
= NULL
;
2624 path_node
*plast
= NULL
;
2625 path_node
*pnode
= NULL
;
2626 dud_node
*node
= NULL
;
2627 data_dud
*data
= NULL
;
2629 vtoy_json_get_int(json
, "index", &index
);
2630 data
= g_data_dud
+ index
;
2632 path
= VTOY_JSON_STR_EX("path");
2633 outpath
= VTOY_JSON_STR_EX("outpath");
2634 if (path
&& outpath
)
2636 for (node
= data
->list
; node
; node
= node
->next
)
2638 if (strcmp(outpath
, node
->path
) == 0)
2640 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2646 ret
= ventoy_data_save_all();
2648 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2656 void ventoy_data_default_auto_install(data_auto_install
*data
)
2658 memset(data
, 0, sizeof(data_auto_install
));
2661 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2663 auto_install_node
*list1
= NULL
;
2664 auto_install_node
*list2
= NULL
;
2666 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2670 else if (data1
->list
&& data2
->list
)
2672 list1
= data1
->list
;
2673 list2
= data2
->list
;
2675 while (list1
&& list2
)
2677 if (list1
->timeout
!= list2
->timeout
||
2678 list1
->autosel
!= list2
->autosel
||
2679 strcmp(list1
->path
, list2
->path
))
2684 /* no need to compare auto install list with default */
2685 list1
= list1
->next
;
2686 list2
= list2
->next
;
2689 if (list1
== NULL
&& list2
== NULL
)
2704 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2707 auto_install_node
*node
= NULL
;
2708 path_node
*pathnode
= NULL
;
2710 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2712 VTOY_JSON_FMT_KEY_L(L1
, title
);
2713 VTOY_JSON_FMT_ARY_BEGIN_N();
2715 for (node
= data
->list
; node
; node
= node
->next
)
2717 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2718 if (node
->type
== 0)
2720 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2724 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2728 VTOY_JSON_FMT_KEY_L(L3
, "template");
2729 VTOY_JSON_FMT_ARY_BEGIN_N();
2730 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2732 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2734 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2736 if (node
->timeouten
)
2738 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2741 if (node
->autoselen
)
2743 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2746 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2749 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2750 VTOY_JSON_FMT_END(pos
);
2756 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2760 auto_install_node
*node
= NULL
;
2761 path_node
*pathnode
= NULL
;
2763 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2764 VTOY_JSON_FMT_ARY_BEGIN();
2766 for (node
= data
->list
; node
; node
= node
->next
)
2768 VTOY_JSON_FMT_OBJ_BEGIN();
2770 VTOY_JSON_FMT_STRN("path", node
->path
);
2772 if (node
->type
== 0)
2774 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2778 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2780 VTOY_JSON_FMT_SINT("valid", valid
);
2781 VTOY_JSON_FMT_SINT("type", node
->type
);
2783 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2784 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2786 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2787 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2789 VTOY_JSON_FMT_KEY("list");
2790 VTOY_JSON_FMT_ARY_BEGIN();
2791 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2793 VTOY_JSON_FMT_OBJ_BEGIN();
2794 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2796 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2797 VTOY_JSON_FMT_SINT("valid", valid
);
2798 VTOY_JSON_FMT_OBJ_ENDEX();
2800 VTOY_JSON_FMT_ARY_ENDEX();
2803 VTOY_JSON_FMT_OBJ_ENDEX();
2806 VTOY_JSON_FMT_ARY_END();
2807 VTOY_JSON_FMT_END(pos
);
2812 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2814 api_get_func(conn
, json
, auto_install
);
2818 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2824 uint8_t timeouten
= 0;
2825 uint8_t autoselen
= 0;
2826 auto_install_node
*node
= NULL
;
2827 data_auto_install
*data
= NULL
;
2829 vtoy_json_get_int(json
, "index", &index
);
2830 vtoy_json_get_int(json
, "id", &id
);
2832 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2833 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2835 data
= g_data_auto_install
+ index
;
2839 for (node
= data
->list
; node
; node
= node
->next
)
2843 node
->timeouten
= (int)timeouten
;
2844 node
->autoselen
= (int)autoselen
;
2845 VTOY_JSON_INT("timeout", node
->timeout
);
2846 VTOY_JSON_INT("autosel", node
->autosel
);
2852 ret
= ventoy_data_save_all();
2854 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2859 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2864 const char *path
= NULL
;
2865 auto_install_node
*node
= NULL
;
2866 auto_install_node
*cur
= NULL
;
2867 data_auto_install
*data
= NULL
;
2868 VTOY_JSON
*array
= NULL
;
2870 vtoy_json_get_int(json
, "type", &type
);
2871 vtoy_json_get_int(json
, "index", &index
);
2872 data
= g_data_auto_install
+ index
;
2874 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2875 path
= VTOY_JSON_STR_EX("path");
2878 node
= zalloc(sizeof(auto_install_node
));
2882 node
->timeouten
= 0;
2883 node
->autoselen
= 0;
2886 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2887 node
->list
= ventoy_path_node_add_array(array
);
2889 vtoy_list_add(data
->list
, cur
, node
);
2893 ret
= ventoy_data_save_all();
2895 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2899 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2903 const char *path
= NULL
;
2904 auto_install_node
*last
= NULL
;
2905 auto_install_node
*node
= NULL
;
2906 data_auto_install
*data
= NULL
;
2908 vtoy_json_get_int(json
, "index", &index
);
2909 data
= g_data_auto_install
+ index
;
2911 path
= VTOY_JSON_STR_EX("path");
2914 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2917 ret
= ventoy_data_save_all();
2919 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2923 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2927 const char *path
= NULL
;
2928 const char *outpath
= NULL
;
2929 path_node
*pcur
= NULL
;
2930 path_node
*pnode
= NULL
;
2931 auto_install_node
*node
= NULL
;
2932 data_auto_install
*data
= NULL
;
2934 vtoy_json_get_int(json
, "index", &index
);
2935 data
= g_data_auto_install
+ index
;
2937 path
= VTOY_JSON_STR_EX("path");
2938 outpath
= VTOY_JSON_STR_EX("outpath");
2939 if (path
&& outpath
)
2941 for (node
= data
->list
; node
; node
= node
->next
)
2943 if (strcmp(outpath
, node
->path
) == 0)
2945 pnode
= zalloc(sizeof(path_node
));
2948 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2949 vtoy_list_add(node
->list
, pcur
, pnode
);
2957 ret
= ventoy_data_save_all();
2959 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2963 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2967 const char *path
= NULL
;
2968 const char *outpath
= NULL
;
2969 path_node
*plast
= NULL
;
2970 path_node
*pnode
= NULL
;
2971 auto_install_node
*node
= NULL
;
2972 data_auto_install
*data
= NULL
;
2974 vtoy_json_get_int(json
, "index", &index
);
2975 data
= g_data_auto_install
+ index
;
2977 path
= VTOY_JSON_STR_EX("path");
2978 outpath
= VTOY_JSON_STR_EX("outpath");
2979 if (path
&& outpath
)
2981 for (node
= data
->list
; node
; node
= node
->next
)
2983 if (strcmp(outpath
, node
->path
) == 0)
2985 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2991 ret
= ventoy_data_save_all();
2993 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3002 void ventoy_data_default_persistence(data_persistence
*data
)
3004 memset(data
, 0, sizeof(data_persistence
));
3007 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
3009 persistence_node
*list1
= NULL
;
3010 persistence_node
*list2
= NULL
;
3012 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3016 else if (data1
->list
&& data2
->list
)
3018 list1
= data1
->list
;
3019 list2
= data2
->list
;
3021 while (list1
&& list2
)
3023 if (list1
->timeout
!= list2
->timeout
||
3024 list1
->autosel
!= list2
->autosel
||
3025 strcmp(list1
->path
, list2
->path
))
3030 /* no need to compare auto install list with default */
3031 list1
= list1
->next
;
3032 list2
= list2
->next
;
3035 if (list1
== NULL
&& list2
== NULL
)
3050 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3053 persistence_node
*node
= NULL
;
3054 path_node
*pathnode
= NULL
;
3056 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3058 VTOY_JSON_FMT_KEY_L(L1
, title
);
3059 VTOY_JSON_FMT_ARY_BEGIN_N();
3061 for (node
= data
->list
; node
; node
= node
->next
)
3063 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3064 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3065 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3066 VTOY_JSON_FMT_ARY_BEGIN_N();
3067 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3069 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3071 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3073 if (node
->timeouten
)
3075 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3078 if (node
->autoselen
)
3080 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3083 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3086 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3087 VTOY_JSON_FMT_END(pos
);
3093 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3097 persistence_node
*node
= NULL
;
3098 path_node
*pathnode
= NULL
;
3100 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3101 VTOY_JSON_FMT_ARY_BEGIN();
3103 for (node
= data
->list
; node
; node
= node
->next
)
3105 VTOY_JSON_FMT_OBJ_BEGIN();
3107 VTOY_JSON_FMT_STRN("path", node
->path
);
3109 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3110 VTOY_JSON_FMT_SINT("valid", valid
);
3111 VTOY_JSON_FMT_SINT("type", node
->type
);
3113 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3114 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3116 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3117 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3119 VTOY_JSON_FMT_KEY("list");
3120 VTOY_JSON_FMT_ARY_BEGIN();
3121 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3123 VTOY_JSON_FMT_OBJ_BEGIN();
3124 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3126 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3127 VTOY_JSON_FMT_SINT("valid", valid
);
3128 VTOY_JSON_FMT_OBJ_ENDEX();
3130 VTOY_JSON_FMT_ARY_ENDEX();
3133 VTOY_JSON_FMT_OBJ_ENDEX();
3136 VTOY_JSON_FMT_ARY_END();
3137 VTOY_JSON_FMT_END(pos
);
3142 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3144 api_get_func(conn
, json
, persistence
);
3148 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3154 uint8_t timeouten
= 0;
3155 uint8_t autoselen
= 0;
3156 persistence_node
*node
= NULL
;
3157 data_persistence
*data
= NULL
;
3159 vtoy_json_get_int(json
, "index", &index
);
3160 vtoy_json_get_int(json
, "id", &id
);
3162 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3163 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3165 data
= g_data_persistence
+ index
;
3169 for (node
= data
->list
; node
; node
= node
->next
)
3173 node
->timeouten
= (int)timeouten
;
3174 node
->autoselen
= (int)autoselen
;
3175 VTOY_JSON_INT("timeout", node
->timeout
);
3176 VTOY_JSON_INT("autosel", node
->autosel
);
3182 ret
= ventoy_data_save_all();
3184 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3189 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3193 const char *path
= NULL
;
3194 persistence_node
*node
= NULL
;
3195 persistence_node
*cur
= NULL
;
3196 data_persistence
*data
= NULL
;
3197 VTOY_JSON
*array
= NULL
;
3199 vtoy_json_get_int(json
, "index", &index
);
3200 data
= g_data_persistence
+ index
;
3202 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3203 path
= VTOY_JSON_STR_EX("path");
3206 node
= zalloc(sizeof(persistence_node
));
3209 node
->timeouten
= 0;
3210 node
->autoselen
= 0;
3213 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3214 node
->list
= ventoy_path_node_add_array(array
);
3216 vtoy_list_add(data
->list
, cur
, node
);
3220 ret
= ventoy_data_save_all();
3222 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3226 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3230 const char *path
= NULL
;
3231 persistence_node
*last
= NULL
;
3232 persistence_node
*node
= NULL
;
3233 data_persistence
*data
= NULL
;
3235 vtoy_json_get_int(json
, "index", &index
);
3236 data
= g_data_persistence
+ index
;
3238 path
= VTOY_JSON_STR_EX("path");
3241 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3244 ret
= ventoy_data_save_all();
3246 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3250 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3254 const char *path
= NULL
;
3255 const char *outpath
= NULL
;
3256 path_node
*pcur
= NULL
;
3257 path_node
*pnode
= NULL
;
3258 persistence_node
*node
= NULL
;
3259 data_persistence
*data
= NULL
;
3261 vtoy_json_get_int(json
, "index", &index
);
3262 data
= g_data_persistence
+ index
;
3264 path
= VTOY_JSON_STR_EX("path");
3265 outpath
= VTOY_JSON_STR_EX("outpath");
3266 if (path
&& outpath
)
3268 for (node
= data
->list
; node
; node
= node
->next
)
3270 if (strcmp(outpath
, node
->path
) == 0)
3272 pnode
= zalloc(sizeof(path_node
));
3275 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3276 vtoy_list_add(node
->list
, pcur
, pnode
);
3284 ret
= ventoy_data_save_all();
3286 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3290 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3294 const char *path
= NULL
;
3295 const char *outpath
= NULL
;
3296 path_node
*plast
= NULL
;
3297 path_node
*pnode
= NULL
;
3298 persistence_node
*node
= NULL
;
3299 data_persistence
*data
= NULL
;
3301 vtoy_json_get_int(json
, "index", &index
);
3302 data
= g_data_persistence
+ index
;
3304 path
= VTOY_JSON_STR_EX("path");
3305 outpath
= VTOY_JSON_STR_EX("outpath");
3306 if (path
&& outpath
)
3308 for (node
= data
->list
; node
; node
= node
->next
)
3310 if (strcmp(outpath
, node
->path
) == 0)
3312 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3318 ret
= ventoy_data_save_all();
3320 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3328 void ventoy_data_default_injection(data_injection
*data
)
3330 memset(data
, 0, sizeof(data_injection
));
3333 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3335 injection_node
*list1
= NULL
;
3336 injection_node
*list2
= NULL
;
3338 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3342 else if (data1
->list
&& data2
->list
)
3344 list1
= data1
->list
;
3345 list2
= data2
->list
;
3347 while (list1
&& list2
)
3349 if ((list1
->type
!= list2
->type
) ||
3350 strcmp(list1
->path
, list2
->path
) ||
3351 strcmp(list1
->archive
, list2
->archive
))
3356 list1
= list1
->next
;
3357 list2
= list2
->next
;
3360 if (list1
== NULL
&& list2
== NULL
)
3375 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3378 injection_node
*node
= NULL
;
3380 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3382 VTOY_JSON_FMT_KEY_L(L1
, title
);
3383 VTOY_JSON_FMT_ARY_BEGIN_N();
3385 for (node
= data
->list
; node
; node
= node
->next
)
3387 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3389 if (node
->type
== 0)
3391 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3395 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3397 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3399 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3402 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3403 VTOY_JSON_FMT_END(pos
);
3409 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3413 injection_node
*node
= NULL
;
3415 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3416 VTOY_JSON_FMT_ARY_BEGIN();
3418 for (node
= data
->list
; node
; node
= node
->next
)
3420 VTOY_JSON_FMT_OBJ_BEGIN();
3422 VTOY_JSON_FMT_UINT("type", node
->type
);
3423 VTOY_JSON_FMT_STRN("path", node
->path
);
3425 if (node
->type
== 0)
3427 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3431 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3433 VTOY_JSON_FMT_SINT("valid", valid
);
3435 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3437 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3438 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3440 VTOY_JSON_FMT_OBJ_ENDEX();
3443 VTOY_JSON_FMT_ARY_END();
3444 VTOY_JSON_FMT_END(pos
);
3450 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3452 api_get_func(conn
, json
, injection
);
3456 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3459 ret
= ventoy_data_save_all();
3461 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3465 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3470 const char *path
= NULL
;
3471 const char *archive
= NULL
;
3472 injection_node
*node
= NULL
;
3473 injection_node
*cur
= NULL
;
3474 data_injection
*data
= NULL
;
3476 vtoy_json_get_int(json
, "index", &index
);
3477 data
= g_data_injection
+ index
;
3479 vtoy_json_get_int(json
, "type", &type
);
3481 path
= VTOY_JSON_STR_EX("path");
3482 archive
= VTOY_JSON_STR_EX("archive");
3483 if (path
&& archive
)
3485 node
= zalloc(sizeof(injection_node
));
3490 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3491 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3493 vtoy_list_add(data
->list
, cur
, node
);
3497 ret
= ventoy_data_save_all();
3499 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3503 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3507 const char *path
= NULL
;
3508 injection_node
*last
= NULL
;
3509 injection_node
*node
= NULL
;
3510 data_injection
*data
= NULL
;
3512 vtoy_json_get_int(json
, "index", &index
);
3513 data
= g_data_injection
+ index
;
3515 path
= VTOY_JSON_STR_EX("path");
3518 vtoy_list_del(last
, node
, data
->list
, path
);
3521 ret
= ventoy_data_save_all();
3523 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3531 int ventoy_data_save_all(void)
3533 ventoy_set_writeback_event();
3537 int ventoy_data_real_save_all(void)
3543 pthread_mutex_lock(&g_api_mutex
);
3545 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3547 ventoy_save_plug(control
);
3548 ventoy_save_plug(theme
);
3549 ventoy_save_plug(menu_alias
);
3550 ventoy_save_plug(menu_tip
);
3551 ventoy_save_plug(menu_class
);
3552 ventoy_save_plug(auto_install
);
3553 ventoy_save_plug(persistence
);
3554 ventoy_save_plug(injection
);
3555 ventoy_save_plug(conf_replace
);
3556 ventoy_save_plug(password
);
3557 ventoy_save_plug(image_list
);
3558 ventoy_save_plug(auto_memdisk
);
3559 ventoy_save_plug(dud
);
3561 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3563 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3566 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3568 pthread_mutex_unlock(&g_api_mutex
);
3573 int ventoy_http_writeback(void)
3579 ventoy_get_json_path(filename
, NULL
);
3581 pos
= ventoy_data_real_save_all();
3584 printf("%s", JSON_SAVE_BUFFER
);
3587 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3590 vlog("Failed to write ventoy.json file.\n");
3591 g_sysinfo
.config_save_error
= 1;
3598 static JSON_CB g_ventoy_json_cb
[] =
3600 { "sysinfo", ventoy_api_sysinfo
},
3601 { "handshake", ventoy_api_handshake
},
3602 { "check_path", ventoy_api_check_exist
},
3603 { "check_path2", ventoy_api_check_exist2
},
3604 { "check_fuzzy", ventoy_api_check_fuzzy
},
3606 { "device_info", ventoy_api_device_info
},
3608 { "get_control", ventoy_api_get_control
},
3609 { "save_control", ventoy_api_save_control
},
3611 { "get_theme", ventoy_api_get_theme
},
3612 { "save_theme", ventoy_api_save_theme
},
3613 { "theme_add_file", ventoy_api_theme_add_file
},
3614 { "theme_del_file", ventoy_api_theme_del_file
},
3615 { "theme_add_font", ventoy_api_theme_add_font
},
3616 { "theme_del_font", ventoy_api_theme_del_font
},
3618 { "get_alias", ventoy_api_get_alias
},
3619 { "save_alias", ventoy_api_save_alias
},
3620 { "alias_add", ventoy_api_alias_add
},
3621 { "alias_del", ventoy_api_alias_del
},
3623 { "get_tip", ventoy_api_get_tip
},
3624 { "save_tip", ventoy_api_save_tip
},
3625 { "tip_add", ventoy_api_tip_add
},
3626 { "tip_del", ventoy_api_tip_del
},
3628 { "get_class", ventoy_api_get_class
},
3629 { "save_class", ventoy_api_save_class
},
3630 { "class_add", ventoy_api_class_add
},
3631 { "class_del", ventoy_api_class_del
},
3633 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3634 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3635 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3636 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3638 { "get_image_list", ventoy_api_get_image_list
},
3639 { "save_image_list", ventoy_api_save_image_list
},
3640 { "image_list_add", ventoy_api_image_list_add
},
3641 { "image_list_del", ventoy_api_image_list_del
},
3643 { "get_conf_replace", ventoy_api_get_conf_replace
},
3644 { "save_conf_replace", ventoy_api_save_conf_replace
},
3645 { "conf_replace_add", ventoy_api_conf_replace_add
},
3646 { "conf_replace_del", ventoy_api_conf_replace_del
},
3648 { "get_dud", ventoy_api_get_dud
},
3649 { "save_dud", ventoy_api_save_dud
},
3650 { "dud_add", ventoy_api_dud_add
},
3651 { "dud_del", ventoy_api_dud_del
},
3652 { "dud_add_inner", ventoy_api_dud_add_inner
},
3653 { "dud_del_inner", ventoy_api_dud_del_inner
},
3655 { "get_auto_install", ventoy_api_get_auto_install
},
3656 { "save_auto_install", ventoy_api_save_auto_install
},
3657 { "auto_install_add", ventoy_api_auto_install_add
},
3658 { "auto_install_del", ventoy_api_auto_install_del
},
3659 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3660 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3662 { "get_persistence", ventoy_api_get_persistence
},
3663 { "save_persistence", ventoy_api_save_persistence
},
3664 { "persistence_add", ventoy_api_persistence_add
},
3665 { "persistence_del", ventoy_api_persistence_del
},
3666 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3667 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3669 { "get_password", ventoy_api_get_password
},
3670 { "save_password", ventoy_api_save_password
},
3671 { "password_add", ventoy_api_password_add
},
3672 { "password_del", ventoy_api_password_del
},
3674 { "get_injection", ventoy_api_get_injection
},
3675 { "save_injection", ventoy_api_save_injection
},
3676 { "injection_add", ventoy_api_injection_add
},
3677 { "injection_del", ventoy_api_injection_del
},
3682 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3685 const char *method
= NULL
;
3687 method
= vtoy_json_get_string_ex(json
, "method");
3690 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3694 if (strcmp(method
, "handshake") == 0)
3696 ventoy_api_handshake(conn
, json
);
3700 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3702 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3704 g_ventoy_json_cb
[i
].callback(conn
, json
);
3712 static int ventoy_request_handler(struct mg_connection
*conn
)
3716 VTOY_JSON
*json
= NULL
;
3717 char *post_data_buf
= NULL
;
3718 const struct mg_request_info
*ri
= NULL
;
3719 char stack_buf
[512];
3721 ri
= mg_get_request_info(conn
);
3723 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3725 if (ri
->content_length
> 500)
3727 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3728 post_buf_len
= (int)(ri
->content_length
+ 1);
3732 post_data_buf
= stack_buf
;
3733 post_buf_len
= sizeof(stack_buf
);
3736 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3737 post_data_buf
[post_data_len
] = 0;
3739 json
= vtoy_json_create();
3740 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3742 pthread_mutex_lock(&g_api_mutex
);
3743 ventoy_json_handler(conn
, json
->pstChild
);
3744 pthread_mutex_unlock(&g_api_mutex
);
3748 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3751 vtoy_json_destroy(json
);
3753 if (post_data_buf
!= stack_buf
)
3755 free(post_data_buf
);
3765 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3767 ventoy_file
*node
= NULL
;
3776 node
= ventoy_tar_find_file(path
);
3779 *data_len
= node
->size
;
3791 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3794 VTOY_JSON
*node
= NULL
;
3795 VTOY_JSON
*child
= NULL
;
3796 data_control
*data
= (data_control
*)p
;
3798 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3803 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3805 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3807 child
= node
->pstChild
;
3809 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3811 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3813 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3815 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3817 else if (strcmp(child
->pcName
, "VTOY_LINUX_REMOUNT") == 0)
3819 CONTROL_PARSE_INT(child
, data
->linux_remount
);
3821 else if (strcmp(child
->pcName
, "VTOY_SECONDARY_BOOT_MENU") == 0)
3823 CONTROL_PARSE_INT(child
, data
->secondary_menu
);
3825 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3827 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3829 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3831 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3833 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3835 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3837 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3839 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3841 data
->max_search_level
= -1;
3845 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3848 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3850 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3852 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3854 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3856 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3858 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3860 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3862 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3867 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3869 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3871 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3873 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3878 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3880 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3882 else if (strcmp(child
->pcName
, "VTOY_SECONDARY_TIMEOUT") == 0)
3884 data
->secondary_menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3886 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3888 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3890 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3892 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3894 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3896 CONTROL_PARSE_INT(child
, data
->filter_img
);
3898 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3900 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3902 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3904 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3906 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3908 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3910 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3912 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3920 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3922 const char *dismode
= NULL
;
3923 VTOY_JSON
*child
= NULL
;
3924 VTOY_JSON
*node
= NULL
;
3925 path_node
*tail
= NULL
;
3926 path_node
*pnode
= NULL
;
3927 data_theme
*data
= (data_theme
*)p
;
3929 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3934 child
= json
->pstChild
;
3936 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3937 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3938 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3939 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3941 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3942 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3943 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3947 if (strcmp(dismode
, "CLI") == 0)
3949 data
->display_mode
= display_mode_cli
;
3951 else if (strcmp(dismode
, "serial") == 0)
3953 data
->display_mode
= display_mode_serial
;
3955 else if (strcmp(dismode
, "serial_console") == 0)
3957 data
->display_mode
= display_mode_ser_console
;
3961 data
->display_mode
= display_mode_gui
;
3965 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3968 data
->default_file
= 0;
3970 pnode
= zalloc(sizeof(path_node
));
3973 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3974 data
->filelist
= pnode
;
3979 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3982 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3984 if (node
->enDataType
== JSON_TYPE_STRING
)
3986 pnode
= zalloc(sizeof(path_node
));
3989 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3997 data
->filelist
= tail
= pnode
;
4006 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
4009 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
4011 if (node
->enDataType
== JSON_TYPE_STRING
)
4013 pnode
= zalloc(sizeof(path_node
));
4016 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4017 if (data
->fontslist
)
4024 data
->fontslist
= tail
= pnode
;
4033 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4036 const char *path
= NULL
;
4037 const char *alias
= NULL
;
4038 data_alias
*data
= (data_alias
*)p
;
4039 data_alias_node
*tail
= NULL
;
4040 data_alias_node
*pnode
= NULL
;
4041 VTOY_JSON
*node
= NULL
;
4043 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4048 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4050 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4055 type
= path_type_file
;
4056 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4059 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4060 type
= path_type_dir
;
4062 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4066 pnode
= zalloc(sizeof(data_alias_node
));
4070 strlcpy(pnode
->path
, path
);
4071 strlcpy(pnode
->alias
, alias
);
4080 data
->list
= tail
= pnode
;
4089 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4092 const char *path
= NULL
;
4093 const char *tip
= NULL
;
4094 data_tip
*data
= (data_tip
*)p
;
4095 data_tip_node
*tail
= NULL
;
4096 data_tip_node
*pnode
= NULL
;
4097 VTOY_JSON
*node
= NULL
;
4098 VTOY_JSON
*tips
= NULL
;
4100 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4105 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4106 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4107 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4109 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4115 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4117 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4122 type
= path_type_file
;
4123 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4126 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4127 type
= path_type_dir
;
4129 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4133 pnode
= zalloc(sizeof(data_tip_node
));
4137 strlcpy(pnode
->path
, path
);
4138 strlcpy(pnode
->tip
, tip
);
4147 data
->list
= tail
= pnode
;
4155 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4158 const char *path
= NULL
;
4159 const char *class = NULL
;
4160 data_class
*data
= (data_class
*)p
;
4161 data_class_node
*tail
= NULL
;
4162 data_class_node
*pnode
= NULL
;
4163 VTOY_JSON
*node
= NULL
;
4165 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4170 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4172 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4177 type
= class_type_key
;
4178 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4181 type
= class_type_dir
;
4182 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4185 type
= class_type_parent
;
4186 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4189 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4193 pnode
= zalloc(sizeof(data_class_node
));
4197 strlcpy(pnode
->path
, path
);
4198 strlcpy(pnode
->class, class);
4207 data
->list
= tail
= pnode
;
4215 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4223 const char *path
= NULL
;
4224 const char *file
= NULL
;
4225 data_auto_install
*data
= (data_auto_install
*)p
;
4226 auto_install_node
*tail
= NULL
;
4227 auto_install_node
*pnode
= NULL
;
4228 path_node
*pathnode
= NULL
;
4229 path_node
*pathtail
= NULL
;
4230 VTOY_JSON
*node
= NULL
;
4231 VTOY_JSON
*filelist
= NULL
;
4232 VTOY_JSON
*filenode
= NULL
;
4234 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4239 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4241 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4247 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4250 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4258 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4261 pnode
= zalloc(sizeof(auto_install_node
));
4266 strlcpy(pnode
->path
, path
);
4268 pathnode
= zalloc(sizeof(path_node
));
4271 strlcpy(pathnode
->path
, file
);
4272 pnode
->list
= pathnode
;
4286 data
->list
= tail
= pnode
;
4294 timeouten
= autoselen
= 0;
4295 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4299 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4304 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4310 pnode
= zalloc(sizeof(auto_install_node
));
4317 pnode
->autoselen
= autoselen
;
4318 pnode
->timeouten
= timeouten
;
4319 pnode
->timeout
= timeout
;
4320 pnode
->autosel
= autosel
;
4321 strlcpy(pnode
->path
, path
);
4324 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4326 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4331 pathnode
= zalloc(sizeof(path_node
));
4335 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4339 pathtail
->next
= pathnode
;
4340 pathtail
= pathnode
;
4344 pnode
->list
= pathtail
= pathnode
;
4355 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4367 data
->list
= tail
= pnode
;
4374 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4381 const char *path
= NULL
;
4382 const char *file
= NULL
;
4383 data_persistence
*data
= (data_persistence
*)p
;
4384 persistence_node
*tail
= NULL
;
4385 persistence_node
*pnode
= NULL
;
4386 path_node
*pathnode
= NULL
;
4387 path_node
*pathtail
= NULL
;
4388 VTOY_JSON
*node
= NULL
;
4389 VTOY_JSON
*filelist
= NULL
;
4390 VTOY_JSON
*filenode
= NULL
;
4392 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4397 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4399 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4404 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4410 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4413 pnode
= zalloc(sizeof(persistence_node
));
4418 strlcpy(pnode
->path
, path
);
4420 pathnode
= zalloc(sizeof(path_node
));
4423 strlcpy(pathnode
->path
, file
);
4424 pnode
->list
= pathnode
;
4438 data
->list
= tail
= pnode
;
4446 timeouten
= autoselen
= 0;
4447 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4451 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4456 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4462 pnode
= zalloc(sizeof(persistence_node
));
4469 pnode
->autoselen
= autoselen
;
4470 pnode
->timeouten
= timeouten
;
4471 pnode
->timeout
= timeout
;
4472 pnode
->autosel
= autosel
;
4473 strlcpy(pnode
->path
, path
);
4476 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4478 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4483 pathnode
= zalloc(sizeof(path_node
));
4487 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4491 pathtail
->next
= pathnode
;
4492 pathtail
= pathnode
;
4496 pnode
->list
= pathtail
= pathnode
;
4507 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4519 data
->list
= tail
= pnode
;
4526 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4529 const char *path
= NULL
;
4530 const char *archive
= NULL
;
4531 data_injection
*data
= (data_injection
*)p
;
4532 injection_node
*tail
= NULL
;
4533 injection_node
*pnode
= NULL
;
4534 VTOY_JSON
*node
= NULL
;
4536 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4541 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4543 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4549 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4552 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4555 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4557 if (path
&& archive
)
4559 pnode
= zalloc(sizeof(injection_node
));
4563 strlcpy(pnode
->path
, path
);
4564 strlcpy(pnode
->archive
, archive
);
4573 data
->list
= tail
= pnode
;
4581 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4584 const char *path
= NULL
;
4585 const char *org
= NULL
;
4586 const char *new = NULL
;
4587 data_conf_replace
*data
= (data_conf_replace
*)p
;
4588 conf_replace_node
*tail
= NULL
;
4589 conf_replace_node
*pnode
= NULL
;
4590 VTOY_JSON
*node
= NULL
;
4592 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4597 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4599 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4604 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4605 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4606 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4609 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4611 if (path
&& org
&& new)
4613 pnode
= zalloc(sizeof(conf_replace_node
));
4616 strlcpy(pnode
->path
, path
);
4617 strlcpy(pnode
->org
, org
);
4618 strlcpy(pnode
->new, new);
4631 data
->list
= tail
= pnode
;
4639 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4642 const char *bootpwd
= NULL
;
4643 const char *isopwd
= NULL
;
4644 const char *wimpwd
= NULL
;
4645 const char *imgpwd
= NULL
;
4646 const char *efipwd
= NULL
;
4647 const char *vhdpwd
= NULL
;
4648 const char *vtoypwd
= NULL
;
4649 const char *path
= NULL
;
4650 const char *pwd
= NULL
;
4651 data_password
*data
= (data_password
*)p
;
4652 menu_password
*tail
= NULL
;
4653 menu_password
*pnode
= NULL
;
4654 VTOY_JSON
*node
= NULL
;
4655 VTOY_JSON
*menupwd
= NULL
;
4657 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4662 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4663 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4664 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4665 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4666 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4667 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4668 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4671 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4672 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4673 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4674 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4675 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4676 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4677 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4680 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4686 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4688 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4694 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4697 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4700 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4704 pnode
= zalloc(sizeof(menu_password
));
4708 strlcpy(pnode
->path
, path
);
4709 strlcpy(pnode
->pwd
, pwd
);
4718 data
->list
= tail
= pnode
;
4727 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4729 VTOY_JSON
*node
= NULL
;
4730 data_image_list
*data
= (data_image_list
*)p
;
4731 path_node
*tail
= NULL
;
4732 path_node
*pnode
= NULL
;
4734 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4741 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4743 if (node
->enDataType
== JSON_TYPE_STRING
)
4745 pnode
= zalloc(sizeof(path_node
));
4748 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4756 data
->list
= tail
= pnode
;
4764 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4766 return ventoy_parse_image_list_real(json
, 1, p
);
4768 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4770 return ventoy_parse_image_list_real(json
, 0, p
);
4773 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4775 VTOY_JSON
*node
= NULL
;
4776 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4777 path_node
*tail
= NULL
;
4778 path_node
*pnode
= NULL
;
4780 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4785 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4787 if (node
->enDataType
== JSON_TYPE_STRING
)
4789 pnode
= zalloc(sizeof(path_node
));
4792 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4800 data
->list
= tail
= pnode
;
4808 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4811 const char *path
= NULL
;
4812 const char *file
= NULL
;
4813 data_dud
*data
= (data_dud
*)p
;
4814 dud_node
*tail
= NULL
;
4815 dud_node
*pnode
= NULL
;
4816 path_node
*pathnode
= NULL
;
4817 path_node
*pathtail
= NULL
;
4818 VTOY_JSON
*node
= NULL
;
4819 VTOY_JSON
*filelist
= NULL
;
4820 VTOY_JSON
*filenode
= NULL
;
4822 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4827 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4829 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4834 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4840 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4843 pnode
= zalloc(sizeof(dud_node
));
4846 strlcpy(pnode
->path
, path
);
4848 pathnode
= zalloc(sizeof(path_node
));
4851 strlcpy(pathnode
->path
, file
);
4852 pnode
->list
= pathnode
;
4866 data
->list
= tail
= pnode
;
4873 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4879 pnode
= zalloc(sizeof(dud_node
));
4885 strlcpy(pnode
->path
, path
);
4887 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4889 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4894 pathnode
= zalloc(sizeof(path_node
));
4897 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4902 pathtail
->next
= pathnode
;
4903 pathtail
= pathnode
;
4907 pnode
->list
= pathtail
= pathnode
;
4925 data
->list
= tail
= pnode
;
4939 static int ventoy_load_old_json(const char *filename
)
4944 char *buffer
= NULL
;
4945 unsigned char *start
= NULL
;
4946 VTOY_JSON
*json
= NULL
;
4947 VTOY_JSON
*node
= NULL
;
4948 VTOY_JSON
*next
= NULL
;
4950 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4953 vlog("Failed to read old ventoy.json file.\n");
4958 start
= (unsigned char *)buffer
;
4960 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4964 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4966 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4971 json
= vtoy_json_create();
4978 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4980 vlog("parse ventoy.json success\n");
4982 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4983 for (next
= node
->pstNext
; next
; next
= next
->pstNext
)
4985 if (node
->pcName
&& next
->pcName
&& strcmp(node
->pcName
, next
->pcName
) == 0)
4987 vlog("ventoy.json contains duplicate key <%s>.\n", node
->pcName
);
4988 g_sysinfo
.invalid_config
= 1;
4994 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4996 ventoy_parse_json(control
);
4997 ventoy_parse_json(theme
);
4998 ventoy_parse_json(menu_alias
);
4999 ventoy_parse_json(menu_tip
);
5000 ventoy_parse_json(menu_class
);
5001 ventoy_parse_json(auto_install
);
5002 ventoy_parse_json(persistence
);
5003 ventoy_parse_json(injection
);
5004 ventoy_parse_json(conf_replace
);
5005 ventoy_parse_json(password
);
5006 ventoy_parse_json(image_list
);
5007 ventoy_parse_json(image_blacklist
);
5008 ventoy_parse_json(auto_memdisk
);
5009 ventoy_parse_json(dud
);
5014 vlog("ventoy.json has syntax error.\n");
5015 g_sysinfo
.syntax_error
= 1;
5020 vtoy_json_destroy(json
);
5027 int ventoy_http_start(const char *ip
, const char *port
)
5032 char backupname
[128];
5033 struct mg_callbacks callbacks
;
5034 const char *options
[] =
5036 "listening_ports", "24681",
5037 "document_root", "www",
5038 "index_files", "index.html",
5039 "num_threads", "16",
5040 "error_log_file", LOG_FILE
,
5041 "request_timeout_ms", "10000",
5045 for (i
= 0; i
<= bios_max
; i
++)
5047 ventoy_data_default_control(g_data_control
+ i
);
5048 ventoy_data_default_theme(g_data_theme
+ i
);
5049 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5050 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5051 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5052 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5053 ventoy_data_default_persistence(g_data_persistence
+ i
);
5054 ventoy_data_default_injection(g_data_injection
+ i
);
5055 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5056 ventoy_data_default_password(g_data_password
+ i
);
5057 ventoy_data_default_image_list(g_data_image_list
+ i
);
5058 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5059 ventoy_data_default_dud(g_data_dud
+ i
);
5062 ventoy_get_json_path(filename
, backupname
);
5063 if (ventoy_is_file_exist("%s", filename
))
5065 ventoy_copy_file(filename
, backupname
);
5066 ventoy_load_old_json(filename
);
5071 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5074 memset(&callbacks
, 0, sizeof(callbacks
));
5075 callbacks
.begin_request
= ventoy_request_handler
;
5077 callbacks
.open_file
= ventoy_web_openfile
;
5079 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5081 ventoy_start_writeback_thread(ventoy_http_writeback
);
5083 return g_ventoy_http_ctx
? 0 : 1;
5086 int ventoy_http_stop(void)
5088 if (g_ventoy_http_ctx
)
5090 mg_stop(g_ventoy_http_ctx
);
5093 ventoy_stop_writeback_thread();
5097 int ventoy_http_init(void)
5102 char *Buffer
= NULL
;
5105 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5108 for (i
= 0; i
< BufLen
/ 5; i
++)
5110 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5111 g_ventoy_help_lang
[i
][5] = 0;
5117 file
= ventoy_tar_find_file("www/helplist");
5120 for (i
= 0; i
< file
->size
/ 5; i
++)
5122 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5123 g_ventoy_help_lang
[i
][5] = 0;
5128 if (!g_pub_json_buffer
)
5130 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5131 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5135 pthread_mutex_init(&g_api_mutex
, NULL
);
5139 void ventoy_http_exit(void)
5141 check_free(g_pub_json_buffer
);
5142 g_pub_json_buffer
= NULL
;
5143 g_pub_save_buffer
= NULL
;
5145 pthread_mutex_destroy(&g_api_mutex
);