2 * filewatcher.c: File System Watcher internal calls
5 * Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
14 #include <mono/metadata/appdomain.h>
15 #include <mono/metadata/exception.h>
16 #include <mono/metadata/filewatcher.h>
17 #include <mono/metadata/marshal.h>
18 #include <mono/utils/mono-dl.h>
19 #include <mono/utils/mono-io-portability.h>
24 * We use the managed watcher on windows, so the code inside this #if is never used
27 ves_icall_System_IO_FSW_SupportsFSW (void)
33 ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn
,
34 MonoString
**filename
,
43 static int (*FAMNextEvent
) (gpointer
, gpointer
);
46 ves_icall_System_IO_FSW_SupportsFSW (void)
52 int lib_used
= 4; /* gamin */
59 inotify_instance
= ves_icall_System_IO_InotifyWatcher_GetInotifyInstance ();
60 if (inotify_instance
!= -1) {
61 close (inotify_instance
);
62 return 5; /* inotify */
66 fam_module
= mono_dl_open ("libgamin-1.so", MONO_DL_LAZY
, NULL
);
67 if (fam_module
== NULL
) {
68 lib_used
= 2; /* FAM */
70 fam_module
= mono_dl_open ("libfam.so", MONO_DL_LAZY
, NULL
);
73 if (fam_module
== NULL
)
76 err
= mono_dl_symbol (fam_module
, "FAMNextEvent", (gpointer
*) &FAMNextEvent
);
78 if (FAMNextEvent
== NULL
)
85 /* Almost copied from fam.h. Weird, I know */
90 typedef struct FAMEvent
{
94 gchar filename
[PATH_MAX
];
100 ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn
,
101 MonoString
**filename
,
109 if (FAMNextEvent (conn
, &ev
) == 1) {
110 *filename
= mono_string_new (mono_domain_get (), ev
.filename
);
112 *reqnum
= ev
.fr
.reqnum
;
120 #ifndef HAVE_SYS_INOTIFY_H
121 int ves_icall_System_IO_InotifyWatcher_GetInotifyInstance ()
126 int ves_icall_System_IO_InotifyWatcher_AddWatch (int fd
, MonoString
*directory
, gint32 mask
)
131 int ves_icall_System_IO_InotifyWatcher_RemoveWatch (int fd
, gint32 watch_descriptor
)
136 #include <sys/inotify.h>
140 ves_icall_System_IO_InotifyWatcher_GetInotifyInstance ()
142 return inotify_init ();
146 ves_icall_System_IO_InotifyWatcher_AddWatch (int fd
, MonoString
*name
, gint32 mask
)
156 str
= mono_string_to_utf8 (name
);
157 path
= mono_portability_find_file (str
, TRUE
);
161 retval
= inotify_add_watch (fd
, path
, mask
);
165 errno
= ERROR_ACCESS_DENIED
;
168 errno
= ERROR_INVALID_HANDLE
;
171 errno
= ERROR_INVALID_ACCESS
;
174 errno
= ERROR_INVALID_DATA
;
177 errno
= ERROR_NOT_ENOUGH_MEMORY
;
180 errno
= ERROR_TOO_MANY_OPEN_FILES
;
183 errno
= ERROR_GEN_FAILURE
;
186 mono_marshal_set_last_error ();
195 ves_icall_System_IO_InotifyWatcher_RemoveWatch (int fd
, gint32 watch_descriptor
)
197 return inotify_rm_watch (fd
, watch_descriptor
);