Use g_fopen(). (#168341, Daniel Atallah)
[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  * mkstemp() implementation is from the GNU C library.
816  * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
817  */
818 /**
819  * g_mkstemp:
820  * @tmpl: template filename
821  *
822  * Opens a temporary file. See the mkstemp() documentation
823  * on most UNIX-like systems. This is a portability wrapper, which simply calls 
824  * mkstemp() on systems that have it, and implements 
825  * it in GLib otherwise.
826  *
827  * The parameter is a string that should match the rules for
828  * mkstemp(), i.e. end in "XXXXXX". The X string will 
829  * be modified to form the name of a file that didn't exist.
830  * The string should be in the GLib file name encoding. Most importantly, 
831  * on Windows it should be in UTF-8.
832  *
833  * Return value: A file handle (as from open()) to the file
834  * opened for reading and writing. The file is opened in binary mode
835  * on platforms where there is a difference. The file handle should be
836  * closed with close(). In case of errors, -1 is returned.
837  */
838 gint
839 g_mkstemp (gchar *tmpl)
840 {
841 #ifdef HAVE_MKSTEMP
842   return mkstemp (tmpl);
843 #else
844   int len;
845   char *XXXXXX;
846   int count, fd;
847   static const char letters[] =
848     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
849   static const int NLETTERS = sizeof (letters) - 1;
850   glong value;
851   GTimeVal tv;
852   static int counter = 0;
853
854   len = strlen (tmpl);
855   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
856     {
857       errno = EINVAL;
858       return -1;
859     }
860
861   /* This is where the Xs start.  */
862   XXXXXX = &tmpl[len - 6];
863
864   /* Get some more or less random data.  */
865   g_get_current_time (&tv);
866   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
867
868   for (count = 0; count < 100; value += 7777, ++count)
869     {
870       glong v = value;
871
872       /* Fill in the random bits.  */
873       XXXXXX[0] = letters[v % NLETTERS];
874       v /= NLETTERS;
875       XXXXXX[1] = letters[v % NLETTERS];
876       v /= NLETTERS;
877       XXXXXX[2] = letters[v % NLETTERS];
878       v /= NLETTERS;
879       XXXXXX[3] = letters[v % NLETTERS];
880       v /= NLETTERS;
881       XXXXXX[4] = letters[v % NLETTERS];
882       v /= NLETTERS;
883       XXXXXX[5] = letters[v % NLETTERS];
884
885       /* tmpl is in UTF-8 on Windows, thus use g_open() */
886       fd = g_open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
887
888       if (fd >= 0)
889         return fd;
890       else if (errno != EEXIST)
891         /* Any other error will apply also to other names we might
892          *  try, and there are 2^32 or so of them, so give up now.
893          */
894         return -1;
895     }
896
897   /* We got out of the loop because we ran out of combinations to try.  */
898   errno = EEXIST;
899   return -1;
900 #endif
901 }
902
903 #ifdef G_OS_WIN32
904
905 #undef g_mkstemp
906
907 /* Binary compatibility version. Not for newly compiled code. */
908
909 gint
910 g_mkstemp (gchar *tmpl)
911 {
912   int len;
913   char *XXXXXX;
914   int count, fd;
915   static const char letters[] =
916     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
917   static const int NLETTERS = sizeof (letters) - 1;
918   glong value;
919   GTimeVal tv;
920   static int counter = 0;
921
922   len = strlen (tmpl);
923   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
924     {
925       errno = EINVAL;
926       return -1;
927     }
928
929   /* This is where the Xs start.  */
930   XXXXXX = &tmpl[len - 6];
931
932   /* Get some more or less random data.  */
933   g_get_current_time (&tv);
934   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
935
936   for (count = 0; count < 100; value += 7777, ++count)
937     {
938       glong v = value;
939
940       /* Fill in the random bits.  */
941       XXXXXX[0] = letters[v % NLETTERS];
942       v /= NLETTERS;
943       XXXXXX[1] = letters[v % NLETTERS];
944       v /= NLETTERS;
945       XXXXXX[2] = letters[v % NLETTERS];
946       v /= NLETTERS;
947       XXXXXX[3] = letters[v % NLETTERS];
948       v /= NLETTERS;
949       XXXXXX[4] = letters[v % NLETTERS];
950       v /= NLETTERS;
951       XXXXXX[5] = letters[v % NLETTERS];
952
953       /* This is the backward compatibility system codepage version,
954        * thus use normal open().
955        */
956       fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
957
958       if (fd >= 0)
959         return fd;
960       else if (errno != EEXIST)
961         /* Any other error will apply also to other names we might
962          *  try, and there are 2^32 or so of them, so give up now.
963          */
964         return -1;
965     }
966
967   /* We got out of the loop because we ran out of combinations to try.  */
968   errno = EEXIST;
969   return -1;
970 }
971
972 #endif
973
974 /**
975  * g_file_open_tmp:
976  * @tmpl: Template for file name, as in g_mkstemp(), basename only
977  * @name_used: location to store actual name used
978  * @error: return location for a #GError
979  *
980  * Opens a file for writing in the preferred directory for temporary
981  * files (as returned by g_get_tmp_dir()). 
982  *
983  * @tmpl should be a string in the GLib file name encoding ending with
984  * six 'X' characters, as the parameter to g_mkstemp() (or mkstemp()).
985  * However, unlike these functions, the template should only be a
986  * basename, no directory components are allowed. If template is
987  * %NULL, a default template is used.
988  *
989  * Note that in contrast to g_mkstemp() (and mkstemp()) 
990  * @tmpl is not modified, and might thus be a read-only literal string.
991  *
992  * The actual name used is returned in @name_used if non-%NULL. This
993  * string should be freed with g_free() when not needed any longer.
994  * The returned name is in the GLib file name encoding.
995  *
996  * Return value: A file handle (as from open()) to 
997  * the file opened for reading and writing. The file is opened in binary 
998  * mode on platforms where there is a difference. The file handle should be
999  * closed with close(). In case of errors, -1 is returned 
1000  * and @error will be set.
1001  **/
1002 gint
1003 g_file_open_tmp (const gchar *tmpl,
1004                  gchar      **name_used,
1005                  GError     **error)
1006 {
1007   int retval;
1008   const char *tmpdir;
1009   char *sep;
1010   char *fulltemplate;
1011   const char *slash;
1012
1013   if (tmpl == NULL)
1014     tmpl = ".XXXXXX";
1015
1016   if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL
1017 #ifdef G_OS_WIN32
1018       || (strchr (tmpl, '/') != NULL && (slash = "/"))
1019 #endif
1020       )
1021     {
1022       gchar *display_tmpl = g_filename_display_name (tmpl);
1023       char c[2];
1024       c[0] = *slash;
1025       c[1] = '\0';
1026
1027       g_set_error (error,
1028                    G_FILE_ERROR,
1029                    G_FILE_ERROR_FAILED,
1030                    _("Template '%s' invalid, should not contain a '%s'"),
1031                    display_tmpl, c);
1032       g_free (display_tmpl);
1033
1034       return -1;
1035     }
1036   
1037   if (strlen (tmpl) < 6 ||
1038       strcmp (tmpl + strlen (tmpl) - 6, "XXXXXX") != 0)
1039     {
1040       gchar *display_tmpl = g_filename_display_name (tmpl);
1041       g_set_error (error,
1042                    G_FILE_ERROR,
1043                    G_FILE_ERROR_FAILED,
1044                    _("Template '%s' doesn't end with XXXXXX"),
1045                    display_tmpl);
1046       g_free (display_tmpl);
1047       return -1;
1048     }
1049
1050   tmpdir = g_get_tmp_dir ();
1051
1052   if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1]))
1053     sep = "";
1054   else
1055     sep = G_DIR_SEPARATOR_S;
1056
1057   fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL);
1058
1059   retval = g_mkstemp (fulltemplate);
1060
1061   if (retval == -1)
1062     {
1063       int save_errno = errno;
1064       gchar *display_fulltemplate = g_filename_display_name (fulltemplate);
1065
1066       g_set_error (error,
1067                    G_FILE_ERROR,
1068                    g_file_error_from_errno (save_errno),
1069                    _("Failed to create file '%s': %s"),
1070                    display_fulltemplate, g_strerror (save_errno));
1071       g_free (display_fulltemplate);
1072       g_free (fulltemplate);
1073       return -1;
1074     }
1075
1076   if (name_used)
1077     *name_used = fulltemplate;
1078   else
1079     g_free (fulltemplate);
1080
1081   return retval;
1082 }
1083
1084 #ifdef G_OS_WIN32
1085
1086 #undef g_file_open_tmp
1087
1088 /* Binary compatibility version. Not for newly compiled code. */
1089
1090 gint
1091 g_file_open_tmp (const gchar *tmpl,
1092                  gchar      **name_used,
1093                  GError     **error)
1094 {
1095   gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
1096   gchar *utf8_name_used;
1097   gint retval;
1098
1099   if (utf8_tmpl == NULL)
1100     return -1;
1101
1102   retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
1103   
1104   if (retval == -1)
1105     return -1;
1106
1107   if (name_used)
1108     *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
1109
1110   g_free (utf8_name_used);
1111
1112   return retval;
1113 }
1114
1115 #endif
1116
1117 static gchar *
1118 g_build_pathv (const gchar *separator,
1119                const gchar *first_element,
1120                va_list      args)
1121 {
1122   GString *result;
1123   gint separator_len = strlen (separator);
1124   gboolean is_first = TRUE;
1125   gboolean have_leading = FALSE;
1126   const gchar *single_element = NULL;
1127   const gchar *next_element;
1128   const gchar *last_trailing = NULL;
1129
1130   result = g_string_new (NULL);
1131
1132   next_element = first_element;
1133
1134   while (TRUE)
1135     {
1136       const gchar *element;
1137       const gchar *start;
1138       const gchar *end;
1139
1140       if (next_element)
1141         {
1142           element = next_element;
1143           next_element = va_arg (args, gchar *);
1144         }
1145       else
1146         break;
1147
1148       /* Ignore empty elements */
1149       if (!*element)
1150         continue;
1151       
1152       start = element;
1153
1154       if (separator_len)
1155         {
1156           while (start &&
1157                  strncmp (start, separator, separator_len) == 0)
1158             start += separator_len;
1159         }
1160
1161       end = start + strlen (start);
1162       
1163       if (separator_len)
1164         {
1165           while (end >= start + separator_len &&
1166                  strncmp (end - separator_len, separator, separator_len) == 0)
1167             end -= separator_len;
1168           
1169           last_trailing = end;
1170           while (last_trailing >= element + separator_len &&
1171                  strncmp (last_trailing - separator_len, separator, separator_len) == 0)
1172             last_trailing -= separator_len;
1173
1174           if (!have_leading)
1175             {
1176               /* If the leading and trailing separator strings are in the
1177                * same element and overlap, the result is exactly that element
1178                */
1179               if (last_trailing <= start)
1180                 single_element = element;
1181                   
1182               g_string_append_len (result, element, start - element);
1183               have_leading = TRUE;
1184             }
1185           else
1186             single_element = NULL;
1187         }
1188
1189       if (end == start)
1190         continue;
1191
1192       if (!is_first)
1193         g_string_append (result, separator);
1194       
1195       g_string_append_len (result, start, end - start);
1196       is_first = FALSE;
1197     }
1198
1199   if (single_element)
1200     {
1201       g_string_free (result, TRUE);
1202       return g_strdup (single_element);
1203     }
1204   else
1205     {
1206       if (last_trailing)
1207         g_string_append (result, last_trailing);
1208   
1209       return g_string_free (result, FALSE);
1210     }
1211 }
1212
1213 /**
1214  * g_build_path:
1215  * @separator: a string used to separator the elements of the path.
1216  * @first_element: the first element in the path
1217  * @Varargs: remaining elements in path, terminated by %NULL
1218  * 
1219  * Creates a path from a series of elements using @separator as the
1220  * separator between elements. At the boundary between two elements,
1221  * any trailing occurrences of separator in the first element, or
1222  * leading occurrences of separator in the second element are removed
1223  * and exactly one copy of the separator is inserted.
1224  *
1225  * Empty elements are ignored.
1226  *
1227  * The number of leading copies of the separator on the result is
1228  * the same as the number of leading copies of the separator on
1229  * the first non-empty element.
1230  *
1231  * The number of trailing copies of the separator on the result is
1232  * the same as the number of trailing copies of the separator on
1233  * the last non-empty element. (Determination of the number of
1234  * trailing copies is done without stripping leading copies, so
1235  * if the separator is <literal>ABA</literal>, <literal>ABABA</literal>
1236  * has 1 trailing copy.)
1237  *
1238  * However, if there is only a single non-empty element, and there
1239  * are no characters in that element not part of the leading or
1240  * trailing separators, then the result is exactly the original value
1241  * of that element.
1242  *
1243  * Other than for determination of the number of leading and trailing
1244  * copies of the separator, elements consisting only of copies
1245  * of the separator are ignored.
1246  * 
1247  * Return value: a newly-allocated string that must be freed with g_free().
1248  **/
1249 gchar *
1250 g_build_path (const gchar *separator,
1251               const gchar *first_element,
1252               ...)
1253 {
1254   gchar *str;
1255   va_list args;
1256
1257   g_return_val_if_fail (separator != NULL, NULL);
1258
1259   va_start (args, first_element);
1260   str = g_build_pathv (separator, first_element, args);
1261   va_end (args);
1262
1263   return str;
1264 }
1265
1266 /**
1267  * g_build_filename:
1268  * @first_element: the first element in the path
1269  * @Varargs: remaining elements in path, terminated by %NULL
1270  * 
1271  * Creates a filename from a series of elements using the correct
1272  * separator for filenames.
1273  *
1274  * On Unix, this function behaves identically to <literal>g_build_path
1275  * (G_DIR_SEPARATOR_S, first_element, ....)</literal>.
1276  *
1277  * On Windows, it takes into account that either the backslash
1278  * (<literal>\</literal> or slash (<literal>/</literal>) can be used
1279  * as separator in filenames, but otherwise behaves as on Unix. When
1280  * file pathname separators need to be inserted, the one that last
1281  * previously occurred in the parameters (reading from left to right)
1282  * is used.
1283  *
1284  * No attempt is made to force the resulting filename to be an absolute
1285  * path. If the first element is a relative path, the result will
1286  * be a relative path. 
1287  * 
1288  * Return value: a newly-allocated string that must be freed with g_free().
1289  **/
1290 gchar *
1291 g_build_filename (const gchar *first_element, 
1292                   ...)
1293 {
1294 #ifndef G_OS_WIN32
1295   gchar *str;
1296   va_list args;
1297
1298   va_start (args, first_element);
1299   str = g_build_pathv (G_DIR_SEPARATOR_S, first_element, args);
1300   va_end (args);
1301
1302   return str;
1303 #else
1304   /* Code copied from g_build_pathv(), and modifed to use two
1305    * alternative single-character separators.
1306    */
1307   va_list args;
1308   GString *result;
1309   gboolean is_first = TRUE;
1310   gboolean have_leading = FALSE;
1311   const gchar *single_element = NULL;
1312   const gchar *next_element;
1313   const gchar *last_trailing = NULL;
1314   gchar current_separator = '\\';
1315
1316   va_start (args, first_element);
1317
1318   result = g_string_new (NULL);
1319
1320   next_element = first_element;
1321
1322   while (TRUE)
1323     {
1324       const gchar *element;
1325       const gchar *start;
1326       const gchar *end;
1327
1328       if (next_element)
1329         {
1330           element = next_element;
1331           next_element = va_arg (args, gchar *);
1332         }
1333       else
1334         break;
1335
1336       /* Ignore empty elements */
1337       if (!*element)
1338         continue;
1339       
1340       start = element;
1341
1342       if (TRUE)
1343         {
1344           while (start &&
1345                  (*start == '\\' || *start == '/'))
1346             {
1347               current_separator = *start;
1348               start++;
1349             }
1350         }
1351
1352       end = start + strlen (start);
1353       
1354       if (TRUE)
1355         {
1356           while (end >= start + 1 &&
1357                  (end[-1] == '\\' || end[-1] == '/'))
1358             {
1359               current_separator = end[-1];
1360               end--;
1361             }
1362           
1363           last_trailing = end;
1364           while (last_trailing >= element + 1 &&
1365                  (last_trailing[-1] == '\\' || last_trailing[-1] == '/'))
1366             last_trailing--;
1367
1368           if (!have_leading)
1369             {
1370               /* If the leading and trailing separator strings are in the
1371                * same element and overlap, the result is exactly that element
1372                */
1373               if (last_trailing <= start)
1374                 single_element = element;
1375                   
1376               g_string_append_len (result, element, start - element);
1377               have_leading = TRUE;
1378             }
1379           else
1380             single_element = NULL;
1381         }
1382
1383       if (end == start)
1384         continue;
1385
1386       if (!is_first)
1387         g_string_append_len (result, &current_separator, 1);
1388       
1389       g_string_append_len (result, start, end - start);
1390       is_first = FALSE;
1391     }
1392
1393   va_end (args);
1394
1395   if (single_element)
1396     {
1397       g_string_free (result, TRUE);
1398       return g_strdup (single_element);
1399     }
1400   else
1401     {
1402       if (last_trailing)
1403         g_string_append (result, last_trailing);
1404   
1405       return g_string_free (result, FALSE);
1406     }
1407 #endif
1408 }
1409
1410 /**
1411  * g_file_read_link:
1412  * @filename: the symbolic link
1413  * @error: return location for a #GError
1414  *
1415  * Reads the contents of the symbolic link @filename like the POSIX
1416  * readlink() function.  The returned string is in the encoding used
1417  * for filenames. Use g_filename_to_utf8() to convert it to UTF-8.
1418  *
1419  * Returns: A newly allocated string with the contents of the symbolic link, 
1420  *          or %NULL if an error occurred.
1421  *
1422  * Since: 2.4
1423  */
1424 gchar *
1425 g_file_read_link (const gchar *filename,
1426                   GError     **error)
1427 {
1428 #ifdef HAVE_READLINK
1429   gchar *buffer;
1430   guint size;
1431   gint read_size;    
1432   
1433   size = 256; 
1434   buffer = g_malloc (size);
1435   
1436   while (TRUE) 
1437     {
1438       read_size = readlink (filename, buffer, size);
1439       if (read_size < 0) {
1440         int save_errno = errno;
1441         gchar *display_filename = g_filename_display_name (filename);
1442
1443         g_free (buffer);
1444         g_set_error (error,
1445                      G_FILE_ERROR,
1446                      g_file_error_from_errno (save_errno),
1447                      _("Failed to read the symbolic link '%s': %s"),
1448                      display_filename, 
1449                      g_strerror (save_errno));
1450         g_free (display_filename);
1451         
1452         return NULL;
1453       }
1454     
1455       if (read_size < size) 
1456         {
1457           buffer[read_size] = 0;
1458           return buffer;
1459         }
1460       
1461       size *= 2;
1462       buffer = g_realloc (buffer, size);
1463     }
1464 #else
1465   g_set_error (error,
1466                G_FILE_ERROR,
1467                G_FILE_ERROR_INVAL,
1468                _("Symbolic links not supported"));
1469         
1470   return NULL;
1471 #endif
1472 }