Implement unwatching a path
This commit is contained in:
@@ -21,6 +21,13 @@ public actor Inotify {
|
|||||||
return wd
|
return wd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func removeWatch(_ wd: Int32) throws {
|
||||||
|
guard inotify_rm_watch(self.fd, wd) == 0 else {
|
||||||
|
throw InotifyError.removeWatchFailed(watchDescriptor: wd, errno: cinotify_get_errno())
|
||||||
|
}
|
||||||
|
watches.removeValue(forKey: wd)
|
||||||
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
cinotify_deinit(self.fd)
|
cinotify_deinit(self.fd)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import CInotify
|
|||||||
public enum InotifyError: Error, Sendable, CustomStringConvertible {
|
public enum InotifyError: Error, Sendable, CustomStringConvertible {
|
||||||
case initFailed(errno: Int32)
|
case initFailed(errno: Int32)
|
||||||
case addWatchFailed(path: String, errno: Int32)
|
case addWatchFailed(path: String, errno: Int32)
|
||||||
|
case removeWatchFailed(watchDescriptor: Int32, errno: Int32)
|
||||||
|
|
||||||
public var description: String {
|
public var description: String {
|
||||||
switch self {
|
switch self {
|
||||||
@@ -10,6 +11,8 @@ public enum InotifyError: Error, Sendable, CustomStringConvertible {
|
|||||||
"inotify_init1 failed: \(readableErrno(code))"
|
"inotify_init1 failed: \(readableErrno(code))"
|
||||||
case .addWatchFailed(let path, let code):
|
case .addWatchFailed(let path, let code):
|
||||||
"inotify_add_watch failed for '\(path)': \(readableErrno(code))"
|
"inotify_add_watch failed for '\(path)': \(readableErrno(code))"
|
||||||
|
case .removeWatchFailed(let wd, let code):
|
||||||
|
"inotify_rm_watch failed for wd \(wd): \(readableErrno(code))"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,4 +18,19 @@ struct WatchTests {
|
|||||||
try await watcher.addWatch(path: "/nonexistent-\(UUID())", mask: .allEvents)
|
try await watcher.addWatch(path: "/nonexistent-\(UUID())", mask: .allEvents)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test func removeWatchSucceeds() async throws {
|
||||||
|
try await withTempDir { dir in
|
||||||
|
let watcher = try Inotify()
|
||||||
|
let wd = try await watcher.addWatch(path: dir, mask: .allEvents)
|
||||||
|
try await watcher.removeWatch(wd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test func removeInvalidWatchThrows() async throws {
|
||||||
|
let watcher = try Inotify()
|
||||||
|
await #expect(throws: InotifyError.self) {
|
||||||
|
try await watcher.removeWatch(9999)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user