From a54887f0541f766a01c4634e4b1dd4e450e54e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sun, 11 Jan 2009 21:39:41 +0000 Subject: [PATCH] Add krb5_storage_truncate git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24226 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/store-int.h | 1 + lib/krb5/store_emem.c | 24 ++++++++++++++++++++++++ lib/krb5/store_fd.c | 7 +++++++ lib/krb5/store_mem.c | 20 ++++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/lib/krb5/store-int.h b/lib/krb5/store-int.h index 8489f9845..0b7accb86 100644 --- a/lib/krb5/store-int.h +++ b/lib/krb5/store-int.h @@ -39,6 +39,7 @@ struct krb5_storage_data { ssize_t (*fetch)(struct krb5_storage_data*, void*, size_t); ssize_t (*store)(struct krb5_storage_data*, const void*, size_t); off_t (*seek)(struct krb5_storage_data*, off_t, int); + int (*trunc)(struct krb5_storage_data*, off_t); void (*free)(struct krb5_storage_data*); krb5_flags flags; int eof_code; diff --git a/lib/krb5/store_emem.c b/lib/krb5/store_emem.c index 8a587600f..e3e1a0af4 100644 --- a/lib/krb5/store_emem.c +++ b/lib/krb5/store_emem.c @@ -104,6 +104,29 @@ emem_seek(krb5_storage *sp, off_t offset, int whence) return s->ptr - s->base; } +static int +emem_trunc(krb5_storage *sp, off_t offset) +{ + emem_storage *s = (emem_storage*)sp->data; + /* + * If offset is larget then current size, or current size is + * shrunk more then half of the current size, adjust buffer. + */ + if (offset > s->size || s->size / 2 > offset ) { + void *base; + base = realloc(s->base, offset); + if(base == NULL) + return ENOMEM; + if (offset > s->size) + memset(s->len, 0, offset); + s->size = offset; + s->base = base; + } + s->len = offset; + return 0; +} + + static void emem_free(krb5_storage *sp) { @@ -142,6 +165,7 @@ krb5_storage_emem(void) sp->fetch = emem_fetch; sp->store = emem_store; sp->seek = emem_seek; + sp->trunc = emem_trunc; sp->free = emem_free; return sp; } diff --git a/lib/krb5/store_fd.c b/lib/krb5/store_fd.c index fe3c513ee..8e2a343d6 100644 --- a/lib/krb5/store_fd.c +++ b/lib/krb5/store_fd.c @@ -60,6 +60,12 @@ fd_seek(krb5_storage * sp, off_t offset, int whence) return lseek(FD(sp), offset, whence); } +static off_t +fd_trunc(krb5_storage * sp, off_t offset) +{ + return ftruncate(FD(sp), offset); +} + static void fd_free(krb5_storage * sp) { @@ -93,6 +99,7 @@ krb5_storage_from_fd(int fd) sp->fetch = fd_fetch; sp->store = fd_store; sp->seek = fd_seek; + sp->trunc = fd_trunc; sp->free = fd_free; return sp; } diff --git a/lib/krb5/store_mem.c b/lib/krb5/store_mem.c index 5c7cd17fb..0b150986f 100644 --- a/lib/krb5/store_mem.c +++ b/lib/krb5/store_mem.c @@ -93,6 +93,24 @@ mem_seek(krb5_storage *sp, off_t offset, int whence) return s->ptr - s->base; } +static ssize_t +mem_trunc(krb5_storage *sp, size_t offset) +{ + mem_storage *s = (mem_storage*)sp->data; + if(offset > s->size) + return ERANGE; + s->size = offset; + if ((s->ptr - s->base) > offset) + s->ptr = s->base + offset; + return 0; +} + +static krb5_error_code +mem_no_trunc(krb5_storage *sp, off_t offset) +{ + return EINVAL; +} + krb5_storage * KRB5_LIB_FUNCTION krb5_storage_from_mem(void *buf, size_t len) { @@ -114,6 +132,7 @@ krb5_storage_from_mem(void *buf, size_t len) sp->fetch = mem_fetch; sp->store = mem_store; sp->seek = mem_seek; + sp->trunc = mem_trunc; sp->free = NULL; return sp; } @@ -145,6 +164,7 @@ krb5_storage_from_readonly_mem(const void *buf, size_t len) sp->fetch = mem_fetch; sp->store = mem_no_store; sp->seek = mem_seek; + sp->trunc = mem_no_trunc; sp->free = NULL; return sp; }