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