avoid unnecessary filename conversions.
[platform/upstream/glib.git] / glib / gfileutils.c
1 /* gfileutils.c - File utility functions
2  *
3  *  Copyright 2000 Red Hat, Inc.
4  *
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.
9  *
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.
14  *
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.
19  */
20
21 #include "config.h"
22
23 #include "galias.h"
24 #include "glib.h"
25
26 #include <sys/stat.h>
27 #ifdef HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <stdarg.h>
33 #include <string.h>
34 #include <errno.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <fcntl.h>
38 #include <stdlib.h>
39
40 #ifdef G_OS_WIN32
41 #include <windows.h>
42 #include <io.h>
43 #endif /* G_OS_WIN32 */
44
45 #ifndef S_ISLNK
46 #define S_ISLNK(x) 0
47 #endif
48
49 #ifndef O_BINARY
50 #define O_BINARY 0
51 #endif
52
53 #include "gstdio.h"
54 #include "glibintl.h"
55
56 /**
57  * g_file_test:
58  * @filename: a filename to test in the GLib file name encoding
59  * @test: bitfield of #GFileTest flags
60  * 
61  * Returns %TRUE if any of the tests in the bitfield @test are
62  * %TRUE. For example, <literal>(G_FILE_TEST_EXISTS | 
63  * G_FILE_TEST_IS_DIR)</literal> will return %TRUE if the file exists; 
64  * the check whether it's a directory doesn't matter since the existence 
65  * test is %TRUE. With the current set of available tests, there's no point
66  * passing in more than one test at a time.
67  * 
68  * Apart from %G_FILE_TEST_IS_SYMLINK all tests follow symbolic links,
69  * so for a symbolic link to a regular file g_file_test() will return
70  * %TRUE for both %G_FILE_TEST_IS_SYMLINK and %G_FILE_TEST_IS_REGULAR.
71  *
72  * Note, that for a dangling symbolic link g_file_test() will return
73  * %TRUE for %G_FILE_TEST_IS_SYMLINK and %FALSE for all other flags.
74  *
75  * You should never use g_file_test() to test whether it is safe
76  * to perform an operation, because there is always the possibility
77  * of the condition changing before you actually perform the operation.
78  * For example, you might think you could use %G_FILE_TEST_IS_SYMLINK
79  * to know whether it is is safe to write to a file without being
80  * tricked into writing into a different location. It doesn't work!
81  *
82  * <informalexample><programlisting>
83  * /&ast; DON'T DO THIS &ast;/
84  *  if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK)) {
85  *    fd = g_open (filename, O_WRONLY);
86  *    /&ast; write to fd &ast;/
87  *  }
88  * </programlisting></informalexample>
89  *
90  * Another thing to note is that %G_FILE_TEST_EXISTS and
91  * %G_FILE_TEST_IS_EXECUTABLE are implemented using the access()
92  * system call. This usually doesn't matter, but if your program
93  * is setuid or setgid it means that these tests will give you
94  * the answer for the real user ID and group ID, rather than the
95  * effective user ID and group ID.
96  *
97  * On Windows, there are no symlinks, so testing for
98  * %G_FILE_TEST_IS_SYMLINK will always return %FALSE. Testing for
99  * %G_FILE_TEST_IS_EXECUTABLE will just check that the file exists and
100  * its name indicates that it is executable, checking for well-known
101  * extensions and those listed in the %PATHEXT environment variable.
102  *
103  * Return value: whether a test was %TRUE
104  **/
105 gboolean
106 g_file_test (const gchar *filename,
107              GFileTest    test)
108 {
109 #ifdef G_OS_WIN32
110 /* stuff missing in std vc6 api */
111 #  ifndef INVALID_FILE_ATTRIBUTES
112 #    define INVALID_FILE_ATTRIBUTES -1
113 #  endif
114 #  ifndef FILE_ATTRIBUTE_DEVICE
115 #    define FILE_ATTRIBUTE_DEVICE 64
116 #  endif
117   int attributes;
118
119   if (G_WIN32_HAVE_WIDECHAR_API ())
120     {
121       wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
122
123       if (wfilename == NULL)
124         return FALSE;
125
126       attributes = GetFileAttributesW (wfilename);
127
128       g_free (wfilename);
129     }
130   else
131     {
132       gchar *cpfilename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
133
134       if (cpfilename == NULL)
135         return FALSE;
136       
137       attributes = GetFileAttributesA (cpfilename);
138       
139       g_free (cpfilename);
140     }
141
142   if (attributes == INVALID_FILE_ATTRIBUTES)
143     return FALSE;
144
145   if (test & G_FILE_TEST_EXISTS)
146     return TRUE;
147       
148   if (test & G_FILE_TEST_IS_REGULAR)
149     return (attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0;
150
151   if (test & G_FILE_TEST_IS_DIR)
152     return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
153
154   if (test & G_FILE_TEST_IS_EXECUTABLE)
155     {
156       const gchar *lastdot = strrchr (filename, '.');
157       const gchar *pathext = NULL, *p;
158       int extlen;
159
160       if (lastdot == NULL)
161         return FALSE;
162
163       if (stricmp (lastdot, ".exe") == 0 ||
164           stricmp (lastdot, ".cmd") == 0 ||
165           stricmp (lastdot, ".bat") == 0 ||
166           stricmp (lastdot, ".com") == 0)
167         return TRUE;
168
169       /* Check if it is one of the types listed in %PATHEXT% */
170
171       pathext = g_getenv ("PATHEXT");
172       if (pathext == NULL)
173         return FALSE;
174
175       pathext = g_utf8_casefold (pathext, -1);
176
177       lastdot = g_utf8_casefold (lastdot, -1);
178       extlen = strlen (lastdot);
179
180       p = pathext;
181       while (TRUE)
182         {
183           const gchar *q = strchr (p, ';');
184           if (q == NULL)
185             q = p + strlen (p);
186           if (extlen == q - p &&
187               memcmp (lastdot, p, extlen) == 0)
188             {
189               g_free ((gchar *) pathext);
190               g_free ((gchar *) lastdot);
191               return TRUE;
192             }
193           if (*q)
194             p = q + 1;
195           else
196             break;
197         }
198
199       g_free ((gchar *) pathext);
200       g_free ((gchar *) lastdot);
201       return FALSE;
202     }
203
204   return FALSE;
205 #else
206   if ((test & G_FILE_TEST_EXISTS) && (access (filename, F_OK) == 0))
207     return TRUE;
208   
209   if ((test & G_FILE_TEST_IS_EXECUTABLE) && (access (filename, X_OK) == 0))
210     {
211       if (getuid () != 0)
212         return TRUE;
213
214       /* For root, on some POSIX systems, access (filename, X_OK)
215        * will succeed even if no executable bits are set on the
216        * file. We fall through to a stat test to avoid that.
217        */
218     }
219   else
220     test &= ~G_FILE_TEST_IS_EXECUTABLE;
221
222   if (test & G_FILE_TEST_IS_SYMLINK)
223     {
224       struct stat s;
225
226       if ((lstat (filename, &s) == 0) && S_ISLNK (s.st_mode))
227         return TRUE;
228     }
229   
230   if (test & (G_FILE_TEST_IS_REGULAR |
231               G_FILE_TEST_IS_DIR |
232               G_FILE_TEST_IS_EXECUTABLE))
233     {
234       struct stat s;
235       
236       if (stat (filename, &s) == 0)
237         {
238           if ((test & G_FILE_TEST_IS_REGULAR) && S_ISREG (s.st_mode))
239             return TRUE;
240           
241           if ((test & G_FILE_TEST_IS_DIR) && S_ISDIR (s.st_mode))
242             return TRUE;
243
244           /* The extra test for root when access (file, X_OK) succeeds.
245            */
246           if ((test & G_FILE_TEST_IS_EXECUTABLE) &&
247               ((s.st_mode & S_IXOTH) ||
248                (s.st_mode & S_IXUSR) ||
249                (s.st_mode & S_IXGRP)))
250             return TRUE;
251         }
252     }
253
254   return FALSE;
255 #endif
256 }
257
258 #ifdef G_OS_WIN32
259
260 #undef g_file_test
261
262 /* Binary compatibility version. Not for newly compiled code. */
263
264 gboolean
265 g_file_test (const gchar *filename,
266              GFileTest    test)
267 {
268   gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
269   gboolean retval;
270
271   if (utf8_filename == NULL)
272     return FALSE;
273
274   retval = g_file_test_utf8 (utf8_filename, test);
275
276   g_free (utf8_filename);
277
278   return retval;
279 }
280
281 #endif
282
283 GQuark
284 g_file_error_quark (void)
285 {
286   static GQuark q = 0;
287   if (q == 0)
288     q = g_quark_from_static_string ("g-file-error-quark");
289
290   return q;
291 }
292
293 /**
294  * g_file_error_from_errno:
295  * @err_no: an "errno" value
296  * 
297  * Gets a #GFileError constant based on the passed-in @errno.
298  * For example, if you pass in %EEXIST this function returns
299  * #G_FILE_ERROR_EXIST. Unlike @errno values, you can portably
300  * assume that all #GFileError values will exist.
301  *
302  * Normally a #GFileError value goes into a #GError returned
303  * from a function that manipulates files. So you would use
304  * g_file_error_from_errno() when constructing a #GError.
305  * 
306  * Return value: #GFileError corresponding to the given @errno
307  **/
308 GFileError
309 g_file_error_from_errno (gint err_no)
310 {
311   switch (err_no)
312     {
313 #ifdef EEXIST
314     case EEXIST:
315       return G_FILE_ERROR_EXIST;
316       break;
317 #endif
318
319 #ifdef EISDIR
320     case EISDIR:
321       return G_FILE_ERROR_ISDIR;
322       break;
323 #endif
324
325 #ifdef EACCES
326     case EACCES:
327       return G_FILE_ERROR_ACCES;
328       break;
329 #endif
330
331 #ifdef ENAMETOOLONG
332     case ENAMETOOLONG:
333       return G_FILE_ERROR_NAMETOOLONG;
334       break;
335 #endif
336
337 #ifdef ENOENT
338     case ENOENT:
339       return G_FILE_ERROR_NOENT;
340       break;
341 #endif
342
343 #ifdef ENOTDIR
344     case ENOTDIR:
345       return G_FILE_ERROR_NOTDIR;
346       break;
347 #endif
348
349 #ifdef ENXIO
350     case ENXIO:
351       return G_FILE_ERROR_NXIO;
352       break;
353 #endif
354
355 #ifdef ENODEV
356     case ENODEV:
357       return G_FILE_ERROR_NODEV;
358       break;
359 #endif
360
361 #ifdef EROFS
362     case EROFS:
363       return G_FILE_ERROR_ROFS;
364       break;
365 #endif
366
367 #ifdef ETXTBSY
368     case ETXTBSY:
369       return G_FILE_ERROR_TXTBSY;
370       break;
371 #endif
372
373 #ifdef EFAULT
374     case EFAULT:
375       return G_FILE_ERROR_FAULT;
376       break;
377 #endif
378
379 #ifdef ELOOP
380     case ELOOP:
381       return G_FILE_ERROR_LOOP;
382       break;
383 #endif
384
385 #ifdef ENOSPC
386     case ENOSPC:
387       return G_FILE_ERROR_NOSPC;
388       break;
389 #endif
390
391 #ifdef ENOMEM
392     case ENOMEM:
393       return G_FILE_ERROR_NOMEM;
394       break;
395 #endif
396
397 #ifdef EMFILE
398     case EMFILE:
399       return G_FILE_ERROR_MFILE;
400       break;
401 #endif
402
403 #ifdef ENFILE
404     case ENFILE:
405       return G_FILE_ERROR_NFILE;
406       break;
407 #endif
408
409 #ifdef EBADF
410     case EBADF:
411       return G_FILE_ERROR_BADF;
412       break;
413 #endif
414
415 #ifdef EINVAL
416     case EINVAL:
417       return G_FILE_ERROR_INVAL;
418       break;
419 #endif
420
421 #ifdef EPIPE
422     case EPIPE:
423       return G_FILE_ERROR_PIPE;
424       break;
425 #endif
426
427 #ifdef EAGAIN
428     case EAGAIN:
429       return G_FILE_ERROR_AGAIN;
430       break;
431 #endif
432
433 #ifdef EINTR
434     case EINTR:
435       return G_FILE_ERROR_INTR;
436       break;
437 #endif
438
439 #ifdef EIO
440     case EIO:
441       return G_FILE_ERROR_IO;
442       break;
443 #endif
444
445 #ifdef EPERM
446     case EPERM:
447       return G_FILE_ERROR_PERM;
448       break;
449 #endif
450
451 #ifdef ENOSYS
452     case ENOSYS:
453       return G_FILE_ERROR_NOSYS;
454       break;
455 #endif
456
457     default:
458       return G_FILE_ERROR_FAILED;
459       break;
460     }
461 }
462
463 static gboolean
464 get_contents_stdio (const gchar *display_filename,
465                     FILE        *f,
466                     gchar      **contents,
467                     gsize       *length, 
468                     GError     **error)
469 {
470   gchar buf[2048];
471   size_t bytes;
472   char *str;
473   size_t total_bytes;
474   size_t total_allocated;
475   
476   g_assert (f != NULL);
477
478 #define STARTING_ALLOC 64
479   
480   total_bytes = 0;
481   total_allocated = STARTING_ALLOC;
482   str = g_malloc (STARTING_ALLOC);
483   
484   while (!feof (f))
485     {
486       int save_errno;
487
488       bytes = fread (buf, 1, 2048, f);
489       save_errno = errno;
490
491       while ((total_bytes + bytes + 1) > total_allocated)
492         {
493           total_allocated *= 2;
494           str = g_try_realloc (str, total_allocated);
495
496           if (str == NULL)
497             {
498               g_set_error (error,
499                            G_FILE_ERROR,
500                            G_FILE_ERROR_NOMEM,
501                            _("Could not allocate %lu bytes to read file \"%s\""),
502                            (gulong) total_allocated, 
503                            display_filename);
504
505               goto error;
506             }
507         }
508       
509       if (ferror (f))
510         {
511           g_set_error (error,
512                        G_FILE_ERROR,
513                        g_file_error_from_errno (save_errno),
514                        _("Error reading file '%s': %s"),
515                        display_filename,
516                        g_strerror (save_errno));
517
518           goto error;
519         }
520
521       memcpy (str + total_bytes, buf, bytes);
522       total_bytes += bytes;
523     }
524
525   fclose (f);
526
527   str[total_bytes] = '\0';
528   
529   if (length)
530     *length = total_bytes;
531   
532   *contents = str;
533   
534   return TRUE;
535
536  error:
537
538   g_free (str);
539   fclose (f);
540   
541   return FALSE;  
542 }
543
544 #ifndef G_OS_WIN32
545
546 static gboolean
547 get_contents_regfile (const gchar *display_filename,
548                       struct stat *stat_buf,
549                       gint         fd,
550                       gchar      **contents,
551                       gsize       *length,
552                       GError     **error)
553 {
554   gchar *buf;
555   size_t bytes_read;
556   size_t size;
557   size_t alloc_size;
558   
559   size = stat_buf->st_size;
560
561   alloc_size = size + 1;
562   buf = g_try_malloc (alloc_size);
563
564   if (buf == NULL)
565     {
566       g_set_error (error,
567                    G_FILE_ERROR,
568                    G_FILE_ERROR_NOMEM,
569                    _("Could not allocate %lu bytes to read file \"%s\""),
570                    (gulong) alloc_size, 
571                    display_filename);
572
573       goto error;
574     }
575   
576   bytes_read = 0;
577   while (bytes_read < size)
578     {
579       gssize rc;
580           
581       rc = read (fd, buf + bytes_read, size - bytes_read);
582
583       if (rc < 0)
584         {
585           if (errno != EINTR) 
586             {
587               int save_errno = errno;
588
589               g_free (buf);
590               g_set_error (error,
591                            G_FILE_ERROR,
592                            g_file_error_from_errno (save_errno),
593                            _("Failed to read from file '%s': %s"),
594                            display_filename, 
595                            g_strerror (save_errno));
596
597               goto error;
598             }
599         }
600       else if (rc == 0)
601         break;
602       else
603         bytes_read += rc;
604     }
605       
606   buf[bytes_read] = '\0';
607
608   if (length)
609     *length = bytes_read;
610   
611   *contents = buf;
612
613   close (fd);
614
615   return TRUE;
616
617  error:
618
619   close (fd);
620   
621   return FALSE;
622 }
623
624 static gboolean
625 get_contents_posix (const gchar *filename,
626                     gchar      **contents,
627                     gsize       *length,
628                     GError     **error)
629 {
630   struct stat stat_buf;
631   gint fd;
632   gchar *display_filename = g_filename_display_name (filename);
633
634   /* O_BINARY useful on Cygwin */
635   fd = open (filename, O_RDONLY|O_BINARY);
636
637   if (fd < 0)
638     {
639       int save_errno = errno;
640
641       g_set_error (error,
642                    G_FILE_ERROR,
643                    g_file_error_from_errno (save_errno),
644                    _("Failed to open file '%s': %s"),
645                    display_filename, 
646                    g_strerror (save_errno));
647       g_free (display_filename);
648
649       return FALSE;
650     }
651
652   /* I don't think this will ever fail, aside from ENOMEM, but. */
653   if (fstat (fd, &stat_buf) < 0)
654     {
655       int save_errno = errno;
656
657       close (fd);
658       g_set_error (error,
659                    G_FILE_ERROR,
660                    g_file_error_from_errno (save_errno),
661                    _("Failed to get attributes of file '%s': fstat() failed: %s"),
662                    display_filename, 
663                    g_strerror (save_errno));
664       g_free (display_filename);
665
666       return FALSE;
667     }
668
669   if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode))
670     {
671       gboolean retval = get_contents_regfile (display_filename,
672                                               &stat_buf,
673                                               fd,
674                                               contents,
675                                               length,
676                                               error);
677       g_free (display_filename);
678
679       return retval;
680     }
681   else
682     {
683       FILE *f;
684       gboolean retval;
685
686       f = fdopen (fd, "r");
687       
688       if (f == NULL)
689         {
690           int save_errno = errno;
691
692           g_set_error (error,
693                        G_FILE_ERROR,
694                        g_file_error_from_errno (save_errno),
695                        _("Failed to open file '%s': fdopen() failed: %s"),
696                        display_filename, 
697                        g_strerror (save_errno));
698           g_free (display_filename);
699
700           return FALSE;
701         }
702   
703       retval = get_contents_stdio (display_filename, f, contents, length, error);
704       g_free (display_filename);
705
706       return retval;
707     }
708 }
709
710 #else  /* G_OS_WIN32 */
711
712 static gboolean
713 get_contents_win32 (const gchar *filename,
714                     gchar      **contents,
715                     gsize       *length,
716                     GError     **error)
717 {
718   FILE *f;
719   gboolean retval;
720   gchar *display_filename = g_filename_display_name (filename);
721   int save_errno;
722   
723   f = g_fopen (filename, "rb");
724   save_errno = errno;
725
726   if (f == NULL)
727     {
728       g_set_error (error,
729                    G_FILE_ERROR,
730                    g_file_error_from_errno (save_errno),
731                    _("Failed to open file '%s': %s"),
732                    display_filename,
733                    g_strerror (save_errno));
734       g_free (display_filename);
735
736       return FALSE;
737     }
738   
739   retval = get_contents_stdio (display_filename, f, contents, length, error);
740   g_free (display_filename);
741
742   return retval;
743 }
744
745 #endif
746
747 /**
748  * g_file_get_contents:
749  * @filename: name of a file to read contents from, in the GLib file name encoding
750  * @contents: location to store an allocated string
751  * @length: location to store length in bytes of the contents, or %NULL
752  * @error: return location for a #GError, or %NULL
753  * 
754  * Reads an entire file into allocated memory, with good error
755  * checking. 
756  *
757  * If the call was successful, it returns %TRUE and sets @contents to the file 
758  * contents and @length to the length of the file contents in bytes. The string 
759  * stored in @contents will be nul-terminated, so for text files you can pass 
760  * %NULL for the @length argument. If the call was not successful, it returns 
761  * %FALSE and sets @error. The error domain is #G_FILE_ERROR. Possible error  
762  * codes are those in the #GFileError enumeration. In the error case, 
763  * @contents is set to %NULL and @length is set to zero.
764  *
765  * Return value: %TRUE on success, %FALSE if an error occurred
766  **/
767 gboolean
768 g_file_get_contents (const gchar *filename,
769                      gchar      **contents,
770                      gsize       *length,
771                      GError     **error)
772 {  
773   g_return_val_if_fail (filename != NULL, FALSE);
774   g_return_val_if_fail (contents != NULL, FALSE);
775
776   *contents = NULL;
777   if (length)
778     *length = 0;
779
780 #ifdef G_OS_WIN32
781   return get_contents_win32 (filename, contents, length, error);
782 #else
783   return get_contents_posix (filename, contents, length, error);
784 #endif
785 }
786
787 #ifdef G_OS_WIN32
788
789 #undef g_file_get_contents
790
791 /* Binary compatibility version. Not for newly compiled code. */
792
793 gboolean
794 g_file_get_contents (const gchar *filename,
795                      gchar      **contents,
796                      gsize       *length,
797                      GError     **error)
798 {
799   gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
800   gboolean retval;
801
802   if (utf8_filename == NULL)
803     return FALSE;
804
805   retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error);
806
807   g_free (utf8_filename);
808
809   return retval;
810 }
811
812 #endif
813
814
815 static gboolean
816 rename_file (const char *old_name,
817              const char *new_name,
818              GError **err)
819 {
820   errno = 0;
821   if (g_rename (old_name, new_name) == -1)
822     {
823       int save_errno = errno;
824       gchar *display_old_name = g_filename_display_name (old_name);
825       gchar *display_new_name = g_filename_display_name (new_name);
826       
827       g_set_error (err,
828                    G_FILE_ERROR,
829                    g_file_error_from_errno (save_errno),
830                    _("Failed to rename file '%s' to '%s': g_rename() failed: %s"),
831                    display_old_name,
832                    display_new_name,
833                    g_strerror (save_errno));
834
835       g_free (display_old_name);
836       g_free (display_new_name);
837       
838       return FALSE;
839     }
840   
841   return TRUE;
842 }
843
844 static gchar *
845 write_to_temp_file (const gchar *contents,
846                     gsize length,
847                     const gchar *template,
848                     GError **err)
849 {
850   gchar *tmp_name;
851   gchar *display_name;
852   gchar *retval;
853   FILE *file;
854   gint fd;
855   int save_errno;
856
857   retval = NULL;
858   
859   tmp_name = g_strdup_printf (".%s.XXXXXX", template);
860
861   errno = 0;
862   fd = g_mkstemp (tmp_name);
863   save_errno = errno;
864   display_name = g_filename_display_name (tmp_name);
865       
866   if (fd == -1)
867     {
868       g_set_error (err,
869                    G_FILE_ERROR,
870                    g_file_error_from_errno (save_errno),
871                    _("Failed to create file '%s': %s"),
872                    display_name, g_strerror (save_errno));
873       
874       goto out;
875     }
876
877   errno = 0;
878   file = fdopen (fd, "wb");
879   if (!file)
880     {
881       g_set_error (err,
882                    G_FILE_ERROR,
883                    g_file_error_from_errno (errno),
884                    _("Failed to open file '%s' for writing: fdopen() failed: %s"),
885                    display_name,
886                    g_strerror (errno));
887
888       close (fd);
889       g_unlink (tmp_name);
890       
891       goto out;
892     }
893
894   if (length > 0)
895     {
896       size_t n_written;
897       
898       errno = 0;
899
900       n_written = fwrite (contents, 1, length, file);
901       
902       if (n_written < length)
903         {
904           g_set_error (err,
905                        G_FILE_ERROR,
906                        g_file_error_from_errno (errno),
907                        _("Failed to write file '%s': fwrite() failed: %s"),
908                        display_name,
909                        g_strerror (errno));
910
911           fclose (file);
912           g_unlink (tmp_name);
913           
914           goto out;
915         }
916     }
917    
918   errno = 0;
919   if (fclose (file) == EOF)
920     {
921       g_set_error (err,
922                    G_FILE_ERROR,
923                    g_file_error_from_errno (errno),
924                    _("Failed to close file '%s': fclose() failed: %s"),
925                    display_name, 
926                    g_strerror (errno));
927
928       g_unlink (tmp_name);
929       
930       goto out;
931     }
932   
933   retval = g_strdup (tmp_name);
934
935  out:
936   g_free (tmp_name);
937   g_free (display_name);
938   
939   return retval;
940 }
941
942 /**
943  * g_file_replace:
944  * @filename: name of a file to write @contents to, in the GLib file name
945  *   encoding
946  * @contents: string to write to the file
947  * @length: length of @contents, or -1 if @contents is a nul-terminated string
948  * @error: return location for a #GError, or %NULL
949  *
950  * Writes all of @contents to a file named @filename, with good error checking.
951  * If a file called @filename already exists it will be overwritten.
952  *
953  * This write is atomic in the sense that it is first written to a temporary
954  * file which is then renamed to the final name. Notes:
955  * <itemizedlist>
956  * <listitem>
957  *    On Unix, if @filename already exists hard links to @filename will break.
958  *    Also since the file is recreated, existing permissions, access control
959  *    lists, metadata etc. may be lost.
960  * </listitem>
961  * <listitem>
962  *   On Windows renaming a file will not remove an existing file with the
963  *   new name, so on Windows there is a race condition between the existing
964  *   file being removed and the temporary file being renamed.
965  * </listitem>
966  * <listitem>
967  *   On Windows there is no way to remove a file that is open to some
968  *   process, or mapped into memory. Thus, this function will fail if
969  *   @filename already exists and is open.
970  * </listitem>
971  * </itemizedlist>
972  *
973  * If the call was sucessful, it returns %TRUE. If the call was not successful,
974  * it returns %FALSE and sets @error. The error domain is #G_FILE_ERROR.
975  * Possible error codes are those in the #GFileError enumeration.
976  *
977  * Return value: %TRUE on success, %FALSE if an error occurred
978  *
979  * Since: 2.8
980  **/
981 gboolean
982 g_file_replace (const gchar *filename,
983                 const gchar *contents,
984                 gssize       length,
985                 GError     **error)
986 {
987   gchar *tmp_filename;
988   gboolean retval;
989   GError *rename_error = NULL;
990   
991   g_return_val_if_fail (filename != NULL, FALSE);
992   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
993   g_return_val_if_fail (contents != NULL || length == 0, FALSE);
994  
995   if (length == -1)
996     length = strlen (contents);
997
998   tmp_filename = write_to_temp_file (contents, length, filename, error);
999   
1000   if (!tmp_filename)
1001     {
1002       retval = FALSE;
1003       goto out;
1004     }
1005
1006   if (!rename_file (tmp_filename, filename, &rename_error))
1007     {
1008 #ifndef G_OS_WIN32
1009
1010       g_unlink (tmp_filename);
1011       g_propagate_error (error, rename_error);
1012       retval = FALSE;
1013       goto out;
1014
1015 #else /* G_OS_WIN32 */
1016       
1017       /* Renaming failed, but on Windows this may just mean
1018        * the file already exists. So if the target file
1019        * exists, try deleting it and do the rename again.
1020        */
1021       if (!g_file_test (filename, G_FILE_TEST_EXISTS))
1022         {
1023           g_unlink (tmp_filename);
1024           g_propagate_error (error, rename_error);
1025           retval = FALSE;
1026           goto out;
1027         }
1028
1029       g_error_free (rename_error);
1030       
1031       if (g_unlink (filename) == -1)
1032         {
1033           gchar *display_filename = g_filename_display_name (filename);
1034
1035           g_set_error (error,
1036                        G_FILE_ERROR,
1037                        g_file_error_from_errno (errno),
1038                        _("Existing file '%s' could not be removed: g_unlink() failed: %s"),
1039                        display_filename,
1040                        g_strerror (errno));
1041
1042           g_free (display_filename);
1043           g_unlink (tmp_filename);
1044           retval = FALSE;
1045           goto out;
1046         }
1047       
1048       if (!rename_file (tmp_filename, filename, error))
1049         {
1050           g_unlink (tmp_filename);
1051           retval = FALSE;
1052           goto out;
1053         }
1054
1055 #endif
1056     }
1057
1058   retval = TRUE;
1059   
1060  out:
1061   g_free (tmp_filename);
1062   return retval;
1063 }
1064
1065 /*
1066  * mkstemp() implementation is from the GNU C library.
1067  * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
1068  */
1069 /**
1070  * g_mkstemp:
1071  * @tmpl: template filename
1072  *
1073  * Opens a temporary file. See the mkstemp() documentation
1074  * on most UNIX-like systems. This is a portability wrapper, which simply calls 
1075  * mkstemp() on systems that have it, and implements 
1076  * it in GLib otherwise.
1077  *
1078  * The parameter is a string that should match the rules for
1079  * mkstemp(), i.e. end in "XXXXXX". The X string will 
1080  * be modified to form the name of a file that didn't exist.
1081  * The string should be in the GLib file name encoding. Most importantly, 
1082  * on Windows it should be in UTF-8.
1083  *
1084  * Return value: A file handle (as from open()) to the file
1085  * opened for reading and writing. The file is opened in binary mode
1086  * on platforms where there is a difference. The file handle should be
1087  * closed with close(). In case of errors, -1 is returned.
1088  */
1089 gint
1090 g_mkstemp (gchar *tmpl)
1091 {
1092 #ifdef HAVE_MKSTEMP
1093   return mkstemp (tmpl);
1094 #else
1095   int len;
1096   char *XXXXXX;
1097   int count, fd;
1098   static const char letters[] =
1099     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
1100   static const int NLETTERS = sizeof (letters) - 1;
1101   glong value;
1102   GTimeVal tv;
1103   static int counter = 0;
1104
1105   len = strlen (tmpl);
1106   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
1107     {
1108       errno = EINVAL;
1109       return -1;
1110     }
1111
1112   /* This is where the Xs start.  */
1113   XXXXXX = &tmpl[len - 6];
1114
1115   /* Get some more or less random data.  */
1116   g_get_current_time (&tv);
1117   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
1118
1119   for (count = 0; count < 100; value += 7777, ++count)
1120     {
1121       glong v = value;
1122
1123       /* Fill in the random bits.  */
1124       XXXXXX[0] = letters[v % NLETTERS];
1125       v /= NLETTERS;
1126       XXXXXX[1] = letters[v % NLETTERS];
1127       v /= NLETTERS;
1128       XXXXXX[2] = letters[v % NLETTERS];
1129       v /= NLETTERS;
1130       XXXXXX[3] = letters[v % NLETTERS];
1131       v /= NLETTERS;
1132       XXXXXX[4] = letters[v % NLETTERS];
1133       v /= NLETTERS;
1134       XXXXXX[5] = letters[v % NLETTERS];
1135
1136       /* tmpl is in UTF-8 on Windows, thus use g_open() */
1137       fd = g_open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
1138
1139       if (fd >= 0)
1140         return fd;
1141       else if (errno != EEXIST)
1142         /* Any other error will apply also to other names we might
1143          *  try, and there are 2^32 or so of them, so give up now.
1144          */
1145         return -1;
1146     }
1147
1148   /* We got out of the loop because we ran out of combinations to try.  */
1149   errno = EEXIST;
1150   return -1;
1151 #endif
1152 }
1153
1154 #ifdef G_OS_WIN32
1155
1156 #undef g_mkstemp
1157
1158 /* Binary compatibility version. Not for newly compiled code. */
1159
1160 gint
1161 g_mkstemp (gchar *tmpl)
1162 {
1163   int len;
1164   char *XXXXXX;
1165   int count, fd;
1166   static const char letters[] =
1167     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
1168   static const int NLETTERS = sizeof (letters) - 1;
1169   glong value;
1170   GTimeVal tv;
1171   static int counter = 0;
1172
1173   len = strlen (tmpl);
1174   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
1175     {
1176       errno = EINVAL;
1177       return -1;
1178     }
1179
1180   /* This is where the Xs start.  */
1181   XXXXXX = &tmpl[len - 6];
1182
1183   /* Get some more or less random data.  */
1184   g_get_current_time (&tv);
1185   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
1186
1187   for (count = 0; count < 100; value += 7777, ++count)
1188     {
1189       glong v = value;
1190
1191       /* Fill in the random bits.  */
1192       XXXXXX[0] = letters[v % NLETTERS];
1193       v /= NLETTERS;
1194       XXXXXX[1] = letters[v % NLETTERS];
1195       v /= NLETTERS;
1196       XXXXXX[2] = letters[v % NLETTERS];
1197       v /= NLETTERS;
1198       XXXXXX[3] = letters[v % NLETTERS];
1199       v /= NLETTERS;
1200       XXXXXX[4] = letters[v % NLETTERS];
1201       v /= NLETTERS;
1202       XXXXXX[5] = letters[v % NLETTERS];
1203
1204       /* This is the backward compatibility system codepage version,
1205        * thus use normal open().
1206        */
1207       fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
1208
1209       if (fd >= 0)
1210         return fd;
1211       else if (errno != EEXIST)
1212         /* Any other error will apply also to other names we might
1213          *  try, and there are 2^32 or so of them, so give up now.
1214          */
1215         return -1;
1216     }
1217
1218   /* We got out of the loop because we ran out of combinations to try.  */
1219   errno = EEXIST;
1220   return -1;
1221 }
1222
1223 #endif
1224
1225 /**
1226  * g_file_open_tmp:
1227  * @tmpl: Template for file name, as in g_mkstemp(), basename only
1228  * @name_used: location to store actual name used
1229  * @error: return location for a #GError
1230  *
1231  * Opens a file for writing in the preferred directory for temporary
1232  * files (as returned by g_get_tmp_dir()). 
1233  *
1234  * @tmpl should be a string in the GLib file name encoding ending with
1235  * six 'X' characters, as the parameter to g_mkstemp() (or mkstemp()).
1236  * However, unlike these functions, the template should only be a
1237  * basename, no directory components are allowed. If template is
1238  * %NULL, a default template is used.
1239  *
1240  * Note that in contrast to g_mkstemp() (and mkstemp()) 
1241  * @tmpl is not modified, and might thus be a read-only literal string.
1242  *
1243  * The actual name used is returned in @name_used if non-%NULL. This
1244  * string should be freed with g_free() when not needed any longer.
1245  * The returned name is in the GLib file name encoding.
1246  *
1247  * Return value: A file handle (as from open()) to 
1248  * the file opened for reading and writing. The file is opened in binary 
1249  * mode on platforms where there is a difference. The file handle should be
1250  * closed with close(). In case of errors, -1 is returned 
1251  * and @error will be set.
1252  **/
1253 gint
1254 g_file_open_tmp (const gchar *tmpl,
1255                  gchar      **name_used,
1256                  GError     **error)
1257 {
1258   int retval;
1259   const char *tmpdir;
1260   char *sep;
1261   char *fulltemplate;
1262   const char *slash;
1263
1264   if (tmpl == NULL)
1265     tmpl = ".XXXXXX";
1266
1267   if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL
1268 #ifdef G_OS_WIN32
1269       || (strchr (tmpl, '/') != NULL && (slash = "/"))
1270 #endif
1271       )
1272     {
1273       gchar *display_tmpl = g_filename_display_name (tmpl);
1274       char c[2];
1275       c[0] = *slash;
1276       c[1] = '\0';
1277
1278       g_set_error (error,
1279                    G_FILE_ERROR,
1280                    G_FILE_ERROR_FAILED,
1281                    _("Template '%s' invalid, should not contain a '%s'"),
1282                    display_tmpl, c);
1283       g_free (display_tmpl);
1284
1285       return -1;
1286     }
1287   
1288   if (strlen (tmpl) < 6 ||
1289       strcmp (tmpl + strlen (tmpl) - 6, "XXXXXX") != 0)
1290     {
1291       gchar *display_tmpl = g_filename_display_name (tmpl);
1292       g_set_error (error,
1293                    G_FILE_ERROR,
1294                    G_FILE_ERROR_FAILED,
1295                    _("Template '%s' doesn't end with XXXXXX"),
1296                    display_tmpl);
1297       g_free (display_tmpl);
1298       return -1;
1299     }
1300
1301   tmpdir = g_get_tmp_dir ();
1302
1303   if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1]))
1304     sep = "";
1305   else
1306     sep = G_DIR_SEPARATOR_S;
1307
1308   fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL);
1309
1310   retval = g_mkstemp (fulltemplate);
1311
1312   if (retval == -1)
1313     {
1314       int save_errno = errno;
1315       gchar *display_fulltemplate = g_filename_display_name (fulltemplate);
1316
1317       g_set_error (error,
1318                    G_FILE_ERROR,
1319                    g_file_error_from_errno (save_errno),
1320                    _("Failed to create file '%s': %s"),
1321                    display_fulltemplate, g_strerror (save_errno));
1322       g_free (display_fulltemplate);
1323       g_free (fulltemplate);
1324       return -1;
1325     }
1326
1327   if (name_used)
1328     *name_used = fulltemplate;
1329   else
1330     g_free (fulltemplate);
1331
1332   return retval;
1333 }
1334
1335 #ifdef G_OS_WIN32
1336
1337 #undef g_file_open_tmp
1338
1339 /* Binary compatibility version. Not for newly compiled code. */
1340
1341 gint
1342 g_file_open_tmp (const gchar *tmpl,
1343                  gchar      **name_used,
1344                  GError     **error)
1345 {
1346   gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
1347   gchar *utf8_name_used;
1348   gint retval;
1349
1350   if (utf8_tmpl == NULL)
1351     return -1;
1352
1353   retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
1354   
1355   if (retval == -1)
1356     return -1;
1357
1358   if (name_used)
1359     *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
1360
1361   g_free (utf8_name_used);
1362
1363   return retval;
1364 }
1365
1366 #endif
1367
1368 static gchar *
1369 g_build_pathv (const gchar *separator,
1370                const gchar *first_element,
1371                va_list      args)
1372 {
1373   GString *result;
1374   gint separator_len = strlen (separator);
1375   gboolean is_first = TRUE;
1376   gboolean have_leading = FALSE;
1377   const gchar *single_element = NULL;
1378   const gchar *next_element;
1379   const gchar *last_trailing = NULL;
1380
1381   result = g_string_new (NULL);
1382
1383   next_element = first_element;
1384
1385   while (TRUE)
1386     {
1387       const gchar *element;
1388       const gchar *start;
1389       const gchar *end;
1390
1391       if (next_element)
1392         {
1393           element = next_element;
1394           next_element = va_arg (args, gchar *);
1395         }
1396       else
1397         break;
1398
1399       /* Ignore empty elements */
1400       if (!*element)
1401         continue;
1402       
1403       start = element;
1404
1405       if (separator_len)
1406         {
1407           while (start &&
1408                  strncmp (start, separator, separator_len) == 0)
1409             start += separator_len;
1410         }
1411
1412       end = start + strlen (start);
1413       
1414       if (separator_len)
1415         {
1416           while (end >= start + separator_len &&
1417                  strncmp (end - separator_len, separator, separator_len) == 0)
1418             end -= separator_len;
1419           
1420           last_trailing = end;
1421           while (last_trailing >= element + separator_len &&
1422                  strncmp (last_trailing - separator_len, separator, separator_len) == 0)
1423             last_trailing -= separator_len;
1424
1425           if (!have_leading)
1426             {
1427               /* If the leading and trailing separator strings are in the
1428                * same element and overlap, the result is exactly that element
1429                */
1430               if (last_trailing <= start)
1431                 single_element = element;
1432                   
1433               g_string_append_len (result, element, start - element);
1434               have_leading = TRUE;
1435             }
1436           else
1437             single_element = NULL;
1438         }
1439
1440       if (end == start)
1441         continue;
1442
1443       if (!is_first)
1444         g_string_append (result, separator);
1445       
1446       g_string_append_len (result, start, end - start);
1447       is_first = FALSE;
1448     }
1449
1450   if (single_element)
1451     {
1452       g_string_free (result, TRUE);
1453       return g_strdup (single_element);
1454     }
1455   else
1456     {
1457       if (last_trailing)
1458         g_string_append (result, last_trailing);
1459   
1460       return g_string_free (result, FALSE);
1461     }
1462 }
1463
1464 /**
1465  * g_build_path:
1466  * @separator: a string used to separator the elements of the path.
1467  * @first_element: the first element in the path
1468  * @Varargs: remaining elements in path, terminated by %NULL
1469  * 
1470  * Creates a path from a series of elements using @separator as the
1471  * separator between elements. At the boundary between two elements,
1472  * any trailing occurrences of separator in the first element, or
1473  * leading occurrences of separator in the second element are removed
1474  * and exactly one copy of the separator is inserted.
1475  *
1476  * Empty elements are ignored.
1477  *
1478  * The number of leading copies of the separator on the result is
1479  * the same as the number of leading copies of the separator on
1480  * the first non-empty element.
1481  *
1482  * The number of trailing copies of the separator on the result is
1483  * the same as the number of trailing copies of the separator on
1484  * the last non-empty element. (Determination of the number of
1485  * trailing copies is done without stripping leading copies, so
1486  * if the separator is <literal>ABA</literal>, <literal>ABABA</literal>
1487  * has 1 trailing copy.)
1488  *
1489  * However, if there is only a single non-empty element, and there
1490  * are no characters in that element not part of the leading or
1491  * trailing separators, then the result is exactly the original value
1492  * of that element.
1493  *
1494  * Other than for determination of the number of leading and trailing
1495  * copies of the separator, elements consisting only of copies
1496  * of the separator are ignored.
1497  * 
1498  * Return value: a newly-allocated string that must be freed with g_free().
1499  **/
1500 gchar *
1501 g_build_path (const gchar *separator,
1502               const gchar *first_element,
1503               ...)
1504 {
1505   gchar *str;
1506   va_list args;
1507
1508   g_return_val_if_fail (separator != NULL, NULL);
1509
1510   va_start (args, first_element);
1511   str = g_build_pathv (separator, first_element, args);
1512   va_end (args);
1513
1514   return str;
1515 }
1516
1517 /**
1518  * g_build_filename:
1519  * @first_element: the first element in the path
1520  * @Varargs: remaining elements in path, terminated by %NULL
1521  * 
1522  * Creates a filename from a series of elements using the correct
1523  * separator for filenames.
1524  *
1525  * On Unix, this function behaves identically to <literal>g_build_path
1526  * (G_DIR_SEPARATOR_S, first_element, ....)</literal>.
1527  *
1528  * On Windows, it takes into account that either the backslash
1529  * (<literal>\</literal> or slash (<literal>/</literal>) can be used
1530  * as separator in filenames, but otherwise behaves as on Unix. When
1531  * file pathname separators need to be inserted, the one that last
1532  * previously occurred in the parameters (reading from left to right)
1533  * is used.
1534  *
1535  * No attempt is made to force the resulting filename to be an absolute
1536  * path. If the first element is a relative path, the result will
1537  * be a relative path. 
1538  * 
1539  * Return value: a newly-allocated string that must be freed with g_free().
1540  **/
1541 gchar *
1542 g_build_filename (const gchar *first_element, 
1543                   ...)
1544 {
1545 #ifndef G_OS_WIN32
1546   gchar *str;
1547   va_list args;
1548
1549   va_start (args, first_element);
1550   str = g_build_pathv (G_DIR_SEPARATOR_S, first_element, args);
1551   va_end (args);
1552
1553   return str;
1554 #else
1555   /* Code copied from g_build_pathv(), and modifed to use two
1556    * alternative single-character separators.
1557    */
1558   va_list args;
1559   GString *result;
1560   gboolean is_first = TRUE;
1561   gboolean have_leading = FALSE;
1562   const gchar *single_element = NULL;
1563   const gchar *next_element;
1564   const gchar *last_trailing = NULL;
1565   gchar current_separator = '\\';
1566
1567   va_start (args, first_element);
1568
1569   result = g_string_new (NULL);
1570
1571   next_element = first_element;
1572
1573   while (TRUE)
1574     {
1575       const gchar *element;
1576       const gchar *start;
1577       const gchar *end;
1578
1579       if (next_element)
1580         {
1581           element = next_element;
1582           next_element = va_arg (args, gchar *);
1583         }
1584       else
1585         break;
1586
1587       /* Ignore empty elements */
1588       if (!*element)
1589         continue;
1590       
1591       start = element;
1592
1593       if (TRUE)
1594         {
1595           while (start &&
1596                  (*start == '\\' || *start == '/'))
1597             {
1598               current_separator = *start;
1599               start++;
1600             }
1601         }
1602
1603       end = start + strlen (start);
1604       
1605       if (TRUE)
1606         {
1607           while (end >= start + 1 &&
1608                  (end[-1] == '\\' || end[-1] == '/'))
1609             {
1610               current_separator = end[-1];
1611               end--;
1612             }
1613           
1614           last_trailing = end;
1615           while (last_trailing >= element + 1 &&
1616                  (last_trailing[-1] == '\\' || last_trailing[-1] == '/'))
1617             last_trailing--;
1618
1619           if (!have_leading)
1620             {
1621               /* If the leading and trailing separator strings are in the
1622                * same element and overlap, the result is exactly that element
1623                */
1624               if (last_trailing <= start)
1625                 single_element = element;
1626                   
1627               g_string_append_len (result, element, start - element);
1628               have_leading = TRUE;
1629             }
1630           else
1631             single_element = NULL;
1632         }
1633
1634       if (end == start)
1635         continue;
1636
1637       if (!is_first)
1638         g_string_append_len (result, &current_separator, 1);
1639       
1640       g_string_append_len (result, start, end - start);
1641       is_first = FALSE;
1642     }
1643
1644   va_end (args);
1645
1646   if (single_element)
1647     {
1648       g_string_free (result, TRUE);
1649       return g_strdup (single_element);
1650     }
1651   else
1652     {
1653       if (last_trailing)
1654         g_string_append (result, last_trailing);
1655   
1656       return g_string_free (result, FALSE);
1657     }
1658 #endif
1659 }
1660
1661 /**
1662  * g_file_read_link:
1663  * @filename: the symbolic link
1664  * @error: return location for a #GError
1665  *
1666  * Reads the contents of the symbolic link @filename like the POSIX
1667  * readlink() function.  The returned string is in the encoding used
1668  * for filenames. Use g_filename_to_utf8() to convert it to UTF-8.
1669  *
1670  * Returns: A newly allocated string with the contents of the symbolic link, 
1671  *          or %NULL if an error occurred.
1672  *
1673  * Since: 2.4
1674  */
1675 gchar *
1676 g_file_read_link (const gchar *filename,
1677                   GError     **error)
1678 {
1679 #ifdef HAVE_READLINK
1680   gchar *buffer;
1681   guint size;
1682   gint read_size;    
1683   
1684   size = 256; 
1685   buffer = g_malloc (size);
1686   
1687   while (TRUE) 
1688     {
1689       read_size = readlink (filename, buffer, size);
1690       if (read_size < 0) {
1691         int save_errno = errno;
1692         gchar *display_filename = g_filename_display_name (filename);
1693
1694         g_free (buffer);
1695         g_set_error (error,
1696                      G_FILE_ERROR,
1697                      g_file_error_from_errno (save_errno),
1698                      _("Failed to read the symbolic link '%s': %s"),
1699                      display_filename, 
1700                      g_strerror (save_errno));
1701         g_free (display_filename);
1702         
1703         return NULL;
1704       }
1705     
1706       if (read_size < size) 
1707         {
1708           buffer[read_size] = 0;
1709           return buffer;
1710         }
1711       
1712       size *= 2;
1713       buffer = g_realloc (buffer, size);
1714     }
1715 #else
1716   g_set_error (error,
1717                G_FILE_ERROR,
1718                G_FILE_ERROR_INVAL,
1719                _("Symbolic links not supported"));
1720         
1721   return NULL;
1722 #endif
1723 }