void Setup ()
{
var initialFds = new List<int> ();
// fsw.FullPath may end in '/', see https://bugzilla.xamarin.com/show_bug.cgi?id=5747
if (fsw.FullPath.EndsWith ("/", StringComparison.Ordinal))
fullPathNoLastSlash = fsw.FullPath.Substring (0, fsw.FullPath.Length - 1);
else
fullPathNoLastSlash = fsw.FullPath;
// GetFilenameFromFd() returns the *realpath* which can be different than fsw.FullPath because symlinks.
// If so, introduce a fixup step.
int fd = open (fullPathNoLastSlash, O_EVTONLY, 0);
var resolvedFullPath = GetFilenameFromFd (fd);
close (fd);
if (resolvedFullPath != fullPathNoLastSlash)
fixupPath = resolvedFullPath;
else
fixupPath = null;
Scan (fullPathNoLastSlash, false, ref initialFds);
var immediate_timeout = new timespec { tv_sec = (IntPtr)0, tv_usec = (IntPtr)0 };
var eventBuffer = new kevent[0]; // we don't want to take any events from the queue at this point
var changes = CreateChangeList (ref initialFds);
int numEvents = kevent (conn, changes, changes.Length, eventBuffer, eventBuffer.Length, ref immediate_timeout);
if (numEvents == -1) {
var errMsg = String.Format ("kevent() error at initial event registration, error code = '{0}'", Marshal.GetLastWin32Error ());
throw new IOException (errMsg);
}
}