1 /* gstdio.c - wrappers for C library functions
3 * Copyright 2004 Tor Lillqvist
5 * GLib is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU Lesser General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * GLib is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with GLib; see the file COPYING.LIB. If not,
17 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
26 #include <sys/types.h>
43 #if !defined (G_OS_UNIX) && !defined (G_OS_WIN32)
44 #error Please port this to your operating system
50 * @filename: a pathname in the GLib file name encoding
51 * @flags: as in open()
54 * A wrapper for the POSIX open() function. The open() function is
55 * used to convert a pathname into a file descriptor. Note that on
56 * POSIX systems file descriptors are implemented by the operating
57 * system. On Windows, it's the C library that implements open() and
58 * file descriptors. The actual Windows API for opening files is
59 * something different.
61 * See the C library manual for more details about open().
63 * Returns: a new file descriptor, or -1 if an error occurred. The
64 * return value can be used exactly like the return value from open().
69 g_open (const gchar *filename,
74 if (G_WIN32_HAVE_WIDECHAR_API ())
76 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
77 int retval = _wopen (wfilename, flags, mode);
78 int save_errno = errno;
87 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
88 int retval = open (cp_filename, flags, mode);
89 int save_errno = errno;
97 return open (filename, flags, mode);
103 * @oldfilename: a pathname in the GLib file name encoding
104 * @newfilename: a pathname in the GLib file name encoding
106 * A wrapper for the POSIX rename() function. The rename() function
107 * renames a file, moving it between directories if required.
109 * See your C library manual for more details about how rename() works
110 * on your system. Note in particular that on Windows, it is in
111 * general not possible to rename a file if a file with the new name
112 * already exists. Also it is not possible in general to rename an
115 * Returns: 0 if the renaming succeeded, -1 if an error occurred
120 g_rename (const gchar *oldfilename,
121 const gchar *newfilename)
124 if (G_WIN32_HAVE_WIDECHAR_API ())
126 wchar_t *woldfilename = g_utf8_to_utf16 (oldfilename, -1, NULL, NULL, NULL);
127 wchar_t *wnewfilename = g_utf8_to_utf16 (newfilename, -1, NULL, NULL, NULL);
128 int retval = _wrename (woldfilename, wnewfilename);
129 int save_errno = errno;
131 g_free (woldfilename);
132 g_free (wnewfilename);
139 gchar *cp_oldfilename = g_locale_from_utf8 (oldfilename, -1, NULL, NULL, NULL);
140 gchar *cp_newfilename = g_locale_from_utf8 (newfilename, -1, NULL, NULL, NULL);
141 int retval = rename (cp_oldfilename, cp_newfilename);
142 int save_errno = errno;
144 g_free (cp_oldfilename);
145 g_free (cp_newfilename);
151 return rename (oldfilename, newfilename);
157 * @filename: a pathname in the GLib file name encoding
158 * @mode: permissions to use for the newly created directory
160 * A wrapper for the POSIX mkdir() function. The mkdir() function
161 * attempts to create a directory with the given name and permissions.
163 * See the C library manual for more details about mkdir().
165 * Returns: 0 if the directory was successfully created, -1 if an error
171 g_mkdir (const gchar *filename,
175 if (G_WIN32_HAVE_WIDECHAR_API ())
177 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
178 int retval = _wmkdir (wfilename);
179 int save_errno = errno;
188 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
189 int retval = mkdir (cp_filename);
190 int save_errno = errno;
192 g_free (cp_filename);
198 return mkdir (filename, mode);
204 * @filename: a pathname in the GLib file name encoding
205 * @buf: a pointer to a <structname>stat</structname> struct, which
206 * will be filled with the file information
208 * A wrapper for the POSIX stat() function. The stat() function
209 * returns information about a file.
211 * See the C library manual for more details about stat().
213 * Returns: 0 if the information was successfully retrieved, -1 if an error
219 g_stat (const gchar *filename,
223 if (G_WIN32_HAVE_WIDECHAR_API ())
225 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
226 int retval = _wstat (wfilename, (struct _stat *) buf);
227 int save_errno = errno;
236 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
237 int retval = stat (cp_filename, buf);
238 int save_errno = errno;
240 g_free (cp_filename);
246 return stat (filename, buf);
252 * @filename: a pathname in the GLib file name encoding
253 * @buf: a pointer to a <structname>stat</structname> struct, which
254 * will be filled with the file information
256 * A wrapper for the POSIX lstat() function. The lstat() function is
257 * like stat() except that in the case of symbolic links, it returns
258 * information about the symbolic link itself and not the file that it
259 * refers to. If the system does not support symbolic links g_lstat()
260 * is identical to g_stat().
262 * See the C library manual for more details about lstat().
264 * Returns: 0 if the information was successfully retrieved, -1 if an error
270 g_lstat (const gchar *filename,
274 /* This can't be Win32, so don't do the widechar dance. */
275 return lstat (filename, buf);
277 return g_stat (filename, buf);
283 * @filename: a pathname in the GLib file name encoding
285 * A wrapper for the POSIX unlink() function. The unlink() function
286 * deletes a name from the filesystem. If this was the last link to the
287 * file and no processes have it opened, the diskspace occupied by the
290 * See your C library manual for more details about unlink(). Note
291 * that on Windows, it is in general not possible to delete files that
292 * are open to some process, or mapped into memory.
294 * Returns: 0 if the name was successfully deleted, -1 if an error
300 g_unlink (const gchar *filename)
303 if (G_WIN32_HAVE_WIDECHAR_API ())
305 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
306 int retval = _wunlink (wfilename);
307 int save_errno = errno;
316 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
317 int retval = unlink (cp_filename);
318 int save_errno = errno;
320 g_free (cp_filename);
326 return unlink (filename);
332 * @filename: a pathname in the GLib file name encoding
334 * A wrapper for the POSIX remove() function. The remove() function
335 * deletes a name from the filesystem.
337 * See your C library manual for more details about how remove() works
338 * on your system. On Unix, remove() removes also directories, as it
339 * calls unlink() for files and rmdir() for directories. On Windows,
340 * although remove() in the C library only works for files, this
341 * function tries first remove() and then if that fails rmdir(), and
342 * thus works for both files and directories. Note however, that on
343 * Windows, it is in general not possible to remove a file that is
344 * open to some process, or mapped into memory.
346 * Returns: 0 if the file was successfully removed, -1 if an error
352 g_remove (const gchar *filename)
355 if (G_WIN32_HAVE_WIDECHAR_API ())
357 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
361 retval = _wremove (wfilename);
363 retval = _wrmdir (wfilename);
373 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
377 retval = remove (cp_filename);
379 retval = rmdir (cp_filename);
382 g_free (cp_filename);
388 return remove (filename);
394 * @filename: a pathname in the GLib file name encoding
396 * A wrapper for the POSIX rmdir() function. The rmdir() function
397 * deletes a directory from the filesystem.
399 * See your C library manual for more details about how rmdir() works
402 * Returns: 0 if the directory was successfully removed, -1 if an error
408 g_rmdir (const gchar *filename)
411 if (G_WIN32_HAVE_WIDECHAR_API ())
413 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
414 int retval = _wrmdir (wfilename);
415 int save_errno = errno;
424 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
425 int retval = rmdir (cp_filename);
426 int save_errno = errno;
428 g_free (cp_filename);
434 return rmdir (filename);
440 * @filename: a pathname in the GLib file name encoding
441 * @mode: a string describing the mode in which the file should be
444 * A wrapper for the POSIX fopen() function. The fopen() function opens
445 * a file and associates a new stream with it.
447 * See the C library manual for more details about fopen().
449 * Returns: A <typename>FILE</typename> pointer if the file was successfully
450 * opened, or %NULL if an error occurred
455 g_fopen (const gchar *filename,
459 if (G_WIN32_HAVE_WIDECHAR_API ())
461 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
462 wchar_t *wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
463 FILE *retval = _wfopen (wfilename, wmode);
464 int save_errno = errno;
474 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
475 FILE *retval = fopen (cp_filename, mode);
476 int save_errno = errno;
478 g_free (cp_filename);
484 return fopen (filename, mode);
490 * @filename: a pathname in the GLib file name encoding
491 * @mode: a string describing the mode in which the file should be
493 * @stream: an existing stream which will be reused, or %NULL
495 * A wrapper for the POSIX freopen() function. The freopen() function
496 * opens a file and associates it with an existing stream.
498 * See the C library manual for more details about freopen().
500 * Returns: A <typename>FILE</typename> pointer if the file was successfully
501 * opened, or %NULL if an error occurred.
506 g_freopen (const gchar *filename,
511 if (G_WIN32_HAVE_WIDECHAR_API ())
513 wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
514 wchar_t *wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
515 FILE *retval = _wfreopen (wfilename, wmode, stream);
516 int save_errno = errno;
526 gchar *cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
527 FILE *retval = freopen (cp_filename, mode, stream);
528 int save_errno = errno;
530 g_free (cp_filename);
536 return freopen (filename, mode, stream);