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;
330 #if defined(_MSC_VER) || defined(WIN32)
331 VTOY_JSON_FMT_STRN("os", "windows");
333 VTOY_JSON_FMT_STRN("os", "linux");
336 VTOY_JSON_FMT_OBJ_END();
337 VTOY_JSON_FMT_END(pos
);
339 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
343 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
349 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
350 VTOY_JSON_FMT_OBJ_BEGIN();
351 VTOY_JSON_FMT_SINT("status", 0);
352 VTOY_JSON_FMT_OBJ_END();
353 VTOY_JSON_FMT_END(pos
);
355 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
359 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
364 const char *path
= NULL
;
366 path
= vtoy_json_get_string_ex(json
, "path");
367 vtoy_json_get_int(json
, "dir", &dir
);
373 exist
= ventoy_is_directory_exist("%s", path
);
377 exist
= ventoy_is_file_exist("%s", path
);
381 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
382 VTOY_JSON_FMT_OBJ_BEGIN();
383 VTOY_JSON_FMT_SINT("exist", exist
);
384 VTOY_JSON_FMT_OBJ_END();
385 VTOY_JSON_FMT_END(pos
);
387 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
391 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
400 const char *path1
= NULL
;
401 const char *path2
= NULL
;
403 path1
= vtoy_json_get_string_ex(json
, "path1");
404 path2
= vtoy_json_get_string_ex(json
, "path2");
405 vtoy_json_get_int(json
, "dir1", &dir1
);
406 vtoy_json_get_int(json
, "dir2", &dir2
);
407 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
408 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
414 exist1
= ventoy_is_directory_exist("%s", path1
);
420 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
424 exist1
= ventoy_is_file_exist("%s", path1
);
433 exist2
= ventoy_is_directory_exist("%s", path2
);
439 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
443 exist2
= ventoy_is_file_exist("%s", path2
);
448 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
449 VTOY_JSON_FMT_OBJ_BEGIN();
450 VTOY_JSON_FMT_SINT("exist1", exist1
);
451 VTOY_JSON_FMT_SINT("exist2", exist2
);
452 VTOY_JSON_FMT_OBJ_END();
453 VTOY_JSON_FMT_END(pos
);
455 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
459 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
463 const char *path
= NULL
;
465 path
= vtoy_json_get_string_ex(json
, "path");
468 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
471 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
472 VTOY_JSON_FMT_OBJ_BEGIN();
473 VTOY_JSON_FMT_SINT("exist", exist
);
474 VTOY_JSON_FMT_OBJ_END();
475 VTOY_JSON_FMT_END(pos
);
477 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
484 void ventoy_data_default_control(data_control
*data
)
486 memset(data
, 0, sizeof(data_control
));
488 data
->default_menu_mode
= 1;
489 data
->filter_dot_underscore
= 1;
490 data
->treeview_style
= 1;
491 data
->max_search_level
= -1;
492 data
->menu_timeout
= 0;
494 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
495 strlcpy(data
->help_text_language
, "en_US");
498 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
500 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
501 data1
->treeview_style
!= data2
->treeview_style
||
502 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
503 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
504 data1
->max_search_level
!= data2
->max_search_level
||
505 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
506 data1
->filter_iso
!= data2
->filter_iso
||
507 data1
->filter_wim
!= data2
->filter_wim
||
508 data1
->filter_efi
!= data2
->filter_efi
||
509 data1
->filter_img
!= data2
->filter_img
||
510 data1
->filter_vhd
!= data2
->filter_vhd
||
511 data1
->filter_vtoy
!= data2
->filter_vtoy
||
512 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
513 data1
->linux_remount
!= data2
->linux_remount
||
514 data1
->menu_timeout
!= data2
->menu_timeout
)
519 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
520 strcmp(data1
->default_image
, data2
->default_image
) ||
521 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
522 strcmp(data1
->help_text_language
, data2
->help_text_language
))
530 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
533 data_control
*def
= g_data_control
+ bios_max
;
535 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
537 VTOY_JSON_FMT_KEY_L(L1
, title
);
538 VTOY_JSON_FMT_ARY_BEGIN_N();
540 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
541 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
542 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
543 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
545 if (data
->max_search_level
>= 0)
547 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
551 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
552 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
553 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
554 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
555 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
556 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
557 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
558 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_LINUX_REMOUNT", linux_remount
);
559 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
561 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
562 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
564 if (strcmp(def
->default_search_root
, data
->default_search_root
))
566 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
569 if (strcmp(def
->default_image
, data
->default_image
))
571 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
574 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
575 VTOY_JSON_FMT_END(pos
);
580 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
586 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
587 VTOY_JSON_FMT_OBJ_BEGIN();
589 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
590 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
591 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
592 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
593 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
594 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
596 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
597 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
598 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
599 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
600 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
601 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
602 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
603 VTOY_JSON_FMT_SINT("linux_remount", ctrl
->linux_remount
);
604 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
605 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
606 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
609 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
613 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
614 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
618 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
622 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
623 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
625 VTOY_JSON_FMT_KEY("help_list");
626 VTOY_JSON_FMT_ARY_BEGIN();
628 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
630 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
632 VTOY_JSON_FMT_ARY_ENDEX();
635 VTOY_JSON_FMT_OBJ_END();
636 VTOY_JSON_FMT_END(pos
);
641 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
643 api_get_func(conn
, json
, control
);
647 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
651 data_control
*ctrl
= NULL
;
653 vtoy_json_get_int(json
, "index", &index
);
654 ctrl
= g_data_control
+ index
;
656 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
657 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
658 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
659 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
660 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
661 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
662 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
663 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
664 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
665 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
666 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
667 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
668 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
669 VTOY_JSON_INT("linux_remount", ctrl
->linux_remount
);
670 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
672 VTOY_JSON_STR("default_image", ctrl
->default_image
);
673 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
674 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
675 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
677 ret
= ventoy_data_save_all();
679 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
687 void ventoy_data_default_theme(data_theme
*data
)
689 memset(data
, 0, sizeof(data_theme
));
690 strlcpy(data
->gfxmode
, "1024x768");
691 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
692 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
693 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
696 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
698 if (data1
->display_mode
!= data2
->display_mode
||
699 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
700 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
701 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
702 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
708 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
713 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
722 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
725 path_node
*node
= NULL
;
726 data_theme
*def
= g_data_theme
+ bios_max
;
728 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
730 VTOY_JSON_FMT_KEY_L(L1
, title
);
731 VTOY_JSON_FMT_OBJ_BEGIN_N();
735 if (data
->filelist
->next
)
737 VTOY_JSON_FMT_KEY_L(L2
, "file");
738 VTOY_JSON_FMT_ARY_BEGIN_N();
740 for (node
= data
->filelist
; node
; node
= node
->next
)
742 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
745 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
747 if (def
->default_file
!= data
->default_file
)
749 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
754 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
758 if (data
->display_mode
!= def
->display_mode
)
760 if (display_mode_cli
== data
->display_mode
)
762 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
764 else if (display_mode_serial
== data
->display_mode
)
766 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
768 else if (display_mode_ser_console
== data
->display_mode
)
770 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
774 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
778 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
780 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
781 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
782 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
786 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
787 VTOY_JSON_FMT_ARY_BEGIN_N();
789 for (node
= data
->fontslist
; node
; node
= node
->next
)
791 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
794 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
797 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
798 VTOY_JSON_FMT_END(pos
);
804 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
807 path_node
*node
= NULL
;
809 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
810 VTOY_JSON_FMT_OBJ_BEGIN();
812 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
813 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
814 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
816 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
817 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
818 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
820 VTOY_JSON_FMT_KEY("filelist");
821 VTOY_JSON_FMT_ARY_BEGIN();
822 for (node
= data
->filelist
; node
; node
= node
->next
)
824 VTOY_JSON_FMT_OBJ_BEGIN();
825 VTOY_JSON_FMT_STRN("path", node
->path
);
826 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
827 VTOY_JSON_FMT_OBJ_ENDEX();
829 VTOY_JSON_FMT_ARY_ENDEX();
831 VTOY_JSON_FMT_KEY("fontslist");
832 VTOY_JSON_FMT_ARY_BEGIN();
833 for (node
= data
->fontslist
; node
; node
= node
->next
)
835 VTOY_JSON_FMT_OBJ_BEGIN();
836 VTOY_JSON_FMT_STRN("path", node
->path
);
837 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
838 VTOY_JSON_FMT_OBJ_ENDEX();
840 VTOY_JSON_FMT_ARY_ENDEX();
842 VTOY_JSON_FMT_OBJ_END();
843 VTOY_JSON_FMT_END(pos
);
848 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
850 api_get_func(conn
, json
, theme
);
854 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
858 data_theme
*data
= NULL
;
860 vtoy_json_get_int(json
, "index", &index
);
861 data
= g_data_theme
+ index
;
863 VTOY_JSON_INT("default_file", data
->default_file
);
864 VTOY_JSON_INT("display_mode", data
->display_mode
);
865 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
866 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
867 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
868 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
870 ret
= ventoy_data_save_all();
872 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
876 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
880 const char *path
= NULL
;
881 path_node
*node
= NULL
;
882 path_node
*cur
= NULL
;
883 data_theme
*data
= NULL
;
885 vtoy_json_get_int(json
, "index", &index
);
886 data
= g_data_theme
+ index
;
888 path
= VTOY_JSON_STR_EX("path");
891 node
= zalloc(sizeof(path_node
));
894 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
896 vtoy_list_add(data
->filelist
, cur
, node
);
900 ret
= ventoy_data_save_all();
902 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
906 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
910 const char *path
= NULL
;
911 path_node
*node
= NULL
;
912 path_node
*last
= NULL
;
913 data_theme
*data
= NULL
;
915 vtoy_json_get_int(json
, "index", &index
);
916 data
= g_data_theme
+ index
;
918 path
= VTOY_JSON_STR_EX("path");
921 vtoy_list_del(last
, node
, data
->filelist
, path
);
924 ret
= ventoy_data_save_all();
926 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
931 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
935 const char *path
= NULL
;
936 path_node
*node
= NULL
;
937 path_node
*cur
= NULL
;
938 data_theme
*data
= NULL
;
940 vtoy_json_get_int(json
, "index", &index
);
941 data
= g_data_theme
+ index
;
943 path
= VTOY_JSON_STR_EX("path");
946 node
= zalloc(sizeof(path_node
));
949 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
950 vtoy_list_add(data
->fontslist
, cur
, node
);
954 ret
= ventoy_data_save_all();
956 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
961 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
965 const char *path
= NULL
;
966 path_node
*node
= NULL
;
967 path_node
*last
= NULL
;
968 data_theme
*data
= NULL
;
970 vtoy_json_get_int(json
, "index", &index
);
971 data
= g_data_theme
+ index
;
973 path
= VTOY_JSON_STR_EX("path");
976 vtoy_list_del(last
, node
, data
->fontslist
, path
);
979 ret
= ventoy_data_save_all();
981 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
988 void ventoy_data_default_menu_alias(data_alias
*data
)
990 memset(data
, 0, sizeof(data_alias
));
993 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
995 data_alias_node
*list1
= NULL
;
996 data_alias_node
*list2
= NULL
;
998 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1002 else if (data1
->list
&& data2
->list
)
1004 list1
= data1
->list
;
1005 list2
= data2
->list
;
1007 while (list1
&& list2
)
1009 if ((list1
->type
!= list2
->type
) ||
1010 strcmp(list1
->path
, list2
->path
) ||
1011 strcmp(list1
->alias
, list2
->alias
))
1016 list1
= list1
->next
;
1017 list2
= list2
->next
;
1020 if (list1
== NULL
&& list2
== NULL
)
1035 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1038 data_alias_node
*node
= NULL
;
1040 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1042 VTOY_JSON_FMT_KEY_L(L1
, title
);
1043 VTOY_JSON_FMT_ARY_BEGIN_N();
1045 for (node
= data
->list
; node
; node
= node
->next
)
1047 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1049 if (node
->type
== path_type_file
)
1051 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1055 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1058 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1060 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1063 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1064 VTOY_JSON_FMT_END(pos
);
1070 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1074 data_alias_node
*node
= NULL
;
1076 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1077 VTOY_JSON_FMT_ARY_BEGIN();
1079 for (node
= data
->list
; node
; node
= node
->next
)
1081 VTOY_JSON_FMT_OBJ_BEGIN();
1083 VTOY_JSON_FMT_UINT("type", node
->type
);
1084 VTOY_JSON_FMT_STRN("path", node
->path
);
1085 if (node
->type
== path_type_file
)
1087 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1091 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1094 VTOY_JSON_FMT_SINT("valid", valid
);
1095 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1097 VTOY_JSON_FMT_OBJ_ENDEX();
1100 VTOY_JSON_FMT_ARY_END();
1101 VTOY_JSON_FMT_END(pos
);
1106 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1108 api_get_func(conn
, json
, menu_alias
);
1112 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1115 ret
= ventoy_data_save_all();
1117 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1121 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1125 int type
= path_type_file
;
1126 const char *path
= NULL
;
1127 const char *alias
= NULL
;
1128 data_alias_node
*node
= NULL
;
1129 data_alias_node
*cur
= NULL
;
1130 data_alias
*data
= NULL
;
1132 vtoy_json_get_int(json
, "index", &index
);
1133 data
= g_data_menu_alias
+ index
;
1135 vtoy_json_get_int(json
, "type", &type
);
1137 path
= VTOY_JSON_STR_EX("path");
1138 alias
= VTOY_JSON_STR_EX("alias");
1141 node
= zalloc(sizeof(data_alias_node
));
1145 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1146 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1148 vtoy_list_add(data
->list
, cur
, node
);
1152 ret
= ventoy_data_save_all();
1154 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1158 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1162 const char *path
= NULL
;
1163 data_alias_node
*last
= NULL
;
1164 data_alias_node
*node
= NULL
;
1165 data_alias
*data
= NULL
;
1167 vtoy_json_get_int(json
, "index", &index
);
1168 data
= g_data_menu_alias
+ index
;
1170 path
= VTOY_JSON_STR_EX("path");
1173 vtoy_list_del(last
, node
, data
->list
, path
);
1176 ret
= ventoy_data_save_all();
1178 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1185 void ventoy_data_default_menu_tip(data_tip
*data
)
1187 memset(data
, 0, sizeof(data_tip
));
1189 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1190 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1191 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1194 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1196 data_tip_node
*list1
= NULL
;
1197 data_tip_node
*list2
= NULL
;
1199 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1204 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1208 else if (data1
->list
&& data2
->list
)
1210 list1
= data1
->list
;
1211 list2
= data2
->list
;
1213 while (list1
&& list2
)
1215 if ((list1
->type
!= list2
->type
) ||
1216 strcmp(list1
->path
, list2
->path
) ||
1217 strcmp(list1
->tip
, list2
->tip
))
1222 list1
= list1
->next
;
1223 list2
= list2
->next
;
1226 if (list1
== NULL
&& list2
== NULL
)
1241 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1244 data_tip_node
*node
= NULL
;
1245 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1247 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1248 VTOY_JSON_FMT_KEY_L(L1
, title
);
1249 VTOY_JSON_FMT_OBJ_BEGIN_N();
1251 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1252 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1253 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1257 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1258 VTOY_JSON_FMT_ARY_BEGIN_N();
1260 for (node
= data
->list
; node
; node
= node
->next
)
1262 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1264 if (node
->type
== path_type_file
)
1266 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1270 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1272 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1274 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1277 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1280 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1282 VTOY_JSON_FMT_END(pos
);
1288 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1292 data_tip_node
*node
= NULL
;
1294 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1296 VTOY_JSON_FMT_OBJ_BEGIN();
1298 VTOY_JSON_FMT_STRN("left", data
->left
);
1299 VTOY_JSON_FMT_STRN("top", data
->top
);
1300 VTOY_JSON_FMT_STRN("color", data
->color
);
1302 VTOY_JSON_FMT_KEY("tips");
1303 VTOY_JSON_FMT_ARY_BEGIN();
1305 for (node
= data
->list
; node
; node
= node
->next
)
1307 VTOY_JSON_FMT_OBJ_BEGIN();
1309 VTOY_JSON_FMT_UINT("type", node
->type
);
1310 VTOY_JSON_FMT_STRN("path", node
->path
);
1311 if (node
->type
== path_type_file
)
1313 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1317 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1320 VTOY_JSON_FMT_SINT("valid", valid
);
1321 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1323 VTOY_JSON_FMT_OBJ_ENDEX();
1326 VTOY_JSON_FMT_ARY_ENDEX();
1328 VTOY_JSON_FMT_OBJ_END();
1329 VTOY_JSON_FMT_END(pos
);
1334 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1336 api_get_func(conn
, json
, menu_tip
);
1340 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1344 data_tip
*data
= NULL
;
1346 vtoy_json_get_int(json
, "index", &index
);
1347 data
= g_data_menu_tip
+ index
;
1349 VTOY_JSON_STR("left", data
->left
);
1350 VTOY_JSON_STR("top", data
->top
);
1351 VTOY_JSON_STR("color", data
->color
);
1353 ret
= ventoy_data_save_all();
1355 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1359 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1363 int type
= path_type_file
;
1364 const char *path
= NULL
;
1365 const char *tip
= NULL
;
1366 data_tip_node
*node
= NULL
;
1367 data_tip_node
*cur
= NULL
;
1368 data_tip
*data
= NULL
;
1370 vtoy_json_get_int(json
, "index", &index
);
1371 data
= g_data_menu_tip
+ index
;
1373 vtoy_json_get_int(json
, "type", &type
);
1375 path
= VTOY_JSON_STR_EX("path");
1376 tip
= VTOY_JSON_STR_EX("tip");
1379 node
= zalloc(sizeof(data_tip_node
));
1383 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1384 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1386 vtoy_list_add(data
->list
, cur
, node
);
1390 ret
= ventoy_data_save_all();
1392 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1396 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1400 const char *path
= NULL
;
1401 data_tip_node
*last
= NULL
;
1402 data_tip_node
*node
= NULL
;
1403 data_tip
*data
= NULL
;
1405 vtoy_json_get_int(json
, "index", &index
);
1406 data
= g_data_menu_tip
+ index
;
1408 path
= VTOY_JSON_STR_EX("path");
1411 vtoy_list_del(last
, node
, data
->list
, path
);
1414 ret
= ventoy_data_save_all();
1416 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1423 void ventoy_data_default_menu_class(data_class
*data
)
1425 memset(data
, 0, sizeof(data_class
));
1428 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1430 data_class_node
*list1
= NULL
;
1431 data_class_node
*list2
= NULL
;
1433 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1437 else if (data1
->list
&& data2
->list
)
1439 list1
= data1
->list
;
1440 list2
= data2
->list
;
1442 while (list1
&& list2
)
1444 if ((list1
->type
!= list2
->type
) ||
1445 strcmp(list1
->path
, list2
->path
) ||
1446 strcmp(list1
->class, list2
->class))
1451 list1
= list1
->next
;
1452 list2
= list2
->next
;
1455 if (list1
== NULL
&& list2
== NULL
)
1470 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1473 data_class_node
*node
= NULL
;
1475 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1477 VTOY_JSON_FMT_KEY_L(L1
, title
);
1478 VTOY_JSON_FMT_ARY_BEGIN_N();
1480 for (node
= data
->list
; node
; node
= node
->next
)
1482 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1484 if (node
->type
== class_type_key
)
1486 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1488 else if (node
->type
== class_type_dir
)
1490 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1494 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1496 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1498 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1501 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1502 VTOY_JSON_FMT_END(pos
);
1508 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1512 data_class_node
*node
= NULL
;
1514 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1515 VTOY_JSON_FMT_ARY_BEGIN();
1517 for (node
= data
->list
; node
; node
= node
->next
)
1519 VTOY_JSON_FMT_OBJ_BEGIN();
1521 VTOY_JSON_FMT_UINT("type", node
->type
);
1522 VTOY_JSON_FMT_STRN("path", node
->path
);
1524 if (node
->type
== class_type_key
)
1530 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1532 VTOY_JSON_FMT_SINT("valid", valid
);
1534 VTOY_JSON_FMT_STRN("class", node
->class);
1536 VTOY_JSON_FMT_OBJ_ENDEX();
1539 VTOY_JSON_FMT_ARY_END();
1540 VTOY_JSON_FMT_END(pos
);
1546 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1548 api_get_func(conn
, json
, menu_class
);
1552 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1555 ret
= ventoy_data_save_all();
1557 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1561 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1565 int type
= class_type_key
;
1566 const char *path
= NULL
;
1567 const char *class = NULL
;
1568 data_class_node
*node
= NULL
;
1569 data_class_node
*cur
= NULL
;
1570 data_class
*data
= NULL
;
1572 vtoy_json_get_int(json
, "index", &index
);
1573 data
= g_data_menu_class
+ index
;
1575 vtoy_json_get_int(json
, "type", &type
);
1577 path
= VTOY_JSON_STR_EX("path");
1578 class = VTOY_JSON_STR_EX("class");
1581 node
= zalloc(sizeof(data_class_node
));
1586 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1587 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1589 vtoy_list_add(data
->list
, cur
, node
);
1593 ret
= ventoy_data_save_all();
1595 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1599 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1603 const char *path
= NULL
;
1604 data_class_node
*last
= NULL
;
1605 data_class_node
*node
= NULL
;
1606 data_class
*data
= NULL
;
1608 vtoy_json_get_int(json
, "index", &index
);
1609 data
= g_data_menu_class
+ index
;
1611 path
= VTOY_JSON_STR_EX("path");
1614 vtoy_list_del(last
, node
, data
->list
, path
);
1617 ret
= ventoy_data_save_all();
1619 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1626 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1628 memset(data
, 0, sizeof(data_auto_memdisk
));
1631 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1633 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1636 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1639 path_node
*node
= NULL
;
1641 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1643 VTOY_JSON_FMT_KEY_L(L1
, title
);
1644 VTOY_JSON_FMT_ARY_BEGIN_N();
1646 for (node
= data
->list
; node
; node
= node
->next
)
1648 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1651 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1652 VTOY_JSON_FMT_END(pos
);
1657 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1661 path_node
*node
= NULL
;
1663 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1664 VTOY_JSON_FMT_ARY_BEGIN();
1666 for (node
= data
->list
; node
; node
= node
->next
)
1668 VTOY_JSON_FMT_OBJ_BEGIN();
1670 VTOY_JSON_FMT_STRN("path", node
->path
);
1671 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1672 VTOY_JSON_FMT_SINT("valid", valid
);
1674 VTOY_JSON_FMT_OBJ_ENDEX();
1677 VTOY_JSON_FMT_ARY_END();
1678 VTOY_JSON_FMT_END(pos
);
1683 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1685 api_get_func(conn
, json
, auto_memdisk
);
1689 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1693 ret
= ventoy_data_save_all();
1695 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1699 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1703 const char *path
= NULL
;
1704 path_node
*node
= NULL
;
1705 path_node
*cur
= NULL
;
1706 data_auto_memdisk
*data
= NULL
;
1708 vtoy_json_get_int(json
, "index", &index
);
1709 data
= g_data_auto_memdisk
+ index
;
1711 path
= VTOY_JSON_STR_EX("path");
1714 node
= zalloc(sizeof(path_node
));
1717 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1718 vtoy_list_add(data
->list
, cur
, node
);
1722 ret
= ventoy_data_save_all();
1724 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1728 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1732 const char *path
= NULL
;
1733 path_node
*last
= NULL
;
1734 path_node
*node
= NULL
;
1735 data_auto_memdisk
*data
= NULL
;
1737 vtoy_json_get_int(json
, "index", &index
);
1738 data
= g_data_auto_memdisk
+ index
;
1740 path
= VTOY_JSON_STR_EX("path");
1743 vtoy_list_del(last
, node
, data
->list
, path
);
1746 ret
= ventoy_data_save_all();
1748 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1755 void ventoy_data_default_image_list(data_image_list
*data
)
1757 memset(data
, 0, sizeof(data_image_list
));
1760 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1762 if (data1
->type
!= data2
->type
)
1764 if (data1
->list
|| data2
->list
)
1774 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1777 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1780 path_node
*node
= NULL
;
1789 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1791 if (data
->type
== 0)
1793 VTOY_JSON_FMT_KEY_L(L1
, "image_list");
1797 VTOY_JSON_FMT_KEY_L(L1
, "image_blacklist");
1800 VTOY_JSON_FMT_ARY_BEGIN_N();
1802 for (node
= data
->list
; node
; node
= node
->next
)
1804 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1807 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1808 VTOY_JSON_FMT_END(pos
);
1813 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1817 path_node
*node
= NULL
;
1819 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1821 VTOY_JSON_FMT_OBJ_BEGIN();
1822 VTOY_JSON_FMT_SINT("type", data
->type
);
1824 VTOY_JSON_FMT_KEY("list");
1825 VTOY_JSON_FMT_ARY_BEGIN();
1827 for (node
= data
->list
; node
; node
= node
->next
)
1829 VTOY_JSON_FMT_OBJ_BEGIN();
1831 VTOY_JSON_FMT_STRN("path", node
->path
);
1832 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1833 VTOY_JSON_FMT_SINT("valid", valid
);
1835 VTOY_JSON_FMT_OBJ_ENDEX();
1838 VTOY_JSON_FMT_ARY_ENDEX();
1839 VTOY_JSON_FMT_OBJ_END();
1841 VTOY_JSON_FMT_END(pos
);
1846 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1848 api_get_func(conn
, json
, image_list
);
1852 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1856 data_image_list
*data
= NULL
;
1858 vtoy_json_get_int(json
, "index", &index
);
1859 data
= g_data_image_list
+ index
;
1861 VTOY_JSON_INT("type", data
->type
);
1863 ret
= ventoy_data_save_all();
1865 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1869 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1873 const char *path
= NULL
;
1874 path_node
*node
= NULL
;
1875 path_node
*cur
= NULL
;
1876 data_image_list
*data
= NULL
;
1878 vtoy_json_get_int(json
, "index", &index
);
1879 data
= g_data_image_list
+ index
;
1881 path
= VTOY_JSON_STR_EX("path");
1884 node
= zalloc(sizeof(path_node
));
1887 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1888 vtoy_list_add(data
->list
, cur
, node
);
1892 ret
= ventoy_data_save_all();
1894 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1898 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1902 const char *path
= NULL
;
1903 path_node
*last
= NULL
;
1904 path_node
*node
= NULL
;
1905 data_image_list
*data
= NULL
;
1907 vtoy_json_get_int(json
, "index", &index
);
1908 data
= g_data_image_list
+ index
;
1910 path
= VTOY_JSON_STR_EX("path");
1913 vtoy_list_del(last
, node
, data
->list
, path
);
1916 ret
= ventoy_data_save_all();
1918 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1925 void ventoy_data_default_password(data_password
*data
)
1927 memset(data
, 0, sizeof(data_password
));
1930 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1932 menu_password
*list1
= NULL
;
1933 menu_password
*list2
= NULL
;
1935 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1936 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1937 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1938 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1939 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1940 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1941 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1947 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1951 else if (data1
->list
&& data2
->list
)
1953 list1
= data1
->list
;
1954 list2
= data2
->list
;
1956 while (list1
&& list2
)
1958 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1963 list1
= list1
->next
;
1964 list2
= list2
->next
;
1967 if (list1
== NULL
&& list2
== NULL
)
1982 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1985 menu_password
*node
= NULL
;
1986 data_password
*def
= g_data_password
+ bios_max
;
1988 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1989 VTOY_JSON_FMT_KEY_L(L1
, title
);
1990 VTOY_JSON_FMT_OBJ_BEGIN_N();
1992 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1993 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1994 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1995 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
1996 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
1997 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
1998 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
2002 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
2003 VTOY_JSON_FMT_ARY_BEGIN_N();
2005 for (node
= data
->list
; node
; node
= node
->next
)
2007 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2009 if (node
->type
== 0)
2011 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2015 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2017 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2019 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2022 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2025 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2027 VTOY_JSON_FMT_END(pos
);
2033 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2037 menu_password
*node
= NULL
;
2039 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2041 VTOY_JSON_FMT_OBJ_BEGIN();
2043 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2044 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2045 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2046 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2047 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2048 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2049 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2051 VTOY_JSON_FMT_KEY("list");
2052 VTOY_JSON_FMT_ARY_BEGIN();
2054 for (node
= data
->list
; node
; node
= node
->next
)
2056 VTOY_JSON_FMT_OBJ_BEGIN();
2058 VTOY_JSON_FMT_SINT("type", node
->type
);
2059 VTOY_JSON_FMT_STRN("path", node
->path
);
2060 if (node
->type
== path_type_file
)
2062 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2066 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2069 VTOY_JSON_FMT_SINT("valid", valid
);
2070 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2072 VTOY_JSON_FMT_OBJ_ENDEX();
2075 VTOY_JSON_FMT_ARY_ENDEX();
2077 VTOY_JSON_FMT_OBJ_END();
2078 VTOY_JSON_FMT_END(pos
);
2083 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2085 api_get_func(conn
, json
, password
);
2089 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2093 data_password
*data
= NULL
;
2095 vtoy_json_get_int(json
, "index", &index
);
2096 data
= g_data_password
+ index
;
2098 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2099 VTOY_JSON_STR("isopwd", data
->isopwd
);
2100 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2101 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2102 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2103 VTOY_JSON_STR("efipwd", data
->efipwd
);
2104 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2106 ret
= ventoy_data_save_all();
2108 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2112 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2117 const char *path
= NULL
;
2118 const char *pwd
= NULL
;
2119 menu_password
*node
= NULL
;
2120 menu_password
*cur
= NULL
;
2121 data_password
*data
= NULL
;
2123 vtoy_json_get_int(json
, "index", &index
);
2124 data
= g_data_password
+ index
;
2126 vtoy_json_get_int(json
, "type", &type
);
2128 path
= VTOY_JSON_STR_EX("path");
2129 pwd
= VTOY_JSON_STR_EX("pwd");
2132 node
= zalloc(sizeof(menu_password
));
2136 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2137 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2139 vtoy_list_add(data
->list
, cur
, node
);
2143 ret
= ventoy_data_save_all();
2145 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2149 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2153 const char *path
= NULL
;
2154 menu_password
*last
= NULL
;
2155 menu_password
*node
= NULL
;
2156 data_password
*data
= NULL
;
2158 vtoy_json_get_int(json
, "index", &index
);
2159 data
= g_data_password
+ index
;
2161 path
= VTOY_JSON_STR_EX("path");
2164 vtoy_list_del(last
, node
, data
->list
, path
);
2167 ret
= ventoy_data_save_all();
2169 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2176 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2178 memset(data
, 0, sizeof(data_conf_replace
));
2181 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2183 conf_replace_node
*list1
= NULL
;
2184 conf_replace_node
*list2
= NULL
;
2186 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2190 else if (data1
->list
&& data2
->list
)
2192 list1
= data1
->list
;
2193 list2
= data2
->list
;
2195 while (list1
&& list2
)
2197 if (list1
->image
!= list2
->image
||
2198 strcmp(list1
->path
, list2
->path
) ||
2199 strcmp(list1
->org
, list2
->org
) ||
2200 strcmp(list1
->new, list2
->new)
2206 list1
= list1
->next
;
2207 list2
= list2
->next
;
2210 if (list1
== NULL
&& list2
== NULL
)
2225 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2228 conf_replace_node
*node
= NULL
;
2230 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2232 VTOY_JSON_FMT_KEY_L(L1
, title
);
2233 VTOY_JSON_FMT_ARY_BEGIN_N();
2235 for (node
= data
->list
; node
; node
= node
->next
)
2237 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2239 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2240 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2241 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2244 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2247 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2250 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2251 VTOY_JSON_FMT_END(pos
);
2257 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2260 conf_replace_node
*node
= NULL
;
2262 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2263 VTOY_JSON_FMT_ARY_BEGIN();
2265 for (node
= data
->list
; node
; node
= node
->next
)
2267 VTOY_JSON_FMT_OBJ_BEGIN();
2269 VTOY_JSON_FMT_STRN("path", node
->path
);
2270 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2271 VTOY_JSON_FMT_STRN("org", node
->org
);
2272 VTOY_JSON_FMT_STRN("new", node
->new);
2273 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2274 VTOY_JSON_FMT_SINT("img", node
->image
);
2276 VTOY_JSON_FMT_OBJ_ENDEX();
2279 VTOY_JSON_FMT_ARY_END();
2280 VTOY_JSON_FMT_END(pos
);
2285 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2287 api_get_func(conn
, json
, conf_replace
);
2291 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2294 ret
= ventoy_data_save_all();
2296 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2300 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2305 const char *path
= NULL
;
2306 const char *org
= NULL
;
2307 const char *new = NULL
;
2308 conf_replace_node
*node
= NULL
;
2309 conf_replace_node
*cur
= NULL
;
2310 data_conf_replace
*data
= NULL
;
2312 vtoy_json_get_int(json
, "img", &image
);
2314 vtoy_json_get_int(json
, "index", &index
);
2315 data
= g_data_conf_replace
+ index
;
2317 path
= VTOY_JSON_STR_EX("path");
2318 org
= VTOY_JSON_STR_EX("org");
2319 new = VTOY_JSON_STR_EX("new");
2320 if (path
&& org
&& new)
2322 node
= zalloc(sizeof(conf_replace_node
));
2325 node
->image
= image
;
2326 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2327 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2328 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2330 vtoy_list_add(data
->list
, cur
, node
);
2334 ret
= ventoy_data_save_all();
2336 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2340 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2344 const char *path
= NULL
;
2345 conf_replace_node
*last
= NULL
;
2346 conf_replace_node
*node
= NULL
;
2347 data_conf_replace
*data
= NULL
;
2349 vtoy_json_get_int(json
, "index", &index
);
2350 data
= g_data_conf_replace
+ index
;
2352 path
= VTOY_JSON_STR_EX("path");
2355 vtoy_list_del(last
, node
, data
->list
, path
);
2358 ret
= ventoy_data_save_all();
2360 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2368 void ventoy_data_default_dud(data_dud
*data
)
2370 memset(data
, 0, sizeof(data_dud
));
2373 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2375 dud_node
*list1
= NULL
;
2376 dud_node
*list2
= NULL
;
2378 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2382 else if (data1
->list
&& data2
->list
)
2384 list1
= data1
->list
;
2385 list2
= data2
->list
;
2387 while (list1
&& list2
)
2389 if (strcmp(list1
->path
, list2
->path
))
2394 /* no need to compare dud list with default */
2395 list1
= list1
->next
;
2396 list2
= list2
->next
;
2399 if (list1
== NULL
&& list2
== NULL
)
2414 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2417 dud_node
*node
= NULL
;
2418 path_node
*pathnode
= NULL
;
2420 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2422 VTOY_JSON_FMT_KEY_L(L1
, title
);
2423 VTOY_JSON_FMT_ARY_BEGIN_N();
2425 for (node
= data
->list
; node
; node
= node
->next
)
2427 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2428 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2430 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2431 VTOY_JSON_FMT_ARY_BEGIN_N();
2432 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2434 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2436 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2438 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2441 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2442 VTOY_JSON_FMT_END(pos
);
2448 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2452 dud_node
*node
= NULL
;
2453 path_node
*pathnode
= NULL
;
2455 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2456 VTOY_JSON_FMT_ARY_BEGIN();
2458 for (node
= data
->list
; node
; node
= node
->next
)
2460 VTOY_JSON_FMT_OBJ_BEGIN();
2462 VTOY_JSON_FMT_STRN("path", node
->path
);
2463 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2464 VTOY_JSON_FMT_SINT("valid", valid
);
2467 VTOY_JSON_FMT_KEY("list");
2468 VTOY_JSON_FMT_ARY_BEGIN();
2469 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2471 VTOY_JSON_FMT_OBJ_BEGIN();
2472 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2474 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2475 VTOY_JSON_FMT_SINT("valid", valid
);
2476 VTOY_JSON_FMT_OBJ_ENDEX();
2478 VTOY_JSON_FMT_ARY_ENDEX();
2481 VTOY_JSON_FMT_OBJ_ENDEX();
2484 VTOY_JSON_FMT_ARY_END();
2485 VTOY_JSON_FMT_END(pos
);
2490 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2492 api_get_func(conn
, json
, dud
);
2496 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2499 ret
= ventoy_data_save_all();
2501 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2506 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2510 const char *path
= NULL
;
2511 dud_node
*node
= NULL
;
2512 dud_node
*cur
= NULL
;
2513 data_dud
*data
= NULL
;
2514 VTOY_JSON
*array
= NULL
;
2516 vtoy_json_get_int(json
, "index", &index
);
2517 data
= g_data_dud
+ index
;
2519 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2520 path
= VTOY_JSON_STR_EX("path");
2523 node
= zalloc(sizeof(dud_node
));
2526 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2527 node
->list
= ventoy_path_node_add_array(array
);
2529 vtoy_list_add(data
->list
, cur
, node
);
2533 ret
= ventoy_data_save_all();
2535 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2539 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2543 const char *path
= NULL
;
2544 dud_node
*last
= NULL
;
2545 dud_node
*node
= NULL
;
2546 data_dud
*data
= NULL
;
2548 vtoy_json_get_int(json
, "index", &index
);
2549 data
= g_data_dud
+ index
;
2551 path
= VTOY_JSON_STR_EX("path");
2554 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2557 ret
= ventoy_data_save_all();
2559 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2564 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2568 const char *path
= NULL
;
2569 const char *outpath
= NULL
;
2570 path_node
*pcur
= NULL
;
2571 path_node
*pnode
= NULL
;
2572 dud_node
*node
= NULL
;
2573 data_dud
*data
= NULL
;
2575 vtoy_json_get_int(json
, "index", &index
);
2576 data
= g_data_dud
+ index
;
2578 path
= VTOY_JSON_STR_EX("path");
2579 outpath
= VTOY_JSON_STR_EX("outpath");
2580 if (path
&& outpath
)
2582 for (node
= data
->list
; node
; node
= node
->next
)
2584 if (strcmp(outpath
, node
->path
) == 0)
2586 pnode
= zalloc(sizeof(path_node
));
2589 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2590 vtoy_list_add(node
->list
, pcur
, pnode
);
2598 ret
= ventoy_data_save_all();
2600 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2604 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2608 const char *path
= NULL
;
2609 const char *outpath
= NULL
;
2610 path_node
*plast
= NULL
;
2611 path_node
*pnode
= NULL
;
2612 dud_node
*node
= NULL
;
2613 data_dud
*data
= NULL
;
2615 vtoy_json_get_int(json
, "index", &index
);
2616 data
= g_data_dud
+ index
;
2618 path
= VTOY_JSON_STR_EX("path");
2619 outpath
= VTOY_JSON_STR_EX("outpath");
2620 if (path
&& outpath
)
2622 for (node
= data
->list
; node
; node
= node
->next
)
2624 if (strcmp(outpath
, node
->path
) == 0)
2626 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2632 ret
= ventoy_data_save_all();
2634 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2642 void ventoy_data_default_auto_install(data_auto_install
*data
)
2644 memset(data
, 0, sizeof(data_auto_install
));
2647 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2649 auto_install_node
*list1
= NULL
;
2650 auto_install_node
*list2
= NULL
;
2652 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2656 else if (data1
->list
&& data2
->list
)
2658 list1
= data1
->list
;
2659 list2
= data2
->list
;
2661 while (list1
&& list2
)
2663 if (list1
->timeout
!= list2
->timeout
||
2664 list1
->autosel
!= list2
->autosel
||
2665 strcmp(list1
->path
, list2
->path
))
2670 /* no need to compare auto install list with default */
2671 list1
= list1
->next
;
2672 list2
= list2
->next
;
2675 if (list1
== NULL
&& list2
== NULL
)
2690 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2693 auto_install_node
*node
= NULL
;
2694 path_node
*pathnode
= NULL
;
2696 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2698 VTOY_JSON_FMT_KEY_L(L1
, title
);
2699 VTOY_JSON_FMT_ARY_BEGIN_N();
2701 for (node
= data
->list
; node
; node
= node
->next
)
2703 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2704 if (node
->type
== 0)
2706 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2710 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2714 VTOY_JSON_FMT_KEY_L(L3
, "template");
2715 VTOY_JSON_FMT_ARY_BEGIN_N();
2716 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2718 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2720 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2722 if (node
->timeouten
)
2724 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2727 if (node
->autoselen
)
2729 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2732 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2735 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2736 VTOY_JSON_FMT_END(pos
);
2742 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2746 auto_install_node
*node
= NULL
;
2747 path_node
*pathnode
= NULL
;
2749 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2750 VTOY_JSON_FMT_ARY_BEGIN();
2752 for (node
= data
->list
; node
; node
= node
->next
)
2754 VTOY_JSON_FMT_OBJ_BEGIN();
2756 VTOY_JSON_FMT_STRN("path", node
->path
);
2758 if (node
->type
== 0)
2760 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2764 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2766 VTOY_JSON_FMT_SINT("valid", valid
);
2767 VTOY_JSON_FMT_SINT("type", node
->type
);
2769 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2770 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2772 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2773 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2775 VTOY_JSON_FMT_KEY("list");
2776 VTOY_JSON_FMT_ARY_BEGIN();
2777 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2779 VTOY_JSON_FMT_OBJ_BEGIN();
2780 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2782 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2783 VTOY_JSON_FMT_SINT("valid", valid
);
2784 VTOY_JSON_FMT_OBJ_ENDEX();
2786 VTOY_JSON_FMT_ARY_ENDEX();
2789 VTOY_JSON_FMT_OBJ_ENDEX();
2792 VTOY_JSON_FMT_ARY_END();
2793 VTOY_JSON_FMT_END(pos
);
2798 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2800 api_get_func(conn
, json
, auto_install
);
2804 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2810 uint8_t timeouten
= 0;
2811 uint8_t autoselen
= 0;
2812 auto_install_node
*node
= NULL
;
2813 data_auto_install
*data
= NULL
;
2815 vtoy_json_get_int(json
, "index", &index
);
2816 vtoy_json_get_int(json
, "id", &id
);
2818 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2819 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2821 data
= g_data_auto_install
+ index
;
2825 for (node
= data
->list
; node
; node
= node
->next
)
2829 node
->timeouten
= (int)timeouten
;
2830 node
->autoselen
= (int)autoselen
;
2831 VTOY_JSON_INT("timeout", node
->timeout
);
2832 VTOY_JSON_INT("autosel", node
->autosel
);
2838 ret
= ventoy_data_save_all();
2840 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2845 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2850 const char *path
= NULL
;
2851 auto_install_node
*node
= NULL
;
2852 auto_install_node
*cur
= NULL
;
2853 data_auto_install
*data
= NULL
;
2854 VTOY_JSON
*array
= NULL
;
2856 vtoy_json_get_int(json
, "type", &type
);
2857 vtoy_json_get_int(json
, "index", &index
);
2858 data
= g_data_auto_install
+ index
;
2860 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2861 path
= VTOY_JSON_STR_EX("path");
2864 node
= zalloc(sizeof(auto_install_node
));
2868 node
->timeouten
= 0;
2869 node
->autoselen
= 0;
2872 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2873 node
->list
= ventoy_path_node_add_array(array
);
2875 vtoy_list_add(data
->list
, cur
, node
);
2879 ret
= ventoy_data_save_all();
2881 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2885 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2889 const char *path
= NULL
;
2890 auto_install_node
*last
= NULL
;
2891 auto_install_node
*node
= NULL
;
2892 data_auto_install
*data
= NULL
;
2894 vtoy_json_get_int(json
, "index", &index
);
2895 data
= g_data_auto_install
+ index
;
2897 path
= VTOY_JSON_STR_EX("path");
2900 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2903 ret
= ventoy_data_save_all();
2905 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2909 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2913 const char *path
= NULL
;
2914 const char *outpath
= NULL
;
2915 path_node
*pcur
= NULL
;
2916 path_node
*pnode
= NULL
;
2917 auto_install_node
*node
= NULL
;
2918 data_auto_install
*data
= NULL
;
2920 vtoy_json_get_int(json
, "index", &index
);
2921 data
= g_data_auto_install
+ index
;
2923 path
= VTOY_JSON_STR_EX("path");
2924 outpath
= VTOY_JSON_STR_EX("outpath");
2925 if (path
&& outpath
)
2927 for (node
= data
->list
; node
; node
= node
->next
)
2929 if (strcmp(outpath
, node
->path
) == 0)
2931 pnode
= zalloc(sizeof(path_node
));
2934 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2935 vtoy_list_add(node
->list
, pcur
, pnode
);
2943 ret
= ventoy_data_save_all();
2945 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2949 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2953 const char *path
= NULL
;
2954 const char *outpath
= NULL
;
2955 path_node
*plast
= NULL
;
2956 path_node
*pnode
= NULL
;
2957 auto_install_node
*node
= NULL
;
2958 data_auto_install
*data
= NULL
;
2960 vtoy_json_get_int(json
, "index", &index
);
2961 data
= g_data_auto_install
+ index
;
2963 path
= VTOY_JSON_STR_EX("path");
2964 outpath
= VTOY_JSON_STR_EX("outpath");
2965 if (path
&& outpath
)
2967 for (node
= data
->list
; node
; node
= node
->next
)
2969 if (strcmp(outpath
, node
->path
) == 0)
2971 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2977 ret
= ventoy_data_save_all();
2979 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2988 void ventoy_data_default_persistence(data_persistence
*data
)
2990 memset(data
, 0, sizeof(data_persistence
));
2993 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2995 persistence_node
*list1
= NULL
;
2996 persistence_node
*list2
= NULL
;
2998 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3002 else if (data1
->list
&& data2
->list
)
3004 list1
= data1
->list
;
3005 list2
= data2
->list
;
3007 while (list1
&& list2
)
3009 if (list1
->timeout
!= list2
->timeout
||
3010 list1
->autosel
!= list2
->autosel
||
3011 strcmp(list1
->path
, list2
->path
))
3016 /* no need to compare auto install list with default */
3017 list1
= list1
->next
;
3018 list2
= list2
->next
;
3021 if (list1
== NULL
&& list2
== NULL
)
3036 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3039 persistence_node
*node
= NULL
;
3040 path_node
*pathnode
= NULL
;
3042 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3044 VTOY_JSON_FMT_KEY_L(L1
, title
);
3045 VTOY_JSON_FMT_ARY_BEGIN_N();
3047 for (node
= data
->list
; node
; node
= node
->next
)
3049 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3050 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3051 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3052 VTOY_JSON_FMT_ARY_BEGIN_N();
3053 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3055 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3057 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3059 if (node
->timeouten
)
3061 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3064 if (node
->autoselen
)
3066 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3069 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3072 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3073 VTOY_JSON_FMT_END(pos
);
3079 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3083 persistence_node
*node
= NULL
;
3084 path_node
*pathnode
= NULL
;
3086 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3087 VTOY_JSON_FMT_ARY_BEGIN();
3089 for (node
= data
->list
; node
; node
= node
->next
)
3091 VTOY_JSON_FMT_OBJ_BEGIN();
3093 VTOY_JSON_FMT_STRN("path", node
->path
);
3095 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3096 VTOY_JSON_FMT_SINT("valid", valid
);
3097 VTOY_JSON_FMT_SINT("type", node
->type
);
3099 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3100 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3102 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3103 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3105 VTOY_JSON_FMT_KEY("list");
3106 VTOY_JSON_FMT_ARY_BEGIN();
3107 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3109 VTOY_JSON_FMT_OBJ_BEGIN();
3110 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3112 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3113 VTOY_JSON_FMT_SINT("valid", valid
);
3114 VTOY_JSON_FMT_OBJ_ENDEX();
3116 VTOY_JSON_FMT_ARY_ENDEX();
3119 VTOY_JSON_FMT_OBJ_ENDEX();
3122 VTOY_JSON_FMT_ARY_END();
3123 VTOY_JSON_FMT_END(pos
);
3128 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3130 api_get_func(conn
, json
, persistence
);
3134 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3140 uint8_t timeouten
= 0;
3141 uint8_t autoselen
= 0;
3142 persistence_node
*node
= NULL
;
3143 data_persistence
*data
= NULL
;
3145 vtoy_json_get_int(json
, "index", &index
);
3146 vtoy_json_get_int(json
, "id", &id
);
3148 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3149 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3151 data
= g_data_persistence
+ index
;
3155 for (node
= data
->list
; node
; node
= node
->next
)
3159 node
->timeouten
= (int)timeouten
;
3160 node
->autoselen
= (int)autoselen
;
3161 VTOY_JSON_INT("timeout", node
->timeout
);
3162 VTOY_JSON_INT("autosel", node
->autosel
);
3168 ret
= ventoy_data_save_all();
3170 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3175 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3179 const char *path
= NULL
;
3180 persistence_node
*node
= NULL
;
3181 persistence_node
*cur
= NULL
;
3182 data_persistence
*data
= NULL
;
3183 VTOY_JSON
*array
= NULL
;
3185 vtoy_json_get_int(json
, "index", &index
);
3186 data
= g_data_persistence
+ index
;
3188 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3189 path
= VTOY_JSON_STR_EX("path");
3192 node
= zalloc(sizeof(persistence_node
));
3195 node
->timeouten
= 0;
3196 node
->autoselen
= 0;
3199 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3200 node
->list
= ventoy_path_node_add_array(array
);
3202 vtoy_list_add(data
->list
, cur
, node
);
3206 ret
= ventoy_data_save_all();
3208 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3212 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3216 const char *path
= NULL
;
3217 persistence_node
*last
= NULL
;
3218 persistence_node
*node
= NULL
;
3219 data_persistence
*data
= NULL
;
3221 vtoy_json_get_int(json
, "index", &index
);
3222 data
= g_data_persistence
+ index
;
3224 path
= VTOY_JSON_STR_EX("path");
3227 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3230 ret
= ventoy_data_save_all();
3232 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3236 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3240 const char *path
= NULL
;
3241 const char *outpath
= NULL
;
3242 path_node
*pcur
= NULL
;
3243 path_node
*pnode
= NULL
;
3244 persistence_node
*node
= NULL
;
3245 data_persistence
*data
= NULL
;
3247 vtoy_json_get_int(json
, "index", &index
);
3248 data
= g_data_persistence
+ index
;
3250 path
= VTOY_JSON_STR_EX("path");
3251 outpath
= VTOY_JSON_STR_EX("outpath");
3252 if (path
&& outpath
)
3254 for (node
= data
->list
; node
; node
= node
->next
)
3256 if (strcmp(outpath
, node
->path
) == 0)
3258 pnode
= zalloc(sizeof(path_node
));
3261 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3262 vtoy_list_add(node
->list
, pcur
, pnode
);
3270 ret
= ventoy_data_save_all();
3272 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3276 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3280 const char *path
= NULL
;
3281 const char *outpath
= NULL
;
3282 path_node
*plast
= NULL
;
3283 path_node
*pnode
= NULL
;
3284 persistence_node
*node
= NULL
;
3285 data_persistence
*data
= NULL
;
3287 vtoy_json_get_int(json
, "index", &index
);
3288 data
= g_data_persistence
+ index
;
3290 path
= VTOY_JSON_STR_EX("path");
3291 outpath
= VTOY_JSON_STR_EX("outpath");
3292 if (path
&& outpath
)
3294 for (node
= data
->list
; node
; node
= node
->next
)
3296 if (strcmp(outpath
, node
->path
) == 0)
3298 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3304 ret
= ventoy_data_save_all();
3306 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3314 void ventoy_data_default_injection(data_injection
*data
)
3316 memset(data
, 0, sizeof(data_injection
));
3319 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3321 injection_node
*list1
= NULL
;
3322 injection_node
*list2
= NULL
;
3324 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3328 else if (data1
->list
&& data2
->list
)
3330 list1
= data1
->list
;
3331 list2
= data2
->list
;
3333 while (list1
&& list2
)
3335 if ((list1
->type
!= list2
->type
) ||
3336 strcmp(list1
->path
, list2
->path
) ||
3337 strcmp(list1
->archive
, list2
->archive
))
3342 list1
= list1
->next
;
3343 list2
= list2
->next
;
3346 if (list1
== NULL
&& list2
== NULL
)
3361 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3364 injection_node
*node
= NULL
;
3366 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3368 VTOY_JSON_FMT_KEY_L(L1
, title
);
3369 VTOY_JSON_FMT_ARY_BEGIN_N();
3371 for (node
= data
->list
; node
; node
= node
->next
)
3373 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3375 if (node
->type
== 0)
3377 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3381 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3383 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3385 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3388 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3389 VTOY_JSON_FMT_END(pos
);
3395 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3399 injection_node
*node
= NULL
;
3401 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3402 VTOY_JSON_FMT_ARY_BEGIN();
3404 for (node
= data
->list
; node
; node
= node
->next
)
3406 VTOY_JSON_FMT_OBJ_BEGIN();
3408 VTOY_JSON_FMT_UINT("type", node
->type
);
3409 VTOY_JSON_FMT_STRN("path", node
->path
);
3411 if (node
->type
== 0)
3413 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3417 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3419 VTOY_JSON_FMT_SINT("valid", valid
);
3421 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3423 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3424 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3426 VTOY_JSON_FMT_OBJ_ENDEX();
3429 VTOY_JSON_FMT_ARY_END();
3430 VTOY_JSON_FMT_END(pos
);
3436 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3438 api_get_func(conn
, json
, injection
);
3442 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3445 ret
= ventoy_data_save_all();
3447 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3451 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3456 const char *path
= NULL
;
3457 const char *archive
= NULL
;
3458 injection_node
*node
= NULL
;
3459 injection_node
*cur
= NULL
;
3460 data_injection
*data
= NULL
;
3462 vtoy_json_get_int(json
, "index", &index
);
3463 data
= g_data_injection
+ index
;
3465 vtoy_json_get_int(json
, "type", &type
);
3467 path
= VTOY_JSON_STR_EX("path");
3468 archive
= VTOY_JSON_STR_EX("archive");
3469 if (path
&& archive
)
3471 node
= zalloc(sizeof(injection_node
));
3476 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3477 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3479 vtoy_list_add(data
->list
, cur
, node
);
3483 ret
= ventoy_data_save_all();
3485 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3489 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3493 const char *path
= NULL
;
3494 injection_node
*last
= NULL
;
3495 injection_node
*node
= NULL
;
3496 data_injection
*data
= NULL
;
3498 vtoy_json_get_int(json
, "index", &index
);
3499 data
= g_data_injection
+ index
;
3501 path
= VTOY_JSON_STR_EX("path");
3504 vtoy_list_del(last
, node
, data
->list
, path
);
3507 ret
= ventoy_data_save_all();
3509 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3517 int ventoy_data_save_all(void)
3519 ventoy_set_writeback_event();
3523 int ventoy_data_real_save_all(void)
3529 pthread_mutex_lock(&g_api_mutex
);
3531 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3533 ventoy_save_plug(control
);
3534 ventoy_save_plug(theme
);
3535 ventoy_save_plug(menu_alias
);
3536 ventoy_save_plug(menu_tip
);
3537 ventoy_save_plug(menu_class
);
3538 ventoy_save_plug(auto_install
);
3539 ventoy_save_plug(persistence
);
3540 ventoy_save_plug(injection
);
3541 ventoy_save_plug(conf_replace
);
3542 ventoy_save_plug(password
);
3543 ventoy_save_plug(image_list
);
3544 ventoy_save_plug(auto_memdisk
);
3545 ventoy_save_plug(dud
);
3547 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3549 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3552 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3554 pthread_mutex_unlock(&g_api_mutex
);
3559 int ventoy_http_writeback(void)
3565 ventoy_get_json_path(filename
, NULL
);
3567 pos
= ventoy_data_real_save_all();
3570 printf("%s", JSON_SAVE_BUFFER
);
3573 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3576 vlog("Failed to write ventoy.json file.\n");
3583 static JSON_CB g_ventoy_json_cb
[] =
3585 { "sysinfo", ventoy_api_sysinfo
},
3586 { "handshake", ventoy_api_handshake
},
3587 { "check_path", ventoy_api_check_exist
},
3588 { "check_path2", ventoy_api_check_exist2
},
3589 { "check_fuzzy", ventoy_api_check_fuzzy
},
3591 { "device_info", ventoy_api_device_info
},
3593 { "get_control", ventoy_api_get_control
},
3594 { "save_control", ventoy_api_save_control
},
3596 { "get_theme", ventoy_api_get_theme
},
3597 { "save_theme", ventoy_api_save_theme
},
3598 { "theme_add_file", ventoy_api_theme_add_file
},
3599 { "theme_del_file", ventoy_api_theme_del_file
},
3600 { "theme_add_font", ventoy_api_theme_add_font
},
3601 { "theme_del_font", ventoy_api_theme_del_font
},
3603 { "get_alias", ventoy_api_get_alias
},
3604 { "save_alias", ventoy_api_save_alias
},
3605 { "alias_add", ventoy_api_alias_add
},
3606 { "alias_del", ventoy_api_alias_del
},
3608 { "get_tip", ventoy_api_get_tip
},
3609 { "save_tip", ventoy_api_save_tip
},
3610 { "tip_add", ventoy_api_tip_add
},
3611 { "tip_del", ventoy_api_tip_del
},
3613 { "get_class", ventoy_api_get_class
},
3614 { "save_class", ventoy_api_save_class
},
3615 { "class_add", ventoy_api_class_add
},
3616 { "class_del", ventoy_api_class_del
},
3618 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3619 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3620 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3621 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3623 { "get_image_list", ventoy_api_get_image_list
},
3624 { "save_image_list", ventoy_api_save_image_list
},
3625 { "image_list_add", ventoy_api_image_list_add
},
3626 { "image_list_del", ventoy_api_image_list_del
},
3628 { "get_conf_replace", ventoy_api_get_conf_replace
},
3629 { "save_conf_replace", ventoy_api_save_conf_replace
},
3630 { "conf_replace_add", ventoy_api_conf_replace_add
},
3631 { "conf_replace_del", ventoy_api_conf_replace_del
},
3633 { "get_dud", ventoy_api_get_dud
},
3634 { "save_dud", ventoy_api_save_dud
},
3635 { "dud_add", ventoy_api_dud_add
},
3636 { "dud_del", ventoy_api_dud_del
},
3637 { "dud_add_inner", ventoy_api_dud_add_inner
},
3638 { "dud_del_inner", ventoy_api_dud_del_inner
},
3640 { "get_auto_install", ventoy_api_get_auto_install
},
3641 { "save_auto_install", ventoy_api_save_auto_install
},
3642 { "auto_install_add", ventoy_api_auto_install_add
},
3643 { "auto_install_del", ventoy_api_auto_install_del
},
3644 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3645 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3647 { "get_persistence", ventoy_api_get_persistence
},
3648 { "save_persistence", ventoy_api_save_persistence
},
3649 { "persistence_add", ventoy_api_persistence_add
},
3650 { "persistence_del", ventoy_api_persistence_del
},
3651 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3652 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3654 { "get_password", ventoy_api_get_password
},
3655 { "save_password", ventoy_api_save_password
},
3656 { "password_add", ventoy_api_password_add
},
3657 { "password_del", ventoy_api_password_del
},
3659 { "get_injection", ventoy_api_get_injection
},
3660 { "save_injection", ventoy_api_save_injection
},
3661 { "injection_add", ventoy_api_injection_add
},
3662 { "injection_del", ventoy_api_injection_del
},
3667 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3670 const char *method
= NULL
;
3672 method
= vtoy_json_get_string_ex(json
, "method");
3675 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3679 if (strcmp(method
, "handshake") == 0)
3681 ventoy_api_handshake(conn
, json
);
3685 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3687 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3689 g_ventoy_json_cb
[i
].callback(conn
, json
);
3697 static int ventoy_request_handler(struct mg_connection
*conn
)
3701 VTOY_JSON
*json
= NULL
;
3702 char *post_data_buf
= NULL
;
3703 const struct mg_request_info
*ri
= NULL
;
3704 char stack_buf
[512];
3706 ri
= mg_get_request_info(conn
);
3708 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3710 if (ri
->content_length
> 500)
3712 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3713 post_buf_len
= (int)(ri
->content_length
+ 1);
3717 post_data_buf
= stack_buf
;
3718 post_buf_len
= sizeof(stack_buf
);
3721 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3722 post_data_buf
[post_data_len
] = 0;
3724 json
= vtoy_json_create();
3725 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3727 pthread_mutex_lock(&g_api_mutex
);
3728 ventoy_json_handler(conn
, json
->pstChild
);
3729 pthread_mutex_unlock(&g_api_mutex
);
3733 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3736 vtoy_json_destroy(json
);
3738 if (post_data_buf
!= stack_buf
)
3740 free(post_data_buf
);
3750 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3752 ventoy_file
*node
= NULL
;
3761 node
= ventoy_tar_find_file(path
);
3764 *data_len
= node
->size
;
3776 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3779 VTOY_JSON
*node
= NULL
;
3780 VTOY_JSON
*child
= NULL
;
3781 data_control
*data
= (data_control
*)p
;
3783 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3788 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3790 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3792 child
= node
->pstChild
;
3794 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3796 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3798 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3800 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3802 else if (strcmp(child
->pcName
, "VTOY_LINUX_REMOUNT") == 0)
3804 CONTROL_PARSE_INT(child
, data
->linux_remount
);
3806 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3808 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3810 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3812 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3814 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3816 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3818 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3820 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3822 data
->max_search_level
= -1;
3826 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3829 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3831 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3833 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3835 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3837 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3839 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3841 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3843 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3848 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3850 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3852 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3854 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3859 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3861 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3863 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3865 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3867 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3869 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3871 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3873 CONTROL_PARSE_INT(child
, data
->filter_img
);
3875 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3877 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3879 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3881 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3883 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3885 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3887 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3889 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3897 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3899 const char *dismode
= NULL
;
3900 VTOY_JSON
*child
= NULL
;
3901 VTOY_JSON
*node
= NULL
;
3902 path_node
*tail
= NULL
;
3903 path_node
*pnode
= NULL
;
3904 data_theme
*data
= (data_theme
*)p
;
3906 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3911 child
= json
->pstChild
;
3913 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3914 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3915 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3916 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3918 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3919 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3920 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3924 if (strcmp(dismode
, "CLI") == 0)
3926 data
->display_mode
= display_mode_cli
;
3928 else if (strcmp(dismode
, "serial") == 0)
3930 data
->display_mode
= display_mode_serial
;
3932 else if (strcmp(dismode
, "serial_console") == 0)
3934 data
->display_mode
= display_mode_ser_console
;
3938 data
->display_mode
= display_mode_gui
;
3942 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3945 data
->default_file
= 0;
3947 pnode
= zalloc(sizeof(path_node
));
3950 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3951 data
->filelist
= pnode
;
3956 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3959 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3961 if (node
->enDataType
== JSON_TYPE_STRING
)
3963 pnode
= zalloc(sizeof(path_node
));
3966 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3974 data
->filelist
= tail
= pnode
;
3983 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3986 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3988 if (node
->enDataType
== JSON_TYPE_STRING
)
3990 pnode
= zalloc(sizeof(path_node
));
3993 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3994 if (data
->fontslist
)
4001 data
->fontslist
= tail
= pnode
;
4010 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4013 const char *path
= NULL
;
4014 const char *alias
= NULL
;
4015 data_alias
*data
= (data_alias
*)p
;
4016 data_alias_node
*tail
= NULL
;
4017 data_alias_node
*pnode
= NULL
;
4018 VTOY_JSON
*node
= NULL
;
4020 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4025 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4027 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4032 type
= path_type_file
;
4033 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4036 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4037 type
= path_type_dir
;
4039 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4043 pnode
= zalloc(sizeof(data_alias_node
));
4047 strlcpy(pnode
->path
, path
);
4048 strlcpy(pnode
->alias
, alias
);
4057 data
->list
= tail
= pnode
;
4066 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4069 const char *path
= NULL
;
4070 const char *tip
= NULL
;
4071 data_tip
*data
= (data_tip
*)p
;
4072 data_tip_node
*tail
= NULL
;
4073 data_tip_node
*pnode
= NULL
;
4074 VTOY_JSON
*node
= NULL
;
4075 VTOY_JSON
*tips
= NULL
;
4077 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4082 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4083 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4084 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4086 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4092 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4094 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4099 type
= path_type_file
;
4100 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4103 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4104 type
= path_type_dir
;
4106 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4110 pnode
= zalloc(sizeof(data_tip_node
));
4114 strlcpy(pnode
->path
, path
);
4115 strlcpy(pnode
->tip
, tip
);
4124 data
->list
= tail
= pnode
;
4132 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4135 const char *path
= NULL
;
4136 const char *class = NULL
;
4137 data_class
*data
= (data_class
*)p
;
4138 data_class_node
*tail
= NULL
;
4139 data_class_node
*pnode
= NULL
;
4140 VTOY_JSON
*node
= NULL
;
4142 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4147 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4149 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4154 type
= class_type_key
;
4155 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4158 type
= class_type_dir
;
4159 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4162 type
= class_type_parent
;
4163 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4166 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4170 pnode
= zalloc(sizeof(data_class_node
));
4174 strlcpy(pnode
->path
, path
);
4175 strlcpy(pnode
->class, class);
4184 data
->list
= tail
= pnode
;
4192 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4200 const char *path
= NULL
;
4201 const char *file
= NULL
;
4202 data_auto_install
*data
= (data_auto_install
*)p
;
4203 auto_install_node
*tail
= NULL
;
4204 auto_install_node
*pnode
= NULL
;
4205 path_node
*pathnode
= NULL
;
4206 path_node
*pathtail
= NULL
;
4207 VTOY_JSON
*node
= NULL
;
4208 VTOY_JSON
*filelist
= NULL
;
4209 VTOY_JSON
*filenode
= NULL
;
4211 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4216 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4218 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4224 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4227 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4235 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4238 pnode
= zalloc(sizeof(auto_install_node
));
4243 strlcpy(pnode
->path
, path
);
4245 pathnode
= zalloc(sizeof(path_node
));
4248 strlcpy(pathnode
->path
, file
);
4249 pnode
->list
= pathnode
;
4263 data
->list
= tail
= pnode
;
4271 timeouten
= autoselen
= 0;
4272 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4276 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4281 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4287 pnode
= zalloc(sizeof(auto_install_node
));
4294 pnode
->autoselen
= autoselen
;
4295 pnode
->timeouten
= timeouten
;
4296 pnode
->timeout
= timeout
;
4297 pnode
->autosel
= autosel
;
4298 strlcpy(pnode
->path
, path
);
4301 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4303 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4308 pathnode
= zalloc(sizeof(path_node
));
4312 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4316 pathtail
->next
= pathnode
;
4317 pathtail
= pathnode
;
4321 pnode
->list
= pathtail
= pathnode
;
4332 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4344 data
->list
= tail
= pnode
;
4351 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4358 const char *path
= NULL
;
4359 const char *file
= NULL
;
4360 data_persistence
*data
= (data_persistence
*)p
;
4361 persistence_node
*tail
= NULL
;
4362 persistence_node
*pnode
= NULL
;
4363 path_node
*pathnode
= NULL
;
4364 path_node
*pathtail
= NULL
;
4365 VTOY_JSON
*node
= NULL
;
4366 VTOY_JSON
*filelist
= NULL
;
4367 VTOY_JSON
*filenode
= NULL
;
4369 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4374 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4376 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4381 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4387 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4390 pnode
= zalloc(sizeof(persistence_node
));
4395 strlcpy(pnode
->path
, path
);
4397 pathnode
= zalloc(sizeof(path_node
));
4400 strlcpy(pathnode
->path
, file
);
4401 pnode
->list
= pathnode
;
4415 data
->list
= tail
= pnode
;
4423 timeouten
= autoselen
= 0;
4424 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4428 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4433 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4439 pnode
= zalloc(sizeof(persistence_node
));
4446 pnode
->autoselen
= autoselen
;
4447 pnode
->timeouten
= timeouten
;
4448 pnode
->timeout
= timeout
;
4449 pnode
->autosel
= autosel
;
4450 strlcpy(pnode
->path
, path
);
4453 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4455 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4460 pathnode
= zalloc(sizeof(path_node
));
4464 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4468 pathtail
->next
= pathnode
;
4469 pathtail
= pathnode
;
4473 pnode
->list
= pathtail
= pathnode
;
4484 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4496 data
->list
= tail
= pnode
;
4503 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4506 const char *path
= NULL
;
4507 const char *archive
= NULL
;
4508 data_injection
*data
= (data_injection
*)p
;
4509 injection_node
*tail
= NULL
;
4510 injection_node
*pnode
= NULL
;
4511 VTOY_JSON
*node
= NULL
;
4513 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4518 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4520 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4526 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4529 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4532 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4534 if (path
&& archive
)
4536 pnode
= zalloc(sizeof(injection_node
));
4540 strlcpy(pnode
->path
, path
);
4541 strlcpy(pnode
->archive
, archive
);
4550 data
->list
= tail
= pnode
;
4558 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4561 const char *path
= NULL
;
4562 const char *org
= NULL
;
4563 const char *new = NULL
;
4564 data_conf_replace
*data
= (data_conf_replace
*)p
;
4565 conf_replace_node
*tail
= NULL
;
4566 conf_replace_node
*pnode
= NULL
;
4567 VTOY_JSON
*node
= NULL
;
4569 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4574 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4576 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4581 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4582 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4583 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4586 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4588 if (path
&& org
&& new)
4590 pnode
= zalloc(sizeof(conf_replace_node
));
4593 strlcpy(pnode
->path
, path
);
4594 strlcpy(pnode
->org
, org
);
4595 strlcpy(pnode
->new, new);
4608 data
->list
= tail
= pnode
;
4616 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4619 const char *bootpwd
= NULL
;
4620 const char *isopwd
= NULL
;
4621 const char *wimpwd
= NULL
;
4622 const char *imgpwd
= NULL
;
4623 const char *efipwd
= NULL
;
4624 const char *vhdpwd
= NULL
;
4625 const char *vtoypwd
= NULL
;
4626 const char *path
= NULL
;
4627 const char *pwd
= NULL
;
4628 data_password
*data
= (data_password
*)p
;
4629 menu_password
*tail
= NULL
;
4630 menu_password
*pnode
= NULL
;
4631 VTOY_JSON
*node
= NULL
;
4632 VTOY_JSON
*menupwd
= NULL
;
4634 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4639 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4640 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4641 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4642 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4643 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4644 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4645 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4648 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4649 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4650 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4651 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4652 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4653 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4654 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4657 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4663 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4665 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4671 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4674 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4677 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4681 pnode
= zalloc(sizeof(menu_password
));
4685 strlcpy(pnode
->path
, path
);
4686 strlcpy(pnode
->pwd
, pwd
);
4695 data
->list
= tail
= pnode
;
4704 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4706 VTOY_JSON
*node
= NULL
;
4707 data_image_list
*data
= (data_image_list
*)p
;
4708 path_node
*tail
= NULL
;
4709 path_node
*pnode
= NULL
;
4711 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4718 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4720 if (node
->enDataType
== JSON_TYPE_STRING
)
4722 pnode
= zalloc(sizeof(path_node
));
4725 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4733 data
->list
= tail
= pnode
;
4741 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4743 return ventoy_parse_image_list_real(json
, 1, p
);
4745 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4747 return ventoy_parse_image_list_real(json
, 0, p
);
4750 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4752 VTOY_JSON
*node
= NULL
;
4753 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4754 path_node
*tail
= NULL
;
4755 path_node
*pnode
= NULL
;
4757 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4762 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4764 if (node
->enDataType
== JSON_TYPE_STRING
)
4766 pnode
= zalloc(sizeof(path_node
));
4769 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4777 data
->list
= tail
= pnode
;
4785 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4788 const char *path
= NULL
;
4789 const char *file
= NULL
;
4790 data_dud
*data
= (data_dud
*)p
;
4791 dud_node
*tail
= NULL
;
4792 dud_node
*pnode
= NULL
;
4793 path_node
*pathnode
= NULL
;
4794 path_node
*pathtail
= NULL
;
4795 VTOY_JSON
*node
= NULL
;
4796 VTOY_JSON
*filelist
= NULL
;
4797 VTOY_JSON
*filenode
= NULL
;
4799 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4804 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4806 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4811 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4817 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4820 pnode
= zalloc(sizeof(dud_node
));
4823 strlcpy(pnode
->path
, path
);
4825 pathnode
= zalloc(sizeof(path_node
));
4828 strlcpy(pathnode
->path
, file
);
4829 pnode
->list
= pathnode
;
4843 data
->list
= tail
= pnode
;
4850 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4856 pnode
= zalloc(sizeof(dud_node
));
4862 strlcpy(pnode
->path
, path
);
4864 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4866 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4871 pathnode
= zalloc(sizeof(path_node
));
4874 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4879 pathtail
->next
= pathnode
;
4880 pathtail
= pathnode
;
4884 pnode
->list
= pathtail
= pathnode
;
4902 data
->list
= tail
= pnode
;
4916 static int ventoy_load_old_json(const char *filename
)
4921 char *buffer
= NULL
;
4922 unsigned char *start
= NULL
;
4923 VTOY_JSON
*json
= NULL
;
4924 VTOY_JSON
*node
= NULL
;
4925 VTOY_JSON
*next
= NULL
;
4927 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4930 vlog("Failed to read old ventoy.json file.\n");
4935 start
= (unsigned char *)buffer
;
4937 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4941 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4943 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4948 json
= vtoy_json_create();
4955 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4957 vlog("parse ventoy.json success\n");
4959 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4960 for (next
= node
->pstNext
; next
; next
= next
->pstNext
)
4962 if (node
->pcName
&& next
->pcName
&& strcmp(node
->pcName
, next
->pcName
) == 0)
4964 vlog("ventoy.json contains duplicate key <%s>.\n", node
->pcName
);
4965 g_sysinfo
.invalid_config
= 1;
4971 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4973 ventoy_parse_json(control
);
4974 ventoy_parse_json(theme
);
4975 ventoy_parse_json(menu_alias
);
4976 ventoy_parse_json(menu_tip
);
4977 ventoy_parse_json(menu_class
);
4978 ventoy_parse_json(auto_install
);
4979 ventoy_parse_json(persistence
);
4980 ventoy_parse_json(injection
);
4981 ventoy_parse_json(conf_replace
);
4982 ventoy_parse_json(password
);
4983 ventoy_parse_json(image_list
);
4984 ventoy_parse_json(image_blacklist
);
4985 ventoy_parse_json(auto_memdisk
);
4986 ventoy_parse_json(dud
);
4991 vlog("ventoy.json has syntax error.\n");
4992 g_sysinfo
.syntax_error
= 1;
4997 vtoy_json_destroy(json
);
5004 int ventoy_http_start(const char *ip
, const char *port
)
5009 char backupname
[128];
5010 struct mg_callbacks callbacks
;
5011 const char *options
[] =
5013 "listening_ports", "24681",
5014 "document_root", "www",
5015 "index_files", "index.html",
5016 "num_threads", "16",
5017 "error_log_file", LOG_FILE
,
5018 "request_timeout_ms", "10000",
5022 for (i
= 0; i
<= bios_max
; i
++)
5024 ventoy_data_default_control(g_data_control
+ i
);
5025 ventoy_data_default_theme(g_data_theme
+ i
);
5026 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5027 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5028 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5029 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5030 ventoy_data_default_persistence(g_data_persistence
+ i
);
5031 ventoy_data_default_injection(g_data_injection
+ i
);
5032 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5033 ventoy_data_default_password(g_data_password
+ i
);
5034 ventoy_data_default_image_list(g_data_image_list
+ i
);
5035 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5036 ventoy_data_default_dud(g_data_dud
+ i
);
5039 ventoy_get_json_path(filename
, backupname
);
5040 if (ventoy_is_file_exist("%s", filename
))
5042 ventoy_copy_file(filename
, backupname
);
5043 ventoy_load_old_json(filename
);
5048 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5051 memset(&callbacks
, 0, sizeof(callbacks
));
5052 callbacks
.begin_request
= ventoy_request_handler
;
5054 callbacks
.open_file
= ventoy_web_openfile
;
5056 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5058 ventoy_start_writeback_thread(ventoy_http_writeback
);
5060 return g_ventoy_http_ctx
? 0 : 1;
5063 int ventoy_http_stop(void)
5065 if (g_ventoy_http_ctx
)
5067 mg_stop(g_ventoy_http_ctx
);
5070 ventoy_stop_writeback_thread();
5074 int ventoy_http_init(void)
5079 char *Buffer
= NULL
;
5082 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5085 for (i
= 0; i
< BufLen
/ 5; i
++)
5087 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5088 g_ventoy_help_lang
[i
][5] = 0;
5094 file
= ventoy_tar_find_file("www/helplist");
5097 for (i
= 0; i
< file
->size
/ 5; i
++)
5099 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5100 g_ventoy_help_lang
[i
][5] = 0;
5105 if (!g_pub_json_buffer
)
5107 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5108 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5112 pthread_mutex_init(&g_api_mutex
, NULL
);
5116 void ventoy_http_exit(void)
5118 check_free(g_pub_json_buffer
);
5119 g_pub_json_buffer
= NULL
;
5120 g_pub_save_buffer
= NULL
;
5122 pthread_mutex_destroy(&g_api_mutex
);