io-watch 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0fc26487e8282e4fb61d521424ea49b98606676fb04768fbe94e5244a44b4642
4
- data.tar.gz: '08666b566a234b2e64c49ea40ff878070d12cb53398cf3b883bff22ef1542bbb'
3
+ metadata.gz: 3b3d57b500111de6639098f96580da6ddfc5029f77fc0daf97159e54415ea7c5
4
+ data.tar.gz: 0ee6cfbdb782214fc141b713f7396448e92ae438244939ed48b9681a6e620f7f
5
5
  SHA512:
6
- metadata.gz: 51ee161b28baae33c5745658a77a82dd01bca7b6b350a60af90a19d38c3bbb329b00c242a81ae58134ea91445101c719f6b6b2a85013bb668390f31c52d7580c
7
- data.tar.gz: 9224e4d78d0509c987aba237df97babd0ed6caef5cc1f7012b4151c3ac84cd81ba2f67aa473163ce542d6325cbbf79c87ffeffb53b43de2c1142d5bc4596d618
6
+ metadata.gz: 3e4873bbd69789206c2704fe3e20914c7955c79d2310513adcf8dd9371c6773bf9d0a729b19b1de4a18fe852631435184559d98600d7de5b2ecd81a5a633075a
7
+ data.tar.gz: cbc9fdaedb8f1383e36e845cd07341e2427e706c205a94da35b355eb87ae049f9d2a256d30beb3a4616f35fbcf10f66e5022e0653849a3762a01376a7937f003
checksums.yaml.gz.sig CHANGED
Binary file
@@ -48,7 +48,7 @@ void IO_Watch_FSEvent_callback(
48
48
  struct IO_Watch *watch = context;
49
49
 
50
50
  for (size_t i = 0; i < numberOfEvents; i++) {
51
- if (DEBUG) fprintf(stderr, "Event: %s\n", eventPaths[i]);
51
+ if (DEBUG) fprintf(stderr, "io-watch:IO_Watch_FSEvent_callback: Event %s\n", eventPaths[i]);
52
52
 
53
53
  // Find the index of the path in the paths array
54
54
  ssize_t index = IO_Watch_find_path(watch, eventPaths[i]);
@@ -57,7 +57,7 @@ void IO_Watch_FSEvent_callback(
57
57
  // Output event data as newline-delimited JSON
58
58
  printf("{\"index\":%zu,\"flags\":%u,\"id\":%llu}\n", index, eventFlags[i], eventIds[i]);
59
59
  } else {
60
- fprintf(stderr, "Path not found in paths array: %s\n", eventPaths[i]);
60
+ fprintf(stderr, "io-watch:IO_Watch_FSEvent_callback: Path not found %s\n", eventPaths[i]);
61
61
  }
62
62
  }
63
63
 
@@ -33,7 +33,7 @@ void IO_Watch_Watch_Array_initialize(struct IO_Watch_Watch_Array *array) {
33
33
  array->capacity = 16;
34
34
  array->watches = malloc(array->capacity * sizeof(struct IO_Watch_Watch));
35
35
  if (!array->watches) {
36
- perror("malloc");
36
+ perror("io-watch:IO_Watch_Watch_Array_initialize:malloc");
37
37
  exit(EXIT_FAILURE);
38
38
  }
39
39
  }
@@ -42,7 +42,7 @@ void IO_Watch_Watch_Array_resize(struct IO_Watch_Watch_Array *array) {
42
42
  array->capacity *= 2;
43
43
  array->watches = realloc(array->watches, array->capacity * sizeof(struct IO_Watch_Watch));
44
44
  if (!array->watches) {
45
- perror("realloc");
45
+ perror("io-watch:IO_Watch_Watch_Array_resize:realloc");
46
46
  exit(EXIT_FAILURE);
47
47
  }
48
48
  }
@@ -67,21 +67,30 @@ ssize_t IO_Watch_Watch_Array_find(struct IO_Watch_Watch_Array *array, int watch_
67
67
  }
68
68
 
69
69
  void IO_Watch_Watch_Array_watch(int fd, struct IO_Watch_Watch_Array *watch_array, char *path, int index) {
70
- int watch_descriptor = inotify_add_watch(fd, path, IN_ALL_EVENTS);
70
+ int mask =
71
+ IN_MODIFY | // File was modified.
72
+ IN_ATTRIB | // Metadata (permissions, timestamps, etc.) changed.
73
+ IN_CLOSE_WRITE | // Writable file was closed.
74
+ IN_MOVE_SELF | // Watched file/directory was moved.
75
+ IN_CREATE | // File or directory was created within the watched directory.
76
+ IN_DELETE; // File or directory was deleted within the watched directory.
77
+
78
+ int watch_descriptor = inotify_add_watch(fd, path, mask);
79
+
71
80
  if (watch_descriptor == -1) {
72
- perror("inotify_add_watch");
81
+ perror("io-watch:IO_Watch_Watch_Array_watch:inotify_add_watch");
73
82
  exit(EXIT_FAILURE);
74
83
  }
75
84
 
76
85
  IO_Watch_Watch_Array_add(watch_array, watch_descriptor, path, index);
77
86
 
78
- if (DEBUG) fprintf(stderr, "Added watch: %s\n", path);
87
+ if (DEBUG) fprintf(stderr, "io-watch:IO_Watch_Watch_Array_watch: Added watch %s\n", path);
79
88
  }
80
89
 
81
90
  void IO_Watch_Watch_Array_scan(int fd, struct IO_Watch_Watch_Array *watch_array, const char *root, int index) {
82
91
  DIR *dir = opendir(root);
83
92
  if (!dir) {
84
- perror("opendir");
93
+ perror("io-watch:IO_Watch_Watch_Array_scan:opendir");
85
94
  return;
86
95
  }
87
96
 
@@ -94,13 +103,13 @@ void IO_Watch_Watch_Array_scan(int fd, struct IO_Watch_Watch_Array *watch_array,
94
103
  size_t size = strlen(root) + 1 + strlen(entry->d_name) + 1;
95
104
  char *path = malloc(size);
96
105
  snprintf(path, size, "%s/%s", root, entry->d_name);
97
-
106
+
98
107
  struct stat statbuf;
99
108
  if (stat(path, &statbuf) == -1) {
100
- perror("stat");
109
+ perror("io-watch:IO_Watch_Watch_Array_scan:stat");
101
110
  continue;
102
111
  }
103
-
112
+
104
113
  if (S_ISDIR(statbuf.st_mode)) {
105
114
  IO_Watch_Watch_Array_watch(fd, watch_array, path, index);
106
115
  IO_Watch_Watch_Array_scan(fd, watch_array, path, index);
@@ -108,7 +117,7 @@ void IO_Watch_Watch_Array_scan(int fd, struct IO_Watch_Watch_Array *watch_array,
108
117
  free(path);
109
118
  }
110
119
  }
111
-
120
+
112
121
  closedir(dir);
113
122
  }
114
123
 
@@ -116,7 +125,7 @@ void IO_Watch_Watch_Array_add_subdirectory(int fd, struct IO_Watch_Watch_Array *
116
125
  size_t size = strlen(watch.path) + 1 + strlen(name) + 1;
117
126
  char *path = malloc(size);
118
127
  snprintf(path, size, "%s/%s", watch.path, name);
119
-
128
+
120
129
  IO_Watch_Watch_Array_watch(fd, watch_array, path, watch.index);
121
130
  IO_Watch_Watch_Array_scan(fd, watch_array, path, watch.index);
122
131
  }
@@ -124,7 +133,7 @@ void IO_Watch_Watch_Array_add_subdirectory(int fd, struct IO_Watch_Watch_Array *
124
133
  void IO_Watch_Watch_Array_remove(int fd, struct IO_Watch_Watch_Array *watch_array, size_t index) {
125
134
  struct IO_Watch_Watch watch = watch_array->watches[index];
126
135
 
127
- if (DEBUG) fprintf(stderr, "Removing watch: %s\n", watch.path);
136
+ if (DEBUG) fprintf(stderr, "io-watch:IO_Watch_Watch_Array_add_subdirectory: Removing watch %s\n", watch.path);
128
137
 
129
138
  inotify_rm_watch(fd, watch.watch_descriptor);
130
139
  free(watch.path);
@@ -138,7 +147,7 @@ void IO_Watch_Watch_Array_remove(int fd, struct IO_Watch_Watch_Array *watch_arra
138
147
 
139
148
  static
140
149
  void IO_Watch_INotify_print_event(struct inotify_event *event) {
141
- fprintf(stderr, "Event: wd=%d", event->wd);
150
+ fprintf(stderr, "Event wd=%d", event->wd);
142
151
 
143
152
  uint32_t mask = event->mask;
144
153
  if (mask & IN_ACCESS) fprintf(stderr, " ACCESS");
@@ -170,41 +179,54 @@ void IO_Watch_INotify_print_event(struct inotify_event *event) {
170
179
  void IO_Watch_run(struct IO_Watch *watch) {
171
180
  int fd = inotify_init1(IN_NONBLOCK);
172
181
  if (fd == -1) {
173
- perror("inotify_init1");
182
+ perror("io-watch:IO_Watch_run:inotify_init1");
174
183
  exit(EXIT_FAILURE);
175
184
  }
176
-
185
+
177
186
  struct IO_Watch_Watch_Array watch_array;
178
187
  IO_Watch_Watch_Array_initialize(&watch_array);
179
-
188
+
180
189
  for (size_t i = 0; i < watch->size; i++) {
181
190
  char *path = strdup(watch->paths[i]);
182
191
 
183
192
  IO_Watch_Watch_Array_watch(fd, &watch_array, path, i);
184
193
  IO_Watch_Watch_Array_scan(fd, &watch_array, path, i);
185
194
  }
186
-
195
+
187
196
  printf("{\"status\":\"started\"}\n");
188
197
  fflush(stdout);
189
-
198
+
190
199
  char buffer[BUFFER_SIZE] __attribute__ ((aligned(8)));
191
200
 
192
201
  while (1) {
193
202
  ssize_t result = read(fd, buffer, BUFFER_SIZE);
194
203
  if (result == -1 && errno != EAGAIN) {
195
- perror("read");
204
+ perror("(io-watch:IO_Watch_run:read)");
196
205
  exit(EXIT_FAILURE);
197
206
  }
198
-
207
+
199
208
  for (ssize_t offset = 0; offset < result;) {
200
209
  struct inotify_event *event = (struct inotify_event *) &buffer[offset];
201
- if (DEBUG) IO_Watch_INotify_print_event(event);
210
+ if (DEBUG) {
211
+ fprintf(stderr, "io-watch:IO_Watch_run: ");
212
+ IO_Watch_INotify_print_event(event);
213
+ }
214
+
215
+ if (event->wd == -1) {
216
+ if (event->mask & IN_Q_OVERFLOW) {
217
+ fprintf(stderr, "io-watch:IO_Watch_run: Queue overflow\n");
218
+ } else {
219
+ fprintf(stderr, "io-watch:IO_Watch_run: Unknown error ");
220
+ IO_Watch_INotify_print_event(event);
221
+ }
222
+ break;
223
+ }
202
224
 
203
225
  ssize_t index = IO_Watch_Watch_Array_find(&watch_array, event->wd);
204
-
226
+
205
227
  if (index != -1) {
206
228
  printf("{\"index\":%d,\"mask\":%u}\n", watch_array.watches[index].index, event->mask);
207
-
229
+
208
230
  // If a new directory is created, add a watch for it
209
231
  if (event->mask & IN_CREATE && event->mask & IN_ISDIR) {
210
232
  IO_Watch_Watch_Array_add_subdirectory(fd, &watch_array, watch_array.watches[index], event->name);
@@ -212,9 +234,9 @@ void IO_Watch_run(struct IO_Watch *watch) {
212
234
  IO_Watch_Watch_Array_remove(fd, &watch_array, index);
213
235
  }
214
236
  } else {
215
- fprintf(stderr, "Watch descriptor not found: %d\n", event->wd);
237
+ fprintf(stderr, "io-watch:IO_Watch_run: Watch descriptor %d not found!\n", event->wd);
216
238
  }
217
-
239
+
218
240
  offset += sizeof(struct inotify_event) + event->len;
219
241
  }
220
242
  fflush(stdout);
data/ext/io/watch.c CHANGED
@@ -27,10 +27,10 @@ int main(int argc, char **argv) {
27
27
  for (size_t i = 0; i < watch.size; i++) {
28
28
  char *real_path = realpath(watch.paths[i], NULL);
29
29
  if (real_path == NULL) {
30
- fprintf(stderr, "Error: realpath failed for %s\n", watch.paths[i]);
30
+ fprintf(stderr, "io-watch:main: Realpath failed for %s\n", watch.paths[i]);
31
31
  return 1;
32
32
  } else {
33
- if (DEBUG) fprintf(stderr, "Watching: %s\n", real_path);
33
+ if (DEBUG) fprintf(stderr, "io-watch:main: Watching %s\n", real_path);
34
34
  watch.paths[i] = real_path;
35
35
  }
36
36
  }
@@ -5,6 +5,6 @@
5
5
 
6
6
  class IO
7
7
  module Watch
8
- VERSION = '0.5.0'
8
+ VERSION = '0.6.1'
9
9
  end
10
10
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-watch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -37,7 +37,7 @@ cert_chain:
37
37
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
38
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
39
  -----END CERTIFICATE-----
40
- date: 2024-06-28 00:00:00.000000000 Z
40
+ date: 2024-08-11 00:00:00.000000000 Z
41
41
  dependencies: []
42
42
  description:
43
43
  email:
metadata.gz.sig CHANGED
Binary file