1 /* This software was written by Dirk Engling <erdgeist@erdgeist.org>
2 It is considered beerware. Prost. Skol. Cheers or whatever.
17 void *iovec_increase( int *iovec_entries
, struct iovec
**iovector
, size_t new_alloc
) {
19 int new_entries
= 1 + *iovec_entries
;
20 struct iovec
*new_vec
= realloc( *iovector
, new_entries
* sizeof( struct iovec
) );
25 /* Only allocate after we have a place to store the pointer */
26 new_data
= malloc( new_alloc
);
30 new_vec
[new_entries
- 1].iov_base
= new_data
;
31 new_vec
[new_entries
- 1].iov_len
= new_alloc
;
38 void *iovec_append( int *iovec_entries
, struct iovec
**iovector
, struct iovec
*append_iovector
) {
39 int new_entries
= *iovec_entries
+ 1;
40 struct iovec
*new_vec
= realloc( *iovector
, new_entries
* sizeof( struct iovec
) );
44 /* Take over data from appended iovec */
45 new_vec
[*iovec_entries
].iov_base
= append_iovector
->iov_base
;
46 new_vec
[*iovec_entries
].iov_len
= append_iovector
->iov_len
;
48 append_iovector
->iov_base
= NULL
;
49 append_iovector
->iov_len
= 0;
52 *iovec_entries
= new_entries
;
58 void iovec_free( int *iovec_entries
, struct iovec
**iovector
) {
60 for( i
=0; i
<*iovec_entries
; ++i
)
61 free( ((*iovector
)[i
]).iov_base
);
66 void iovec_fixlast( int *iovec_entries
, struct iovec
**iovector
, void *last_ptr
) {
67 if( *iovec_entries
) {
68 char * base
= (char*)((*iovector
)[ *iovec_entries
- 1 ]).iov_base
;
69 size_t new_alloc
= ((char*)last_ptr
) - base
;
71 ((*iovector
)[*iovec_entries
- 1 ]).iov_base
= realloc( base
, new_alloc
);
72 ((*iovector
)[*iovec_entries
- 1 ]).iov_len
= new_alloc
;
76 void *iovec_fix_increase_or_free( int *iovec_entries
, struct iovec
**iovector
, void *last_ptr
, size_t new_alloc
) {
79 iovec_fixlast( iovec_entries
, iovector
, last_ptr
);
81 if( !( new_data
= iovec_increase( iovec_entries
, iovector
, new_alloc
) ) )
82 iovec_free( iovec_entries
, iovector
);
87 size_t iovec_length( const int *iovec_entries
, const struct iovec
**iovector
) {
90 for( i
=0; i
<*iovec_entries
; ++i
)
91 length
+= ((*iovector
)[i
]).iov_len
;
95 const char *g_version_iovec_c
= "$Source$: $Revision$\n";