diff --git a/ChangeLog b/ChangeLog index 6432d59d9..b820035af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-04-08 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols (g_access, g_chmod): Wrap also access() and + chmod(). (#169623) + 2005-04-08 Tor Lillqvist Improve g_get_system_data_dirs() on Windows. A library that calls diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6432d59d9..b820035af 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +2005-04-08 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols (g_access, g_chmod): Wrap also access() and + chmod(). (#169623) + 2005-04-08 Tor Lillqvist Improve g_get_system_data_dirs() on Windows. A library that calls diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 6432d59d9..b820035af 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,10 @@ +2005-04-08 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols (g_access, g_chmod): Wrap also access() and + chmod(). (#169623) + 2005-04-08 Tor Lillqvist Improve g_get_system_data_dirs() on Windows. A library that calls diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 6432d59d9..b820035af 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,10 @@ +2005-04-08 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols (g_access, g_chmod): Wrap also access() and + chmod(). (#169623) + 2005-04-08 Tor Lillqvist Improve g_get_system_data_dirs() on Windows. A library that calls diff --git a/glib/glib.symbols b/glib/glib.symbols index 492b23858..28c23e718 100644 --- a/glib/glib.symbols +++ b/glib/glib.symbols @@ -849,6 +849,8 @@ g_spawn_sync #if IN_FILE(__G_STDIO_C__) #if !defined(G_OS_UNIX) || defined(G_STDIO_NO_WRAP_ON_UNIX) /* gstdio wrappers */ +g_access +g_chmod g_open g_rename g_mkdir diff --git a/glib/gstdio.c b/glib/gstdio.c index 8389dcd5e..2edd99066 100644 --- a/glib/gstdio.c +++ b/glib/gstdio.c @@ -48,6 +48,145 @@ #endif +/** + * g_access: + * @filename: a pathname in the GLib file name encoding + * @mode: as in access() + * + * A wrapper for the POSIX access() function. This function is used to + * test a pathname for one or several of read, write or execute + * permissions, or just existence. On Windows, the underlying access() + * function in the C library only checks the READONLY attribute, and + * does not look at the ACL at all. Software that needs to handle file + * permisssions on Windows more exactly should use the Win32 API. + * + * See the C library manual for more details about access(). + * + * Returns: zero if the pathname refers to an existing file system + * object that has all the tested permissions, or -1 otherwise or on + * error. + * + * Since: 2.7 + */ +int +g_access (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + if (G_WIN32_HAVE_WIDECHAR_API ()) + { + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _waccess (wfilename, mode); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; + } + else + { + gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (cp_filename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = access (cp_filename, mode); + save_errno = errno; + + g_free (cp_filename); + + errno = save_errno; + return retval; + } +#else + return access (filename, mode); +#endif +} + +/** + * g_chmod: + * @filename: a pathname in the GLib file name encoding + * @mode: as in chmod() + * + * A wrapper for the POSIX chmod() function. The chmod() function is + * used to set the permissions of a file system object. Note that on + * Windows the file protection mechanism is not at all POSIX-like, and + * the underlying chmod() function in the C library just sets or + * clears the READONLY attribute. It does not touch any ACL. Software + * that needs to manage file permisssions on Windows exactly should + * use the Win32 API. + * + * See the C library manual for more details about chmod(). + * + * Returns: zero if the operation succeedd, -1 on error. + * + * Since: 2.7 + */ +int +g_chmod (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + if (G_WIN32_HAVE_WIDECHAR_API ()) + { + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wchmod (wfilename, mode); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; + } + else + { + gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (cp_filename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = chmod (cp_filename, mode); + save_errno = errno; + + g_free (cp_filename); + + errno = save_errno; + return retval; + } +#else + return chmod (filename, mode); +#endif +} + /** * g_open: * @filename: a pathname in the GLib file name encoding diff --git a/glib/gstdio.h b/glib/gstdio.h index 534a61e27..1189a4177 100644 --- a/glib/gstdio.h +++ b/glib/gstdio.h @@ -31,6 +31,8 @@ * format mismatches, especially with large file interfaces. */ +#define g_access access +#define g_chmod chmod #define g_open open #define g_rename rename #define g_mkdir mkdir @@ -54,6 +56,12 @@ * API. */ +int g_access (const gchar *filename, + int mode); + +int g_chmod (const gchar *filename, + int mode); + int g_open (const gchar *filename, int flags, int mode);