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;
327 #if defined(_MSC_VER) || defined(WIN32)
328 VTOY_JSON_FMT_STRN("os", "windows");
330 VTOY_JSON_FMT_STRN("os", "linux");
333 VTOY_JSON_FMT_OBJ_END();
334 VTOY_JSON_FMT_END(pos
);
336 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
340 static int ventoy_api_handshake(struct mg_connection
*conn
, VTOY_JSON
*json
)
346 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
347 VTOY_JSON_FMT_OBJ_BEGIN();
348 VTOY_JSON_FMT_SINT("status", 0);
349 VTOY_JSON_FMT_OBJ_END();
350 VTOY_JSON_FMT_END(pos
);
352 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
356 static int ventoy_api_check_exist(struct mg_connection
*conn
, VTOY_JSON
*json
)
361 const char *path
= NULL
;
363 path
= vtoy_json_get_string_ex(json
, "path");
364 vtoy_json_get_int(json
, "dir", &dir
);
370 exist
= ventoy_is_directory_exist("%s", path
);
374 exist
= ventoy_is_file_exist("%s", path
);
378 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
379 VTOY_JSON_FMT_OBJ_BEGIN();
380 VTOY_JSON_FMT_SINT("exist", exist
);
381 VTOY_JSON_FMT_OBJ_END();
382 VTOY_JSON_FMT_END(pos
);
384 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
388 static int ventoy_api_check_exist2(struct mg_connection
*conn
, VTOY_JSON
*json
)
397 const char *path1
= NULL
;
398 const char *path2
= NULL
;
400 path1
= vtoy_json_get_string_ex(json
, "path1");
401 path2
= vtoy_json_get_string_ex(json
, "path2");
402 vtoy_json_get_int(json
, "dir1", &dir1
);
403 vtoy_json_get_int(json
, "dir2", &dir2
);
404 vtoy_json_get_int(json
, "fuzzy1", &fuzzy1
);
405 vtoy_json_get_int(json
, "fuzzy2", &fuzzy2
);
411 exist1
= ventoy_is_directory_exist("%s", path1
);
417 exist1
= ventoy_check_fuzzy_path((char *)path1
, 0);
421 exist1
= ventoy_is_file_exist("%s", path1
);
430 exist2
= ventoy_is_directory_exist("%s", path2
);
436 exist2
= ventoy_check_fuzzy_path((char *)path2
, 0);
440 exist2
= ventoy_is_file_exist("%s", path2
);
445 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
446 VTOY_JSON_FMT_OBJ_BEGIN();
447 VTOY_JSON_FMT_SINT("exist1", exist1
);
448 VTOY_JSON_FMT_SINT("exist2", exist2
);
449 VTOY_JSON_FMT_OBJ_END();
450 VTOY_JSON_FMT_END(pos
);
452 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
456 static int ventoy_api_check_fuzzy(struct mg_connection
*conn
, VTOY_JSON
*json
)
460 const char *path
= NULL
;
462 path
= vtoy_json_get_string_ex(json
, "path");
465 exist
= ventoy_check_fuzzy_path((char *)path
, 0);
468 VTOY_JSON_FMT_BEGIN(pos
, JSON_BUFFER
, JSON_BUF_MAX
);
469 VTOY_JSON_FMT_OBJ_BEGIN();
470 VTOY_JSON_FMT_SINT("exist", exist
);
471 VTOY_JSON_FMT_OBJ_END();
472 VTOY_JSON_FMT_END(pos
);
474 ventoy_json_buffer(conn
, JSON_BUFFER
, pos
);
481 void ventoy_data_default_control(data_control
*data
)
483 memset(data
, 0, sizeof(data_control
));
485 data
->filter_dot_underscore
= 1;
486 data
->max_search_level
= -1;
487 data
->menu_timeout
= 0;
489 strlcpy(data
->default_kbd_layout
, "QWERTY_USA");
490 strlcpy(data
->help_text_language
, "en_US");
493 int ventoy_data_cmp_control(data_control
*data1
, data_control
*data2
)
495 if (data1
->default_menu_mode
!= data2
->default_menu_mode
||
496 data1
->treeview_style
!= data2
->treeview_style
||
497 data1
->filter_dot_underscore
!= data2
->filter_dot_underscore
||
498 data1
->sort_casesensitive
!= data2
->sort_casesensitive
||
499 data1
->max_search_level
!= data2
->max_search_level
||
500 data1
->vhd_no_warning
!= data2
->vhd_no_warning
||
501 data1
->filter_iso
!= data2
->filter_iso
||
502 data1
->filter_wim
!= data2
->filter_wim
||
503 data1
->filter_efi
!= data2
->filter_efi
||
504 data1
->filter_img
!= data2
->filter_img
||
505 data1
->filter_vhd
!= data2
->filter_vhd
||
506 data1
->filter_vtoy
!= data2
->filter_vtoy
||
507 data1
->win11_bypass_check
!= data2
->win11_bypass_check
||
508 data1
->linux_remount
!= data2
->linux_remount
||
509 data1
->menu_timeout
!= data2
->menu_timeout
)
514 if (strcmp(data1
->default_search_root
, data2
->default_search_root
) ||
515 strcmp(data1
->default_image
, data2
->default_image
) ||
516 strcmp(data1
->default_kbd_layout
, data2
->default_kbd_layout
) ||
517 strcmp(data1
->help_text_language
, data2
->help_text_language
))
525 int ventoy_data_save_control(data_control
*data
, const char *title
, char *buf
, int buflen
)
528 data_control
*def
= g_data_control
+ bios_max
;
530 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
532 VTOY_JSON_FMT_KEY_L(L1
, title
);
533 VTOY_JSON_FMT_ARY_BEGIN_N();
535 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_DEFAULT_MENU_MODE", default_menu_mode
);
536 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_TREE_VIEW_MENU_STYLE", treeview_style
);
537 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILT_DOT_UNDERSCORE_FILE", filter_dot_underscore
);
538 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_SORT_CASE_SENSITIVE", sort_casesensitive
);
540 if (data
->max_search_level
>= 0)
542 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MAX_SEARCH_LEVEL", max_search_level
);
545 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_VHD_NO_WARNING", vhd_no_warning
);
546 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_ISO", filter_iso
);
547 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_WIM", filter_wim
);
548 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_EFI", filter_efi
);
549 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_IMG", filter_img
);
550 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VHD", filter_vhd
);
551 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_FILE_FLT_VTOY", filter_vtoy
);
552 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_WIN11_BYPASS_CHECK", win11_bypass_check
);
553 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_LINUX_REMOUNT", linux_remount
);
554 VTOY_JSON_FMT_CTRL_INT(L2
, "VTOY_MENU_TIMEOUT", menu_timeout
);
556 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_DEFAULT_KBD_LAYOUT", default_kbd_layout
);
557 VTOY_JSON_FMT_CTRL_STRN(L2
, "VTOY_HELP_TXT_LANGUAGE", help_text_language
);
559 if (strcmp(def
->default_search_root
, data
->default_search_root
))
561 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_SEARCH_ROOT", ventoy_real_path(data
->default_search_root
));
564 if (strcmp(def
->default_image
, data
->default_image
))
566 VTOY_JSON_FMT_CTRL_STRN_STR(L2
, "VTOY_DEFAULT_IMAGE", ventoy_real_path(data
->default_image
));
569 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
570 VTOY_JSON_FMT_END(pos
);
575 int ventoy_data_json_control(data_control
*ctrl
, char *buf
, int buflen
)
581 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
582 VTOY_JSON_FMT_OBJ_BEGIN();
584 VTOY_JSON_FMT_SINT("default_menu_mode", ctrl
->default_menu_mode
);
585 VTOY_JSON_FMT_SINT("treeview_style", ctrl
->treeview_style
);
586 VTOY_JSON_FMT_SINT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
587 VTOY_JSON_FMT_SINT("sort_casesensitive", ctrl
->sort_casesensitive
);
588 VTOY_JSON_FMT_SINT("max_search_level", ctrl
->max_search_level
);
589 VTOY_JSON_FMT_SINT("vhd_no_warning", ctrl
->vhd_no_warning
);
591 VTOY_JSON_FMT_SINT("filter_iso", ctrl
->filter_iso
);
592 VTOY_JSON_FMT_SINT("filter_wim", ctrl
->filter_wim
);
593 VTOY_JSON_FMT_SINT("filter_efi", ctrl
->filter_efi
);
594 VTOY_JSON_FMT_SINT("filter_img", ctrl
->filter_img
);
595 VTOY_JSON_FMT_SINT("filter_vhd", ctrl
->filter_vhd
);
596 VTOY_JSON_FMT_SINT("filter_vtoy", ctrl
->filter_vtoy
);
597 VTOY_JSON_FMT_SINT("win11_bypass_check", ctrl
->win11_bypass_check
);
598 VTOY_JSON_FMT_SINT("linux_remount", ctrl
->linux_remount
);
599 VTOY_JSON_FMT_SINT("menu_timeout", ctrl
->menu_timeout
);
600 VTOY_JSON_FMT_STRN("default_kbd_layout", ctrl
->default_kbd_layout
);
601 VTOY_JSON_FMT_STRN("help_text_language", ctrl
->help_text_language
);
604 if (ctrl
->default_search_root
[0] && ventoy_is_directory_exist("%s%s", g_cur_dir
, ctrl
->default_search_root
))
608 VTOY_JSON_FMT_STRN("default_search_root", ctrl
->default_search_root
);
609 VTOY_JSON_FMT_SINT("default_search_root_valid", valid
);
613 if (ctrl
->default_image
[0] && ventoy_is_file_exist("%s%s", g_cur_dir
, ctrl
->default_image
))
617 VTOY_JSON_FMT_STRN("default_image", ctrl
->default_image
);
618 VTOY_JSON_FMT_SINT("default_image_valid", valid
);
620 VTOY_JSON_FMT_KEY("help_list");
621 VTOY_JSON_FMT_ARY_BEGIN();
623 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
625 VTOY_JSON_FMT_ITEM(g_ventoy_help_lang
[i
]);
627 VTOY_JSON_FMT_ARY_ENDEX();
630 VTOY_JSON_FMT_OBJ_END();
631 VTOY_JSON_FMT_END(pos
);
636 static int ventoy_api_get_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
638 api_get_func(conn
, json
, control
);
642 static int ventoy_api_save_control(struct mg_connection
*conn
, VTOY_JSON
*json
)
646 data_control
*ctrl
= NULL
;
648 vtoy_json_get_int(json
, "index", &index
);
649 ctrl
= g_data_control
+ index
;
651 VTOY_JSON_INT("default_menu_mode", ctrl
->default_menu_mode
);
652 VTOY_JSON_INT("treeview_style", ctrl
->treeview_style
);
653 VTOY_JSON_INT("filter_dot_underscore", ctrl
->filter_dot_underscore
);
654 VTOY_JSON_INT("sort_casesensitive", ctrl
->sort_casesensitive
);
655 VTOY_JSON_INT("max_search_level", ctrl
->max_search_level
);
656 VTOY_JSON_INT("vhd_no_warning", ctrl
->vhd_no_warning
);
657 VTOY_JSON_INT("filter_iso", ctrl
->filter_iso
);
658 VTOY_JSON_INT("filter_wim", ctrl
->filter_wim
);
659 VTOY_JSON_INT("filter_efi", ctrl
->filter_efi
);
660 VTOY_JSON_INT("filter_img", ctrl
->filter_img
);
661 VTOY_JSON_INT("filter_vhd", ctrl
->filter_vhd
);
662 VTOY_JSON_INT("filter_vtoy", ctrl
->filter_vtoy
);
663 VTOY_JSON_INT("win11_bypass_check", ctrl
->win11_bypass_check
);
664 VTOY_JSON_INT("linux_remount", ctrl
->linux_remount
);
665 VTOY_JSON_INT("menu_timeout", ctrl
->menu_timeout
);
667 VTOY_JSON_STR("default_image", ctrl
->default_image
);
668 VTOY_JSON_STR("default_search_root", ctrl
->default_search_root
);
669 VTOY_JSON_STR("help_text_language", ctrl
->help_text_language
);
670 VTOY_JSON_STR("default_kbd_layout", ctrl
->default_kbd_layout
);
672 ret
= ventoy_data_save_all();
674 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
682 void ventoy_data_default_theme(data_theme
*data
)
684 memset(data
, 0, sizeof(data_theme
));
685 strlcpy(data
->gfxmode
, "1024x768");
686 scnprintf(data
->ventoy_left
, sizeof(data
->ventoy_left
), "5%%");
687 scnprintf(data
->ventoy_top
, sizeof(data
->ventoy_top
), "95%%");
688 scnprintf(data
->ventoy_color
, sizeof(data
->ventoy_color
), "%s", "#0000ff");
691 int ventoy_data_cmp_theme(data_theme
*data1
, data_theme
*data2
)
693 if (data1
->display_mode
!= data2
->display_mode
||
694 strcmp(data1
->ventoy_left
, data2
->ventoy_left
) ||
695 strcmp(data1
->ventoy_top
, data2
->ventoy_top
) ||
696 strcmp(data1
->gfxmode
, data2
->gfxmode
) ||
697 strcmp(data1
->ventoy_color
, data2
->ventoy_color
)
703 if (ventoy_path_list_cmp(data1
->filelist
, data2
->filelist
))
708 if (ventoy_path_list_cmp(data1
->fontslist
, data2
->fontslist
))
717 int ventoy_data_save_theme(data_theme
*data
, const char *title
, char *buf
, int buflen
)
720 path_node
*node
= NULL
;
721 data_theme
*def
= g_data_theme
+ bios_max
;
723 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
725 VTOY_JSON_FMT_KEY_L(L1
, title
);
726 VTOY_JSON_FMT_OBJ_BEGIN_N();
730 if (data
->filelist
->next
)
732 VTOY_JSON_FMT_KEY_L(L2
, "file");
733 VTOY_JSON_FMT_ARY_BEGIN_N();
735 for (node
= data
->filelist
; node
; node
= node
->next
)
737 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
740 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
742 if (def
->default_file
!= data
->default_file
)
744 VTOY_JSON_FMT_SINT_LN(L2
, "default_file", data
->default_file
);
749 VTOY_JSON_FMT_STRN_PATH_LN(L2
, "file", data
->filelist
->path
);
753 if (data
->display_mode
!= def
->display_mode
)
755 if (display_mode_cli
== data
->display_mode
)
757 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "CLI");
759 else if (display_mode_serial
== data
->display_mode
)
761 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial");
763 else if (display_mode_ser_console
== data
->display_mode
)
765 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "serial_console");
769 VTOY_JSON_FMT_STRN_LN(L2
, "display_mode", "GUI");
773 VTOY_JSON_FMT_DIFF_STRN(L2
, "gfxmode", gfxmode
);
775 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_left", ventoy_left
);
776 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_top", ventoy_top
);
777 VTOY_JSON_FMT_DIFF_STRN(L2
, "ventoy_color", ventoy_color
);
781 VTOY_JSON_FMT_KEY_L(L2
, "fonts");
782 VTOY_JSON_FMT_ARY_BEGIN_N();
784 for (node
= data
->fontslist
; node
; node
= node
->next
)
786 VTOY_JSON_FMT_ITEM_PATH_LN(L3
, node
->path
);
789 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
792 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
793 VTOY_JSON_FMT_END(pos
);
799 int ventoy_data_json_theme(data_theme
*data
, char *buf
, int buflen
)
802 path_node
*node
= NULL
;
804 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
805 VTOY_JSON_FMT_OBJ_BEGIN();
807 VTOY_JSON_FMT_SINT("default_file", data
->default_file
);
808 VTOY_JSON_FMT_SINT("display_mode", data
->display_mode
);
809 VTOY_JSON_FMT_STRN("gfxmode", data
->gfxmode
);
811 VTOY_JSON_FMT_STRN("ventoy_color", data
->ventoy_color
);
812 VTOY_JSON_FMT_STRN("ventoy_left", data
->ventoy_left
);
813 VTOY_JSON_FMT_STRN("ventoy_top", data
->ventoy_top
);
815 VTOY_JSON_FMT_KEY("filelist");
816 VTOY_JSON_FMT_ARY_BEGIN();
817 for (node
= data
->filelist
; node
; node
= node
->next
)
819 VTOY_JSON_FMT_OBJ_BEGIN();
820 VTOY_JSON_FMT_STRN("path", node
->path
);
821 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
822 VTOY_JSON_FMT_OBJ_ENDEX();
824 VTOY_JSON_FMT_ARY_ENDEX();
826 VTOY_JSON_FMT_KEY("fontslist");
827 VTOY_JSON_FMT_ARY_BEGIN();
828 for (node
= data
->fontslist
; node
; node
= node
->next
)
830 VTOY_JSON_FMT_OBJ_BEGIN();
831 VTOY_JSON_FMT_STRN("path", node
->path
);
832 VTOY_JSON_FMT_SINT("valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->path
));
833 VTOY_JSON_FMT_OBJ_ENDEX();
835 VTOY_JSON_FMT_ARY_ENDEX();
837 VTOY_JSON_FMT_OBJ_END();
838 VTOY_JSON_FMT_END(pos
);
843 static int ventoy_api_get_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
845 api_get_func(conn
, json
, theme
);
849 static int ventoy_api_save_theme(struct mg_connection
*conn
, VTOY_JSON
*json
)
853 data_theme
*data
= NULL
;
855 vtoy_json_get_int(json
, "index", &index
);
856 data
= g_data_theme
+ index
;
858 VTOY_JSON_INT("default_file", data
->default_file
);
859 VTOY_JSON_INT("display_mode", data
->display_mode
);
860 VTOY_JSON_STR("gfxmode", data
->gfxmode
);
861 VTOY_JSON_STR("ventoy_left", data
->ventoy_left
);
862 VTOY_JSON_STR("ventoy_top", data
->ventoy_top
);
863 VTOY_JSON_STR("ventoy_color", data
->ventoy_color
);
865 ret
= ventoy_data_save_all();
867 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
871 static int ventoy_api_theme_add_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
875 const char *path
= NULL
;
876 path_node
*node
= NULL
;
877 path_node
*cur
= NULL
;
878 data_theme
*data
= NULL
;
880 vtoy_json_get_int(json
, "index", &index
);
881 data
= g_data_theme
+ index
;
883 path
= VTOY_JSON_STR_EX("path");
886 node
= zalloc(sizeof(path_node
));
889 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
891 vtoy_list_add(data
->filelist
, cur
, node
);
895 ret
= ventoy_data_save_all();
897 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
901 static int ventoy_api_theme_del_file(struct mg_connection
*conn
, VTOY_JSON
*json
)
905 const char *path
= NULL
;
906 path_node
*node
= NULL
;
907 path_node
*last
= NULL
;
908 data_theme
*data
= NULL
;
910 vtoy_json_get_int(json
, "index", &index
);
911 data
= g_data_theme
+ index
;
913 path
= VTOY_JSON_STR_EX("path");
916 vtoy_list_del(last
, node
, data
->filelist
, path
);
919 ret
= ventoy_data_save_all();
921 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
926 static int ventoy_api_theme_add_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
930 const char *path
= NULL
;
931 path_node
*node
= NULL
;
932 path_node
*cur
= NULL
;
933 data_theme
*data
= NULL
;
935 vtoy_json_get_int(json
, "index", &index
);
936 data
= g_data_theme
+ index
;
938 path
= VTOY_JSON_STR_EX("path");
941 node
= zalloc(sizeof(path_node
));
944 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
945 vtoy_list_add(data
->fontslist
, cur
, node
);
949 ret
= ventoy_data_save_all();
951 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
956 static int ventoy_api_theme_del_font(struct mg_connection
*conn
, VTOY_JSON
*json
)
960 const char *path
= NULL
;
961 path_node
*node
= NULL
;
962 path_node
*last
= NULL
;
963 data_theme
*data
= NULL
;
965 vtoy_json_get_int(json
, "index", &index
);
966 data
= g_data_theme
+ index
;
968 path
= VTOY_JSON_STR_EX("path");
971 vtoy_list_del(last
, node
, data
->fontslist
, path
);
974 ret
= ventoy_data_save_all();
976 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
983 void ventoy_data_default_menu_alias(data_alias
*data
)
985 memset(data
, 0, sizeof(data_alias
));
988 int ventoy_data_cmp_menu_alias(data_alias
*data1
, data_alias
*data2
)
990 data_alias_node
*list1
= NULL
;
991 data_alias_node
*list2
= NULL
;
993 if (NULL
== data1
->list
&& NULL
== data2
->list
)
997 else if (data1
->list
&& data2
->list
)
1000 list2
= data2
->list
;
1002 while (list1
&& list2
)
1004 if ((list1
->type
!= list2
->type
) ||
1005 strcmp(list1
->path
, list2
->path
) ||
1006 strcmp(list1
->alias
, list2
->alias
))
1011 list1
= list1
->next
;
1012 list2
= list2
->next
;
1015 if (list1
== NULL
&& list2
== NULL
)
1030 int ventoy_data_save_menu_alias(data_alias
*data
, const char *title
, char *buf
, int buflen
)
1033 data_alias_node
*node
= NULL
;
1035 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1037 VTOY_JSON_FMT_KEY_L(L1
, title
);
1038 VTOY_JSON_FMT_ARY_BEGIN_N();
1040 for (node
= data
->list
; node
; node
= node
->next
)
1042 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1044 if (node
->type
== path_type_file
)
1046 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
1050 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1053 VTOY_JSON_FMT_STRN_EX_LN(L3
, "alias", node
->alias
);
1055 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1058 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1059 VTOY_JSON_FMT_END(pos
);
1065 int ventoy_data_json_menu_alias(data_alias
*data
, char *buf
, int buflen
)
1069 data_alias_node
*node
= NULL
;
1071 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1072 VTOY_JSON_FMT_ARY_BEGIN();
1074 for (node
= data
->list
; node
; node
= node
->next
)
1076 VTOY_JSON_FMT_OBJ_BEGIN();
1078 VTOY_JSON_FMT_UINT("type", node
->type
);
1079 VTOY_JSON_FMT_STRN("path", node
->path
);
1080 if (node
->type
== path_type_file
)
1082 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1086 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1089 VTOY_JSON_FMT_SINT("valid", valid
);
1090 VTOY_JSON_FMT_STRN("alias", node
->alias
);
1092 VTOY_JSON_FMT_OBJ_ENDEX();
1095 VTOY_JSON_FMT_ARY_END();
1096 VTOY_JSON_FMT_END(pos
);
1101 static int ventoy_api_get_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1103 api_get_func(conn
, json
, menu_alias
);
1107 static int ventoy_api_save_alias(struct mg_connection
*conn
, VTOY_JSON
*json
)
1110 ret
= ventoy_data_save_all();
1112 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1116 static int ventoy_api_alias_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1120 int type
= path_type_file
;
1121 const char *path
= NULL
;
1122 const char *alias
= NULL
;
1123 data_alias_node
*node
= NULL
;
1124 data_alias_node
*cur
= NULL
;
1125 data_alias
*data
= NULL
;
1127 vtoy_json_get_int(json
, "index", &index
);
1128 data
= g_data_menu_alias
+ index
;
1130 vtoy_json_get_int(json
, "type", &type
);
1132 path
= VTOY_JSON_STR_EX("path");
1133 alias
= VTOY_JSON_STR_EX("alias");
1136 node
= zalloc(sizeof(data_alias_node
));
1140 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1141 scnprintf(node
->alias
, sizeof(node
->alias
), "%s", alias
);
1143 vtoy_list_add(data
->list
, cur
, node
);
1147 ret
= ventoy_data_save_all();
1149 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1153 static int ventoy_api_alias_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1157 const char *path
= NULL
;
1158 data_alias_node
*last
= NULL
;
1159 data_alias_node
*node
= NULL
;
1160 data_alias
*data
= NULL
;
1162 vtoy_json_get_int(json
, "index", &index
);
1163 data
= g_data_menu_alias
+ index
;
1165 path
= VTOY_JSON_STR_EX("path");
1168 vtoy_list_del(last
, node
, data
->list
, path
);
1171 ret
= ventoy_data_save_all();
1173 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1180 void ventoy_data_default_menu_tip(data_tip
*data
)
1182 memset(data
, 0, sizeof(data_tip
));
1184 scnprintf(data
->left
, sizeof(data
->left
), "10%%");
1185 scnprintf(data
->top
, sizeof(data
->top
), "81%%");
1186 scnprintf(data
->color
, sizeof(data
->color
), "%s", "blue");
1189 int ventoy_data_cmp_menu_tip(data_tip
*data1
, data_tip
*data2
)
1191 data_tip_node
*list1
= NULL
;
1192 data_tip_node
*list2
= NULL
;
1194 if (strcmp(data1
->left
, data2
->left
) || strcmp(data1
->top
, data2
->top
) || strcmp(data1
->color
, data2
->color
))
1199 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1203 else if (data1
->list
&& data2
->list
)
1205 list1
= data1
->list
;
1206 list2
= data2
->list
;
1208 while (list1
&& list2
)
1210 if ((list1
->type
!= list2
->type
) ||
1211 strcmp(list1
->path
, list2
->path
) ||
1212 strcmp(list1
->tip
, list2
->tip
))
1217 list1
= list1
->next
;
1218 list2
= list2
->next
;
1221 if (list1
== NULL
&& list2
== NULL
)
1236 int ventoy_data_save_menu_tip(data_tip
*data
, const char *title
, char *buf
, int buflen
)
1239 data_tip_node
*node
= NULL
;
1240 data_tip
*def
= g_data_menu_tip
+ bios_max
;
1242 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1243 VTOY_JSON_FMT_KEY_L(L1
, title
);
1244 VTOY_JSON_FMT_OBJ_BEGIN_N();
1246 VTOY_JSON_FMT_DIFF_STRN(L2
, "left", left
);
1247 VTOY_JSON_FMT_DIFF_STRN(L2
, "top", top
);
1248 VTOY_JSON_FMT_DIFF_STRN(L2
, "color", color
);
1252 VTOY_JSON_FMT_KEY_L(L2
, "tips");
1253 VTOY_JSON_FMT_ARY_BEGIN_N();
1255 for (node
= data
->list
; node
; node
= node
->next
)
1257 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
1259 if (node
->type
== path_type_file
)
1261 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "image", node
->path
);
1265 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "dir", node
->path
);
1267 VTOY_JSON_FMT_STRN_EX_LN(L4
, "tip", node
->tip
);
1269 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
1272 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
1275 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
1277 VTOY_JSON_FMT_END(pos
);
1283 int ventoy_data_json_menu_tip(data_tip
*data
, char *buf
, int buflen
)
1287 data_tip_node
*node
= NULL
;
1289 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1291 VTOY_JSON_FMT_OBJ_BEGIN();
1293 VTOY_JSON_FMT_STRN("left", data
->left
);
1294 VTOY_JSON_FMT_STRN("top", data
->top
);
1295 VTOY_JSON_FMT_STRN("color", data
->color
);
1297 VTOY_JSON_FMT_KEY("tips");
1298 VTOY_JSON_FMT_ARY_BEGIN();
1300 for (node
= data
->list
; node
; node
= node
->next
)
1302 VTOY_JSON_FMT_OBJ_BEGIN();
1304 VTOY_JSON_FMT_UINT("type", node
->type
);
1305 VTOY_JSON_FMT_STRN("path", node
->path
);
1306 if (node
->type
== path_type_file
)
1308 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1312 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1315 VTOY_JSON_FMT_SINT("valid", valid
);
1316 VTOY_JSON_FMT_STRN("tip", node
->tip
);
1318 VTOY_JSON_FMT_OBJ_ENDEX();
1321 VTOY_JSON_FMT_ARY_ENDEX();
1323 VTOY_JSON_FMT_OBJ_END();
1324 VTOY_JSON_FMT_END(pos
);
1329 static int ventoy_api_get_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1331 api_get_func(conn
, json
, menu_tip
);
1335 static int ventoy_api_save_tip(struct mg_connection
*conn
, VTOY_JSON
*json
)
1339 data_tip
*data
= NULL
;
1341 vtoy_json_get_int(json
, "index", &index
);
1342 data
= g_data_menu_tip
+ index
;
1344 VTOY_JSON_STR("left", data
->left
);
1345 VTOY_JSON_STR("top", data
->top
);
1346 VTOY_JSON_STR("color", data
->color
);
1348 ret
= ventoy_data_save_all();
1350 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1354 static int ventoy_api_tip_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1358 int type
= path_type_file
;
1359 const char *path
= NULL
;
1360 const char *tip
= NULL
;
1361 data_tip_node
*node
= NULL
;
1362 data_tip_node
*cur
= NULL
;
1363 data_tip
*data
= NULL
;
1365 vtoy_json_get_int(json
, "index", &index
);
1366 data
= g_data_menu_tip
+ index
;
1368 vtoy_json_get_int(json
, "type", &type
);
1370 path
= VTOY_JSON_STR_EX("path");
1371 tip
= VTOY_JSON_STR_EX("tip");
1374 node
= zalloc(sizeof(data_tip_node
));
1378 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1379 scnprintf(node
->tip
, sizeof(node
->tip
), "%s", tip
);
1381 vtoy_list_add(data
->list
, cur
, node
);
1385 ret
= ventoy_data_save_all();
1387 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1391 static int ventoy_api_tip_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1395 const char *path
= NULL
;
1396 data_tip_node
*last
= NULL
;
1397 data_tip_node
*node
= NULL
;
1398 data_tip
*data
= NULL
;
1400 vtoy_json_get_int(json
, "index", &index
);
1401 data
= g_data_menu_tip
+ index
;
1403 path
= VTOY_JSON_STR_EX("path");
1406 vtoy_list_del(last
, node
, data
->list
, path
);
1409 ret
= ventoy_data_save_all();
1411 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1418 void ventoy_data_default_menu_class(data_class
*data
)
1420 memset(data
, 0, sizeof(data_class
));
1423 int ventoy_data_cmp_menu_class(data_class
*data1
, data_class
*data2
)
1425 data_class_node
*list1
= NULL
;
1426 data_class_node
*list2
= NULL
;
1428 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1432 else if (data1
->list
&& data2
->list
)
1434 list1
= data1
->list
;
1435 list2
= data2
->list
;
1437 while (list1
&& list2
)
1439 if ((list1
->type
!= list2
->type
) ||
1440 strcmp(list1
->path
, list2
->path
) ||
1441 strcmp(list1
->class, list2
->class))
1446 list1
= list1
->next
;
1447 list2
= list2
->next
;
1450 if (list1
== NULL
&& list2
== NULL
)
1465 int ventoy_data_save_menu_class(data_class
*data
, const char *title
, char *buf
, int buflen
)
1468 data_class_node
*node
= NULL
;
1470 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1472 VTOY_JSON_FMT_KEY_L(L1
, title
);
1473 VTOY_JSON_FMT_ARY_BEGIN_N();
1475 for (node
= data
->list
; node
; node
= node
->next
)
1477 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
1479 if (node
->type
== class_type_key
)
1481 VTOY_JSON_FMT_STRN_LN(L3
, "key", node
->path
);
1483 else if (node
->type
== class_type_dir
)
1485 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "dir", node
->path
);
1489 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
1491 VTOY_JSON_FMT_STRN_LN(L3
, "class", node
->class);
1493 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
1496 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1497 VTOY_JSON_FMT_END(pos
);
1503 int ventoy_data_json_menu_class(data_class
*data
, char *buf
, int buflen
)
1507 data_class_node
*node
= NULL
;
1509 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1510 VTOY_JSON_FMT_ARY_BEGIN();
1512 for (node
= data
->list
; node
; node
= node
->next
)
1514 VTOY_JSON_FMT_OBJ_BEGIN();
1516 VTOY_JSON_FMT_UINT("type", node
->type
);
1517 VTOY_JSON_FMT_STRN("path", node
->path
);
1519 if (node
->type
== class_type_key
)
1525 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
1527 VTOY_JSON_FMT_SINT("valid", valid
);
1529 VTOY_JSON_FMT_STRN("class", node
->class);
1531 VTOY_JSON_FMT_OBJ_ENDEX();
1534 VTOY_JSON_FMT_ARY_END();
1535 VTOY_JSON_FMT_END(pos
);
1541 static int ventoy_api_get_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1543 api_get_func(conn
, json
, menu_class
);
1547 static int ventoy_api_save_class(struct mg_connection
*conn
, VTOY_JSON
*json
)
1550 ret
= ventoy_data_save_all();
1552 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1556 static int ventoy_api_class_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1560 int type
= class_type_key
;
1561 const char *path
= NULL
;
1562 const char *class = NULL
;
1563 data_class_node
*node
= NULL
;
1564 data_class_node
*cur
= NULL
;
1565 data_class
*data
= NULL
;
1567 vtoy_json_get_int(json
, "index", &index
);
1568 data
= g_data_menu_class
+ index
;
1570 vtoy_json_get_int(json
, "type", &type
);
1572 path
= VTOY_JSON_STR_EX("path");
1573 class = VTOY_JSON_STR_EX("class");
1576 node
= zalloc(sizeof(data_class_node
));
1581 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1582 scnprintf(node
->class, sizeof(node
->class), "%s", class);
1584 vtoy_list_add(data
->list
, cur
, node
);
1588 ret
= ventoy_data_save_all();
1590 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1594 static int ventoy_api_class_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1598 const char *path
= NULL
;
1599 data_class_node
*last
= NULL
;
1600 data_class_node
*node
= NULL
;
1601 data_class
*data
= NULL
;
1603 vtoy_json_get_int(json
, "index", &index
);
1604 data
= g_data_menu_class
+ index
;
1606 path
= VTOY_JSON_STR_EX("path");
1609 vtoy_list_del(last
, node
, data
->list
, path
);
1612 ret
= ventoy_data_save_all();
1614 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1621 void ventoy_data_default_auto_memdisk(data_auto_memdisk
*data
)
1623 memset(data
, 0, sizeof(data_auto_memdisk
));
1626 int ventoy_data_cmp_auto_memdisk(data_auto_memdisk
*data1
, data_auto_memdisk
*data2
)
1628 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1631 int ventoy_data_save_auto_memdisk(data_auto_memdisk
*data
, const char *title
, char *buf
, int buflen
)
1634 path_node
*node
= NULL
;
1636 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1638 VTOY_JSON_FMT_KEY_L(L1
, title
);
1639 VTOY_JSON_FMT_ARY_BEGIN_N();
1641 for (node
= data
->list
; node
; node
= node
->next
)
1643 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1646 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1647 VTOY_JSON_FMT_END(pos
);
1652 int ventoy_data_json_auto_memdisk(data_auto_memdisk
*data
, char *buf
, int buflen
)
1656 path_node
*node
= NULL
;
1658 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1659 VTOY_JSON_FMT_ARY_BEGIN();
1661 for (node
= data
->list
; node
; node
= node
->next
)
1663 VTOY_JSON_FMT_OBJ_BEGIN();
1665 VTOY_JSON_FMT_STRN("path", node
->path
);
1666 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1667 VTOY_JSON_FMT_SINT("valid", valid
);
1669 VTOY_JSON_FMT_OBJ_ENDEX();
1672 VTOY_JSON_FMT_ARY_END();
1673 VTOY_JSON_FMT_END(pos
);
1678 static int ventoy_api_get_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1680 api_get_func(conn
, json
, auto_memdisk
);
1684 static int ventoy_api_save_auto_memdisk(struct mg_connection
*conn
, VTOY_JSON
*json
)
1688 ret
= ventoy_data_save_all();
1690 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1694 static int ventoy_api_auto_memdisk_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1698 const char *path
= NULL
;
1699 path_node
*node
= NULL
;
1700 path_node
*cur
= NULL
;
1701 data_auto_memdisk
*data
= NULL
;
1703 vtoy_json_get_int(json
, "index", &index
);
1704 data
= g_data_auto_memdisk
+ index
;
1706 path
= VTOY_JSON_STR_EX("path");
1709 node
= zalloc(sizeof(path_node
));
1712 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1713 vtoy_list_add(data
->list
, cur
, node
);
1717 ret
= ventoy_data_save_all();
1719 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1723 static int ventoy_api_auto_memdisk_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1727 const char *path
= NULL
;
1728 path_node
*last
= NULL
;
1729 path_node
*node
= NULL
;
1730 data_auto_memdisk
*data
= NULL
;
1732 vtoy_json_get_int(json
, "index", &index
);
1733 data
= g_data_auto_memdisk
+ index
;
1735 path
= VTOY_JSON_STR_EX("path");
1738 vtoy_list_del(last
, node
, data
->list
, path
);
1741 ret
= ventoy_data_save_all();
1743 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1750 void ventoy_data_default_image_list(data_image_list
*data
)
1752 memset(data
, 0, sizeof(data_image_list
));
1755 int ventoy_data_cmp_image_list(data_image_list
*data1
, data_image_list
*data2
)
1757 if (data1
->type
!= data2
->type
)
1759 if (data1
->list
|| data2
->list
)
1769 return ventoy_path_list_cmp(data1
->list
, data2
->list
);
1772 int ventoy_data_save_image_list(data_image_list
*data
, const char *title
, char *buf
, int buflen
)
1775 path_node
*node
= NULL
;
1784 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1786 if (data
->type
== 0)
1788 VTOY_JSON_FMT_KEY_L(L1
, "image_list");
1792 VTOY_JSON_FMT_KEY_L(L1
, "image_blacklist");
1795 VTOY_JSON_FMT_ARY_BEGIN_N();
1797 for (node
= data
->list
; node
; node
= node
->next
)
1799 VTOY_JSON_FMT_ITEM_PATH_LN(L2
, node
->path
);
1802 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
1803 VTOY_JSON_FMT_END(pos
);
1808 int ventoy_data_json_image_list(data_image_list
*data
, char *buf
, int buflen
)
1812 path_node
*node
= NULL
;
1814 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1816 VTOY_JSON_FMT_OBJ_BEGIN();
1817 VTOY_JSON_FMT_SINT("type", data
->type
);
1819 VTOY_JSON_FMT_KEY("list");
1820 VTOY_JSON_FMT_ARY_BEGIN();
1822 for (node
= data
->list
; node
; node
= node
->next
)
1824 VTOY_JSON_FMT_OBJ_BEGIN();
1826 VTOY_JSON_FMT_STRN("path", node
->path
);
1827 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
1828 VTOY_JSON_FMT_SINT("valid", valid
);
1830 VTOY_JSON_FMT_OBJ_ENDEX();
1833 VTOY_JSON_FMT_ARY_ENDEX();
1834 VTOY_JSON_FMT_OBJ_END();
1836 VTOY_JSON_FMT_END(pos
);
1841 static int ventoy_api_get_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1843 api_get_func(conn
, json
, image_list
);
1847 static int ventoy_api_save_image_list(struct mg_connection
*conn
, VTOY_JSON
*json
)
1851 data_image_list
*data
= NULL
;
1853 vtoy_json_get_int(json
, "index", &index
);
1854 data
= g_data_image_list
+ index
;
1856 VTOY_JSON_INT("type", data
->type
);
1858 ret
= ventoy_data_save_all();
1860 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1864 static int ventoy_api_image_list_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
1868 const char *path
= NULL
;
1869 path_node
*node
= NULL
;
1870 path_node
*cur
= NULL
;
1871 data_image_list
*data
= NULL
;
1873 vtoy_json_get_int(json
, "index", &index
);
1874 data
= g_data_image_list
+ index
;
1876 path
= VTOY_JSON_STR_EX("path");
1879 node
= zalloc(sizeof(path_node
));
1882 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
1883 vtoy_list_add(data
->list
, cur
, node
);
1887 ret
= ventoy_data_save_all();
1889 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1893 static int ventoy_api_image_list_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
1897 const char *path
= NULL
;
1898 path_node
*last
= NULL
;
1899 path_node
*node
= NULL
;
1900 data_image_list
*data
= NULL
;
1902 vtoy_json_get_int(json
, "index", &index
);
1903 data
= g_data_image_list
+ index
;
1905 path
= VTOY_JSON_STR_EX("path");
1908 vtoy_list_del(last
, node
, data
->list
, path
);
1911 ret
= ventoy_data_save_all();
1913 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
1920 void ventoy_data_default_password(data_password
*data
)
1922 memset(data
, 0, sizeof(data_password
));
1925 int ventoy_data_cmp_password(data_password
*data1
, data_password
*data2
)
1927 menu_password
*list1
= NULL
;
1928 menu_password
*list2
= NULL
;
1930 if (strcmp(data1
->bootpwd
, data2
->bootpwd
) ||
1931 strcmp(data1
->isopwd
, data2
->isopwd
) ||
1932 strcmp(data1
->wimpwd
, data2
->wimpwd
) ||
1933 strcmp(data1
->vhdpwd
, data2
->vhdpwd
) ||
1934 strcmp(data1
->imgpwd
, data2
->imgpwd
) ||
1935 strcmp(data1
->efipwd
, data2
->efipwd
) ||
1936 strcmp(data1
->vtoypwd
, data2
->vtoypwd
)
1942 if (NULL
== data1
->list
&& NULL
== data2
->list
)
1946 else if (data1
->list
&& data2
->list
)
1948 list1
= data1
->list
;
1949 list2
= data2
->list
;
1951 while (list1
&& list2
)
1953 if ((list1
->type
!= list2
->type
) || strcmp(list1
->path
, list2
->path
))
1958 list1
= list1
->next
;
1959 list2
= list2
->next
;
1962 if (list1
== NULL
&& list2
== NULL
)
1977 int ventoy_data_save_password(data_password
*data
, const char *title
, char *buf
, int buflen
)
1980 menu_password
*node
= NULL
;
1981 data_password
*def
= g_data_password
+ bios_max
;
1983 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
1984 VTOY_JSON_FMT_KEY_L(L1
, title
);
1985 VTOY_JSON_FMT_OBJ_BEGIN_N();
1987 VTOY_JSON_FMT_DIFF_STRN(L2
, "bootpwd", bootpwd
);
1988 VTOY_JSON_FMT_DIFF_STRN(L2
, "isopwd", isopwd
);
1989 VTOY_JSON_FMT_DIFF_STRN(L2
, "wimpwd", wimpwd
);
1990 VTOY_JSON_FMT_DIFF_STRN(L2
, "vhdpwd", vhdpwd
);
1991 VTOY_JSON_FMT_DIFF_STRN(L2
, "imgpwd", imgpwd
);
1992 VTOY_JSON_FMT_DIFF_STRN(L2
, "efipwd", efipwd
);
1993 VTOY_JSON_FMT_DIFF_STRN(L2
, "vtoypwd", vtoypwd
);
1997 VTOY_JSON_FMT_KEY_L(L2
, "menupwd");
1998 VTOY_JSON_FMT_ARY_BEGIN_N();
2000 for (node
= data
->list
; node
; node
= node
->next
)
2002 VTOY_JSON_FMT_OBJ_BEGIN_LN(L3
);
2004 if (node
->type
== 0)
2006 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "file", node
->path
);
2010 VTOY_JSON_FMT_STRN_PATH_LN(L4
, "parent", node
->path
);
2012 VTOY_JSON_FMT_STRN_LN(L4
, "pwd", node
->pwd
);
2014 VTOY_JSON_FMT_OBJ_ENDEX_LN(L3
);
2017 VTOY_JSON_FMT_ARY_ENDEX_LN(L2
);
2020 VTOY_JSON_FMT_OBJ_ENDEX_LN(L1
);
2022 VTOY_JSON_FMT_END(pos
);
2028 int ventoy_data_json_password(data_password
*data
, char *buf
, int buflen
)
2032 menu_password
*node
= NULL
;
2034 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2036 VTOY_JSON_FMT_OBJ_BEGIN();
2038 VTOY_JSON_FMT_STRN("bootpwd", data
->bootpwd
);
2039 VTOY_JSON_FMT_STRN("isopwd", data
->isopwd
);
2040 VTOY_JSON_FMT_STRN("wimpwd", data
->wimpwd
);
2041 VTOY_JSON_FMT_STRN("vhdpwd", data
->vhdpwd
);
2042 VTOY_JSON_FMT_STRN("imgpwd", data
->imgpwd
);
2043 VTOY_JSON_FMT_STRN("efipwd", data
->efipwd
);
2044 VTOY_JSON_FMT_STRN("vtoypwd", data
->vtoypwd
);
2046 VTOY_JSON_FMT_KEY("list");
2047 VTOY_JSON_FMT_ARY_BEGIN();
2049 for (node
= data
->list
; node
; node
= node
->next
)
2051 VTOY_JSON_FMT_OBJ_BEGIN();
2053 VTOY_JSON_FMT_SINT("type", node
->type
);
2054 VTOY_JSON_FMT_STRN("path", node
->path
);
2055 if (node
->type
== path_type_file
)
2057 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2061 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2064 VTOY_JSON_FMT_SINT("valid", valid
);
2065 VTOY_JSON_FMT_STRN("pwd", node
->pwd
);
2067 VTOY_JSON_FMT_OBJ_ENDEX();
2070 VTOY_JSON_FMT_ARY_ENDEX();
2072 VTOY_JSON_FMT_OBJ_END();
2073 VTOY_JSON_FMT_END(pos
);
2078 static int ventoy_api_get_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2080 api_get_func(conn
, json
, password
);
2084 static int ventoy_api_save_password(struct mg_connection
*conn
, VTOY_JSON
*json
)
2088 data_password
*data
= NULL
;
2090 vtoy_json_get_int(json
, "index", &index
);
2091 data
= g_data_password
+ index
;
2093 VTOY_JSON_STR("bootpwd", data
->bootpwd
);
2094 VTOY_JSON_STR("isopwd", data
->isopwd
);
2095 VTOY_JSON_STR("wimpwd", data
->wimpwd
);
2096 VTOY_JSON_STR("vhdpwd", data
->vhdpwd
);
2097 VTOY_JSON_STR("imgpwd", data
->imgpwd
);
2098 VTOY_JSON_STR("efipwd", data
->efipwd
);
2099 VTOY_JSON_STR("vtoypwd", data
->vtoypwd
);
2101 ret
= ventoy_data_save_all();
2103 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2107 static int ventoy_api_password_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2112 const char *path
= NULL
;
2113 const char *pwd
= NULL
;
2114 menu_password
*node
= NULL
;
2115 menu_password
*cur
= NULL
;
2116 data_password
*data
= NULL
;
2118 vtoy_json_get_int(json
, "index", &index
);
2119 data
= g_data_password
+ index
;
2121 vtoy_json_get_int(json
, "type", &type
);
2123 path
= VTOY_JSON_STR_EX("path");
2124 pwd
= VTOY_JSON_STR_EX("pwd");
2127 node
= zalloc(sizeof(menu_password
));
2131 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2132 scnprintf(node
->pwd
, sizeof(node
->pwd
), "%s", pwd
);
2134 vtoy_list_add(data
->list
, cur
, node
);
2138 ret
= ventoy_data_save_all();
2140 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2144 static int ventoy_api_password_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2148 const char *path
= NULL
;
2149 menu_password
*last
= NULL
;
2150 menu_password
*node
= NULL
;
2151 data_password
*data
= NULL
;
2153 vtoy_json_get_int(json
, "index", &index
);
2154 data
= g_data_password
+ index
;
2156 path
= VTOY_JSON_STR_EX("path");
2159 vtoy_list_del(last
, node
, data
->list
, path
);
2162 ret
= ventoy_data_save_all();
2164 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2171 void ventoy_data_default_conf_replace(data_conf_replace
*data
)
2173 memset(data
, 0, sizeof(data_conf_replace
));
2176 int ventoy_data_cmp_conf_replace(data_conf_replace
*data1
, data_conf_replace
*data2
)
2178 conf_replace_node
*list1
= NULL
;
2179 conf_replace_node
*list2
= NULL
;
2181 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2185 else if (data1
->list
&& data2
->list
)
2187 list1
= data1
->list
;
2188 list2
= data2
->list
;
2190 while (list1
&& list2
)
2192 if (list1
->image
!= list2
->image
||
2193 strcmp(list1
->path
, list2
->path
) ||
2194 strcmp(list1
->org
, list2
->org
) ||
2195 strcmp(list1
->new, list2
->new)
2201 list1
= list1
->next
;
2202 list2
= list2
->next
;
2205 if (list1
== NULL
&& list2
== NULL
)
2220 int ventoy_data_save_conf_replace(data_conf_replace
*data
, const char *title
, char *buf
, int buflen
)
2223 conf_replace_node
*node
= NULL
;
2225 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2227 VTOY_JSON_FMT_KEY_L(L1
, title
);
2228 VTOY_JSON_FMT_ARY_BEGIN_N();
2230 for (node
= data
->list
; node
; node
= node
->next
)
2232 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2234 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "iso", node
->path
);
2235 VTOY_JSON_FMT_STRN_LN(L3
, "org", node
->org
);
2236 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "new", node
->new);
2239 VTOY_JSON_FMT_SINT_LN(L3
, "img", node
->image
);
2242 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2245 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2246 VTOY_JSON_FMT_END(pos
);
2252 int ventoy_data_json_conf_replace(data_conf_replace
*data
, char *buf
, int buflen
)
2255 conf_replace_node
*node
= NULL
;
2257 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2258 VTOY_JSON_FMT_ARY_BEGIN();
2260 for (node
= data
->list
; node
; node
= node
->next
)
2262 VTOY_JSON_FMT_OBJ_BEGIN();
2264 VTOY_JSON_FMT_STRN("path", node
->path
);
2265 VTOY_JSON_FMT_SINT("valid", ventoy_check_fuzzy_path(node
->path
, 1));
2266 VTOY_JSON_FMT_STRN("org", node
->org
);
2267 VTOY_JSON_FMT_STRN("new", node
->new);
2268 VTOY_JSON_FMT_SINT("new_valid", ventoy_is_file_exist("%s%s", g_cur_dir
, node
->new));
2269 VTOY_JSON_FMT_SINT("img", node
->image
);
2271 VTOY_JSON_FMT_OBJ_ENDEX();
2274 VTOY_JSON_FMT_ARY_END();
2275 VTOY_JSON_FMT_END(pos
);
2280 static int ventoy_api_get_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2282 api_get_func(conn
, json
, conf_replace
);
2286 static int ventoy_api_save_conf_replace(struct mg_connection
*conn
, VTOY_JSON
*json
)
2289 ret
= ventoy_data_save_all();
2291 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2295 static int ventoy_api_conf_replace_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2300 const char *path
= NULL
;
2301 const char *org
= NULL
;
2302 const char *new = NULL
;
2303 conf_replace_node
*node
= NULL
;
2304 conf_replace_node
*cur
= NULL
;
2305 data_conf_replace
*data
= NULL
;
2307 vtoy_json_get_int(json
, "img", &image
);
2309 vtoy_json_get_int(json
, "index", &index
);
2310 data
= g_data_conf_replace
+ index
;
2312 path
= VTOY_JSON_STR_EX("path");
2313 org
= VTOY_JSON_STR_EX("org");
2314 new = VTOY_JSON_STR_EX("new");
2315 if (path
&& org
&& new)
2317 node
= zalloc(sizeof(conf_replace_node
));
2320 node
->image
= image
;
2321 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2322 scnprintf(node
->org
, sizeof(node
->org
), "%s", org
);
2323 scnprintf(node
->new, sizeof(node
->new), "%s", new);
2325 vtoy_list_add(data
->list
, cur
, node
);
2329 ret
= ventoy_data_save_all();
2331 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2335 static int ventoy_api_conf_replace_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2339 const char *path
= NULL
;
2340 conf_replace_node
*last
= NULL
;
2341 conf_replace_node
*node
= NULL
;
2342 data_conf_replace
*data
= NULL
;
2344 vtoy_json_get_int(json
, "index", &index
);
2345 data
= g_data_conf_replace
+ index
;
2347 path
= VTOY_JSON_STR_EX("path");
2350 vtoy_list_del(last
, node
, data
->list
, path
);
2353 ret
= ventoy_data_save_all();
2355 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2363 void ventoy_data_default_dud(data_dud
*data
)
2365 memset(data
, 0, sizeof(data_dud
));
2368 int ventoy_data_cmp_dud(data_dud
*data1
, data_dud
*data2
)
2370 dud_node
*list1
= NULL
;
2371 dud_node
*list2
= NULL
;
2373 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2377 else if (data1
->list
&& data2
->list
)
2379 list1
= data1
->list
;
2380 list2
= data2
->list
;
2382 while (list1
&& list2
)
2384 if (strcmp(list1
->path
, list2
->path
))
2389 /* no need to compare dud list with default */
2390 list1
= list1
->next
;
2391 list2
= list2
->next
;
2394 if (list1
== NULL
&& list2
== NULL
)
2409 int ventoy_data_save_dud(data_dud
*data
, const char *title
, char *buf
, int buflen
)
2412 dud_node
*node
= NULL
;
2413 path_node
*pathnode
= NULL
;
2415 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2417 VTOY_JSON_FMT_KEY_L(L1
, title
);
2418 VTOY_JSON_FMT_ARY_BEGIN_N();
2420 for (node
= data
->list
; node
; node
= node
->next
)
2422 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2423 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2425 VTOY_JSON_FMT_KEY_L(L3
, "dud");
2426 VTOY_JSON_FMT_ARY_BEGIN_N();
2427 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2429 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2431 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2433 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2436 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2437 VTOY_JSON_FMT_END(pos
);
2443 int ventoy_data_json_dud(data_dud
*data
, char *buf
, int buflen
)
2447 dud_node
*node
= NULL
;
2448 path_node
*pathnode
= NULL
;
2450 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2451 VTOY_JSON_FMT_ARY_BEGIN();
2453 for (node
= data
->list
; node
; node
= node
->next
)
2455 VTOY_JSON_FMT_OBJ_BEGIN();
2457 VTOY_JSON_FMT_STRN("path", node
->path
);
2458 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2459 VTOY_JSON_FMT_SINT("valid", valid
);
2462 VTOY_JSON_FMT_KEY("list");
2463 VTOY_JSON_FMT_ARY_BEGIN();
2464 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2466 VTOY_JSON_FMT_OBJ_BEGIN();
2467 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2469 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2470 VTOY_JSON_FMT_SINT("valid", valid
);
2471 VTOY_JSON_FMT_OBJ_ENDEX();
2473 VTOY_JSON_FMT_ARY_ENDEX();
2476 VTOY_JSON_FMT_OBJ_ENDEX();
2479 VTOY_JSON_FMT_ARY_END();
2480 VTOY_JSON_FMT_END(pos
);
2485 static int ventoy_api_get_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2487 api_get_func(conn
, json
, dud
);
2491 static int ventoy_api_save_dud(struct mg_connection
*conn
, VTOY_JSON
*json
)
2494 ret
= ventoy_data_save_all();
2496 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2501 static int ventoy_api_dud_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2505 const char *path
= NULL
;
2506 dud_node
*node
= NULL
;
2507 dud_node
*cur
= NULL
;
2508 data_dud
*data
= NULL
;
2509 VTOY_JSON
*array
= NULL
;
2511 vtoy_json_get_int(json
, "index", &index
);
2512 data
= g_data_dud
+ index
;
2514 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "dud");
2515 path
= VTOY_JSON_STR_EX("path");
2518 node
= zalloc(sizeof(dud_node
));
2521 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2522 node
->list
= ventoy_path_node_add_array(array
);
2524 vtoy_list_add(data
->list
, cur
, node
);
2528 ret
= ventoy_data_save_all();
2530 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2534 static int ventoy_api_dud_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2538 const char *path
= NULL
;
2539 dud_node
*last
= NULL
;
2540 dud_node
*node
= NULL
;
2541 data_dud
*data
= NULL
;
2543 vtoy_json_get_int(json
, "index", &index
);
2544 data
= g_data_dud
+ index
;
2546 path
= VTOY_JSON_STR_EX("path");
2549 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2552 ret
= ventoy_data_save_all();
2554 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2559 static int ventoy_api_dud_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2563 const char *path
= NULL
;
2564 const char *outpath
= NULL
;
2565 path_node
*pcur
= NULL
;
2566 path_node
*pnode
= NULL
;
2567 dud_node
*node
= NULL
;
2568 data_dud
*data
= NULL
;
2570 vtoy_json_get_int(json
, "index", &index
);
2571 data
= g_data_dud
+ index
;
2573 path
= VTOY_JSON_STR_EX("path");
2574 outpath
= VTOY_JSON_STR_EX("outpath");
2575 if (path
&& outpath
)
2577 for (node
= data
->list
; node
; node
= node
->next
)
2579 if (strcmp(outpath
, node
->path
) == 0)
2581 pnode
= zalloc(sizeof(path_node
));
2584 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2585 vtoy_list_add(node
->list
, pcur
, pnode
);
2593 ret
= ventoy_data_save_all();
2595 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2599 static int ventoy_api_dud_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2603 const char *path
= NULL
;
2604 const char *outpath
= NULL
;
2605 path_node
*plast
= NULL
;
2606 path_node
*pnode
= NULL
;
2607 dud_node
*node
= NULL
;
2608 data_dud
*data
= NULL
;
2610 vtoy_json_get_int(json
, "index", &index
);
2611 data
= g_data_dud
+ index
;
2613 path
= VTOY_JSON_STR_EX("path");
2614 outpath
= VTOY_JSON_STR_EX("outpath");
2615 if (path
&& outpath
)
2617 for (node
= data
->list
; node
; node
= node
->next
)
2619 if (strcmp(outpath
, node
->path
) == 0)
2621 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2627 ret
= ventoy_data_save_all();
2629 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2637 void ventoy_data_default_auto_install(data_auto_install
*data
)
2639 memset(data
, 0, sizeof(data_auto_install
));
2642 int ventoy_data_cmp_auto_install(data_auto_install
*data1
, data_auto_install
*data2
)
2644 auto_install_node
*list1
= NULL
;
2645 auto_install_node
*list2
= NULL
;
2647 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2651 else if (data1
->list
&& data2
->list
)
2653 list1
= data1
->list
;
2654 list2
= data2
->list
;
2656 while (list1
&& list2
)
2658 if (list1
->timeout
!= list2
->timeout
||
2659 list1
->autosel
!= list2
->autosel
||
2660 strcmp(list1
->path
, list2
->path
))
2665 /* no need to compare auto install list with default */
2666 list1
= list1
->next
;
2667 list2
= list2
->next
;
2670 if (list1
== NULL
&& list2
== NULL
)
2685 int ventoy_data_save_auto_install(data_auto_install
*data
, const char *title
, char *buf
, int buflen
)
2688 auto_install_node
*node
= NULL
;
2689 path_node
*pathnode
= NULL
;
2691 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2693 VTOY_JSON_FMT_KEY_L(L1
, title
);
2694 VTOY_JSON_FMT_ARY_BEGIN_N();
2696 for (node
= data
->list
; node
; node
= node
->next
)
2698 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
2699 if (node
->type
== 0)
2701 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
2705 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
2709 VTOY_JSON_FMT_KEY_L(L3
, "template");
2710 VTOY_JSON_FMT_ARY_BEGIN_N();
2711 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2713 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
2715 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
2717 if (node
->timeouten
)
2719 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
2722 if (node
->autoselen
)
2724 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
2727 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
2730 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
2731 VTOY_JSON_FMT_END(pos
);
2737 int ventoy_data_json_auto_install(data_auto_install
*data
, char *buf
, int buflen
)
2741 auto_install_node
*node
= NULL
;
2742 path_node
*pathnode
= NULL
;
2744 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
2745 VTOY_JSON_FMT_ARY_BEGIN();
2747 for (node
= data
->list
; node
; node
= node
->next
)
2749 VTOY_JSON_FMT_OBJ_BEGIN();
2751 VTOY_JSON_FMT_STRN("path", node
->path
);
2753 if (node
->type
== 0)
2755 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
2759 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
2761 VTOY_JSON_FMT_SINT("valid", valid
);
2762 VTOY_JSON_FMT_SINT("type", node
->type
);
2764 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
2765 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
2767 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
2768 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
2770 VTOY_JSON_FMT_KEY("list");
2771 VTOY_JSON_FMT_ARY_BEGIN();
2772 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
2774 VTOY_JSON_FMT_OBJ_BEGIN();
2775 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
2777 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
2778 VTOY_JSON_FMT_SINT("valid", valid
);
2779 VTOY_JSON_FMT_OBJ_ENDEX();
2781 VTOY_JSON_FMT_ARY_ENDEX();
2784 VTOY_JSON_FMT_OBJ_ENDEX();
2787 VTOY_JSON_FMT_ARY_END();
2788 VTOY_JSON_FMT_END(pos
);
2793 static int ventoy_api_get_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2795 api_get_func(conn
, json
, auto_install
);
2799 static int ventoy_api_save_auto_install(struct mg_connection
*conn
, VTOY_JSON
*json
)
2805 uint8_t timeouten
= 0;
2806 uint8_t autoselen
= 0;
2807 auto_install_node
*node
= NULL
;
2808 data_auto_install
*data
= NULL
;
2810 vtoy_json_get_int(json
, "index", &index
);
2811 vtoy_json_get_int(json
, "id", &id
);
2813 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
2814 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
2816 data
= g_data_auto_install
+ index
;
2820 for (node
= data
->list
; node
; node
= node
->next
)
2824 node
->timeouten
= (int)timeouten
;
2825 node
->autoselen
= (int)autoselen
;
2826 VTOY_JSON_INT("timeout", node
->timeout
);
2827 VTOY_JSON_INT("autosel", node
->autosel
);
2833 ret
= ventoy_data_save_all();
2835 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2840 static int ventoy_api_auto_install_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
2845 const char *path
= NULL
;
2846 auto_install_node
*node
= NULL
;
2847 auto_install_node
*cur
= NULL
;
2848 data_auto_install
*data
= NULL
;
2849 VTOY_JSON
*array
= NULL
;
2851 vtoy_json_get_int(json
, "type", &type
);
2852 vtoy_json_get_int(json
, "index", &index
);
2853 data
= g_data_auto_install
+ index
;
2855 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "template");
2856 path
= VTOY_JSON_STR_EX("path");
2859 node
= zalloc(sizeof(auto_install_node
));
2863 node
->timeouten
= 0;
2864 node
->autoselen
= 0;
2867 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
2868 node
->list
= ventoy_path_node_add_array(array
);
2870 vtoy_list_add(data
->list
, cur
, node
);
2874 ret
= ventoy_data_save_all();
2876 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2880 static int ventoy_api_auto_install_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
2884 const char *path
= NULL
;
2885 auto_install_node
*last
= NULL
;
2886 auto_install_node
*node
= NULL
;
2887 data_auto_install
*data
= NULL
;
2889 vtoy_json_get_int(json
, "index", &index
);
2890 data
= g_data_auto_install
+ index
;
2892 path
= VTOY_JSON_STR_EX("path");
2895 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
2898 ret
= ventoy_data_save_all();
2900 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2904 static int ventoy_api_auto_install_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2908 const char *path
= NULL
;
2909 const char *outpath
= NULL
;
2910 path_node
*pcur
= NULL
;
2911 path_node
*pnode
= NULL
;
2912 auto_install_node
*node
= NULL
;
2913 data_auto_install
*data
= NULL
;
2915 vtoy_json_get_int(json
, "index", &index
);
2916 data
= g_data_auto_install
+ index
;
2918 path
= VTOY_JSON_STR_EX("path");
2919 outpath
= VTOY_JSON_STR_EX("outpath");
2920 if (path
&& outpath
)
2922 for (node
= data
->list
; node
; node
= node
->next
)
2924 if (strcmp(outpath
, node
->path
) == 0)
2926 pnode
= zalloc(sizeof(path_node
));
2929 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
2930 vtoy_list_add(node
->list
, pcur
, pnode
);
2938 ret
= ventoy_data_save_all();
2940 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2944 static int ventoy_api_auto_install_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
2948 const char *path
= NULL
;
2949 const char *outpath
= NULL
;
2950 path_node
*plast
= NULL
;
2951 path_node
*pnode
= NULL
;
2952 auto_install_node
*node
= NULL
;
2953 data_auto_install
*data
= NULL
;
2955 vtoy_json_get_int(json
, "index", &index
);
2956 data
= g_data_auto_install
+ index
;
2958 path
= VTOY_JSON_STR_EX("path");
2959 outpath
= VTOY_JSON_STR_EX("outpath");
2960 if (path
&& outpath
)
2962 for (node
= data
->list
; node
; node
= node
->next
)
2964 if (strcmp(outpath
, node
->path
) == 0)
2966 vtoy_list_del(plast
, pnode
, node
->list
, path
);
2972 ret
= ventoy_data_save_all();
2974 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
2983 void ventoy_data_default_persistence(data_persistence
*data
)
2985 memset(data
, 0, sizeof(data_persistence
));
2988 int ventoy_data_cmp_persistence(data_persistence
*data1
, data_persistence
*data2
)
2990 persistence_node
*list1
= NULL
;
2991 persistence_node
*list2
= NULL
;
2993 if (NULL
== data1
->list
&& NULL
== data2
->list
)
2997 else if (data1
->list
&& data2
->list
)
2999 list1
= data1
->list
;
3000 list2
= data2
->list
;
3002 while (list1
&& list2
)
3004 if (list1
->timeout
!= list2
->timeout
||
3005 list1
->autosel
!= list2
->autosel
||
3006 strcmp(list1
->path
, list2
->path
))
3011 /* no need to compare auto install list with default */
3012 list1
= list1
->next
;
3013 list2
= list2
->next
;
3016 if (list1
== NULL
&& list2
== NULL
)
3031 int ventoy_data_save_persistence(data_persistence
*data
, const char *title
, char *buf
, int buflen
)
3034 persistence_node
*node
= NULL
;
3035 path_node
*pathnode
= NULL
;
3037 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3039 VTOY_JSON_FMT_KEY_L(L1
, title
);
3040 VTOY_JSON_FMT_ARY_BEGIN_N();
3042 for (node
= data
->list
; node
; node
= node
->next
)
3044 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3045 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3046 VTOY_JSON_FMT_KEY_L(L3
, "backend");
3047 VTOY_JSON_FMT_ARY_BEGIN_N();
3048 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3050 VTOY_JSON_FMT_ITEM_PATH_LN(L4
, pathnode
->path
);
3052 VTOY_JSON_FMT_ARY_ENDEX_LN(L3
);
3054 if (node
->timeouten
)
3056 VTOY_JSON_FMT_SINT_LN(L3
, "timeout", node
->timeout
);
3059 if (node
->autoselen
)
3061 VTOY_JSON_FMT_SINT_LN(L3
, "autosel", node
->autosel
);
3064 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3067 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3068 VTOY_JSON_FMT_END(pos
);
3074 int ventoy_data_json_persistence(data_persistence
*data
, char *buf
, int buflen
)
3078 persistence_node
*node
= NULL
;
3079 path_node
*pathnode
= NULL
;
3081 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3082 VTOY_JSON_FMT_ARY_BEGIN();
3084 for (node
= data
->list
; node
; node
= node
->next
)
3086 VTOY_JSON_FMT_OBJ_BEGIN();
3088 VTOY_JSON_FMT_STRN("path", node
->path
);
3090 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3091 VTOY_JSON_FMT_SINT("valid", valid
);
3092 VTOY_JSON_FMT_SINT("type", node
->type
);
3094 VTOY_JSON_FMT_BOOL("timeouten", node
->timeouten
);
3095 VTOY_JSON_FMT_BOOL("autoselen", node
->autoselen
);
3097 VTOY_JSON_FMT_SINT("autosel", node
->autosel
);
3098 VTOY_JSON_FMT_SINT("timeout", node
->timeout
);
3100 VTOY_JSON_FMT_KEY("list");
3101 VTOY_JSON_FMT_ARY_BEGIN();
3102 for (pathnode
= node
->list
; pathnode
; pathnode
= pathnode
->next
)
3104 VTOY_JSON_FMT_OBJ_BEGIN();
3105 VTOY_JSON_FMT_STRN("path", pathnode
->path
);
3107 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, pathnode
->path
);
3108 VTOY_JSON_FMT_SINT("valid", valid
);
3109 VTOY_JSON_FMT_OBJ_ENDEX();
3111 VTOY_JSON_FMT_ARY_ENDEX();
3114 VTOY_JSON_FMT_OBJ_ENDEX();
3117 VTOY_JSON_FMT_ARY_END();
3118 VTOY_JSON_FMT_END(pos
);
3123 static int ventoy_api_get_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3125 api_get_func(conn
, json
, persistence
);
3129 static int ventoy_api_save_persistence(struct mg_connection
*conn
, VTOY_JSON
*json
)
3135 uint8_t timeouten
= 0;
3136 uint8_t autoselen
= 0;
3137 persistence_node
*node
= NULL
;
3138 data_persistence
*data
= NULL
;
3140 vtoy_json_get_int(json
, "index", &index
);
3141 vtoy_json_get_int(json
, "id", &id
);
3143 vtoy_json_get_bool(json
, "timeouten", &timeouten
);
3144 vtoy_json_get_bool(json
, "autoselen", &autoselen
);
3146 data
= g_data_persistence
+ index
;
3150 for (node
= data
->list
; node
; node
= node
->next
)
3154 node
->timeouten
= (int)timeouten
;
3155 node
->autoselen
= (int)autoselen
;
3156 VTOY_JSON_INT("timeout", node
->timeout
);
3157 VTOY_JSON_INT("autosel", node
->autosel
);
3163 ret
= ventoy_data_save_all();
3165 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3170 static int ventoy_api_persistence_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3174 const char *path
= NULL
;
3175 persistence_node
*node
= NULL
;
3176 persistence_node
*cur
= NULL
;
3177 data_persistence
*data
= NULL
;
3178 VTOY_JSON
*array
= NULL
;
3180 vtoy_json_get_int(json
, "index", &index
);
3181 data
= g_data_persistence
+ index
;
3183 array
= vtoy_json_find_item(json
, JSON_TYPE_ARRAY
, "backend");
3184 path
= VTOY_JSON_STR_EX("path");
3187 node
= zalloc(sizeof(persistence_node
));
3190 node
->timeouten
= 0;
3191 node
->autoselen
= 0;
3194 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3195 node
->list
= ventoy_path_node_add_array(array
);
3197 vtoy_list_add(data
->list
, cur
, node
);
3201 ret
= ventoy_data_save_all();
3203 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3207 static int ventoy_api_persistence_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3211 const char *path
= NULL
;
3212 persistence_node
*last
= NULL
;
3213 persistence_node
*node
= NULL
;
3214 data_persistence
*data
= NULL
;
3216 vtoy_json_get_int(json
, "index", &index
);
3217 data
= g_data_persistence
+ index
;
3219 path
= VTOY_JSON_STR_EX("path");
3222 vtoy_list_del_ex(last
, node
, data
->list
, path
, ventoy_free_path_node_list
);
3225 ret
= ventoy_data_save_all();
3227 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3231 static int ventoy_api_persistence_add_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3235 const char *path
= NULL
;
3236 const char *outpath
= NULL
;
3237 path_node
*pcur
= NULL
;
3238 path_node
*pnode
= NULL
;
3239 persistence_node
*node
= NULL
;
3240 data_persistence
*data
= NULL
;
3242 vtoy_json_get_int(json
, "index", &index
);
3243 data
= g_data_persistence
+ index
;
3245 path
= VTOY_JSON_STR_EX("path");
3246 outpath
= VTOY_JSON_STR_EX("outpath");
3247 if (path
&& outpath
)
3249 for (node
= data
->list
; node
; node
= node
->next
)
3251 if (strcmp(outpath
, node
->path
) == 0)
3253 pnode
= zalloc(sizeof(path_node
));
3256 scnprintf(pnode
->path
, sizeof(pnode
->path
), "%s", path
);
3257 vtoy_list_add(node
->list
, pcur
, pnode
);
3265 ret
= ventoy_data_save_all();
3267 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3271 static int ventoy_api_persistence_del_inner(struct mg_connection
*conn
, VTOY_JSON
*json
)
3275 const char *path
= NULL
;
3276 const char *outpath
= NULL
;
3277 path_node
*plast
= NULL
;
3278 path_node
*pnode
= NULL
;
3279 persistence_node
*node
= NULL
;
3280 data_persistence
*data
= NULL
;
3282 vtoy_json_get_int(json
, "index", &index
);
3283 data
= g_data_persistence
+ index
;
3285 path
= VTOY_JSON_STR_EX("path");
3286 outpath
= VTOY_JSON_STR_EX("outpath");
3287 if (path
&& outpath
)
3289 for (node
= data
->list
; node
; node
= node
->next
)
3291 if (strcmp(outpath
, node
->path
) == 0)
3293 vtoy_list_del(plast
, pnode
, node
->list
, path
);
3299 ret
= ventoy_data_save_all();
3301 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3309 void ventoy_data_default_injection(data_injection
*data
)
3311 memset(data
, 0, sizeof(data_injection
));
3314 int ventoy_data_cmp_injection(data_injection
*data1
, data_injection
*data2
)
3316 injection_node
*list1
= NULL
;
3317 injection_node
*list2
= NULL
;
3319 if (NULL
== data1
->list
&& NULL
== data2
->list
)
3323 else if (data1
->list
&& data2
->list
)
3325 list1
= data1
->list
;
3326 list2
= data2
->list
;
3328 while (list1
&& list2
)
3330 if ((list1
->type
!= list2
->type
) ||
3331 strcmp(list1
->path
, list2
->path
) ||
3332 strcmp(list1
->archive
, list2
->archive
))
3337 list1
= list1
->next
;
3338 list2
= list2
->next
;
3341 if (list1
== NULL
&& list2
== NULL
)
3356 int ventoy_data_save_injection(data_injection
*data
, const char *title
, char *buf
, int buflen
)
3359 injection_node
*node
= NULL
;
3361 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3363 VTOY_JSON_FMT_KEY_L(L1
, title
);
3364 VTOY_JSON_FMT_ARY_BEGIN_N();
3366 for (node
= data
->list
; node
; node
= node
->next
)
3368 VTOY_JSON_FMT_OBJ_BEGIN_LN(L2
);
3370 if (node
->type
== 0)
3372 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "image", node
->path
);
3376 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "parent", node
->path
);
3378 VTOY_JSON_FMT_STRN_PATH_LN(L3
, "archive", node
->archive
);
3380 VTOY_JSON_FMT_OBJ_ENDEX_LN(L2
);
3383 VTOY_JSON_FMT_ARY_ENDEX_LN(L1
);
3384 VTOY_JSON_FMT_END(pos
);
3390 int ventoy_data_json_injection(data_injection
*data
, char *buf
, int buflen
)
3394 injection_node
*node
= NULL
;
3396 VTOY_JSON_FMT_BEGIN(pos
, buf
, buflen
);
3397 VTOY_JSON_FMT_ARY_BEGIN();
3399 for (node
= data
->list
; node
; node
= node
->next
)
3401 VTOY_JSON_FMT_OBJ_BEGIN();
3403 VTOY_JSON_FMT_UINT("type", node
->type
);
3404 VTOY_JSON_FMT_STRN("path", node
->path
);
3406 if (node
->type
== 0)
3408 valid
= ventoy_check_fuzzy_path(node
->path
, 1);
3412 valid
= ventoy_is_directory_exist("%s%s", g_cur_dir
, node
->path
);
3414 VTOY_JSON_FMT_SINT("valid", valid
);
3416 VTOY_JSON_FMT_STRN("archive", node
->archive
);
3418 valid
= ventoy_is_file_exist("%s%s", g_cur_dir
, node
->archive
);
3419 VTOY_JSON_FMT_SINT("archive_valid", valid
);
3421 VTOY_JSON_FMT_OBJ_ENDEX();
3424 VTOY_JSON_FMT_ARY_END();
3425 VTOY_JSON_FMT_END(pos
);
3431 static int ventoy_api_get_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3433 api_get_func(conn
, json
, injection
);
3437 static int ventoy_api_save_injection(struct mg_connection
*conn
, VTOY_JSON
*json
)
3440 ret
= ventoy_data_save_all();
3442 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3446 static int ventoy_api_injection_add(struct mg_connection
*conn
, VTOY_JSON
*json
)
3451 const char *path
= NULL
;
3452 const char *archive
= NULL
;
3453 injection_node
*node
= NULL
;
3454 injection_node
*cur
= NULL
;
3455 data_injection
*data
= NULL
;
3457 vtoy_json_get_int(json
, "index", &index
);
3458 data
= g_data_injection
+ index
;
3460 vtoy_json_get_int(json
, "type", &type
);
3462 path
= VTOY_JSON_STR_EX("path");
3463 archive
= VTOY_JSON_STR_EX("archive");
3464 if (path
&& archive
)
3466 node
= zalloc(sizeof(injection_node
));
3471 scnprintf(node
->path
, sizeof(node
->path
), "%s", path
);
3472 scnprintf(node
->archive
, sizeof(node
->archive
), "%s", archive
);
3474 vtoy_list_add(data
->list
, cur
, node
);
3478 ret
= ventoy_data_save_all();
3480 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3484 static int ventoy_api_injection_del(struct mg_connection
*conn
, VTOY_JSON
*json
)
3488 const char *path
= NULL
;
3489 injection_node
*last
= NULL
;
3490 injection_node
*node
= NULL
;
3491 data_injection
*data
= NULL
;
3493 vtoy_json_get_int(json
, "index", &index
);
3494 data
= g_data_injection
+ index
;
3496 path
= VTOY_JSON_STR_EX("path");
3499 vtoy_list_del(last
, node
, data
->list
, path
);
3502 ret
= ventoy_data_save_all();
3504 ventoy_json_result(conn
, ret
== 0 ? VTOY_JSON_SUCCESS_RET
: VTOY_JSON_FAILED_RET
);
3512 int ventoy_data_save_all(void)
3514 ventoy_set_writeback_event();
3518 int ventoy_data_real_save_all(void)
3524 pthread_mutex_lock(&g_api_mutex
);
3526 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "{\n");
3528 ventoy_save_plug(control
);
3529 ventoy_save_plug(theme
);
3530 ventoy_save_plug(menu_alias
);
3531 ventoy_save_plug(menu_tip
);
3532 ventoy_save_plug(menu_class
);
3533 ventoy_save_plug(auto_install
);
3534 ventoy_save_plug(persistence
);
3535 ventoy_save_plug(injection
);
3536 ventoy_save_plug(conf_replace
);
3537 ventoy_save_plug(password
);
3538 ventoy_save_plug(image_list
);
3539 ventoy_save_plug(auto_memdisk
);
3540 ventoy_save_plug(dud
);
3542 if (JSON_SAVE_BUFFER
[pos
- 1] == '\n' && JSON_SAVE_BUFFER
[pos
- 2] == ',')
3544 JSON_SAVE_BUFFER
[pos
- 2] = '\n';
3547 ssprintf(pos
, JSON_SAVE_BUFFER
, JSON_BUF_MAX
, "}\n");
3549 pthread_mutex_unlock(&g_api_mutex
);
3554 int ventoy_http_writeback(void)
3560 ventoy_get_json_path(filename
, NULL
);
3562 pos
= ventoy_data_real_save_all();
3565 printf("%s", JSON_SAVE_BUFFER
);
3568 ret
= ventoy_write_buf_to_file(filename
, JSON_SAVE_BUFFER
, pos
);
3571 vlog("Failed to write ventoy.json file.\n");
3578 static JSON_CB g_ventoy_json_cb
[] =
3580 { "sysinfo", ventoy_api_sysinfo
},
3581 { "handshake", ventoy_api_handshake
},
3582 { "check_path", ventoy_api_check_exist
},
3583 { "check_path2", ventoy_api_check_exist2
},
3584 { "check_fuzzy", ventoy_api_check_fuzzy
},
3586 { "device_info", ventoy_api_device_info
},
3588 { "get_control", ventoy_api_get_control
},
3589 { "save_control", ventoy_api_save_control
},
3591 { "get_theme", ventoy_api_get_theme
},
3592 { "save_theme", ventoy_api_save_theme
},
3593 { "theme_add_file", ventoy_api_theme_add_file
},
3594 { "theme_del_file", ventoy_api_theme_del_file
},
3595 { "theme_add_font", ventoy_api_theme_add_font
},
3596 { "theme_del_font", ventoy_api_theme_del_font
},
3598 { "get_alias", ventoy_api_get_alias
},
3599 { "save_alias", ventoy_api_save_alias
},
3600 { "alias_add", ventoy_api_alias_add
},
3601 { "alias_del", ventoy_api_alias_del
},
3603 { "get_tip", ventoy_api_get_tip
},
3604 { "save_tip", ventoy_api_save_tip
},
3605 { "tip_add", ventoy_api_tip_add
},
3606 { "tip_del", ventoy_api_tip_del
},
3608 { "get_class", ventoy_api_get_class
},
3609 { "save_class", ventoy_api_save_class
},
3610 { "class_add", ventoy_api_class_add
},
3611 { "class_del", ventoy_api_class_del
},
3613 { "get_auto_memdisk", ventoy_api_get_auto_memdisk
},
3614 { "save_auto_memdisk", ventoy_api_save_auto_memdisk
},
3615 { "auto_memdisk_add", ventoy_api_auto_memdisk_add
},
3616 { "auto_memdisk_del", ventoy_api_auto_memdisk_del
},
3618 { "get_image_list", ventoy_api_get_image_list
},
3619 { "save_image_list", ventoy_api_save_image_list
},
3620 { "image_list_add", ventoy_api_image_list_add
},
3621 { "image_list_del", ventoy_api_image_list_del
},
3623 { "get_conf_replace", ventoy_api_get_conf_replace
},
3624 { "save_conf_replace", ventoy_api_save_conf_replace
},
3625 { "conf_replace_add", ventoy_api_conf_replace_add
},
3626 { "conf_replace_del", ventoy_api_conf_replace_del
},
3628 { "get_dud", ventoy_api_get_dud
},
3629 { "save_dud", ventoy_api_save_dud
},
3630 { "dud_add", ventoy_api_dud_add
},
3631 { "dud_del", ventoy_api_dud_del
},
3632 { "dud_add_inner", ventoy_api_dud_add_inner
},
3633 { "dud_del_inner", ventoy_api_dud_del_inner
},
3635 { "get_auto_install", ventoy_api_get_auto_install
},
3636 { "save_auto_install", ventoy_api_save_auto_install
},
3637 { "auto_install_add", ventoy_api_auto_install_add
},
3638 { "auto_install_del", ventoy_api_auto_install_del
},
3639 { "auto_install_add_inner", ventoy_api_auto_install_add_inner
},
3640 { "auto_install_del_inner", ventoy_api_auto_install_del_inner
},
3642 { "get_persistence", ventoy_api_get_persistence
},
3643 { "save_persistence", ventoy_api_save_persistence
},
3644 { "persistence_add", ventoy_api_persistence_add
},
3645 { "persistence_del", ventoy_api_persistence_del
},
3646 { "persistence_add_inner", ventoy_api_persistence_add_inner
},
3647 { "persistence_del_inner", ventoy_api_persistence_del_inner
},
3649 { "get_password", ventoy_api_get_password
},
3650 { "save_password", ventoy_api_save_password
},
3651 { "password_add", ventoy_api_password_add
},
3652 { "password_del", ventoy_api_password_del
},
3654 { "get_injection", ventoy_api_get_injection
},
3655 { "save_injection", ventoy_api_save_injection
},
3656 { "injection_add", ventoy_api_injection_add
},
3657 { "injection_del", ventoy_api_injection_del
},
3662 static int ventoy_json_handler(struct mg_connection
*conn
, VTOY_JSON
*json
)
3665 const char *method
= NULL
;
3667 method
= vtoy_json_get_string_ex(json
, "method");
3670 ventoy_json_result(conn
, VTOY_JSON_SUCCESS_RET
);
3674 if (strcmp(method
, "handshake") == 0)
3676 ventoy_api_handshake(conn
, json
);
3680 for (i
= 0; i
< (int)(sizeof(g_ventoy_json_cb
) / sizeof(g_ventoy_json_cb
[0])); i
++)
3682 if (strcmp(method
, g_ventoy_json_cb
[i
].method
) == 0)
3684 g_ventoy_json_cb
[i
].callback(conn
, json
);
3692 static int ventoy_request_handler(struct mg_connection
*conn
)
3696 VTOY_JSON
*json
= NULL
;
3697 char *post_data_buf
= NULL
;
3698 const struct mg_request_info
*ri
= NULL
;
3699 char stack_buf
[512];
3701 ri
= mg_get_request_info(conn
);
3703 if (strcmp(ri
->uri
, "/vtoy/json") == 0)
3705 if (ri
->content_length
> 500)
3707 post_data_buf
= malloc((int)(ri
->content_length
+ 4));
3708 post_buf_len
= (int)(ri
->content_length
+ 1);
3712 post_data_buf
= stack_buf
;
3713 post_buf_len
= sizeof(stack_buf
);
3716 post_data_len
= mg_read(conn
, post_data_buf
, post_buf_len
);
3717 post_data_buf
[post_data_len
] = 0;
3719 json
= vtoy_json_create();
3720 if (JSON_SUCCESS
== vtoy_json_parse(json
, post_data_buf
))
3722 pthread_mutex_lock(&g_api_mutex
);
3723 ventoy_json_handler(conn
, json
->pstChild
);
3724 pthread_mutex_unlock(&g_api_mutex
);
3728 ventoy_json_result(conn
, VTOY_JSON_INVALID_RET
);
3731 vtoy_json_destroy(json
);
3733 if (post_data_buf
!= stack_buf
)
3735 free(post_data_buf
);
3745 const char *ventoy_web_openfile(const struct mg_connection
*conn
, const char *path
, size_t *data_len
)
3747 ventoy_file
*node
= NULL
;
3756 node
= ventoy_tar_find_file(path
);
3759 *data_len
= node
->size
;
3771 static int ventoy_parse_control(VTOY_JSON
*json
, void *p
)
3774 VTOY_JSON
*node
= NULL
;
3775 VTOY_JSON
*child
= NULL
;
3776 data_control
*data
= (data_control
*)p
;
3778 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
3783 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
3785 if (node
->enDataType
== JSON_TYPE_OBJECT
)
3787 child
= node
->pstChild
;
3789 if (strcmp(child
->pcName
, "VTOY_DEFAULT_MENU_MODE") == 0)
3791 CONTROL_PARSE_INT(child
, data
->default_menu_mode
);
3793 else if (strcmp(child
->pcName
, "VTOY_WIN11_BYPASS_CHECK") == 0)
3795 CONTROL_PARSE_INT(child
, data
->win11_bypass_check
);
3797 else if (strcmp(child
->pcName
, "VTOY_LINUX_REMOUNT") == 0)
3799 CONTROL_PARSE_INT(child
, data
->linux_remount
);
3801 else if (strcmp(child
->pcName
, "VTOY_TREE_VIEW_MENU_STYLE") == 0)
3803 CONTROL_PARSE_INT(child
, data
->treeview_style
);
3805 else if (strcmp(child
->pcName
, "VTOY_FILT_DOT_UNDERSCORE_FILE") == 0)
3807 CONTROL_PARSE_INT(child
, data
->filter_dot_underscore
);
3809 else if (strcmp(child
->pcName
, "VTOY_SORT_CASE_SENSITIVE") == 0)
3811 CONTROL_PARSE_INT(child
, data
->sort_casesensitive
);
3813 else if (strcmp(child
->pcName
, "VTOY_MAX_SEARCH_LEVEL") == 0)
3815 if (strcmp(child
->unData
.pcStrVal
, "max") == 0)
3817 data
->max_search_level
= -1;
3821 data
->max_search_level
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3824 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_SEARCH_ROOT") == 0)
3826 strlcpy(data
->default_search_root
, child
->unData
.pcStrVal
);
3828 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_IMAGE") == 0)
3830 strlcpy(data
->default_image
, child
->unData
.pcStrVal
);
3832 else if (strcmp(child
->pcName
, "VTOY_DEFAULT_KBD_LAYOUT") == 0)
3834 for (i
= 0; g_ventoy_kbd_layout
[i
]; i
++)
3836 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_kbd_layout
[i
]) == 0)
3838 strlcpy(data
->default_kbd_layout
, child
->unData
.pcStrVal
);
3843 else if (strcmp(child
->pcName
, "VTOY_HELP_TXT_LANGUAGE") == 0)
3845 for (i
= 0; g_ventoy_help_lang
[i
][0]; i
++)
3847 if (strcmp(child
->unData
.pcStrVal
, g_ventoy_help_lang
[i
]) == 0)
3849 strlcpy(data
->help_text_language
, child
->unData
.pcStrVal
);
3854 else if (strcmp(child
->pcName
, "VTOY_MENU_TIMEOUT") == 0)
3856 data
->menu_timeout
= (int)strtol(child
->unData
.pcStrVal
, NULL
, 10);
3858 else if (strcmp(child
->pcName
, "VTOY_VHD_NO_WARNING") == 0)
3860 CONTROL_PARSE_INT(child
, data
->vhd_no_warning
);
3862 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_ISO") == 0)
3864 CONTROL_PARSE_INT(child
, data
->filter_iso
);
3866 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_IMG") == 0)
3868 CONTROL_PARSE_INT(child
, data
->filter_img
);
3870 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_EFI") == 0)
3872 CONTROL_PARSE_INT(child
, data
->filter_efi
);
3874 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_WIM") == 0)
3876 CONTROL_PARSE_INT(child
, data
->filter_wim
);
3878 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VHD") == 0)
3880 CONTROL_PARSE_INT(child
, data
->filter_vhd
);
3882 else if (strcmp(child
->pcName
, "VTOY_FILE_FLT_VTOY") == 0)
3884 CONTROL_PARSE_INT(child
, data
->filter_vtoy
);
3892 static int ventoy_parse_theme(VTOY_JSON
*json
, void *p
)
3894 const char *dismode
= NULL
;
3895 VTOY_JSON
*child
= NULL
;
3896 VTOY_JSON
*node
= NULL
;
3897 path_node
*tail
= NULL
;
3898 path_node
*pnode
= NULL
;
3899 data_theme
*data
= (data_theme
*)p
;
3901 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
3906 child
= json
->pstChild
;
3908 dismode
= vtoy_json_get_string_ex(child
, "display_mode");
3909 vtoy_json_get_string(child
, "ventoy_left", sizeof(data
->ventoy_left
), data
->ventoy_left
);
3910 vtoy_json_get_string(child
, "ventoy_top", sizeof(data
->ventoy_top
), data
->ventoy_top
);
3911 vtoy_json_get_string(child
, "ventoy_color", sizeof(data
->ventoy_color
), data
->ventoy_color
);
3913 vtoy_json_get_int(child
, "default_file", &(data
->default_file
));
3914 vtoy_json_get_string(child
, "gfxmode", sizeof(data
->gfxmode
), data
->gfxmode
);
3915 vtoy_json_get_string(child
, "serial_param", sizeof(data
->serial_param
), data
->serial_param
);
3919 if (strcmp(dismode
, "CLI") == 0)
3921 data
->display_mode
= display_mode_cli
;
3923 else if (strcmp(dismode
, "serial") == 0)
3925 data
->display_mode
= display_mode_serial
;
3927 else if (strcmp(dismode
, "serial_console") == 0)
3929 data
->display_mode
= display_mode_ser_console
;
3933 data
->display_mode
= display_mode_gui
;
3937 node
= vtoy_json_find_item(child
, JSON_TYPE_STRING
, "file");
3940 data
->default_file
= 0;
3942 pnode
= zalloc(sizeof(path_node
));
3945 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3946 data
->filelist
= pnode
;
3951 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "file");
3954 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3956 if (node
->enDataType
== JSON_TYPE_STRING
)
3958 pnode
= zalloc(sizeof(path_node
));
3961 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3969 data
->filelist
= tail
= pnode
;
3978 node
= vtoy_json_find_item(child
, JSON_TYPE_ARRAY
, "fonts");
3981 for (node
= node
->pstChild
; node
; node
= node
->pstNext
)
3983 if (node
->enDataType
== JSON_TYPE_STRING
)
3985 pnode
= zalloc(sizeof(path_node
));
3988 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
3989 if (data
->fontslist
)
3996 data
->fontslist
= tail
= pnode
;
4005 static int ventoy_parse_menu_alias(VTOY_JSON
*json
, void *p
)
4008 const char *path
= NULL
;
4009 const char *alias
= NULL
;
4010 data_alias
*data
= (data_alias
*)p
;
4011 data_alias_node
*tail
= NULL
;
4012 data_alias_node
*pnode
= NULL
;
4013 VTOY_JSON
*node
= NULL
;
4015 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4020 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4022 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4027 type
= path_type_file
;
4028 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4031 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4032 type
= path_type_dir
;
4034 alias
= vtoy_json_get_string_ex(node
->pstChild
, "alias");
4038 pnode
= zalloc(sizeof(data_alias_node
));
4042 strlcpy(pnode
->path
, path
);
4043 strlcpy(pnode
->alias
, alias
);
4052 data
->list
= tail
= pnode
;
4061 static int ventoy_parse_menu_tip(VTOY_JSON
*json
, void *p
)
4064 const char *path
= NULL
;
4065 const char *tip
= NULL
;
4066 data_tip
*data
= (data_tip
*)p
;
4067 data_tip_node
*tail
= NULL
;
4068 data_tip_node
*pnode
= NULL
;
4069 VTOY_JSON
*node
= NULL
;
4070 VTOY_JSON
*tips
= NULL
;
4072 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4077 vtoy_json_get_string(json
->pstChild
, "left", sizeof(data
->left
), data
->left
);
4078 vtoy_json_get_string(json
->pstChild
, "top", sizeof(data
->top
), data
->top
);
4079 vtoy_json_get_string(json
->pstChild
, "color", sizeof(data
->color
), data
->color
);
4081 tips
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "tips");
4087 for (node
= tips
->pstChild
; node
; node
= node
->pstNext
)
4089 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4094 type
= path_type_file
;
4095 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4098 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4099 type
= path_type_dir
;
4101 tip
= vtoy_json_get_string_ex(node
->pstChild
, "tip");
4105 pnode
= zalloc(sizeof(data_tip_node
));
4109 strlcpy(pnode
->path
, path
);
4110 strlcpy(pnode
->tip
, tip
);
4119 data
->list
= tail
= pnode
;
4127 static int ventoy_parse_menu_class(VTOY_JSON
*json
, void *p
)
4130 const char *path
= NULL
;
4131 const char *class = NULL
;
4132 data_class
*data
= (data_class
*)p
;
4133 data_class_node
*tail
= NULL
;
4134 data_class_node
*pnode
= NULL
;
4135 VTOY_JSON
*node
= NULL
;
4137 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4142 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4144 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4149 type
= class_type_key
;
4150 path
= vtoy_json_get_string_ex(node
->pstChild
, "key");
4153 type
= class_type_dir
;
4154 path
= vtoy_json_get_string_ex(node
->pstChild
, "dir");
4157 type
= class_type_parent
;
4158 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4161 class = vtoy_json_get_string_ex(node
->pstChild
, "class");
4165 pnode
= zalloc(sizeof(data_class_node
));
4169 strlcpy(pnode
->path
, path
);
4170 strlcpy(pnode
->class, class);
4179 data
->list
= tail
= pnode
;
4187 static int ventoy_parse_auto_install(VTOY_JSON
*json
, void *p
)
4195 const char *path
= NULL
;
4196 const char *file
= NULL
;
4197 data_auto_install
*data
= (data_auto_install
*)p
;
4198 auto_install_node
*tail
= NULL
;
4199 auto_install_node
*pnode
= NULL
;
4200 path_node
*pathnode
= NULL
;
4201 path_node
*pathtail
= NULL
;
4202 VTOY_JSON
*node
= NULL
;
4203 VTOY_JSON
*filelist
= NULL
;
4204 VTOY_JSON
*filenode
= NULL
;
4206 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4211 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4213 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4219 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4222 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4230 file
= vtoy_json_get_string_ex(node
->pstChild
, "template");
4233 pnode
= zalloc(sizeof(auto_install_node
));
4238 strlcpy(pnode
->path
, path
);
4240 pathnode
= zalloc(sizeof(path_node
));
4243 strlcpy(pathnode
->path
, file
);
4244 pnode
->list
= pathnode
;
4258 data
->list
= tail
= pnode
;
4266 timeouten
= autoselen
= 0;
4267 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4271 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4276 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "template");
4282 pnode
= zalloc(sizeof(auto_install_node
));
4289 pnode
->autoselen
= autoselen
;
4290 pnode
->timeouten
= timeouten
;
4291 pnode
->timeout
= timeout
;
4292 pnode
->autosel
= autosel
;
4293 strlcpy(pnode
->path
, path
);
4296 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4298 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4303 pathnode
= zalloc(sizeof(path_node
));
4307 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4311 pathtail
->next
= pathnode
;
4312 pathtail
= pathnode
;
4316 pnode
->list
= pathtail
= pathnode
;
4327 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4339 data
->list
= tail
= pnode
;
4346 static int ventoy_parse_persistence(VTOY_JSON
*json
, void *p
)
4353 const char *path
= NULL
;
4354 const char *file
= NULL
;
4355 data_persistence
*data
= (data_persistence
*)p
;
4356 persistence_node
*tail
= NULL
;
4357 persistence_node
*pnode
= NULL
;
4358 path_node
*pathnode
= NULL
;
4359 path_node
*pathtail
= NULL
;
4360 VTOY_JSON
*node
= NULL
;
4361 VTOY_JSON
*filelist
= NULL
;
4362 VTOY_JSON
*filenode
= NULL
;
4364 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4369 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4371 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4376 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4382 file
= vtoy_json_get_string_ex(node
->pstChild
, "backend");
4385 pnode
= zalloc(sizeof(persistence_node
));
4390 strlcpy(pnode
->path
, path
);
4392 pathnode
= zalloc(sizeof(path_node
));
4395 strlcpy(pathnode
->path
, file
);
4396 pnode
->list
= pathnode
;
4410 data
->list
= tail
= pnode
;
4418 timeouten
= autoselen
= 0;
4419 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "timeout", &timeout
))
4423 if (JSON_SUCCESS
== vtoy_json_get_int(node
->pstChild
, "autosel", &autosel
))
4428 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "backend");
4434 pnode
= zalloc(sizeof(persistence_node
));
4441 pnode
->autoselen
= autoselen
;
4442 pnode
->timeouten
= timeouten
;
4443 pnode
->timeout
= timeout
;
4444 pnode
->autosel
= autosel
;
4445 strlcpy(pnode
->path
, path
);
4448 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4450 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4455 pathnode
= zalloc(sizeof(path_node
));
4459 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4463 pathtail
->next
= pathnode
;
4464 pathtail
= pathnode
;
4468 pnode
->list
= pathtail
= pathnode
;
4479 if (pnode
->autoselen
&& pnode
->autosel
> count
)
4491 data
->list
= tail
= pnode
;
4498 static int ventoy_parse_injection(VTOY_JSON
*json
, void *p
)
4501 const char *path
= NULL
;
4502 const char *archive
= NULL
;
4503 data_injection
*data
= (data_injection
*)p
;
4504 injection_node
*tail
= NULL
;
4505 injection_node
*pnode
= NULL
;
4506 VTOY_JSON
*node
= NULL
;
4508 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4513 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4515 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4521 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4524 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4527 archive
= vtoy_json_get_string_ex(node
->pstChild
, "archive");
4529 if (path
&& archive
)
4531 pnode
= zalloc(sizeof(injection_node
));
4535 strlcpy(pnode
->path
, path
);
4536 strlcpy(pnode
->archive
, archive
);
4545 data
->list
= tail
= pnode
;
4553 static int ventoy_parse_conf_replace(VTOY_JSON
*json
, void *p
)
4556 const char *path
= NULL
;
4557 const char *org
= NULL
;
4558 const char *new = NULL
;
4559 data_conf_replace
*data
= (data_conf_replace
*)p
;
4560 conf_replace_node
*tail
= NULL
;
4561 conf_replace_node
*pnode
= NULL
;
4562 VTOY_JSON
*node
= NULL
;
4564 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4569 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4571 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4576 path
= vtoy_json_get_string_ex(node
->pstChild
, "iso");
4577 org
= vtoy_json_get_string_ex(node
->pstChild
, "org");
4578 new = vtoy_json_get_string_ex(node
->pstChild
, "new");
4581 vtoy_json_get_int(node
->pstChild
, "img", &img
);
4583 if (path
&& org
&& new)
4585 pnode
= zalloc(sizeof(conf_replace_node
));
4588 strlcpy(pnode
->path
, path
);
4589 strlcpy(pnode
->org
, org
);
4590 strlcpy(pnode
->new, new);
4603 data
->list
= tail
= pnode
;
4611 static int ventoy_parse_password(VTOY_JSON
*json
, void *p
)
4614 const char *bootpwd
= NULL
;
4615 const char *isopwd
= NULL
;
4616 const char *wimpwd
= NULL
;
4617 const char *imgpwd
= NULL
;
4618 const char *efipwd
= NULL
;
4619 const char *vhdpwd
= NULL
;
4620 const char *vtoypwd
= NULL
;
4621 const char *path
= NULL
;
4622 const char *pwd
= NULL
;
4623 data_password
*data
= (data_password
*)p
;
4624 menu_password
*tail
= NULL
;
4625 menu_password
*pnode
= NULL
;
4626 VTOY_JSON
*node
= NULL
;
4627 VTOY_JSON
*menupwd
= NULL
;
4629 if (json
->enDataType
!= JSON_TYPE_OBJECT
)
4634 bootpwd
= vtoy_json_get_string_ex(json
->pstChild
, "bootpwd");
4635 isopwd
= vtoy_json_get_string_ex(json
->pstChild
, "isopwd");
4636 wimpwd
= vtoy_json_get_string_ex(json
->pstChild
, "wimpwd");
4637 imgpwd
= vtoy_json_get_string_ex(json
->pstChild
, "imgpwd");
4638 efipwd
= vtoy_json_get_string_ex(json
->pstChild
, "efipwd");
4639 vhdpwd
= vtoy_json_get_string_ex(json
->pstChild
, "vhdpwd");
4640 vtoypwd
= vtoy_json_get_string_ex(json
->pstChild
, "vtoypwd");
4643 if (bootpwd
) strlcpy(data
->bootpwd
, bootpwd
);
4644 if (isopwd
) strlcpy(data
->isopwd
, isopwd
);
4645 if (wimpwd
) strlcpy(data
->wimpwd
, wimpwd
);
4646 if (imgpwd
) strlcpy(data
->imgpwd
, imgpwd
);
4647 if (efipwd
) strlcpy(data
->efipwd
, efipwd
);
4648 if (vhdpwd
) strlcpy(data
->vhdpwd
, vhdpwd
);
4649 if (vtoypwd
) strlcpy(data
->vtoypwd
, vtoypwd
);
4652 menupwd
= vtoy_json_find_item(json
->pstChild
, JSON_TYPE_ARRAY
, "menupwd");
4658 for (node
= menupwd
->pstChild
; node
; node
= node
->pstNext
)
4660 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4666 path
= vtoy_json_get_string_ex(node
->pstChild
, "file");
4669 path
= vtoy_json_get_string_ex(node
->pstChild
, "parent");
4672 pwd
= vtoy_json_get_string_ex(node
->pstChild
, "pwd");
4676 pnode
= zalloc(sizeof(menu_password
));
4680 strlcpy(pnode
->path
, path
);
4681 strlcpy(pnode
->pwd
, pwd
);
4690 data
->list
= tail
= pnode
;
4699 static int ventoy_parse_image_list_real(VTOY_JSON
*json
, int type
, void *p
)
4701 VTOY_JSON
*node
= NULL
;
4702 data_image_list
*data
= (data_image_list
*)p
;
4703 path_node
*tail
= NULL
;
4704 path_node
*pnode
= NULL
;
4706 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4713 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4715 if (node
->enDataType
== JSON_TYPE_STRING
)
4717 pnode
= zalloc(sizeof(path_node
));
4720 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4728 data
->list
= tail
= pnode
;
4736 static int ventoy_parse_image_blacklist(VTOY_JSON
*json
, void *p
)
4738 return ventoy_parse_image_list_real(json
, 1, p
);
4740 static int ventoy_parse_image_list(VTOY_JSON
*json
, void *p
)
4742 return ventoy_parse_image_list_real(json
, 0, p
);
4745 static int ventoy_parse_auto_memdisk(VTOY_JSON
*json
, void *p
)
4747 VTOY_JSON
*node
= NULL
;
4748 data_auto_memdisk
*data
= (data_auto_memdisk
*)p
;
4749 path_node
*tail
= NULL
;
4750 path_node
*pnode
= NULL
;
4752 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4757 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4759 if (node
->enDataType
== JSON_TYPE_STRING
)
4761 pnode
= zalloc(sizeof(path_node
));
4764 strlcpy(pnode
->path
, node
->unData
.pcStrVal
);
4772 data
->list
= tail
= pnode
;
4780 static int ventoy_parse_dud(VTOY_JSON
*json
, void *p
)
4783 const char *path
= NULL
;
4784 const char *file
= NULL
;
4785 data_dud
*data
= (data_dud
*)p
;
4786 dud_node
*tail
= NULL
;
4787 dud_node
*pnode
= NULL
;
4788 path_node
*pathnode
= NULL
;
4789 path_node
*pathtail
= NULL
;
4790 VTOY_JSON
*node
= NULL
;
4791 VTOY_JSON
*filelist
= NULL
;
4792 VTOY_JSON
*filenode
= NULL
;
4794 if (json
->enDataType
!= JSON_TYPE_ARRAY
)
4799 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4801 if (node
->enDataType
!= JSON_TYPE_OBJECT
)
4806 path
= vtoy_json_get_string_ex(node
->pstChild
, "image");
4812 file
= vtoy_json_get_string_ex(node
->pstChild
, "dud");
4815 pnode
= zalloc(sizeof(dud_node
));
4818 strlcpy(pnode
->path
, path
);
4820 pathnode
= zalloc(sizeof(path_node
));
4823 strlcpy(pathnode
->path
, file
);
4824 pnode
->list
= pathnode
;
4838 data
->list
= tail
= pnode
;
4845 filelist
= vtoy_json_find_item(node
->pstChild
, JSON_TYPE_ARRAY
, "dud");
4851 pnode
= zalloc(sizeof(dud_node
));
4857 strlcpy(pnode
->path
, path
);
4859 for (filenode
= filelist
->pstChild
; filenode
; filenode
= filenode
->pstNext
)
4861 if (filenode
->enDataType
!= JSON_TYPE_STRING
)
4866 pathnode
= zalloc(sizeof(path_node
));
4869 strlcpy(pathnode
->path
, filenode
->unData
.pcStrVal
);
4874 pathtail
->next
= pathnode
;
4875 pathtail
= pathnode
;
4879 pnode
->list
= pathtail
= pathnode
;
4897 data
->list
= tail
= pnode
;
4911 static int ventoy_load_old_json(const char *filename
)
4916 char *buffer
= NULL
;
4917 unsigned char *start
= NULL
;
4918 VTOY_JSON
*json
= NULL
;
4919 VTOY_JSON
*node
= NULL
;
4921 ret
= ventoy_read_file_to_buf(filename
, 4, (void **)&buffer
, &buflen
);
4924 vlog("Failed to read old ventoy.json file.\n");
4929 start
= (unsigned char *)buffer
;
4931 if (start
[0] == 0xef && start
[1] == 0xbb && start
[2] == 0xbf)
4935 else if ((start
[0] == 0xff && start
[1] == 0xfe) || (start
[0] == 0xfe && start
[1] == 0xff))
4937 vlog("ventoy.json is in UCS-2 encoding, ignore it.\n");
4942 json
= vtoy_json_create();
4949 if (vtoy_json_parse_ex(json
, buffer
+ offset
, buflen
- offset
) == JSON_SUCCESS
)
4951 vlog("parse ventoy.json success\n");
4953 for (node
= json
->pstChild
; node
; node
= node
->pstNext
)
4955 ventoy_parse_json(control
);
4956 ventoy_parse_json(theme
);
4957 ventoy_parse_json(menu_alias
);
4958 ventoy_parse_json(menu_tip
);
4959 ventoy_parse_json(menu_class
);
4960 ventoy_parse_json(auto_install
);
4961 ventoy_parse_json(persistence
);
4962 ventoy_parse_json(injection
);
4963 ventoy_parse_json(conf_replace
);
4964 ventoy_parse_json(password
);
4965 ventoy_parse_json(image_list
);
4966 ventoy_parse_json(image_blacklist
);
4967 ventoy_parse_json(auto_memdisk
);
4968 ventoy_parse_json(dud
);
4973 vlog("ventoy.json has syntax error.\n");
4974 g_sysinfo
.syntax_error
= 1;
4978 vtoy_json_destroy(json
);
4985 int ventoy_http_start(const char *ip
, const char *port
)
4990 char backupname
[128];
4991 struct mg_callbacks callbacks
;
4992 const char *options
[] =
4994 "listening_ports", "24681",
4995 "document_root", "www",
4996 "index_files", "index.html",
4997 "num_threads", "16",
4998 "error_log_file", LOG_FILE
,
4999 "request_timeout_ms", "10000",
5003 for (i
= 0; i
<= bios_max
; i
++)
5005 ventoy_data_default_control(g_data_control
+ i
);
5006 ventoy_data_default_theme(g_data_theme
+ i
);
5007 ventoy_data_default_menu_alias(g_data_menu_alias
+ i
);
5008 ventoy_data_default_menu_class(g_data_menu_class
+ i
);
5009 ventoy_data_default_menu_tip(g_data_menu_tip
+ i
);
5010 ventoy_data_default_auto_install(g_data_auto_install
+ i
);
5011 ventoy_data_default_persistence(g_data_persistence
+ i
);
5012 ventoy_data_default_injection(g_data_injection
+ i
);
5013 ventoy_data_default_conf_replace(g_data_conf_replace
+ i
);
5014 ventoy_data_default_password(g_data_password
+ i
);
5015 ventoy_data_default_image_list(g_data_image_list
+ i
);
5016 ventoy_data_default_auto_memdisk(g_data_auto_memdisk
+ i
);
5017 ventoy_data_default_dud(g_data_dud
+ i
);
5020 ventoy_get_json_path(filename
, backupname
);
5021 if (ventoy_is_file_exist("%s", filename
))
5023 ventoy_copy_file(filename
, backupname
);
5024 ventoy_load_old_json(filename
);
5029 scnprintf(addr
, sizeof(addr
), "%s:%s", ip
, port
);
5032 memset(&callbacks
, 0, sizeof(callbacks
));
5033 callbacks
.begin_request
= ventoy_request_handler
;
5035 callbacks
.open_file
= ventoy_web_openfile
;
5037 g_ventoy_http_ctx
= mg_start(&callbacks
, NULL
, options
);
5039 ventoy_start_writeback_thread(ventoy_http_writeback
);
5041 return g_ventoy_http_ctx
? 0 : 1;
5044 int ventoy_http_stop(void)
5046 if (g_ventoy_http_ctx
)
5048 mg_stop(g_ventoy_http_ctx
);
5051 ventoy_stop_writeback_thread();
5055 int ventoy_http_init(void)
5060 char *Buffer
= NULL
;
5063 ventoy_read_file_to_buf("www/helplist", 4, (void **)&Buffer
, &BufLen
);
5066 for (i
= 0; i
< BufLen
/ 5; i
++)
5068 memcpy(g_ventoy_help_lang
[i
], Buffer
+ i
* 5, 5);
5069 g_ventoy_help_lang
[i
][5] = 0;
5075 file
= ventoy_tar_find_file("www/helplist");
5078 for (i
= 0; i
< file
->size
/ 5; i
++)
5080 memcpy(g_ventoy_help_lang
[i
], (char *)(file
->addr
) + i
* 5, 5);
5081 g_ventoy_help_lang
[i
][5] = 0;
5086 if (!g_pub_json_buffer
)
5088 g_pub_json_buffer
= malloc(JSON_BUF_MAX
* 2);
5089 g_pub_save_buffer
= g_pub_json_buffer
+ JSON_BUF_MAX
;
5093 pthread_mutex_init(&g_api_mutex
, NULL
);
5097 void ventoy_http_exit(void)
5099 check_free(g_pub_json_buffer
);
5100 g_pub_json_buffer
= NULL
;
5101 g_pub_save_buffer
= NULL
;
5103 pthread_mutex_destroy(&g_api_mutex
);