1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /* test-symlinks.c: verifies that symlinks are being created properly
3 Copyright (C) 2000 Eazel
5 The Gnome Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library 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.
10 The Gnome Library 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 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the Gnome Library; 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.
20 Author: Seth Nickell <snickell@stanford.edu> */
24 #include <glib/gmain.h>
25 #include <libgnomevfs/gnome-vfs-async-ops.h>
26 #include <libgnomevfs/gnome-vfs-init.h>
27 #include <libgnomevfs/gnome-vfs-ops.h>
32 static GMainLoop *main_loop;
35 GnomeVFSResult expected_result;
37 const char *target_uri;
38 const char *target_reference;
41 static int measure_speed = 0;
43 static int items_per_notification = 1;
45 struct poptOption options[] = {
50 &items_per_notification,
52 "Number of items to send for every notification",
61 "Measure speed without displaying anything",
85 deal_with_result (GnomeVFSResult result, GnomeVFSResult expected_result,
86 const char *uri, const char *target_uri, const char *target_reference,
89 char read_buffer[1024];
90 const char *write_buffer = "this is test data...we should read the same thing";
91 GnomeVFSHandle *handle;
92 GnomeVFSFileSize bytes_written, temp;
93 GnomeVFSFileInfo info_uri = {0,};
94 GnomeVFSFileInfo info_target = {0,};
96 const gchar *result_string;
98 GnomeVFSURI *real_uri, *real_uri_target;
99 GnomeVFSFileInfo *info;
101 real_uri = gnome_vfs_uri_new (uri);
102 real_uri_target = gnome_vfs_uri_new (target_uri);
104 if (result != expected_result) {
105 result_string = gnome_vfs_result_to_string (result);
106 printf ("creating a link from %s to %s returned %s instead of %s.\n", uri, target_reference,
107 result_string, gnome_vfs_result_to_string (expected_result));
109 } else if (result == GNOME_VFS_OK) {
110 info = gnome_vfs_file_info_new();
111 error = gnome_vfs_get_file_info_uri (real_uri, info, GNOME_VFS_FILE_INFO_DEFAULT);
112 if ((error != GNOME_VFS_OK) || (info->type != GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK)) {
113 printf ("Symlink problem: gnome_vfs_file_info returns wrong for link %s\n", uri);
115 /* our link seems to have been created correctly - lets see if its real */
116 error = gnome_vfs_open_uri (&handle, real_uri_target, GNOME_VFS_OPEN_WRITE);
117 if (error == GNOME_VFS_ERROR_NOT_FOUND)
118 error = gnome_vfs_create_uri (&handle, real_uri_target, GNOME_VFS_OPEN_WRITE, 0, GNOME_VFS_PERM_USER_ALL);
119 if (error == GNOME_VFS_OK) {
120 /* write stuff to our link location */
121 error = gnome_vfs_write (handle, write_buffer, strlen (write_buffer) + 1, &bytes_written);
122 error = gnome_vfs_close (handle);
123 error = gnome_vfs_open_uri (&handle, real_uri, GNOME_VFS_OPEN_READ);
124 if (error == GNOME_VFS_OK) {
125 error = gnome_vfs_read (handle, read_buffer, bytes_written, &temp);
126 read_buffer[temp] = 0;
127 error = gnome_vfs_close (handle);
128 if (strcmp (read_buffer, write_buffer) != 0) {
129 printf ("Symlink problem: value written is not the same as the value read!\n");
130 printf ("Written to %s: #%s# \nRead from link %s: #%s#\n",
131 target_uri, write_buffer, uri, read_buffer);
136 gnome_vfs_get_file_info_uri (real_uri, &info_uri, GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
137 gnome_vfs_get_file_info_uri (real_uri_target, &info_target, GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
138 if (info_uri.inode != info_target.inode) {
139 printf ("Symlink problem: link following is not working\n");
140 printf ("File: %s Link: %s\n", target_uri, uri);
142 gnome_vfs_file_info_clear (&info_uri);
143 gnome_vfs_get_file_info_uri (real_uri, &info_uri, GNOME_VFS_FILE_INFO_DEFAULT);
144 gnome_vfs_file_info_clear (&info_target);
145 gnome_vfs_get_file_info_uri (real_uri_target, &info_target, GNOME_VFS_FILE_INFO_DEFAULT);
146 if (info_uri.inode == info_target.inode) {
147 printf ("Symlink problem: link following is happening when it shouldn't be.\n");
148 printf ("File: %s Link: %s\n", target_uri, uri);
150 gnome_vfs_file_info_clear (&info_uri);
151 gnome_vfs_file_info_clear (&info_target);
153 gnome_vfs_file_info_unref (info);
155 gnome_vfs_unlink_from_uri (real_uri_target);
156 error = gnome_vfs_unlink_from_uri (real_uri);
157 if (error != GNOME_VFS_OK) {
158 printf ("Problem unlinking URI %s", uri);
164 gnome_vfs_uri_unref (real_uri);
165 gnome_vfs_uri_unref (real_uri_target);
171 create_link_callback (GnomeVFSAsyncHandle *handle,
172 GnomeVFSResult result,
173 gpointer callback_data)
175 const char *uri, *target_uri, *target_reference;
176 GnomeVFSResult expected_result;
179 info = (CallbackData*) callback_data;
182 target_uri = info->target_uri;
183 expected_result = info->expected_result;
184 target_reference = info->target_reference;
186 deal_with_result (result, expected_result, uri, target_uri, target_reference, TRUE);
188 g_free (callback_data);
189 g_main_loop_quit (main_loop);
194 make_link (const char *uri, const char *target_reference, const char *target_uri, GnomeVFSResult expected_result, gboolean unlink)
196 GnomeVFSURI *real_uri, *real_uri_target;
197 GnomeVFSResult result;
199 int return_value = 1;
201 real_uri = gnome_vfs_uri_new (uri);
202 real_uri_target = gnome_vfs_uri_new (target_uri);
204 result = gnome_vfs_create_symbolic_link (real_uri, target_reference);
206 return_value = deal_with_result(result, expected_result, uri, target_uri, target_reference, unlink);
210 gnome_vfs_uri_unref (real_uri);
211 gnome_vfs_uri_unref (real_uri_target);
217 make_link_async (const char *uri, const char *target_reference, const char *target_uri, GnomeVFSResult expected_result)
220 GnomeVFSAsyncHandle *handle;
222 info = g_malloc (sizeof (CallbackData));
224 info->target_uri = target_uri;
225 info->expected_result = expected_result;
226 info->target_reference = target_reference;
228 gnome_vfs_async_create_symbolic_link (&handle, gnome_vfs_uri_new(uri), target_reference, 0, create_link_callback, info);
232 check_broken_links (const char *uri)
234 GnomeVFSHandle *handle;
235 GnomeVFSResult error;
236 GnomeVFSURI *real_uri, *real_uri_target;
238 real_uri = gnome_vfs_uri_new (uri);
239 real_uri_target = gnome_vfs_uri_new ("file:///tmp/deadlink");
241 gnome_vfs_unlink_from_uri (real_uri_target);
242 gnome_vfs_create_symbolic_link (real_uri, "deadlink");
244 error = gnome_vfs_open_uri (&handle, real_uri, GNOME_VFS_OPEN_READ);
245 if (error != GNOME_VFS_ERROR_NOT_FOUND) {
246 printf ("GNOME_VFS_BROKEN_SYMLINK not returned open attempting to open a broken symlink.\n");
247 printf ("Value returned: %d\n", error);
250 gnome_vfs_unlink_from_uri (real_uri);
251 gnome_vfs_unlink_from_uri (real_uri_target);
253 gnome_vfs_uri_unref (real_uri);
254 gnome_vfs_uri_unref (real_uri_target);
259 main (int argc, const char **argv)
261 GnomeVFSURI *directory, *file_to_delete;
263 poptContext popt_context;
265 popt_context = poptGetContext ("test-vfs", argc, argv,
269 fprintf (stderr, "Usage: %s <directory>\n", argv[0]);
274 directory = gnome_vfs_uri_new ("file:///tmp/tmp");
276 gnome_vfs_make_directory_for_uri (directory, GNOME_VFS_PERM_USER_ALL);
278 make_link ("file:///tmp/link_to_ditz", "file:///tmp/ditz", "file:///tmp/ditz", GNOME_VFS_OK, TRUE);
279 make_link ("file:///tmp/link_to_ditz_relative", "ditz", "file:///tmp/ditz", GNOME_VFS_OK, TRUE);
280 make_link ("file:///tmp/tmp/link_to_ditz", "../ditz", "file:///tmp/ditz", GNOME_VFS_OK, FALSE);
281 make_link ("file:///tmp/link_to_link", "tmp/link_to_ditz", "file:///tmp/tmp/link_to_ditz", GNOME_VFS_OK, TRUE);
283 gnome_vfs_remove_directory_from_uri (directory);
284 gnome_vfs_uri_unref (directory);
286 file_to_delete = gnome_vfs_uri_new ("file:///tmp/ditz");
287 gnome_vfs_unlink_from_uri (file_to_delete);
288 gnome_vfs_uri_unref (file_to_delete);
290 check_broken_links("file:///tmp/link");
292 make_link ("file:///tmp/link_to_ditz_offfs", "http://www.a.com/ditz", "http://www.a.com/ditz", GNOME_VFS_ERROR_NOT_SUPPORTED, TRUE);
293 make_link ("http://www.eazel.com/link_to_ditz", "file:///tmp/ditz", "file:///tmp/ditz", GNOME_VFS_ERROR_NOT_SUPPORTED, TRUE);
294 make_link ("http://www.a.com/link_to_ditz_relative", "ditz", "http://www.a.com/ditz", GNOME_VFS_ERROR_NOT_SUPPORTED, TRUE);
296 make_link_async ("file:///tmp/async_link", "file:///tmp/link", "file:///tmp/link", GNOME_VFS_OK);
298 main_loop = g_main_loop_new (NULL, TRUE);
299 g_main_loop_run (main_loop);
300 g_main_loop_unref (main_loop);