|
Lines 94-103
Link Here
|
| 94 |
off_t off; |
94 |
off_t off; |
| 95 |
struct stat *sbp; |
95 |
struct stat *sbp; |
| 96 |
{ |
96 |
{ |
| 97 |
int ch, kq = -1; |
97 |
int ch, n, kq = -1; |
| 98 |
int action = USE_SLEEP; |
98 |
int action = USE_SLEEP; |
| 99 |
struct kevent ev[2]; |
99 |
struct kevent ev[2]; |
| 100 |
struct stat sb2; |
100 |
struct stat sb2; |
|
|
101 |
struct timespec ts; |
| 101 |
|
102 |
|
| 102 |
switch(style) { |
103 |
switch(style) { |
| 103 |
case FBYTES: |
104 |
case FBYTES: |
|
Lines 170-175
Link Here
|
| 170 |
if (lines(fp, off)) |
171 |
if (lines(fp, off)) |
| 171 |
return; |
172 |
return; |
| 172 |
break; |
173 |
break; |
|
|
174 |
case NOTSET: |
| 175 |
case REVERSE: |
| 176 |
break; |
| 173 |
} |
177 |
} |
| 174 |
|
178 |
|
| 175 |
if (fflag) { |
179 |
if (fflag) { |
|
Lines 193-201
Link Here
|
| 193 |
clearerr(fp); |
197 |
clearerr(fp); |
| 194 |
|
198 |
|
| 195 |
switch (action) { |
199 |
switch (action) { |
| 196 |
case ADD_EVENTS: { |
200 |
case ADD_EVENTS: |
| 197 |
int n = 0; |
201 |
n = 0; |
| 198 |
struct timespec ts = { 0, 0 }; |
202 |
ts.tv_sec = 0; |
|
|
203 |
ts.tv_nsec = 0; |
| 199 |
|
204 |
|
| 200 |
if (Fflag && fileno(fp) != STDIN_FILENO) { |
205 |
if (Fflag && fileno(fp) != STDIN_FILENO) { |
| 201 |
EV_SET(&ev[n], fileno(fp), EVFILT_VNODE, |
206 |
EV_SET(&ev[n], fileno(fp), EVFILT_VNODE, |
|
Lines 208-231
Link Here
|
| 208 |
n++; |
213 |
n++; |
| 209 |
|
214 |
|
| 210 |
if (kevent(kq, ev, n, NULL, 0, &ts) < 0) { |
215 |
if (kevent(kq, ev, n, NULL, 0, &ts) < 0) { |
| 211 |
close(kq); |
|
|
| 212 |
kq = -1; |
| 213 |
action = USE_SLEEP; |
216 |
action = USE_SLEEP; |
| 214 |
} else { |
217 |
} else { |
| 215 |
action = USE_KQUEUE; |
218 |
action = USE_KQUEUE; |
| 216 |
} |
219 |
} |
| 217 |
break; |
220 |
break; |
| 218 |
} |
|
|
| 219 |
|
221 |
|
| 220 |
case USE_KQUEUE: |
222 |
case USE_KQUEUE: |
| 221 |
if (kevent(kq, NULL, 0, ev, 1, NULL) < 0) |
223 |
ts.tv_sec = 1; |
|
|
224 |
ts.tv_nsec = 0; |
| 225 |
/* |
| 226 |
* In the -F case we set a timeout to ensure that |
| 227 |
* we re-stat the file at least once every second. |
| 228 |
*/ |
| 229 |
n = kevent(kq, NULL, 0, ev, 1, Fflag ? &ts : NULL); |
| 230 |
if (n < 0) |
| 222 |
err(1, "kevent"); |
231 |
err(1, "kevent"); |
| 223 |
|
232 |
if (n == 0) { |
| 224 |
if (ev->filter == EVFILT_VNODE) { |
233 |
/* timeout */ |
| 225 |
/* file was rotated, wait until it reappears */ |
234 |
break; |
| 226 |
action = USE_SLEEP; |
235 |
} else if (ev->filter == EVFILT_READ && ev->data < 0) { |
| 227 |
} else if (ev->data < 0) { |
236 |
/* file shrank, reposition to end */ |
| 228 |
/* file shrank, reposition to end */ |
|
|
| 229 |
if (fseeko(fp, (off_t)0, SEEK_END) == -1) { |
237 |
if (fseeko(fp, (off_t)0, SEEK_END) == -1) { |
| 230 |
ierr(); |
238 |
ierr(); |
| 231 |
return; |
239 |
return; |
|
Lines 236-261
Link Here
|
| 236 |
case USE_SLEEP: |
244 |
case USE_SLEEP: |
| 237 |
(void) usleep(250000); |
245 |
(void) usleep(250000); |
| 238 |
clearerr(fp); |
246 |
clearerr(fp); |
|
|
247 |
break; |
| 248 |
} |
| 239 |
|
249 |
|
| 240 |
if (Fflag && fileno(fp) != STDIN_FILENO && |
250 |
if (Fflag && fileno(fp) != STDIN_FILENO) { |
| 241 |
stat(fname, &sb2) != -1) { |
251 |
while (stat(fname, &sb2) != 0) |
| 242 |
if (sb2.st_ino != sbp->st_ino || |
252 |
/* file was rotated, wait until it reappears */ |
| 243 |
sb2.st_dev != sbp->st_dev || |
253 |
(void)sleep(1); |
| 244 |
sb2.st_rdev != sbp->st_rdev || |
254 |
if (sb2.st_ino != sbp->st_ino || |
| 245 |
sb2.st_nlink == 0) { |
255 |
sb2.st_dev != sbp->st_dev || |
| 246 |
fp = freopen(fname, "r", fp); |
256 |
sb2.st_rdev != sbp->st_rdev || |
| 247 |
if (fp == NULL) { |
257 |
sb2.st_nlink == 0) { |
| 248 |
ierr(); |
258 |
fp = freopen(fname, "r", fp); |
| 249 |
break; |
259 |
if (fp == NULL) { |
| 250 |
} |
260 |
ierr(); |
|
|
261 |
} else { |
| 251 |
*sbp = sb2; |
262 |
*sbp = sb2; |
| 252 |
if (kq != -1) |
263 |
action = ADD_EVENTS; |
| 253 |
action = ADD_EVENTS; |
|
|
| 254 |
} else if (kq != -1) { |
| 255 |
action = USE_KQUEUE; |
| 256 |
} |
264 |
} |
| 257 |
} |
265 |
} |
| 258 |
break; |
|
|
| 259 |
} |
266 |
} |
| 260 |
} |
267 |
} |
| 261 |
} |
268 |
} |