diff --git a/moo/mooutils/moofiledialog.c b/moo/mooutils/moofiledialog.c index af12fb66..f43fd2fe 100644 --- a/moo/mooutils/moofiledialog.c +++ b/moo/mooutils/moofiledialog.c @@ -16,6 +16,7 @@ #include "mooutils/mooprefs.h" #include "mooutils/mooutils-misc.h" #include "mooutils/moocompat.h" +#include struct _MooFileDialogPrivate { @@ -454,6 +455,58 @@ set_filenames (MooFileDialog *dialog, } +static gboolean +filename_is_valid (G_GNUC_UNUSED const char *filename, + G_GNUC_UNUSED char **msg) +{ +#ifndef __WIN32__ + return TRUE; +#else + struct name { + const char *name; + guint len; + } names[] = { + { "con", 3 }, { "aux", 3 }, { "prn", 3 }, { "nul", 3 }, + { "com1", 4 }, { "com2", 4 }, { "com3", 4 }, { "com4", 4 }, + { "lpt1", 4 }, { "lpt2", 4 }, { "lpt3", 4 } + }; + guint i; + const char *basename; + gboolean invalid = FALSE; + + basename = strrchr (filename, '\\'); + + if (!basename) + basename = strrchr (filename, '/'); + + if (!basename) + basename = filename; + else + basename += 1; + + for (i = 0; i < G_N_ELEMENTS (names); ++i) + { + if (!g_ascii_strncasecmp (basename, names[i].name, names[i].len)) + { + if (!basename[names[i].len] || basename[names[i].len] == '.') + invalid = TRUE; + break; + } + } + + if (invalid) + { + char *base = g_path_get_basename (filename); + *msg = g_strdup_printf ("Filename '%s' is a reserved device name.\n" + "Please choose another name", base); + g_free (base); + return FALSE; + } + + return TRUE; +#endif +} + gboolean moo_file_dialog_run (MooFileDialog *dialog) @@ -493,10 +546,18 @@ moo_file_dialog_run (MooFileDialog *dialog) { if (GTK_RESPONSE_OK == gtk_dialog_run (GTK_DIALOG (filechooser))) { + char *msg; + filename = file_chooser_get_filename (filechooser); - if (g_file_test (filename, G_FILE_TEST_EXISTS) && - ! g_file_test (filename, G_FILE_TEST_IS_REGULAR)) + if (!filename_is_valid (filename, &msg)) + { + moo_error_dialog (filechooser, msg, NULL); + g_free (filename); + g_free (msg); + } + else if (g_file_test (filename, G_FILE_TEST_EXISTS) && + ! g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { moo_error_dialog (filechooser, "Choosen file is not a regular file",