- if ((o = ftello(fp)) >= 0 &&
- fseeko(fp, 0, SEEK_END) >= 0 &&
- (sz = ftello(fp),
- fseeko(fp, o, SEEK_SET) < 0))
- return (-1);
+ o = lseek(fileno(fp), 0, SEEK_CUR);
+ if (fstat(fileno(fp), &st)) return (-1);
+ sz = (S_ISREG(st.st_mode)) ? st.st_size : -1;