2 * File utility functions.
5 * Gonzalo Paniagua Javier (gonzalo@novell.com)
7 * (C) 2006 Novell, Inc.
9 * Permission is hereby granted, free of charge, to any person obtaining
10 * a copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sublicense, and/or sell copies of the Software, and to
14 * permit persons to whom the Software is furnished to do so, subject to
15 * the following conditions:
17 * The above copyright notice and this permission notice shall be
18 * included in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
39 static gpointer error_quark
= (gpointer
)"FileError";
42 g_file_error_quark (void)
48 g_file_error_from_errno (gint err_no
)
52 return G_FILE_ERROR_EXIST
;
54 return G_FILE_ERROR_ISDIR
;
56 return G_FILE_ERROR_ACCES
;
58 return G_FILE_ERROR_NAMETOOLONG
;
60 return G_FILE_ERROR_NOENT
;
62 return G_FILE_ERROR_NOTDIR
;
64 return G_FILE_ERROR_NXIO
;
66 return G_FILE_ERROR_NODEV
;
68 return G_FILE_ERROR_ROFS
;
71 return G_FILE_ERROR_TXTBSY
;
74 return G_FILE_ERROR_FAULT
;
77 return G_FILE_ERROR_LOOP
;
80 return G_FILE_ERROR_NOSPC
;
82 return G_FILE_ERROR_NOMEM
;
84 return G_FILE_ERROR_MFILE
;
86 return G_FILE_ERROR_NFILE
;
88 return G_FILE_ERROR_BADF
;
90 return G_FILE_ERROR_INVAL
;
92 return G_FILE_ERROR_PIPE
;
94 return G_FILE_ERROR_AGAIN
;
96 return G_FILE_ERROR_INTR
;
98 return G_FILE_ERROR_IO
;
100 return G_FILE_ERROR_PERM
;
102 return G_FILE_ERROR_NOSYS
;
104 return G_FILE_ERROR_FAILED
;
109 #define TMP_FILE_FORMAT "%.*s%s.tmp"
111 #define TMP_FILE_FORMAT "%.*s.%s~"
115 g_file_set_contents (const gchar
*filename
, const gchar
*contents
, gssize length
, GError
**err
)
121 if (!(name
= strrchr (filename
, G_DIR_SEPARATOR
)))
126 path
= g_strdup_printf (TMP_FILE_FORMAT
, (int)(name
- filename
), filename
, name
);
127 if (!(fp
= fopen (path
, "wb"))) {
128 g_set_error (err
, G_FILE_ERROR
, g_file_error_from_errno (errno
), "%s", g_strerror (errno
));
134 length
= strlen (contents
);
136 if (fwrite (contents
, 1, length
, fp
) < length
) {
137 g_set_error (err
, G_FILE_ERROR
, g_file_error_from_errno (ferror (fp
)), "%s", g_strerror (ferror (fp
)));
147 if (g_rename (path
, filename
) != 0) {
148 g_set_error (err
, G_FILE_ERROR
, g_file_error_from_errno (errno
), "%s", g_strerror (errno
));