* Authors:
* Gonzalo Paniagua Javier (gonzalo@ximian.com)
*
- * (C) 2004,2005,2006 Novell, Inc. (http://www.novell.com)
+ * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
*/
#ifdef HAVE_CONFIG_H
#include <mono/metadata/appdomain.h>
#include <mono/metadata/exception.h>
#include <mono/metadata/filewatcher.h>
-
-#if (defined (PLATFORM_WIN32) && WINVER >= 0x0400)
+#include <mono/metadata/marshal.h>
+#include <mono/utils/mono-dl.h>
+#ifdef PLATFORM_WIN32
/*
* TODO:
return 1;
}
-gpointer
-ves_icall_System_IO_FSW_OpenDirectory (MonoString *path, gpointer reserved)
-{
- return NULL;
- /*
- gpointer dir;
- gchar *utf8path;
-
- MONO_ARCH_SAVE_REGS;
-
- dir = CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE,
- NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
-
- return dir;
- */
-}
-
-gboolean
-ves_icall_System_IO_FSW_CloseDirectory (gpointer handle)
-{
- return FALSE;
- /*
- MONO_ARCH_SAVE_REGS;
-
- return CloseHandle (handle);
- */
-}
-
-gboolean
-ves_icall_System_IO_FSW_ReadDirectoryChanges (gpointer handle,
- MonoArray *buffer,
- gboolean includeSubdirs,
- gint filters,
- gpointer overlap,
- gpointer callback)
-{
- return FALSE;
- /*
- gpointer dest;
- gint size;
- MonoObject *delegate = (MonoObject *) callback;
- MonoMethod *im;
- LPOVERLAPPED_COMPLETION_ROUTINE func;
-
- MONO_ARCH_SAVE_REGS;
-
- size = mono_array_length (buffer);
- dest = mono_array_addr_with_size (buffer, 1, 0);
-
- im = mono_get_delegate_invoke (mono_object_get_class (delegate));
- func = mono_compile_method (im);
- return FALSE;
- * return ReadDirectoryChanges (handle, dest, size, includeSubdirs, filters,
- NULL, (LPOVERLAPPED) overlap,
- func); */
-}
-
gboolean
ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn,
MonoString **filename,
#if HAVE_KQUEUE
return 3;
#else
- GModule *fam_module;
- gchar *filename;
+ MonoDl *fam_module;
int lib_used = 4; /* gamin */
int inotify_instance;
+ void *iter;
+ char *err;
MONO_ARCH_SAVE_REGS;
return 5; /* inotify */
}
- filename = g_module_build_path (NULL, "libgamin-1.so.0");
- fam_module = g_module_open (filename, G_MODULE_BIND_LAZY);
- g_free (filename);
+ iter = NULL;
+ fam_module = mono_dl_open ("libgamin-1.so", MONO_DL_LAZY, NULL);
if (fam_module == NULL) {
lib_used = 2; /* FAM */
- filename = g_module_build_path (NULL, "libfam.so.0");
- fam_module = g_module_open (filename, G_MODULE_BIND_LAZY);
- g_free (filename);
+ iter = NULL;
+ fam_module = mono_dl_open ("libfam.so", MONO_DL_LAZY, NULL);
}
if (fam_module == NULL)
return 0;
- g_module_symbol (fam_module, "FAMNextEvent", (gpointer *) &FAMNextEvent);
+ err = mono_dl_symbol (fam_module, "FAMNextEvent", (gpointer *) &FAMNextEvent);
+ g_free (err);
if (FAMNextEvent == NULL)
return 0;
#endif
}
-gpointer
-ves_icall_System_IO_FSW_OpenDirectory (MonoString *path, gpointer reserved)
-{
- return NULL;
-}
-
-gboolean
-ves_icall_System_IO_FSW_CloseDirectory (gpointer handle)
-{
- return FALSE;
-}
-
-gboolean
-ves_icall_System_IO_FSW_ReadDirectoryChanges (gpointer handle,
- MonoArray *buffer,
- gboolean includeSubdirs,
- gint filters,
- gpointer overlap,
- gpointer callback)
-{
- return FALSE;
-}
-
/* Almost copied from fam.h. Weird, I know */
typedef struct {
gint reqnum;
}
#endif
+#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H) && !defined(__NR_inotify_init)
+# if defined(__i386__)
+# define __NR_inotify_init 291
+# elif defined(__x86_64__)
+# define __NR_inotify_init 253
+# elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc64__)
+# define __NR_inotify_init 275
+# elif defined (__s390__) || defined (__s390x__)
+# define __NR_inotify_init 284
+# elif defined(__sparc__) || defined (__sparc64__)
+# define __NR_inotify_init 151
+# elif defined (__ia64__)
+# define __NR_inotify_init 1277
+# elif defined (__arm__)
+# define __NR_inotify_init 316
+# elif defined(__alpha__)
+# define __NR_inotify_init 444
+# endif
+#ifdef __NR_inotify_init
+# ifndef __NR_inotify_add_watch
+# define __NR_inotify_add_watch (__NR_inotify_init + 1)
+# endif
+# ifndef __NR_inotify_rm_watch
+# define __NR_inotify_rm_watch (__NR_inotify_init + 2)
+# endif
+#endif
+#endif
+
#if !defined(__linux__) || !defined(__NR_inotify_init)
int ves_icall_System_IO_InotifyWatcher_GetInotifyInstance ()
{
return -1;
}
-int ves_icall_System_IO_InotifyWatcher_AddDirectoryWatch (int fd, MonoString *directory, gint32 mask)
+int ves_icall_System_IO_InotifyWatcher_AddWatch (int fd, MonoString *directory, gint32 mask)
{
return -1;
}
-int ves_icall_System_IO_InotifyWatcher_RemoveDirectoryWatch (int fd, int watch_descriptor)
+int ves_icall_System_IO_InotifyWatcher_RemoveWatch (int fd, int watch_descriptor)
{
return -1;
}
{
char *str;
int retval;
- int error;
+
+ MONO_ARCH_SAVE_REGS;
if (name == NULL)
return -1;
str = mono_string_to_utf8 (name);
retval = syscall (__NR_inotify_add_watch, fd, str, mask);
- if (retval < 0)
- error = errno;
+ if (retval < 0) {
+ switch (errno) {
+ case EACCES:
+ errno = ERROR_ACCESS_DENIED;
+ break;
+ case EBADF:
+ errno = ERROR_INVALID_HANDLE;
+ break;
+ case EFAULT:
+ errno = ERROR_INVALID_ACCESS;
+ break;
+ case EINVAL:
+ errno = ERROR_INVALID_DATA;
+ break;
+ case ENOMEM:
+ errno = ERROR_NOT_ENOUGH_MEMORY;
+ break;
+ case ENOSPC:
+ errno = ERROR_TOO_MANY_OPEN_FILES;
+ break;
+ default:
+ errno = ERROR_GEN_FAILURE;
+ break;
+ }
+ mono_marshal_set_last_error ();
+ }
g_free (str);
- if (retval < 0)
- errno = error;
return retval;
}