X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fgdir.c;h=e6cf5e634ee6114c6b7f96adfb801c53f1b805be;hb=2a53b4d0e2c98a14aedf31e38f0ad1fb2e8fe26f;hp=0f0a17faf374d70d55690bc0f108cbae2909a96a;hpb=63adeda0861a26b38ec0adc76255666554c18951;p=platform%2Fupstream%2Fglib.git diff --git a/glib/gdir.c b/glib/gdir.c index 0f0a17f..e6cf5e6 100644 --- a/glib/gdir.c +++ b/glib/gdir.c @@ -17,9 +17,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . */ #include "config.h" @@ -42,12 +40,19 @@ #include "gtestutils.h" #include "glibintl.h" - #if defined (_MSC_VER) && !defined (HAVE_DIRENT_H) #include "../build/win32/dirent/dirent.h" #include "../build/win32/dirent/wdirent.c" #endif +#include "glib-private.h" /* g_dir_open_with_errno, g_dir_new_from_dirp */ + +/** + * GDir: + * + * An opaque structure representing an opened directory. + */ + struct _GDir { #ifdef G_OS_WIN32 @@ -60,6 +65,57 @@ struct _GDir #endif }; +/*< private > + * g_dir_open_with_errno: + * @path: the path to the directory you are interested in. + * @flags: Currently must be set to 0. Reserved for future use. + * + * Opens a directory for reading. + * + * This function is equivalent to g_dir_open() except in the error case, + * errno will be set accordingly. + * + * This is useful if you want to construct your own error message. + * + * Returns: a newly allocated #GDir on success, or %NULL on failure, + * with errno set accordingly. + * + * Since: 2.38 + */ +GDir * +g_dir_open_with_errno (const gchar *path, + guint flags) +{ + GDir dir; +#ifdef G_OS_WIN32 + gint saved_errno; + wchar_t *wpath; +#endif + + g_return_val_if_fail (path != NULL, NULL); + +#ifdef G_OS_WIN32 + wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + + g_return_val_if_fail (wpath != NULL, NULL); + + dir.wdirp = _wopendir (wpath); + saved_errno = errno; + g_free (wpath); + errno = saved_errno; + + if (dir.wdirp == NULL) + return NULL; +#else + dir.dirp = opendir (path); + + if (dir.dirp == NULL) + return NULL; +#endif + + return g_memdup (&dir, sizeof dir); +} + /** * g_dir_open: * @path: the path to the directory you are interested in. On Unix @@ -73,7 +129,7 @@ struct _GDir * directory can then be retrieved using g_dir_read_name(). Note * that the ordering is not defined. * - * Return value: a newly allocated #GDir on success, %NULL on failure. + * Returns: a newly allocated #GDir on success, %NULL on failure. * If non-%NULL, you must free the result with g_dir_close() * when you are finished with it. **/ @@ -82,67 +138,25 @@ g_dir_open (const gchar *path, guint flags, GError **error) { + gint saved_errno; GDir *dir; - int errsv; -#ifdef G_OS_WIN32 - wchar_t *wpath; -#else - gchar *utf8_path; -#endif - - g_return_val_if_fail (path != NULL, NULL); -#ifdef G_OS_WIN32 - wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, error); - - if (wpath == NULL) - return NULL; - - dir = g_new (GDir, 1); - - dir->wdirp = _wopendir (wpath); - g_free (wpath); - - if (dir->wdirp) - return dir; - - /* error case */ - errsv = errno; - - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errsv), - _("Error opening directory '%s': %s"), - path, g_strerror (errsv)); - - g_free (dir); - - return NULL; -#else - dir = g_new (GDir, 1); + dir = g_dir_open_with_errno (path, flags); - dir->dirp = opendir (path); - - if (dir->dirp) - return dir; - - /* error case */ - errsv = errno; + if (dir == NULL) + { + gchar *utf8_path; - utf8_path = g_filename_to_utf8 (path, -1, - NULL, NULL, NULL); + saved_errno = errno; - g_set_error (error, - G_FILE_ERROR, - g_file_error_from_errno (errsv), - _("Error opening directory '%s': %s"), - utf8_path, g_strerror (errsv)); + utf8_path = g_filename_to_utf8 (path, -1, NULL, NULL, NULL); - g_free (utf8_path); - g_free (dir); + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno), + _("Error opening directory '%s': %s"), utf8_path, g_strerror (saved_errno)); + g_free (utf8_path); + } - return NULL; -#endif + return dir; } #if defined (G_OS_WIN32) && !defined (_WIN64) @@ -175,6 +189,40 @@ g_dir_open (const gchar *path, } #endif +/*< private > + * g_dir_new_from_dirp: + * @dirp: a #DIR* created by opendir() or fdopendir() + * + * Creates a #GDir object from the DIR object that is created using + * opendir() or fdopendir(). The created #GDir assumes ownership of the + * passed-in #DIR pointer. + * + * @dirp must not be %NULL. + * + * This function never fails. + * + * Returns: a newly allocated #GDir, which should be closed using + * g_dir_close(). + * + * Since: 2.38 + **/ +GDir * +g_dir_new_from_dirp (gpointer dirp) +{ +#ifdef G_OS_UNIX + GDir *dir; + + g_return_val_if_fail (dirp != NULL, NULL); + + dir = g_new (GDir, 1); + dir->dirp = dirp; + + return dir; +#else + g_assert_not_reached (); +#endif +} + /** * g_dir_read_name: * @dir: a #GDir* created by g_dir_open() @@ -182,7 +230,10 @@ g_dir_open (const gchar *path, * Retrieves the name of another entry in the directory, or %NULL. * The order of entries returned from this function is not defined, * and may vary by file system or other operating-system dependent - * factors. + * factors. + * + * %NULL may also be returned in case of errors. On Unix, you can + * check `errno` to find out if %NULL was returned because of an error. * * On Unix, the '.' and '..' entries are omitted, and the returned * name is in the on-disk encoding. @@ -190,11 +241,11 @@ g_dir_open (const gchar *path, * On Windows, as is true of all GLib functions which operate on * filenames, the returned name is in UTF-8. * - * Return value: The entry's name or %NULL if there are no + * Returns: The entry's name or %NULL if there are no * more entries. The return value is owned by GLib and * must not be modified or freed. **/ -G_CONST_RETURN gchar* +const gchar * g_dir_read_name (GDir *dir) { #ifdef G_OS_WIN32 @@ -250,7 +301,7 @@ g_dir_read_name (GDir *dir) /* Binary compatibility version. Not for newly compiled code. */ -G_CONST_RETURN gchar* +const gchar * g_dir_read_name (GDir *dir) { while (1)