Windows build fixes

master
Yevgen Muntyan 2015-12-25 23:09:59 -08:00
parent 60fe755b79
commit 504bcf6916
9 changed files with 81 additions and 224 deletions

View File

@ -723,20 +723,6 @@ moo_print_operation_calc_page_size (MooPrintOperation *op,
}
#ifdef __WIN32__
static struct tm *
localtime_r (const time_t *timep,
struct tm *result)
{
struct tm *res;
res = localtime (timep);
if (res)
*result = *res;
return res;
}
#endif
static gboolean
line_number_displayed (MooPrintOperation *op,
int line_no)

View File

@ -788,7 +788,7 @@ move_file_unix (G_GNUC_UNUSED MooFileSystem *fs,
g_return_val_if_fail (_moo_path_is_absolute (new_path), FALSE);
/* XXX */
if (_moo_rename (old_path, new_path, &err))
if (mgw_rename (old_path, new_path, &err))
{
g_set_error (error, MOO_FILE_ERROR,
_moo_file_error_from_errno (err),

View File

@ -11,6 +11,9 @@
#include <fcntl.h>
#include <unistd.h>
#ifdef __WIN32__
#include <io.h>
#endif // __WIN32__
const mgw_errno_t MGW_E_NOERROR { MGW_ENOERROR };
const mgw_errno_t MGW_E_EXIST { MGW_EEXIST };
@ -33,11 +36,36 @@ static void convert_g_stat_buf (const GStatBuf* gbuf, MgwStatBuf* mbuf)
mbuf->isreg = S_ISREG (gbuf->st_mode);
mbuf->isdir = S_ISDIR (gbuf->st_mode);
#ifdef S_ISLNK
mbuf->islnk = S_ISLNK (gbuf->st_mode);
#else
mbuf->islnk = 0;
#endif
#ifdef S_ISSOCK
mbuf->issock = S_ISSOCK (gbuf->st_mode);
#else
mbuf->issock = 0;
#endif
#ifdef S_ISFIFO
mbuf->isfifo = S_ISFIFO (gbuf->st_mode);
#else
mbuf->isfifo = 0;
#endif
#ifdef S_ISCHR
mbuf->ischr = S_ISCHR (gbuf->st_mode);
#else
mbuf->ischr = 0;
#endif
#ifdef S_ISBLK
mbuf->isblk = S_ISBLK (gbuf->st_mode);
#else
mbuf->isblk = 0;
#endif
}
@ -102,6 +130,19 @@ mgw_localtime (const mgw_time_t *timep)
return localtime(&t);
}
#ifdef __WIN32__
static struct tm *
localtime_r (const time_t *timep,
struct tm *result)
{
struct tm *res;
res = localtime (timep);
if (res)
*result = *res;
return res;
}
#endif
const struct tm *
mgw_localtime_r (const mgw_time_t *timep, struct tm *result, mgw_errno_t *err)
{
@ -191,7 +232,13 @@ int
mgw_pipe (MgwFd *fds)
{
int t[2];
#ifndef __WIN32__
int result = pipe (t);
#else
int result = _pipe(t, 4096, O_BINARY);
#endif
fds[0].value = t[0];
fds[1].value = t[1];
return result;
@ -216,6 +263,12 @@ mgw_remove (const char *path, mgw_errno_t *err)
return call_with_errno (err, g_remove, path);
}
int
mgw_rename (const char *oldpath, const char *newpath, mgw_errno_t *err)
{
return call_with_errno (err, g_rename, oldpath, newpath);
}
int
mgw_mkdir (const gchar *filename, int mode, mgw_errno_t *err)
{
@ -268,3 +321,11 @@ mgw_io_channel_unix_new (MgwFd fd)
{
return g_io_channel_unix_new (fd.value);
}
#ifdef __WIN32__
GIOChannel *
mgw_io_channel_win32_new_fd (MgwFd fd)
{
return g_io_channel_win32_new_fd (fd.value);
}
#endif // __WIN32__

View File

@ -68,6 +68,7 @@ void mgw_perror (const char *s);
int mgw_unlink (const char *path, mgw_errno_t *err);
int mgw_remove (const char *path, mgw_errno_t *err);
int mgw_rename (const char *oldpath, const char *newpath, mgw_errno_t *err);
int mgw_mkdir (const gchar *filename, int mode, mgw_errno_t *err);
int mgw_mkdir_with_parents (const gchar *pathname, gint mode, mgw_errno_t *err);
@ -85,6 +86,10 @@ mgw_spawn_async_with_pipes (const gchar *working_directory,
GError **error);
GIOChannel *mgw_io_channel_unix_new (MgwFd fd);
#ifdef __WIN32__
GIOChannel *mgw_io_channel_win32_new_fd (MgwFd fd);
#endif
enum mgw_access_mode_value_t
{
MGW_F_OK = 0,
@ -103,6 +108,7 @@ int mgw_access (const char *path, mgw_access_mode_t mode);
#ifndef MOO_DO_NOT_MANGLE_GLIB_FUNCTIONS
#undef g_stat
#undef g_rename
#undef g_access
#undef g_lstat
#undef g_strerror
@ -116,8 +122,10 @@ int mgw_access (const char *path, mgw_access_mode_t mode);
#undef g_open
#undef g_spawn_async_with_pipes
#undef g_io_channel_unix_new
#undef g_io_channel_win32_new_fd
#define g_stat DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_rename DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_access DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_lstat DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_strerror DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
@ -131,6 +139,7 @@ int mgw_access (const char *path, mgw_access_mode_t mode);
#define g_open DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_spawn_async_with_pipes DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_io_channel_unix_new DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#define g_io_channel_win32_new_fd DO_NOT_USE_THIS_DIRECTLY_USE_MGW_WRAPPERS_INSTEAD
#endif // MOO_DO_NOT_MANGLE_GLIB_FUNCTIONS

View File

@ -795,11 +795,9 @@ fam_thread_check_dir (FAMThread *thr,
guint idx)
{
MgwStatBuf buf;
mgw_errno_t err;
errno = 0;
if (mgw_stat (thr->watches[idx].path, &buf) != 0 &&
errno == ENOENT)
if (mgw_stat (thr->watches[idx].path, &buf, &err) != 0 && err.value == MGW_ENOENT)
{
fam_thread_event (MOO_FILE_EVENT_DELETED,
FALSE, NULL,
@ -895,7 +893,7 @@ fam_thread_main (FAMThread *thr)
if (ret == WAIT_OBJECT_0)
fam_thread_do_command (thr);
else if (WAIT_OBJECT_0 < ret && ret < (int) thr->n_events)
else if ((int) WAIT_OBJECT_0 < ret && ret < (int) thr->n_events)
fam_thread_check_dir (thr, ret - WAIT_OBJECT_0);
else
{
@ -1130,7 +1128,7 @@ watch_win32_start_monitor (MooFileWatch *watch,
return FALSE;
}
monitor->isdir = S_ISDIR (buf.st_mode) != 0;
monitor->isdir = buf.isdir;
if (!monitor->isdir)
return watch_stat_start_monitor (watch, monitor, error);

View File

@ -427,7 +427,7 @@ _moo_rename_file (const char *path,
g_return_val_if_fail (path != NULL, FALSE);
g_return_val_if_fail (new_path != NULL, FALSE);
if (_moo_rename (path, new_path, &err) != 0)
if (mgw_rename (path, new_path, &err) != 0)
{
char *utf8_path = g_filename_display_name (path);
char *utf8_new_path = g_filename_display_name (new_path);
@ -535,86 +535,6 @@ _moo_filename_to_uri (const char *file,
}
#if 0
static int
_moo_chdir (const char *path)
{
#ifdef __WIN32__
CCALL_1 (_chdir, _wchdir, path);
#else
return chdir (path);
#endif
}
// char *
// _moo_normalize_file_path (const char *filename)
// {
// char *freeme = NULL;
// char *working_dir, *basename, *dirname;
// char *real_filename = NULL;
//
// g_return_val_if_fail (filename != NULL, NULL);
//
// working_dir = g_get_current_dir ();
// g_return_val_if_fail (working_dir != NULL, g_strdup (filename));
//
// if (!_moo_path_is_absolute (filename))
// {
// freeme = g_build_filename (working_dir, filename, NULL);
// filename = freeme;
// }
//
// /* It's an error to call this function for a directory, so if
// * it's the case, just return what we got. */
// if (g_file_test (filename, G_FILE_TEST_IS_DIR) ||
// /* and this totally screws up dirname/basename */
// g_str_has_suffix (filename, G_DIR_SEPARATOR_S))
// {
// if (!freeme)
// freeme = g_strdup (filename);
// g_free (working_dir);
// return freeme;
// }
//
// dirname = g_path_get_dirname (filename);
// basename = g_path_get_basename (filename);
// g_return_val_if_fail (dirname && basename, g_strdup (filename));
//
// errno = 0;
//
// if (_moo_chdir (dirname) != 0)
// {
// int err = errno;
// g_warning ("%s", g_strerror (err));
// }
// else
// {
// char *real_dirname = g_get_current_dir ();
// real_filename = g_build_filename (real_dirname, basename, NULL);
// g_free (real_dirname);
//
// errno = 0;
//
// if (_moo_chdir (working_dir) != 0)
// {
// int err = errno;
// g_warning ("%s", g_strerror (err));
// }
// }
//
// if (!real_filename)
// real_filename = g_strdup (filename);
//
// g_free (freeme);
// g_free (dirname);
// g_free (basename);
// g_free (working_dir);
//
// return real_filename;
// }
#endif
#ifndef __WIN32__
static char *
@ -1125,123 +1045,13 @@ moo_test_mooutils_fs (void)
}
/**********************************************************************/
/* MSLU for poor
*/
#ifdef __WIN32__
static gpointer
convert_filename (const char *filename,
gboolean *use_wide_char_api)
{
if (G_WIN32_HAVE_WIDECHAR_API ())
{
*use_wide_char_api = TRUE;
return g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
}
else
{
*use_wide_char_api = FALSE;
return g_locale_from_utf8 (filename, -1, NULL,
NULL, NULL);
}
}
#endif
#define CCALL_1(_AFunc, _WFunc, path) \
G_STMT_START { \
gboolean use_wide_char_api; \
gpointer converted; \
int retval; \
mgw_errno_t save_errno; \
\
converted = convert_filename (path, &use_wide_char_api); \
\
if (!converted) \
{ \
mgw_set_errno (MGW_EINVAL); \
return -1; \
} \
\
mgw_set_errno (0); \
\
if (use_wide_char_api) \
retval = _WFunc (converted); \
else \
retval = _AFunc (converted); \
\
save_errno = mgw_errno (); \
g_free (converted); \
mgw_set_errno (save_errno); \
\
return retval; \
} G_STMT_END
int
_moo_mkdir (const char *path, mgw_errno_t *err)
{
#ifdef __WIN32__
CCALL_1 (mkdir, _wmkdir, path, err);
#ifndef __WIN32__
return mgw_mkdir (path, S_IRWXU, err);
#else
int result;
errno = 0;
result = mkdir (path, S_IRWXU);
err->value = errno;
return result;
#endif
}
int
_moo_rename (const char *old_name,
const char *new_name,
mgw_errno_t *err)
{
#ifdef __WIN32__
gboolean use_wide_char_api;
gpointer old_conv, new_conv;
int retval;
if (G_WIN32_HAVE_WIDECHAR_API ())
{
use_wide_char_api = TRUE;
old_conv = g_utf8_to_utf16 (old_name, -1, NULL, NULL, NULL);
new_conv = g_utf8_to_utf16 (new_name, -1, NULL, NULL, NULL);
}
else
{
use_wide_char_api = FALSE;
old_conv = g_locale_from_utf8 (old_name, -1, NULL, NULL, NULL);
new_conv = g_locale_from_utf8 (new_name, -1, NULL, NULL, NULL);
}
if (!old_conv || !new_conv)
{
g_free (old_conv);
g_free (new_conv);
*err = MGW_E_INVAL;
return -1;
}
mgw_set_errno (0);
if (use_wide_char_api)
retval = mw_wrename (old_conv, new_conv, err);
else
retval = mw_rename (old_conv, new_conv, err);
g_free (old_conv);
g_free (new_conv);
return retval;
#else
int result;
errno = 0;
result = rename (old_name, new_name);
err->value = errno;
return result;
return mgw_mkdir (path, 0, err);
#endif
}

View File

@ -83,9 +83,6 @@ gboolean _moo_move_files_ui (GList *filenames,
int _moo_mkdir (const char *path,
mgw_errno_t *err); /* S_IRWXU on unix */
int _moo_rename (const char *old_name,
const char *new_name,
mgw_errno_t *err);
gboolean _moo_glob_match_simple (const char *pattern,
const char *filename);

View File

@ -370,12 +370,7 @@ _moo_win32_fnmatch (const char *pattern,
const char *string,
int flags)
{
if (flags != 0)
{
mgw_set_errno (MGW_EINVAL);
return -1;
}
g_return_val_if_fail (flags != 0, -1);
return _moo_glob_match_simple (pattern, string) ? 0 : 1;
}

View File

@ -70,6 +70,7 @@ export AR=$_mingw_tool_prefix-ar
export RANLIB=$_mingw_tool_prefix-ranlib
export STRIP=$_mingw_tool_prefix-strip
export LDFLAGS="-L$mgwtargetdir/lib"
export CPPFLAGS="-I$mgwtargetdir/include"
export CFLAGS="-mms-bitfields -march=i686 $_def_cflags"
export CXXFLAGS="-mms-bitfields -march=i686 $_def_cflags"