And `lseek' to discover the current offset. Annoyingly, Android only
developed `ftello64' and `fseeko64' in API24, so we can't use these (and
it was a pretty grim circumlocution anyway). On the other hand, Android
has had `lseek64' forever, and its `fstat' is natively 64-bit; and
there's no portability benefit to using the other functions because
Windows doesn't have them anyway. (Indeed, `lseek' and `stat' are
ancient Unix, so probably more portable.)
#include "cc.h"
#ifndef PATHSEP
#include "cc.h"
#ifndef PATHSEP
int fprogress_init(fprogress *f, const char *name, FILE *fp)
{
const char *p;
int fprogress_init(fprogress *f, const char *name, FILE *fp)
{
const char *p;
off_t o, sz = -1;
size_t n;
/* --- Set up the offset --- */
off_t o, sz = -1;
size_t n;
/* --- Set up the offset --- */
- 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;
if (o != -1 && sz != -1) sz -= o;
f->o = f->olast = 0; f->sz = sz;
if (o != -1 && sz != -1) sz -= o;
f->o = f->olast = 0; f->sz = sz;