Include <io.h> on Windows for prototypes. (#163390, Kazuki Iwamoto)
[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   int attributes;
111
112   if (G_WIN32_HAVE_WIDECHAR_API ())
113     {
114       wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
115
116       if (wfilename == NULL)
117         return FALSE;
118
119       attributes = GetFileAttributesW (wfilename);
120
121       g_free (wfilename);
122     }
123   else
124     {
125       gchar *cpfilename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
126
127       if (cpfilename == NULL)
128         return FALSE;
129       
130       attributes = GetFileAttributesA (cpfilename);
131       
132       g_free (cpfilename);
133     }
134
135   if (attributes == INVALID_FILE_ATTRIBUTES)
136     return FALSE;
137
138   if (test & G_FILE_TEST_EXISTS)
139     return TRUE;
140       
141   if (test & G_FILE_TEST_IS_REGULAR)
142     return (attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0;
143
144   if (test & G_FILE_TEST_IS_DIR)
145     return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
146
147   if (test & G_FILE_TEST_IS_EXECUTABLE)
148     {
149       const gchar *lastdot = strrchr (filename, '.');
150       const gchar *pathext = NULL, *p;
151       int extlen;
152
153       if (lastdot == NULL)
154         return FALSE;
155
156       if (stricmp (lastdot, ".exe") == 0 ||
157           stricmp (lastdot, ".cmd") == 0 ||
158           stricmp (lastdot, ".bat") == 0 ||
159           stricmp (lastdot, ".com") == 0)
160         return TRUE;
161
162       /* Check if it is one of the types listed in %PATHEXT% */
163
164       pathext = g_getenv ("PATHEXT");
165       if (pathext == NULL)
166         return FALSE;
167
168       pathext = g_utf8_casefold (pathext, -1);
169
170       lastdot = g_utf8_casefold (lastdot, -1);
171       extlen = strlen (lastdot);
172
173       p = pathext;
174       while (TRUE)
175         {
176           const gchar *q = strchr (p, ';');
177           if (q == NULL)
178             q = p + strlen (p);
179           if (extlen == q - p &&
180               memcmp (lastdot, p, extlen) == 0)
181             {
182               g_free ((gchar *) pathext);
183               g_free ((gchar *) lastdot);
184               return TRUE;
185             }
186           if (*q)
187             p = q + 1;
188           else
189             break;
190         }
191
192       g_free ((gchar *) pathext);
193       g_free ((gchar *) lastdot);
194       return FALSE;
195     }
196
197   return FALSE;
198 #else
199   if ((test & G_FILE_TEST_EXISTS) && (access (filename, F_OK) == 0))
200     return TRUE;
201   
202   if ((test & G_FILE_TEST_IS_EXECUTABLE) && (access (filename, X_OK) == 0))
203     {
204       if (getuid () != 0)
205         return TRUE;
206
207       /* For root, on some POSIX systems, access (filename, X_OK)
208        * will succeed even if no executable bits are set on the
209        * file. We fall through to a stat test to avoid that.
210        */
211     }
212   else
213     test &= ~G_FILE_TEST_IS_EXECUTABLE;
214
215   if (test & G_FILE_TEST_IS_SYMLINK)
216     {
217       struct stat s;
218
219       if ((lstat (filename, &s) == 0) && S_ISLNK (s.st_mode))
220         return TRUE;
221     }
222   
223   if (test & (G_FILE_TEST_IS_REGULAR |
224               G_FILE_TEST_IS_DIR |
225               G_FILE_TEST_IS_EXECUTABLE))
226     {
227       struct stat s;
228       
229       if (stat (filename, &s) == 0)
230         {
231           if ((test & G_FILE_TEST_IS_REGULAR) && S_ISREG (s.st_mode))
232             return TRUE;
233           
234           if ((test & G_FILE_TEST_IS_DIR) && S_ISDIR (s.st_mode))
235             return TRUE;
236
237           /* The extra test for root when access (file, X_OK) succeeds.
238            */
239           if ((test & G_FILE_TEST_IS_EXECUTABLE) &&
240               ((s.st_mode & S_IXOTH) ||
241                (s.st_mode & S_IXUSR) ||
242                (s.st_mode & S_IXGRP)))
243             return TRUE;
244         }
245     }
246
247   return FALSE;
248 #endif
249 }
250
251 #ifdef G_OS_WIN32
252
253 #undef g_file_test
254
255 /* Binary compatibility version. Not for newly compiled code. */
256
257 gboolean
258 g_file_test (const gchar *filename,
259              GFileTest    test)
260 {
261   gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
262   gboolean retval;
263
264   if (utf8_filename == NULL)
265     return FALSE;
266
267   retval = g_file_test_utf8 (utf8_filename, test);
268
269   g_free (utf8_filename);
270
271   return retval;
272 }
273
274 #endif
275
276 GQuark
277 g_file_error_quark (void)
278 {
279   static GQuark q = 0;
280   if (q == 0)
281     q = g_quark_from_static_string ("g-file-error-quark");
282
283   return q;
284 }
285
286 /**
287  * g_file_error_from_errno:
288  * @err_no: an "errno" value
289  * 
290  * Gets a #GFileError constant based on the passed-in @errno.
291  * For example, if you pass in %EEXIST this function returns
292  * #G_FILE_ERROR_EXIST. Unlike @errno values, you can portably
293  * assume that all #GFileError values will exist.
294  *
295  * Normally a #GFileError value goes into a #GError returned
296  * from a function that manipulates files. So you would use
297  * g_file_error_from_errno() when constructing a #GError.
298  * 
299  * Return value: #GFileError corresponding to the given @errno
300  **/
301 GFileError
302 g_file_error_from_errno (gint err_no)
303 {
304   switch (err_no)
305     {
306 #ifdef EEXIST
307     case EEXIST:
308       return G_FILE_ERROR_EXIST;
309       break;
310 #endif
311
312 #ifdef EISDIR
313     case EISDIR:
314       return G_FILE_ERROR_ISDIR;
315       break;
316 #endif
317
318 #ifdef EACCES
319     case EACCES:
320       return G_FILE_ERROR_ACCES;
321       break;
322 #endif
323
324 #ifdef ENAMETOOLONG
325     case ENAMETOOLONG:
326       return G_FILE_ERROR_NAMETOOLONG;
327       break;
328 #endif
329
330 #ifdef ENOENT
331     case ENOENT:
332       return G_FILE_ERROR_NOENT;
333       break;
334 #endif
335
336 #ifdef ENOTDIR
337     case ENOTDIR:
338       return G_FILE_ERROR_NOTDIR;
339       break;
340 #endif
341
342 #ifdef ENXIO
343     case ENXIO:
344       return G_FILE_ERROR_NXIO;
345       break;
346 #endif
347
348 #ifdef ENODEV
349     case ENODEV:
350       return G_FILE_ERROR_NODEV;
351       break;
352 #endif
353
354 #ifdef EROFS
355     case EROFS:
356       return G_FILE_ERROR_ROFS;
357       break;
358 #endif
359
360 #ifdef ETXTBSY
361     case ETXTBSY:
362       return G_FILE_ERROR_TXTBSY;
363       break;
364 #endif
365
366 #ifdef EFAULT
367     case EFAULT:
368       return G_FILE_ERROR_FAULT;
369       break;
370 #endif
371
372 #ifdef ELOOP
373     case ELOOP:
374       return G_FILE_ERROR_LOOP;
375       break;
376 #endif
377
378 #ifdef ENOSPC
379     case ENOSPC:
380       return G_FILE_ERROR_NOSPC;
381       break;
382 #endif
383
384 #ifdef ENOMEM
385     case ENOMEM:
386       return G_FILE_ERROR_NOMEM;
387       break;
388 #endif
389
390 #ifdef EMFILE
391     case EMFILE:
392       return G_FILE_ERROR_MFILE;
393       break;
394 #endif
395
396 #ifdef ENFILE
397     case ENFILE:
398       return G_FILE_ERROR_NFILE;
399       break;
400 #endif
401
402 #ifdef EBADF
403     case EBADF:
404       return G_FILE_ERROR_BADF;
405       break;
406 #endif
407
408 #ifdef EINVAL
409     case EINVAL:
410       return G_FILE_ERROR_INVAL;
411       break;
412 #endif
413
414 #ifdef EPIPE
415     case EPIPE:
416       return G_FILE_ERROR_PIPE;
417       break;
418 #endif
419
420 #ifdef EAGAIN
421     case EAGAIN:
422       return G_FILE_ERROR_AGAIN;
423       break;
424 #endif
425
426 #ifdef EINTR
427     case EINTR:
428       return G_FILE_ERROR_INTR;
429       break;
430 #endif
431
432 #ifdef EIO
433     case EIO:
434       return G_FILE_ERROR_IO;
435       break;
436 #endif
437
438 #ifdef EPERM
439     case EPERM:
440       return G_FILE_ERROR_PERM;
441       break;
442 #endif
443
444 #ifdef ENOSYS
445     case ENOSYS:
446       return G_FILE_ERROR_NOSYS;
447       break;
448 #endif
449
450     default:
451       return G_FILE_ERROR_FAILED;
452       break;
453     }
454 }
455
456 static gboolean
457 get_contents_stdio (const gchar *display_filename,
458                     FILE        *f,
459                     gchar      **contents,
460                     gsize       *length, 
461                     GError     **error)
462 {
463   gchar buf[2048];
464   size_t bytes;
465   char *str;
466   size_t total_bytes;
467   size_t total_allocated;
468   
469   g_assert (f != NULL);
470
471 #define STARTING_ALLOC 64
472   
473   total_bytes = 0;
474   total_allocated = STARTING_ALLOC;
475   str = g_malloc (STARTING_ALLOC);
476   
477   while (!feof (f))
478     {
479       bytes = fread (buf, 1, 2048, f);
480
481       while ((total_bytes + bytes + 1) > total_allocated)
482         {
483           total_allocated *= 2;
484           str = g_try_realloc (str, total_allocated);
485
486           if (str == NULL)
487             {
488               g_set_error (error,
489                            G_FILE_ERROR,
490                            G_FILE_ERROR_NOMEM,
491                            _("Could not allocate %lu bytes to read file \"%s\""),
492                            (gulong) total_allocated, 
493                            display_filename);
494
495               goto error;
496             }
497         }
498       
499       if (ferror (f))
500         {
501           g_set_error (error,
502                        G_FILE_ERROR,
503                        g_file_error_from_errno (errno),
504                        _("Error reading file '%s': %s"),
505                        display_filename,
506                        g_strerror (errno));
507
508           goto error;
509         }
510
511       memcpy (str + total_bytes, buf, bytes);
512       total_bytes += bytes;
513     }
514
515   fclose (f);
516
517   str[total_bytes] = '\0';
518   
519   if (length)
520     *length = total_bytes;
521   
522   *contents = str;
523   
524   return TRUE;
525
526  error:
527
528   g_free (str);
529   fclose (f);
530   
531   return FALSE;  
532 }
533
534 #ifndef G_OS_WIN32
535
536 static gboolean
537 get_contents_regfile (const gchar *display_filename,
538                       struct stat *stat_buf,
539                       gint         fd,
540                       gchar      **contents,
541                       gsize       *length,
542                       GError     **error)
543 {
544   gchar *buf;
545   size_t bytes_read;
546   size_t size;
547   size_t alloc_size;
548   
549   size = stat_buf->st_size;
550
551   alloc_size = size + 1;
552   buf = g_try_malloc (alloc_size);
553
554   if (buf == NULL)
555     {
556       g_set_error (error,
557                    G_FILE_ERROR,
558                    G_FILE_ERROR_NOMEM,
559                    _("Could not allocate %lu bytes to read file \"%s\""),
560                    (gulong) alloc_size, 
561                    display_filename);
562
563       goto error;
564     }
565   
566   bytes_read = 0;
567   while (bytes_read < size)
568     {
569       gssize rc;
570           
571       rc = read (fd, buf + bytes_read, size - bytes_read);
572
573       if (rc < 0)
574         {
575           if (errno != EINTR) 
576             {
577               g_free (buf);
578               g_set_error (error,
579                            G_FILE_ERROR,
580                            g_file_error_from_errno (errno),
581                            _("Failed to read from file '%s': %s"),
582                            display_filename, 
583                            g_strerror (errno));
584
585               goto error;
586             }
587         }
588       else if (rc == 0)
589         break;
590       else
591         bytes_read += rc;
592     }
593       
594   buf[bytes_read] = '\0';
595
596   if (length)
597     *length = bytes_read;
598   
599   *contents = buf;
600
601   close (fd);
602
603   return TRUE;
604
605  error:
606
607   close (fd);
608   
609   return FALSE;
610 }
611
612 static gboolean
613 get_contents_posix (const gchar *filename,
614                     gchar      **contents,
615                     gsize       *length,
616                     GError     **error)
617 {
618   struct stat stat_buf;
619   gint fd;
620   gchar *display_filename = g_filename_display_name (filename);
621
622   /* O_BINARY useful on Cygwin */
623   fd = open (filename, O_RDONLY|O_BINARY);
624
625   if (fd < 0)
626     {
627       g_set_error (error,
628                    G_FILE_ERROR,
629                    g_file_error_from_errno (errno),
630                    _("Failed to open file '%s': %s"),
631                    display_filename, 
632                    g_strerror (errno));
633       g_free (display_filename);
634
635       return FALSE;
636     }
637
638   /* I don't think this will ever fail, aside from ENOMEM, but. */
639   if (fstat (fd, &stat_buf) < 0)
640     {
641       close (fd);
642       g_set_error (error,
643                    G_FILE_ERROR,
644                    g_file_error_from_errno (errno),
645                    _("Failed to get attributes of file '%s': fstat() failed: %s"),
646                    display_filename, 
647                    g_strerror (errno));
648       g_free (display_filename);
649
650       return FALSE;
651     }
652
653   if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode))
654     {
655       gboolean retval = get_contents_regfile (display_filename,
656                                               &stat_buf,
657                                               fd,
658                                               contents,
659                                               length,
660                                               error);
661       g_free (display_filename);
662
663       return retval;
664     }
665   else
666     {
667       FILE *f;
668       gboolean retval;
669
670       f = fdopen (fd, "r");
671       
672       if (f == NULL)
673         {
674           g_set_error (error,
675                        G_FILE_ERROR,
676                        g_file_error_from_errno (errno),
677                        _("Failed to open file '%s': fdopen() failed: %s"),
678                        display_filename, 
679                        g_strerror (errno));
680           g_free (display_filename);
681
682           return FALSE;
683         }
684   
685       retval = get_contents_stdio (display_filename, f, contents, length, error);
686       g_free (display_filename);
687
688       return retval;
689     }
690 }
691
692 #else  /* G_OS_WIN32 */
693
694 static gboolean
695 get_contents_win32 (const gchar *filename,
696                     gchar      **contents,
697                     gsize       *length,
698                     GError     **error)
699 {
700   FILE *f;
701   gboolean retval;
702   wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
703   gchar *display_filename = g_filename_display_name (filename);
704   
705   f = _wfopen (wfilename, L"rb");
706   g_free (wfilename);
707
708   if (f == NULL)
709     {
710       g_set_error (error,
711                    G_FILE_ERROR,
712                    g_file_error_from_errno (errno),
713                    _("Failed to open file '%s': %s"),
714                    display_filename,
715                    g_strerror (errno));
716       g_free (display_filename);
717
718       return FALSE;
719     }
720   
721   retval = get_contents_stdio (display_filename, f, contents, length, error);
722   g_free (display_filename);
723
724   return retval;
725 }
726
727 #endif
728
729 /**
730  * g_file_get_contents:
731  * @filename: name of a file to read contents from, in the GLib file name encoding
732  * @contents: location to store an allocated string
733  * @length: location to store length in bytes of the contents, or %NULL
734  * @error: return location for a #GError, or %NULL
735  * 
736  * Reads an entire file into allocated memory, with good error
737  * checking. 
738  *
739  * If the call was successful, it returns %TRUE and sets @contents to the file 
740  * contents and @length to the length of the file contents in bytes. The string 
741  * stored in @contents will be nul-terminated, so for text files you can pass 
742  * %NULL for the @length argument. If the call was not successful, it returns 
743  * %FALSE and sets @error. The error domain is #G_FILE_ERROR. Possible error  
744  * codes are those in the #GFileError enumeration. In the error case, 
745  * @contents is set to %NULL and @length is set to zero.
746  *
747  * Return value: %TRUE on success, %FALSE if an error occurred
748  **/
749 gboolean
750 g_file_get_contents (const gchar *filename,
751                      gchar      **contents,
752                      gsize       *length,
753                      GError     **error)
754 {  
755   g_return_val_if_fail (filename != NULL, FALSE);
756   g_return_val_if_fail (contents != NULL, FALSE);
757
758   *contents = NULL;
759   if (length)
760     *length = 0;
761
762 #ifdef G_OS_WIN32
763   return get_contents_win32 (filename, contents, length, error);
764 #else
765   return get_contents_posix (filename, contents, length, error);
766 #endif
767 }
768
769 #ifdef G_OS_WIN32
770
771 #undef g_file_get_contents
772
773 /* Binary compatibility version. Not for newly compiled code. */
774
775 gboolean
776 g_file_get_contents (const gchar *filename,
777                      gchar      **contents,
778                      gsize       *length,
779                      GError     **error)
780 {
781   gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
782   gboolean retval;
783
784   if (utf8_filename == NULL)
785     return FALSE;
786
787   retval = g_file_get_contents (utf8_filename, contents, length, error);
788
789   g_free (utf8_filename);
790
791   return retval;
792 }
793
794 #endif
795
796 /*
797  * mkstemp() implementation is from the GNU C library.
798  * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc.
799  */
800 /**
801  * g_mkstemp:
802  * @tmpl: template filename
803  *
804  * Opens a temporary file. See the mkstemp() documentation
805  * on most UNIX-like systems. This is a portability wrapper, which simply calls 
806  * mkstemp() on systems that have it, and implements 
807  * it in GLib otherwise.
808  *
809  * The parameter is a string that should match the rules for
810  * mkstemp(), i.e. end in "XXXXXX". The X string will 
811  * be modified to form the name of a file that didn't exist.
812  * The string should be in the GLib file name encoding. Most importantly, 
813  * on Windows it should be in UTF-8.
814  *
815  * Return value: A file handle (as from open()) to the file
816  * opened for reading and writing. The file is opened in binary mode
817  * on platforms where there is a difference. The file handle should be
818  * closed with close(). In case of errors, -1 is returned.
819  */
820 gint
821 g_mkstemp (gchar *tmpl)
822 {
823 #ifdef HAVE_MKSTEMP
824   return mkstemp (tmpl);
825 #else
826   int len;
827   char *XXXXXX;
828   int count, fd;
829   static const char letters[] =
830     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
831   static const int NLETTERS = sizeof (letters) - 1;
832   glong value;
833   GTimeVal tv;
834   static int counter = 0;
835
836   len = strlen (tmpl);
837   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
838     return -1;
839
840   /* This is where the Xs start.  */
841   XXXXXX = &tmpl[len - 6];
842
843   /* Get some more or less random data.  */
844   g_get_current_time (&tv);
845   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
846
847   for (count = 0; count < 100; value += 7777, ++count)
848     {
849       glong v = value;
850
851       /* Fill in the random bits.  */
852       XXXXXX[0] = letters[v % NLETTERS];
853       v /= NLETTERS;
854       XXXXXX[1] = letters[v % NLETTERS];
855       v /= NLETTERS;
856       XXXXXX[2] = letters[v % NLETTERS];
857       v /= NLETTERS;
858       XXXXXX[3] = letters[v % NLETTERS];
859       v /= NLETTERS;
860       XXXXXX[4] = letters[v % NLETTERS];
861       v /= NLETTERS;
862       XXXXXX[5] = letters[v % NLETTERS];
863
864       /* tmpl is in UTF-8 on Windows, thus use g_open() */
865       fd = g_open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
866
867       if (fd >= 0)
868         return fd;
869       else if (errno != EEXIST)
870         /* Any other error will apply also to other names we might
871          *  try, and there are 2^32 or so of them, so give up now.
872          */
873         return -1;
874     }
875
876   /* We got out of the loop because we ran out of combinations to try.  */
877   return -1;
878 #endif
879 }
880
881 #ifdef G_OS_WIN32
882
883 #undef g_mkstemp
884
885 /* Binary compatibility version. Not for newly compiled code. */
886
887 gint
888 g_mkstemp (gchar *tmpl)
889 {
890   int len;
891   char *XXXXXX;
892   int count, fd;
893   static const char letters[] =
894     "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
895   static const int NLETTERS = sizeof (letters) - 1;
896   glong value;
897   GTimeVal tv;
898   static int counter = 0;
899
900   len = strlen (tmpl);
901   if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
902     return -1;
903
904   /* This is where the Xs start.  */
905   XXXXXX = &tmpl[len - 6];
906
907   /* Get some more or less random data.  */
908   g_get_current_time (&tv);
909   value = (tv.tv_usec ^ tv.tv_sec) + counter++;
910
911   for (count = 0; count < 100; value += 7777, ++count)
912     {
913       glong v = value;
914
915       /* Fill in the random bits.  */
916       XXXXXX[0] = letters[v % NLETTERS];
917       v /= NLETTERS;
918       XXXXXX[1] = letters[v % NLETTERS];
919       v /= NLETTERS;
920       XXXXXX[2] = letters[v % NLETTERS];
921       v /= NLETTERS;
922       XXXXXX[3] = letters[v % NLETTERS];
923       v /= NLETTERS;
924       XXXXXX[4] = letters[v % NLETTERS];
925       v /= NLETTERS;
926       XXXXXX[5] = letters[v % NLETTERS];
927
928       /* This is the backward compatibility system codepage version,
929        * thus use normal open().
930        */
931       fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
932
933       if (fd >= 0)
934         return fd;
935       else if (errno != EEXIST)
936         /* Any other error will apply also to other names we might
937          *  try, and there are 2^32 or so of them, so give up now.
938          */
939         return -1;
940     }
941
942   /* We got out of the loop because we ran out of combinations to try.  */
943   return -1;
944 }
945
946 #endif
947
948 /**
949  * g_file_open_tmp:
950  * @tmpl: Template for file name, as in g_mkstemp(), basename only
951  * @name_used: location to store actual name used
952  * @error: return location for a #GError
953  *
954  * Opens a file for writing in the preferred directory for temporary
955  * files (as returned by g_get_tmp_dir()). 
956  *
957  * @tmpl should be a string in the GLib file name encoding ending with
958  * six 'X' characters, as the parameter to g_mkstemp() (or mkstemp()).
959  * However, unlike these functions, the template should only be a
960  * basename, no directory components are allowed. If template is
961  * %NULL, a default template is used.
962  *
963  * Note that in contrast to g_mkstemp() (and mkstemp()) 
964  * @tmpl is not modified, and might thus be a read-only literal string.
965  *
966  * The actual name used is returned in @name_used if non-%NULL. This
967  * string should be freed with g_free() when not needed any longer.
968  * The returned name is in the GLib file name encoding.
969  *
970  * Return value: A file handle (as from open()) to 
971  * the file opened for reading and writing. The file is opened in binary 
972  * mode on platforms where there is a difference. The file handle should be
973  * closed with close(). In case of errors, -1 is returned 
974  * and @error will be set.
975  **/
976 gint
977 g_file_open_tmp (const gchar *tmpl,
978                  gchar      **name_used,
979                  GError     **error)
980 {
981   int retval;
982   const char *tmpdir;
983   char *sep;
984   char *fulltemplate;
985   const char *slash;
986
987   if (tmpl == NULL)
988     tmpl = ".XXXXXX";
989
990   if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL
991 #ifdef G_OS_WIN32
992       || (strchr (tmpl, '/') != NULL && (slash = "/"))
993 #endif
994       )
995     {
996       gchar *display_tmpl = g_filename_display_name (tmpl);
997       char c[2];
998       c[0] = *slash;
999       c[1] = '\0';
1000
1001       g_set_error (error,
1002                    G_FILE_ERROR,
1003                    G_FILE_ERROR_FAILED,
1004                    _("Template '%s' invalid, should not contain a '%s'"),
1005                    display_tmpl, c);
1006       g_free (display_tmpl);
1007
1008       return -1;
1009     }
1010   
1011   if (strlen (tmpl) < 6 ||
1012       strcmp (tmpl + strlen (tmpl) - 6, "XXXXXX") != 0)
1013     {
1014       gchar *display_tmpl = g_filename_display_name (tmpl);
1015       g_set_error (error,
1016                    G_FILE_ERROR,
1017                    G_FILE_ERROR_FAILED,
1018                    _("Template '%s' doesn't end with XXXXXX"),
1019                    display_tmpl);
1020       g_free (display_tmpl);
1021       return -1;
1022     }
1023
1024   tmpdir = g_get_tmp_dir ();
1025
1026   if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1]))
1027     sep = "";
1028   else
1029     sep = G_DIR_SEPARATOR_S;
1030
1031   fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL);
1032
1033   retval = g_mkstemp (fulltemplate);
1034
1035   if (retval == -1)
1036     {
1037       gchar *display_fulltemplate = g_filename_display_name (fulltemplate);
1038       g_set_error (error,
1039                    G_FILE_ERROR,
1040                    g_file_error_from_errno (errno),
1041                    _("Failed to create file '%s': %s"),
1042                    display_fulltemplate, g_strerror (errno));
1043       g_free (display_fulltemplate);
1044       g_free (fulltemplate);
1045       return -1;
1046     }
1047
1048   if (name_used)
1049     *name_used = fulltemplate;
1050   else
1051     g_free (fulltemplate);
1052
1053   return retval;
1054 }
1055
1056 #ifdef G_OS_WIN32
1057
1058 #undef g_file_open_tmp
1059
1060 /* Binary compatibility version. Not for newly compiled code. */
1061
1062 gint
1063 g_file_open_tmp (const gchar *tmpl,
1064                  gchar      **name_used,
1065                  GError     **error)
1066 {
1067   gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error);
1068   gchar *utf8_name_used;
1069   gint retval;
1070
1071   if (utf8_tmpl == NULL)
1072     return -1;
1073
1074   retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error);
1075   
1076   if (retval == -1)
1077     return -1;
1078
1079   if (name_used)
1080     *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL);
1081
1082   g_free (utf8_name_used);
1083
1084   return retval;
1085 }
1086
1087 #endif
1088
1089 static gchar *
1090 g_build_pathv (const gchar *separator,
1091                const gchar *first_element,
1092                va_list      args)
1093 {
1094   GString *result;
1095   gint separator_len = strlen (separator);
1096   gboolean is_first = TRUE;
1097   gboolean have_leading = FALSE;
1098   const gchar *single_element = NULL;
1099   const gchar *next_element;
1100   const gchar *last_trailing = NULL;
1101
1102   result = g_string_new (NULL);
1103
1104   next_element = first_element;
1105
1106   while (TRUE)
1107     {
1108       const gchar *element;
1109       const gchar *start;
1110       const gchar *end;
1111
1112       if (next_element)
1113         {
1114           element = next_element;
1115           next_element = va_arg (args, gchar *);
1116         }
1117       else
1118         break;
1119
1120       /* Ignore empty elements */
1121       if (!*element)
1122         continue;
1123       
1124       start = element;
1125
1126       if (separator_len)
1127         {
1128           while (start &&
1129                  strncmp (start, separator, separator_len) == 0)
1130             start += separator_len;
1131         }
1132
1133       end = start + strlen (start);
1134       
1135       if (separator_len)
1136         {
1137           while (end >= start + separator_len &&
1138                  strncmp (end - separator_len, separator, separator_len) == 0)
1139             end -= separator_len;
1140           
1141           last_trailing = end;
1142           while (last_trailing >= element + separator_len &&
1143                  strncmp (last_trailing - separator_len, separator, separator_len) == 0)
1144             last_trailing -= separator_len;
1145
1146           if (!have_leading)
1147             {
1148               /* If the leading and trailing separator strings are in the
1149                * same element and overlap, the result is exactly that element
1150                */
1151               if (last_trailing <= start)
1152                 single_element = element;
1153                   
1154               g_string_append_len (result, element, start - element);
1155               have_leading = TRUE;
1156             }
1157           else
1158             single_element = NULL;
1159         }
1160
1161       if (end == start)
1162         continue;
1163
1164       if (!is_first)
1165         g_string_append (result, separator);
1166       
1167       g_string_append_len (result, start, end - start);
1168       is_first = FALSE;
1169     }
1170
1171   if (single_element)
1172     {
1173       g_string_free (result, TRUE);
1174       return g_strdup (single_element);
1175     }
1176   else
1177     {
1178       if (last_trailing)
1179         g_string_append (result, last_trailing);
1180   
1181       return g_string_free (result, FALSE);
1182     }
1183 }
1184
1185 /**
1186  * g_build_path:
1187  * @separator: a string used to separator the elements of the path.
1188  * @first_element: the first element in the path
1189  * @Varargs: remaining elements in path, terminated by %NULL
1190  * 
1191  * Creates a path from a series of elements using @separator as the
1192  * separator between elements. At the boundary between two elements,
1193  * any trailing occurrences of separator in the first element, or
1194  * leading occurrences of separator in the second element are removed
1195  * and exactly one copy of the separator is inserted.
1196  *
1197  * Empty elements are ignored.
1198  *
1199  * The number of leading copies of the separator on the result is
1200  * the same as the number of leading copies of the separator on
1201  * the first non-empty element.
1202  *
1203  * The number of trailing copies of the separator on the result is
1204  * the same as the number of trailing copies of the separator on
1205  * the last non-empty element. (Determination of the number of
1206  * trailing copies is done without stripping leading copies, so
1207  * if the separator is <literal>ABA</literal>, <literal>ABABA</literal>
1208  * has 1 trailing copy.)
1209  *
1210  * However, if there is only a single non-empty element, and there
1211  * are no characters in that element not part of the leading or
1212  * trailing separators, then the result is exactly the original value
1213  * of that element.
1214  *
1215  * Other than for determination of the number of leading and trailing
1216  * copies of the separator, elements consisting only of copies
1217  * of the separator are ignored.
1218  * 
1219  * Return value: a newly-allocated string that must be freed with g_free().
1220  **/
1221 gchar *
1222 g_build_path (const gchar *separator,
1223               const gchar *first_element,
1224               ...)
1225 {
1226   gchar *str;
1227   va_list args;
1228
1229   g_return_val_if_fail (separator != NULL, NULL);
1230
1231   va_start (args, first_element);
1232   str = g_build_pathv (separator, first_element, args);
1233   va_end (args);
1234
1235   return str;
1236 }
1237
1238 /**
1239  * g_build_filename:
1240  * @first_element: the first element in the path
1241  * @Varargs: remaining elements in path, terminated by %NULL
1242  * 
1243  * Creates a filename from a series of elements using the correct
1244  * separator for filenames.
1245  *
1246  * On Unix, this function behaves identically to <literal>g_build_path
1247  * (G_DIR_SEPARATOR_S, first_element, ....)</literal>.
1248  *
1249  * On Windows, it takes into account that either the backslash
1250  * (<literal>\</literal> or slash (<literal>/</literal>) can be used
1251  * as separator in filenames, but otherwise behaves as on Unix. When
1252  * file pathname separators need to be inserted, the one that last
1253  * previously occurred in the parameters (reading from left to right)
1254  * is used.
1255  *
1256  * No attempt is made to force the resulting filename to be an absolute
1257  * path. If the first element is a relative path, the result will
1258  * be a relative path. 
1259  * 
1260  * Return value: a newly-allocated string that must be freed with g_free().
1261  **/
1262 gchar *
1263 g_build_filename (const gchar *first_element, 
1264                   ...)
1265 {
1266 #ifndef G_OS_WIN32
1267   gchar *str;
1268   va_list args;
1269
1270   va_start (args, first_element);
1271   str = g_build_pathv (G_DIR_SEPARATOR_S, first_element, args);
1272   va_end (args);
1273
1274   return str;
1275 #else
1276   /* Code copied from g_build_pathv(), and modifed to use two
1277    * alternative single-character separators.
1278    */
1279   va_list args;
1280   GString *result;
1281   gboolean is_first = TRUE;
1282   gboolean have_leading = FALSE;
1283   const gchar *single_element = NULL;
1284   const gchar *next_element;
1285   const gchar *last_trailing = NULL;
1286   gchar current_separator = '\\';
1287
1288   va_start (args, first_element);
1289
1290   result = g_string_new (NULL);
1291
1292   next_element = first_element;
1293
1294   while (TRUE)
1295     {
1296       const gchar *element;
1297       const gchar *start;
1298       const gchar *end;
1299
1300       if (next_element)
1301         {
1302           element = next_element;
1303           next_element = va_arg (args, gchar *);
1304         }
1305       else
1306         break;
1307
1308       /* Ignore empty elements */
1309       if (!*element)
1310         continue;
1311       
1312       start = element;
1313
1314       if (TRUE)
1315         {
1316           while (start &&
1317                  (*start == '\\' || *start == '/'))
1318             {
1319               current_separator = *start;
1320               start++;
1321             }
1322         }
1323
1324       end = start + strlen (start);
1325       
1326       if (TRUE)
1327         {
1328           while (end >= start + 1 &&
1329                  (end[-1] == '\\' || end[-1] == '/'))
1330             {
1331               current_separator = end[-1];
1332               end--;
1333             }
1334           
1335           last_trailing = end;
1336           while (last_trailing >= element + 1 &&
1337                  (last_trailing[-1] == '\\' || last_trailing[-1] == '/'))
1338             last_trailing--;
1339
1340           if (!have_leading)
1341             {
1342               /* If the leading and trailing separator strings are in the
1343                * same element and overlap, the result is exactly that element
1344                */
1345               if (last_trailing <= start)
1346                 single_element = element;
1347                   
1348               g_string_append_len (result, element, start - element);
1349               have_leading = TRUE;
1350             }
1351           else
1352             single_element = NULL;
1353         }
1354
1355       if (end == start)
1356         continue;
1357
1358       if (!is_first)
1359         g_string_append_len (result, &current_separator, 1);
1360       
1361       g_string_append_len (result, start, end - start);
1362       is_first = FALSE;
1363     }
1364
1365   va_end (args);
1366
1367   if (single_element)
1368     {
1369       g_string_free (result, TRUE);
1370       return g_strdup (single_element);
1371     }
1372   else
1373     {
1374       if (last_trailing)
1375         g_string_append (result, last_trailing);
1376   
1377       return g_string_free (result, FALSE);
1378     }
1379 #endif
1380 }
1381
1382 /**
1383  * g_file_read_link:
1384  * @filename: the symbolic link
1385  * @error: return location for a #GError
1386  *
1387  * Reads the contents of the symbolic link @filename like the POSIX
1388  * readlink() function.  The returned string is in the encoding used
1389  * for filenames. Use g_filename_to_utf8() to convert it to UTF-8.
1390  *
1391  * Returns: A newly allocated string with the contents of the symbolic link, 
1392  *          or %NULL if an error occurred.
1393  *
1394  * Since: 2.4
1395  */
1396 gchar *
1397 g_file_read_link (const gchar *filename,
1398                   GError     **error)
1399 {
1400 #ifdef HAVE_READLINK
1401   gchar *buffer;
1402   guint size;
1403   gint read_size;    
1404   
1405   size = 256; 
1406   buffer = g_malloc (size);
1407   
1408   while (TRUE) 
1409     {
1410       read_size = readlink (filename, buffer, size);
1411       if (read_size < 0) {
1412         gchar *display_filename = g_filename_display_name (filename);
1413         g_free (buffer);
1414         g_set_error (error,
1415                      G_FILE_ERROR,
1416                      g_file_error_from_errno (errno),
1417                      _("Failed to read the symbolic link '%s': %s"),
1418                      display_filename, 
1419                      g_strerror (errno));
1420         g_free (display_filename);
1421         
1422         return NULL;
1423       }
1424     
1425       if (read_size < size) 
1426         {
1427           buffer[read_size] = 0;
1428           return buffer;
1429         }
1430       
1431       size *= 2;
1432       buffer = g_realloc (buffer, size);
1433     }
1434 #else
1435   g_set_error (error,
1436                G_FILE_ERROR,
1437                G_FILE_ERROR_INVAL,
1438                _("Symbolic links not supported"));
1439         
1440   return NULL;
1441 #endif
1442 }