1 | /* GLIB - Library of useful routines for C programming |
2 | * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2.1 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Lesser General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Lesser General Public |
15 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
16 | */ |
17 | |
18 | /* |
19 | * Modified by the GLib Team and others 1997-2000. See the AUTHORS |
20 | * file for a list of people on the GLib Team. See the ChangeLog |
21 | * files for a list of changes. These files are distributed with |
22 | * GLib at ftp://ftp.gtk.org/pub/gtk/. |
23 | */ |
24 | |
25 | #undef G_DISABLE_ASSERT |
26 | #undef G_LOG_DOMAIN |
27 | |
28 | #ifdef GLIB_COMPILATION |
29 | #undef GLIB_COMPILATION |
30 | #endif |
31 | |
32 | #include <string.h> |
33 | |
34 | #include <glib.h> |
35 | |
36 | #include <gstdio.h> |
37 | |
38 | #include <fcntl.h> /* For open() */ |
39 | |
40 | #ifdef G_OS_UNIX |
41 | #include <unistd.h> |
42 | #endif |
43 | #ifdef G_OS_WIN32 |
44 | #include <io.h> /* For read(), write() etc */ |
45 | #endif |
46 | |
47 | static void |
48 | test_mkstemp (void) |
49 | { |
50 | char template[32]; |
51 | int fd; |
52 | int i; |
53 | const char hello[] = "Hello, World" ; |
54 | const int hellolen = sizeof (hello) - 1; |
55 | char chars[62]; |
56 | |
57 | strcpy (dest: template, src: "foobar" ); |
58 | fd = g_mkstemp (tmpl: template); |
59 | if (fd != -1) |
60 | { |
61 | g_warning ("g_mkstemp works even if template doesn't contain XXXXXX" ); |
62 | close (fd: fd); |
63 | } |
64 | |
65 | strcpy (dest: template, src: "foobarXXX" ); |
66 | fd = g_mkstemp (tmpl: template); |
67 | if (fd != -1) |
68 | { |
69 | g_warning ("g_mkstemp works even if template contains less than six X" ); |
70 | close (fd: fd); |
71 | } |
72 | |
73 | strcpy (dest: template, src: "fooXXXXXX" ); |
74 | fd = g_mkstemp (tmpl: template); |
75 | g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX" ); |
76 | i = write (fd: fd, buf: hello, n: hellolen); |
77 | g_assert (i != -1 && "write() failed" ); |
78 | g_assert (i == hellolen && "write() has written too few bytes" ); |
79 | |
80 | lseek (fd: fd, offset: 0, whence: 0); |
81 | i = read (fd: fd, buf: chars, nbytes: sizeof (chars)); |
82 | g_assert (i != -1 && "read() failed: %s" ); |
83 | g_assert (i == hellolen && "read() has got wrong number of bytes" ); |
84 | |
85 | chars[i] = 0; |
86 | g_assert (strcmp (chars, hello) == 0 && "read() didn't get same string back" ); |
87 | |
88 | close (fd: fd); |
89 | remove (filename: template); |
90 | |
91 | strcpy (dest: template, src: "fooXXXXXX.pdf" ); |
92 | fd = g_mkstemp (tmpl: template); |
93 | g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX.pdf" ); |
94 | |
95 | close (fd: fd); |
96 | remove (filename: template); |
97 | } |
98 | |
99 | static void |
100 | test_mkdtemp (void) |
101 | { |
102 | char template[32], *retval; |
103 | int fd; |
104 | int i; |
105 | |
106 | strcpy (dest: template, src: "foodir" ); |
107 | retval = g_mkdtemp (tmpl: template); |
108 | if (retval != NULL) |
109 | { |
110 | g_warning ("g_mkdtemp works even if template doesn't contain XXXXXX" ); |
111 | g_rmdir (filename: retval); |
112 | } |
113 | |
114 | strcpy (dest: template, src: "foodir" ); |
115 | retval = g_mkdtemp (tmpl: template); |
116 | if (retval != NULL) |
117 | { |
118 | g_warning ("g_mkdtemp works even if template contains less than six X" ); |
119 | g_rmdir (filename: retval); |
120 | } |
121 | |
122 | strcpy (dest: template, src: "fooXXXXXX" ); |
123 | retval = g_mkdtemp (tmpl: template); |
124 | g_assert (retval != NULL && "g_mkdtemp didn't work for template fooXXXXXX" ); |
125 | g_assert (retval == template && "g_mkdtemp allocated the resulting string?" ); |
126 | g_assert (!g_file_test (template, G_FILE_TEST_IS_REGULAR)); |
127 | g_assert (g_file_test (template, G_FILE_TEST_IS_DIR)); |
128 | |
129 | strcat (dest: template, src: "/abc" ); |
130 | fd = g_open (file: template, O_WRONLY | O_CREAT, 0600); |
131 | g_assert (fd != -1 && "couldn't open file in temporary directory" ); |
132 | close (fd: fd); |
133 | g_assert (g_file_test (template, G_FILE_TEST_IS_REGULAR)); |
134 | i = g_unlink (filename: template); |
135 | g_assert (i != -1 && "couldn't unlink file in temporary directory" ); |
136 | |
137 | template[9] = '\0'; |
138 | i = g_rmdir (filename: template); |
139 | g_assert (i != -1 && "couldn't remove temporary directory" ); |
140 | |
141 | strcpy (dest: template, src: "fooXXXXXX.dir" ); |
142 | retval = g_mkdtemp (tmpl: template); |
143 | g_assert (retval != NULL && "g_mkdtemp didn't work for template fooXXXXXX.dir" ); |
144 | g_assert (g_file_test (template, G_FILE_TEST_IS_DIR)); |
145 | g_rmdir (filename: template); |
146 | } |
147 | |
148 | static void |
149 | test_readlink (void) |
150 | { |
151 | #ifdef HAVE_SYMLINK |
152 | FILE *file; |
153 | int result; |
154 | char *filename = "file-test-data" ; |
155 | char *link1 = "file-test-link1" ; |
156 | char *link2 = "file-test-link2" ; |
157 | char *link3 = "file-test-link3" ; |
158 | char *data; |
159 | GError *error; |
160 | |
161 | file = fopen (filename, "w" ); |
162 | g_assert (file != NULL && "fopen() failed" ); |
163 | fclose (file); |
164 | |
165 | result = symlink (filename, link1); |
166 | g_assert (result == 0 && "symlink() failed" ); |
167 | result = symlink (link1, link2); |
168 | g_assert (result == 0 && "symlink() failed" ); |
169 | |
170 | error = NULL; |
171 | data = g_file_read_link (link1, &error); |
172 | g_assert (data != NULL && "couldn't read link1" ); |
173 | g_assert (strcmp (data, filename) == 0 && "link1 contains wrong data" ); |
174 | g_free (data); |
175 | |
176 | error = NULL; |
177 | data = g_file_read_link (link2, &error); |
178 | g_assert (data != NULL && "couldn't read link2" ); |
179 | g_assert (strcmp (data, link1) == 0 && "link2 contains wrong data" ); |
180 | g_free (data); |
181 | |
182 | error = NULL; |
183 | data = g_file_read_link (link3, &error); |
184 | g_assert (data == NULL && "could read link3" ); |
185 | g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); |
186 | g_error_free (error); |
187 | |
188 | error = NULL; |
189 | data = g_file_read_link (filename, &error); |
190 | g_assert (data == NULL && "could read regular file as link" ); |
191 | g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL); |
192 | g_error_free (error); |
193 | |
194 | remove (filename); |
195 | remove (link1); |
196 | remove (link2); |
197 | #endif |
198 | } |
199 | |
200 | static void |
201 | test_get_contents (void) |
202 | { |
203 | const gchar *text = "abcdefghijklmnopqrstuvwxyz" ; |
204 | const gchar *filename = "file-test-get-contents" ; |
205 | gchar *contents; |
206 | gsize len; |
207 | FILE *f; |
208 | GError *error = NULL; |
209 | |
210 | f = g_fopen (filename: filename, modes: "w" ); |
211 | fwrite (ptr: text, size: 1, n: strlen (s: text), s: f); |
212 | fclose (stream: f); |
213 | |
214 | g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR)); |
215 | |
216 | if (! g_file_get_contents (filename, contents: &contents, length: &len, error: &error)) |
217 | g_error ("g_file_get_contents() failed: %s" , error->message); |
218 | |
219 | g_assert (strcmp (text, contents) == 0 && "content mismatch" ); |
220 | |
221 | g_free (mem: contents); |
222 | } |
223 | |
224 | int |
225 | main (int argc, char *argv[]) |
226 | { |
227 | test_mkstemp (); |
228 | test_mkdtemp (); |
229 | test_readlink (); |
230 | test_get_contents (); |
231 | |
232 | return 0; |
233 | } |
234 | |