Optimise stdio krb5_storage by tracking offset
This commit is contained in:

committed by
Nico Williams

parent
56a32a8dbd
commit
c827cd48f6
@@ -36,9 +36,11 @@
|
||||
|
||||
typedef struct stdio_storage {
|
||||
FILE *f;
|
||||
off_t pos;
|
||||
} stdio_storage;
|
||||
|
||||
#define F(S) (((stdio_storage*)(S)->data)->f)
|
||||
#define POS(S) (((stdio_storage*)(S)->data)->pos)
|
||||
|
||||
static ssize_t
|
||||
stdio_fetch(krb5_storage * sp, void *data, size_t size)
|
||||
@@ -51,16 +53,21 @@ stdio_fetch(krb5_storage * sp, void *data, size_t size)
|
||||
while (rem > 0) {
|
||||
count = fread(cbuf, 1, rem, F(sp));
|
||||
if (count < 0) {
|
||||
POS(sp) = -1;
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else
|
||||
return count;
|
||||
} else if (count == 0) {
|
||||
if (POS(sp) >= 0)
|
||||
POS(sp) += size - rem;
|
||||
return size - rem;
|
||||
}
|
||||
cbuf += count;
|
||||
rem -= count;
|
||||
}
|
||||
if (POS(sp) >= 0)
|
||||
POS(sp) += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -84,13 +91,18 @@ stdio_store(krb5_storage * sp, const void *data, size_t size)
|
||||
* earlier writes that appeared complete may have failed,
|
||||
* and so we don't know how much we really failed to write.
|
||||
*/
|
||||
POS(sp) = -1;
|
||||
return -1;
|
||||
}
|
||||
if (count == 0)
|
||||
if (count == 0) {
|
||||
POS(sp) = -1;
|
||||
return -1;
|
||||
}
|
||||
cbuf += count;
|
||||
rem -= count;
|
||||
}
|
||||
if (POS(sp) >= 0)
|
||||
POS(sp) += size;
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -99,10 +111,16 @@ stdio_seek(krb5_storage * sp, off_t offset, int whence)
|
||||
{
|
||||
int save_errno = errno;
|
||||
|
||||
if (whence == SEEK_SET && POS(sp) == offset)
|
||||
return POS(sp);
|
||||
|
||||
if (whence == SEEK_CUR && POS(sp) >= 0 && offset == 0)
|
||||
return POS(sp);
|
||||
|
||||
if (fseeko(F(sp), offset, whence) != 0)
|
||||
return -1;
|
||||
errno = save_errno;
|
||||
return ftello(F(sp));
|
||||
return POS(sp) = ftello(F(sp));
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -123,6 +141,7 @@ stdio_trunc(krb5_storage * sp, off_t offset)
|
||||
if (fseeko(F(sp), tmpoff, SEEK_SET) == -1)
|
||||
return errno;
|
||||
errno = save_errno;
|
||||
POS(sp) = tmpoff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -224,6 +243,7 @@ krb5_storage_stdio_from_fd(int fd_in, const char *mode)
|
||||
sp->flags = 0;
|
||||
sp->eof_code = HEIM_ERR_EOF;
|
||||
F(sp) = f;
|
||||
POS(sp) = off;
|
||||
sp->fetch = stdio_fetch;
|
||||
sp->store = stdio_store;
|
||||
sp->seek = stdio_seek;
|
||||
|
Reference in New Issue
Block a user