-
Notifications
You must be signed in to change notification settings - Fork 3
/
watch.go
67 lines (54 loc) · 1.19 KB
/
watch.go
1
2
3
4
5
6
7
8
9
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package filewatcher
import (
"github.com/y4v8/errors"
"strings"
"syscall"
)
type action uint32
const (
actionAdd action = iota
actionRemove
)
type watchAction struct {
action action
path string
}
type watches map[string]*watch
type watch struct {
volume uint32
volumeName string
path string
}
func newWatch(path string) (*watch, error) {
pathUTF16, err := syscall.UTF16FromString(path)
if err != nil {
return nil, errors.Wrap(err)
}
h, err := syscall.CreateFile(&pathUTF16[0],
0,
syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
nil,
syscall.OPEN_EXISTING,
syscall.FILE_FLAG_BACKUP_SEMANTICS,
0)
if err != nil {
return nil, errors.Wrap(err)
}
defer syscall.CloseHandle(h)
var fi syscall.ByHandleFileInformation
if err = syscall.GetFileInformationByHandle(h, &fi); err != nil {
return nil, errors.Wrap(err)
}
volumeName, err := getVolumePathName(path)
if err != nil {
return nil, errors.Wrap(err)
}
volumeName = volumeName[:len(volumeName)-1]
path = path[len(volumeName):]
w := &watch{
volume: fi.VolumeSerialNumber,
volumeName: strings.ToLower(volumeName),
path: strings.ToLower(path),
}
return w, nil
}