From 3181836ab8e52c7c74e7c6af8acddb698870325a Mon Sep 17 00:00:00 2001 From: Eduardo Casino Date: Sat, 16 Jul 2022 00:10:49 +0200 Subject: Add /cs option for mounting case sensitive filesystems --- nls/vbsf.en | 3 ++- nls/vbsf.es | 3 ++- sfmain.c | 31 +++++++++++++++---------------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/nls/vbsf.en b/nls/vbsf.en index a3e25a1..9aac01e 100644 --- a/nls/vbsf.en +++ b/nls/vbsf.en @@ -15,9 +15,10 @@ 0.8: (%d min, %d max, %d default)\n 0.9: uninstall uninstall the driver from memory 0.10: list list available shared folders -0.11: mount mount a shared folder into drive X: +0.11: mount [/cs] mount a shared folder into drive X: 0.12: umount unmount shared folder from drive X: 0.13: rescan unmount everything and recreate automounts +0.14: use '/cs' if host filesystem is case sensitive 1.0:Mounted drives:\n 1.1: %s on %c:\n 1.2:Available shared folders:\n diff --git a/nls/vbsf.es b/nls/vbsf.es index f8fb119..7e638be 100644 --- a/nls/vbsf.es +++ b/nls/vbsf.es @@ -17,9 +17,10 @@ 0.8: (%d m¡n, %d m x, %d por defecto)\n 0.9: uninstall desinstala el controlador de la memoria 0.10: list lista carpetas compartidas disponibles -0.11: mount monta una carpeta compartida en la unidad X: +0.11: mount [/cs] monta una carpeta compartida en la unidad X: 0.12: umount desmonta la carpeta compartida de la unidad X: 0.13: rescan desmonta todo y recrea los automounts +0.14: usar '/cs' si el anfitri¢n distingue may£s/min£s 1.0:Unidades montadas:\n 1.1: %s en %c:\n 1.2:Carpetas compartidas disponibles:\n diff --git a/sfmain.c b/sfmain.c index eef8c72..cc939f0 100644 --- a/sfmain.c +++ b/sfmain.c @@ -145,7 +145,7 @@ static void close_openfiles(LPTSRDATA data, int drive) } } -static int mount_shfl(LPTSRDATA data, int drive, const char *folder) +static int mount_shfl(LPTSRDATA data, int drive, const char *folder, bool ci) { int32_t err; SHFLSTRING_WITH_BUF(str, SHFL_MAX_LEN); @@ -161,17 +161,8 @@ static int mount_shfl(LPTSRDATA data, int drive, const char *folder) } data->drives[drive].root = root; + data->drives[drive].case_insensitive = ci; - err = vbox_shfl_query_map_info(&data->vb, data->hgcm_client_id, root, - &str.shflstr, &str.shflstr, &flags, &version); - if (err) { - printf(_(3, 4, "Error on Query Map Info for mounted drive, err=%ld\n"), err); - return -1; - } - - // This is not a bug! VirtualBox sets SHFL_MIF_HOST_ICASE if host file system is case sensitive - data->drives[drive].case_insensitive = !(flags & SHFL_MIF_HOST_ICASE); - return 0; } @@ -193,7 +184,7 @@ static int unmount_shfl(LPTSRDATA data, int drive) return 0; } -static int mount(LPTSRDATA data, char *folder, char drive_letter) +static int mount(LPTSRDATA data, char *folder, char drive_letter, bool ci) { int drive = drive_letter_to_index(drive_letter); DOSLOL __far *lol = dos_get_list_of_lists(); @@ -221,11 +212,12 @@ static int mount(LPTSRDATA data, char *folder, char drive_letter) return EXIT_FAILURE; } - if (mount_shfl(data, drive, folder) != 0) { + if (mount_shfl(data, drive, folder, ci) != 0) { fprintf(stderr, _(3, 10, "Cannot mount drive %c:\n"), drive_letter); return EXIT_FAILURE; } + // Ok, set the network flag. // By setting the physical flag, we also let DOS know the drive is present cds->flags = DOS_CDS_FLAG_NETWORK | DOS_CDS_FLAG_PHYSICAL; @@ -316,7 +308,7 @@ static int automount(LPTSRDATA data) drive_letter = find_free_drive_letter(); } - mount(data, name.buf, drive_letter); + mount(data, name.buf, drive_letter, true); } return 0; @@ -648,7 +640,8 @@ static void print_help(void) MIN_HASH_CHARS, MAX_HASH_CHARS, DEF_HASH_CHARS); puts(_(0, 9, " uninstall uninstall the driver from memory")); puts(_(0, 10, " list list available shared folders")); - puts(_(0, 11, " mount mount a shared folder into drive X:")); + puts(_(0, 11, " mount [/cs] mount a shared folder into drive X:")); + puts(_(0, 14, " use '/cs' if host filesystem is case sensitive")); puts(_(0, 12, " umount unmount shared folder from drive X:")); puts(_(0, 13, " rescan unmount everything and recreate automounts")); } @@ -763,10 +756,16 @@ int main(int argc, const char *argv[]) } else if (stricmp(argv[argi], "mount") == 0) { char *folder; char drive; + bool ci = true; if (!data) return driver_not_found(); argi++; if (argi >= argc) return arg_required("mount"); + if (stricmp(argv[argi], "/cs") == 0) { + ci = false; + argi++; + if (argi >= argc) return arg_required("mount"); + } folder = (char *) argv[argi]; argi++; if (argi >= argc) return arg_required("mount"); @@ -774,7 +773,7 @@ int main(int argc, const char *argv[]) if (!drive) return invalid_arg(argv[argi]); local_to_utf8(data, utf8name.buf, folder, utf8name.shflstr.u16Size); - return mount(data, utf8name.buf, drive); + return mount(data, utf8name.buf, drive, ci); } else if (stricmp(argv[argi], "umount") == 0 || stricmp(argv[argi], "unmount") == 0) { char drive; if (!data) return driver_not_found(); -- cgit v1.2.3