fix in this fuction console and argument charset as well.
+2013-10-13 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Move set_program_name and init_nls to host_init. On windows
+ fix in this fuction console and argument charset as well.
+
2013-10-12 Andrey Borzenkov <arvidjaar@gmail.com>
Fix inconsistent use of GRUB_CRYPTODISK_ENABLE and
common = util/grub-mkimage.c;
common = util/resolve.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
common = grub-core/kern/arm/dl_helper.c;
common = util/grub-mkrelpath.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-script-check.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
mansection = 1;
common = util/grub-editenv.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-mkpasswd-pbkdf2.c;
common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/random.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-fstest.c;
common = grub-core/kern/emu/hostfs.c;
common = grub-core/disk/host.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
name = grub-mkfont;
mansection = 1;
common = util/grub-mkfont.c;
- common = grub-core/unidata.c;
common = grub-core/kern/emu/argp_common.c;
- common = grub-core/kern/emu/misc.c;
- common = util/misc.c;
- common = grub-core/gnulib/progname.c;
+ common = grub-core/osdep/init.c;
cflags = '$(freetype_cflags)';
cppflags = '-DGRUB_MKFONT=1';
+ ldadd = libgrubmods.a;
+ ldadd = libgrubgcry.a;
+ ldadd = libgrubkern.a;
ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(freetype_libs)';
- ldadd = '$(LIBINTL)';
+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
condition = COND_GRUB_MKFONT;
};
common = util/grub-probe.c;
common = grub-core/osdep/ofpath.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-setup.c;
common = grub-core/kern/emu/argp_common.c;
common = grub-core/lib/reed_solomon.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubkern.a;
common = grub-core/kern/emu/argp_common.c;
common = grub-core/lib/reed_solomon.c;
common = grub-core/osdep/ofpath.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubkern.a;
mansection = 8;
common = util/ieee1275/grub-ofpathname.c;
common = grub-core/osdep/ofpath.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-mklayout.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-menulst2cfg.c;
common = grub-core/lib/legacy_parse.c;
common = grub-core/lib/i386/pc/vesa_modes_table.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = util/grub-glue-efi.c;
common = grub-core/kern/emu/argp_common.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
common = grub-core/kern/emu/argp_common.c;
common = grub-core/kern/emu/hostfs.c;
common = grub-core/disk/host.c;
+ common = grub-core/osdep/init.c;
ldadd = libgrubmods.a;
ldadd = libgrubgcry.a;
};
volatile int hold = 0;
- set_program_name (argv[0]);
+ grub_util_host_init (&argc, &argv);
dir = xstrdup (DEFAULT_DIRECTORY);
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <config-util.h>
+
+#include <grub/util/misc.h>
+
+#include "progname.h"
+
+void
+grub_util_host_init (int *argc __attribute__ ((unused)),
+ char ***argv)
+{
+ set_program_name ((*argv)[0]);
+
+ grub_util_init_nls ();
+}
--- /dev/null
+#if defined (__MINGW32__)
+#include "windows/init.c"
+#else
+#include "basic/init.c"
+#endif
#include <windows.h>
#include <winioctl.h>
-char *
-grub_util_tchar_to_utf8 (LPCTSTR in)
-{
-#if SIZEOF_TCHAR == 1
- return xstrdup (path);
-#elif SIZEOF_TCHAR == 2
- size_t ssz;
- for (ssz = 0; in[ssz]; ssz++);
-
- size_t tsz = GRUB_MAX_UTF8_PER_UTF16 * ssz + 1;
- grub_uint8_t *ret = xmalloc (tsz);
- *grub_utf16_to_utf8 (ret, in, ssz) = '\0';
- return (char *) ret;
-#else
-#error "Unsupported TCHAR size"
-#endif
-}
-
#if SIZEOF_TCHAR == 1
#define tcsnicmp strncasecmp
#define tclen strlen
#include <windows.h>
#include <winioctl.h>
+#if SIZEOF_TCHAR == 1
+
+LPTSTR
+grub_util_utf8_to_tchar (const char *in)
+{
+ return xstrdup (in);
+}
+
+char *
+grub_util_tchar_to_utf8 (LPCTSTR in)
+{
+ return xstrdup (in);
+}
+
+#elif SIZEOF_TCHAR == 2
+
+LPTSTR
+grub_util_utf8_to_tchar (const char *in)
+{
+ LPTSTR ret;
+ size_t ssz = strlen (in);
+ size_t tsz = 2 * (GRUB_MAX_UTF16_PER_UTF8 * ssz + 1);
+ ret = xmalloc (tsz);
+ tsz = grub_utf8_to_utf16 (ret, tsz,
+ (const grub_uint8_t *) in, ssz, NULL);
+ ret[tsz] = 0;
+ return ret;
+}
+
+char *
+grub_util_tchar_to_utf8 (LPCTSTR in)
+{
+ size_t ssz;
+ for (ssz = 0; in[ssz]; ssz++);
+
+ size_t tsz = GRUB_MAX_UTF8_PER_UTF16 * ssz + 1;
+ grub_uint8_t *ret = xmalloc (tsz);
+ *grub_utf16_to_utf8 (ret, in, ssz) = '\0';
+ return (char *) ret;
+}
+
+#else
+#error "Unsupported TCHAR size"
+#endif
+
#ifdef __CYGWIN__
LPTSTR
grub_util_get_windows_path (const char *path)
LPTSTR
grub_util_get_windows_path (const char *path)
{
- char *fpa;
- const char *fp;
- LPTSTR ret;
+ LPTSTR fpa;
+ LPTSTR tpath;
- fp = fpa = xmalloc (PATH_MAX);
- if (!_fullpath (fpa, path, PATH_MAX))
- fp = path;
-#if SIZEOF_TCHAR == 1
- ret = xstrdup (fp);
-#elif SIZEOF_TCHAR == 2
- size_t ssz = strlen (fp);
- size_t tsz = 2 * (GRUB_MAX_UTF16_PER_UTF8 * ssz + 1);
- ret = xmalloc (tsz);
- tsz = grub_utf8_to_utf16 (ret, tsz, (const grub_uint8_t *) fp, ssz, NULL);
- ret[tsz] = 0;
-#else
-#error SIZEOF_TCHAR
-#error "Unsupported TCHAR size"
-#endif
+ tpath = grub_util_utf8_to_tchar (path);
- free (fpa);
- return ret;
+ fpa = xmalloc (PATH_MAX * sizeof (fpa[0]));
+ if (!_wfullpath (fpa, tpath, PATH_MAX))
+ {
+ free (fpa);
+ return tpath;
+ }
+
+ free (tpath);
+ return fpa;
}
#endif
--- /dev/null
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <config-util.h>
+#include <grub/util/misc.h>
+#include <grub/osdep/hostfile.h>
+#include <grub/util/windows.h>
+
+#include <wincon.h>
+#include <windows.h>
+
+#include <grub/util/misc.h>
+
+#include "progname.h"
+
+struct grub_windows_console_font_infoex {
+ ULONG cbSize;
+ DWORD nFont;
+ COORD dwFontSize;
+ UINT FontFamily;
+ UINT FontWeight;
+ WCHAR FaceName[LF_FACESIZE];
+};
+
+static int
+check_is_raster (HMODULE kernel32, HANDLE hnd)
+{
+ CONSOLE_FONT_INFO console_font_info;
+ BOOL (WINAPI * func_GetCurrentConsoleFont) (HANDLE, BOOL,
+ PCONSOLE_FONT_INFO);
+
+ func_GetCurrentConsoleFont = (void *)
+ GetProcAddress (kernel32, "GetCurrentConsoleFont");
+
+ if (!func_GetCurrentConsoleFont)
+ return 1;
+
+ if (!func_GetCurrentConsoleFont (hnd, FALSE, &console_font_info))
+ return 1;
+ return console_font_info.nFont < 12;
+}
+
+static void
+set_console_unicode_font (void)
+{
+ BOOL (WINAPI * func_SetCurrentConsoleFontEx) (HANDLE, BOOL,
+ struct grub_windows_console_font_infoex *);
+ BOOL (WINAPI * func_SetConsoleFont)(HANDLE, DWORD);
+ HMODULE kernel32;
+ HANDLE out_handle = GetStdHandle (STD_OUTPUT_HANDLE);
+ HANDLE err_handle = GetStdHandle (STD_ERROR_HANDLE);
+ int out_raster, err_raster;
+
+ kernel32 = GetModuleHandle(TEXT("kernel32.dll"));
+ if (!kernel32)
+ return;
+
+ out_raster = check_is_raster (kernel32, out_handle);
+ err_raster = check_is_raster (kernel32, err_handle);
+
+ if (!out_raster && !err_raster)
+ return;
+
+ func_SetCurrentConsoleFontEx = (void *) GetProcAddress (kernel32, "SetCurrentConsoleFontEx");
+
+ /* Newer windows versions. */
+ if (func_SetCurrentConsoleFontEx)
+ {
+ struct grub_windows_console_font_infoex new_console_font_info;
+ new_console_font_info.cbSize = sizeof (new_console_font_info);
+ new_console_font_info.nFont = 12;
+ new_console_font_info.dwFontSize.X = 7;
+ new_console_font_info.dwFontSize.Y = 12;
+ new_console_font_info.FontFamily = FF_DONTCARE;
+ new_console_font_info.FontWeight = 400;
+ memcpy (new_console_font_info.FaceName, TEXT("Lucida Console"),
+ sizeof (TEXT("Lucida Console")));
+ if (out_raster)
+ func_SetCurrentConsoleFontEx (out_handle, FALSE,
+ &new_console_font_info);
+ if (err_raster)
+ func_SetCurrentConsoleFontEx (err_handle, FALSE,
+ &new_console_font_info);
+ return;
+ }
+
+ /* Fallback for older versions. */
+ func_SetConsoleFont = (void *) GetProcAddress (kernel32, "SetConsoleFont");
+ if (func_SetConsoleFont)
+ {
+ if (out_raster)
+ func_SetConsoleFont (out_handle, 12);
+ if (err_raster)
+ func_SetConsoleFont (err_handle, 12);
+ }
+}
+
+void
+grub_util_host_init (int *argc __attribute__ ((unused)),
+ char ***argv)
+{
+ SetConsoleOutputCP (CP_UTF8);
+ SetConsoleCP (CP_UTF8);
+
+ set_console_unicode_font ();
+
+#if SIZEOF_TCHAR == 1
+
+#elif SIZEOF_TCHAR == 2
+ LPWSTR tcmdline = GetCommandLineW ();
+ int i;
+ LPWSTR *targv;
+
+ targv = CommandLineToArgvW (tcmdline, argc);
+ *argv = xmalloc ((*argc + 1) * sizeof (argv[0]));
+
+ for (i = 0; i < *argc; i++)
+ (*argv)[i] = grub_util_tchar_to_utf8 (targv[i]);
+ (*argv)[i] = NULL;
+#else
+#error "Unsupported TCHAR size"
+#endif
+
+ set_program_name ((*argv)[0]);
+
+ grub_util_init_nls ();
+}
void grub_util_init_nls (void);
+void grub_util_host_init (int *argc, char ***argv);
+
#endif /* ! GRUB_UTIL_MISC_HEADER */
char *command;
int curindex, arg_count;
+ grub_util_host_init (&argc, &argv);
+
set_program_name (argv[0]);
grub_util_init_nls ();
const char *default_root;
char *alloc_root;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
args = xmalloc (argc * sizeof (args[0]));
FILE *in32, *in64, *out;
struct arguments arguments;
- set_program_name (argv[0]);
+ grub_util_host_init (&argc, &argv);
/* Check for options. */
memset (&arguments, 0, sizeof (struct arguments));
int suffixlen = 0;
const char *out_fname = 0;
+ grub_util_host_init (&argc, &argv);
+
if (argc >= 2 && argv[1][0] == '-')
{
fprintf (stdout, _("Usage: %s [INFILE [OUTFILE]]\n"), argv[0]);
struct arguments arguments;
#ifndef GRUB_BUILD
- set_program_name (argv[0]);
+ grub_util_host_init (&argc, &argv);
#endif
- grub_util_init_nls ();
-
memset (&arguments, 0, sizeof (struct arguments));
arguments.file_format = PF2;
arguments.files_max = argc + 1;
FILE *fp = stdout;
struct arguments arguments;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
memset (&arguments, 0, sizeof (struct arguments));
arguments.comp = COMPRESSION_AUTO;
FILE *in, *out;
struct arguments arguments;
- set_program_name (argv[0]);
+ grub_util_host_init (&argc, &argv);
/* Check for options. */
memset (&arguments, 0, sizeof (struct arguments));
char pass1[GRUB_AUTH_MAX_PASSLEN];
char pass2[GRUB_AUTH_MAX_PASSLEN];
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
/* Check for options. */
if (argp_parse (&argp, argc, argv, 0, 0, &arguments) != 0)
char *relpath;
struct arguments arguments;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
memset (&arguments, 0, sizeof (struct arguments));
const char *default_root;
char *alloc_root;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
fuse_args = xrealloc (fuse_args, (fuse_argc + 2) * sizeof (fuse_args[0]));
fuse_args[fuse_argc] = xstrdup (argv[0]);
char delim;
struct arguments arguments;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
memset (&arguments, 0, sizeof (struct arguments));
arguments.device_max = argc + 1;
ieee1275_palette[cptr].b = 0;
ieee1275_palette[cptr].a = 0xff;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
/* Check for options. */
memset (&arguments, 0, sizeof (struct arguments));
int found_input = 0, found_cmd = 0;
struct grub_script *script = NULL;
- set_program_name (argv[0]);
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
memset (&ctx.arguments, 0, sizeof (struct arguments));
char *dest_dev = NULL;
struct arguments arguments;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
/* Default option values. */
memset (&arguments, 0, sizeof (struct arguments));
{
char *of_path;
- set_program_name (argv[0]);
-
- grub_util_init_nls ();
+ grub_util_host_init (&argc, &argv);
if (argc != 2 || strcmp (argv[1], "--help") == 0)
{