- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
static int ReadEvent (byte [] source, int off, int size, out InotifyEvent evt)
{
evt = new InotifyEvent ();
if (size <= 0 || off > size - 16) {
return -1;
}
int len;
if (BitConverter.IsLittleEndian) {
evt.WatchDescriptor = source [off] + (source [off + 1] << 8) +
(source [off + 2] << 16) + (source [off + 3] << 24);
evt.Mask = (InotifyMask) (source [off + 4] + (source [off + 5] << 8) +
(source [off + 6] << 16) + (source [off + 7] << 24));
// Ignore Cookie -> +4
len = source [off + 12] + (source [off + 13] << 8) +
(source [off + 14] << 16) + (source [off + 15] << 24);
} else {
evt.WatchDescriptor = source [off + 3] + (source [off + 2] << 8) +
(source [off + 1] << 16) + (source [off] << 24);
evt.Mask = (InotifyMask) (source [off + 7] + (source [off + 6] << 8) +
(source [off + 5] << 16) + (source [off + 4] << 24));
// Ignore Cookie -> +4
len = source [off + 15] + (source [off + 14] << 8) +
(source [off + 13] << 16) + (source [off + 12] << 24);
}
if (len > 0) {
if (off > size - 16 - len)
return -1;
string name = Encoding.UTF8.GetString (source, off + 16, len);
evt.Name = name.Trim ('\0');
} else {
evt.Name = null;
}
return 16 + len;
}
Mono, обёртка вокруг INotify (вокруг папки INotify создаёт поток (файл?), который нужно с помощью read читать в буфер, и в буфере будет лежать объект-событие в говносериализованной форме).
Давно столько магических чисел в одном месте не видел o_O
Можно ли в C# решить элегантнее?
Аналог всего этого кода на Си: struct inotify_event *event = ( struct inotify_event*) &buffer[i]
cfdev 11.07.2010 17:46 # 0
bober_maniac 11.07.2010 19:14 # +2
Webkill 13.07.2010 14:21 # +1
bober_maniac 14.07.2010 00:44 # +1
Pahan Menski 20.07.2010 13:13 # 0
fixed (void* ptr = source)
{
evt = *((InotifyEvent*)ptr[offset]);
}