Add krb5_storage_truncate
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24226 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -39,6 +39,7 @@ struct krb5_storage_data { | |||||||
|     ssize_t (*fetch)(struct krb5_storage_data*, void*, size_t); |     ssize_t (*fetch)(struct krb5_storage_data*, void*, size_t); | ||||||
|     ssize_t (*store)(struct krb5_storage_data*, const void*, size_t); |     ssize_t (*store)(struct krb5_storage_data*, const void*, size_t); | ||||||
|     off_t (*seek)(struct krb5_storage_data*, off_t, int); |     off_t (*seek)(struct krb5_storage_data*, off_t, int); | ||||||
|  |     int (*trunc)(struct krb5_storage_data*, off_t); | ||||||
|     void (*free)(struct krb5_storage_data*); |     void (*free)(struct krb5_storage_data*); | ||||||
|     krb5_flags flags; |     krb5_flags flags; | ||||||
|     int eof_code; |     int eof_code; | ||||||
|   | |||||||
| @@ -104,6 +104,29 @@ emem_seek(krb5_storage *sp, off_t offset, int whence) | |||||||
|     return s->ptr - s->base; |     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 | static void | ||||||
| emem_free(krb5_storage *sp) | emem_free(krb5_storage *sp) | ||||||
| { | { | ||||||
| @@ -142,6 +165,7 @@ krb5_storage_emem(void) | |||||||
|     sp->fetch = emem_fetch; |     sp->fetch = emem_fetch; | ||||||
|     sp->store = emem_store; |     sp->store = emem_store; | ||||||
|     sp->seek = emem_seek; |     sp->seek = emem_seek; | ||||||
|  |     sp->trunc = emem_trunc; | ||||||
|     sp->free = emem_free; |     sp->free = emem_free; | ||||||
|     return sp; |     return sp; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -60,6 +60,12 @@ fd_seek(krb5_storage * sp, off_t offset, int whence) | |||||||
|     return lseek(FD(sp), offset, 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 | static void | ||||||
| fd_free(krb5_storage * sp) | fd_free(krb5_storage * sp) | ||||||
| { | { | ||||||
| @@ -93,6 +99,7 @@ krb5_storage_from_fd(int fd) | |||||||
|     sp->fetch = fd_fetch; |     sp->fetch = fd_fetch; | ||||||
|     sp->store = fd_store; |     sp->store = fd_store; | ||||||
|     sp->seek = fd_seek; |     sp->seek = fd_seek; | ||||||
|  |     sp->trunc = fd_trunc; | ||||||
|     sp->free = fd_free; |     sp->free = fd_free; | ||||||
|     return sp; |     return sp; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -93,6 +93,24 @@ mem_seek(krb5_storage *sp, off_t offset, int whence) | |||||||
|     return s->ptr - s->base; |     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 * KRB5_LIB_FUNCTION | ||||||
| krb5_storage_from_mem(void *buf, size_t len) | 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->fetch = mem_fetch; | ||||||
|     sp->store = mem_store; |     sp->store = mem_store; | ||||||
|     sp->seek = mem_seek; |     sp->seek = mem_seek; | ||||||
|  |     sp->trunc = mem_trunc; | ||||||
|     sp->free = NULL; |     sp->free = NULL; | ||||||
|     return sp; |     return sp; | ||||||
| } | } | ||||||
| @@ -145,6 +164,7 @@ krb5_storage_from_readonly_mem(const void *buf, size_t len) | |||||||
|     sp->fetch = mem_fetch; |     sp->fetch = mem_fetch; | ||||||
|     sp->store = mem_no_store; |     sp->store = mem_no_store; | ||||||
|     sp->seek = mem_seek; |     sp->seek = mem_seek; | ||||||
|  |     sp->trunc = mem_no_trunc; | ||||||
|     sp->free = NULL; |     sp->free = NULL; | ||||||
|     return sp; |     return sp; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand