]> git.ipfire.org Git - thirdparty/opentracker.git/commitdiff
make ot_iovecs fix last interface more sane, also add a convenience function that...
authorerdgeist <>
Fri, 23 Nov 2007 18:12:50 +0000 (18:12 +0000)
committererdgeist <>
Fri, 23 Nov 2007 18:12:50 +0000 (18:12 +0000)
ot_iovec.c
ot_iovec.h

index a098733a1a784f66c49a165ea12df6b970d93aa0..f71d4d70a527ca337b5586d72b78fd6a635e2ccc 100644 (file)
@@ -34,23 +34,36 @@ void iovec_free( int *iovec_entries, struct iovec **iovector ) {
   *iovec_entries = 0;
 }
 
-void  iovec_fixlast( int *iovec_entries, struct iovec **iovector, size_t new_alloc ) {
+void  iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr ) {
   int page_size = getpagesize();
-  size_t old_alloc, old_pages, new_pages;
+  size_t old_alloc, new_alloc, old_pages, new_pages;
+  char * base = (char*)((*iovector)[ *iovec_entries - 1 ]).iov_base;
 
   if( !*iovec_entries ) return;
 
   old_alloc = ((*iovector)[ *iovec_entries - 1 ]).iov_len;
+  new_alloc = ((char*)last_ptr) - base;
   old_pages = 1 + old_alloc / page_size;
   new_pages = 1 + new_alloc / page_size;
 
   if( old_pages != new_pages ) {
-    munmap( ((char*)((*iovector)[ *iovec_entries - 1 ]).iov_base ) +  new_pages * page_size,
-            old_alloc - new_pages * page_size );
+    munmap( base + new_pages * page_size, old_alloc - new_pages * page_size );
   }
   ((*iovector)[*iovec_entries - 1 ]).iov_len = new_alloc;
 }
 
+void  *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc ) {
+  void *new_ptr;
+
+  iovec_fixlast( iovec_entries, iovector, last_ptr );
+
+  if( !( new_ptr = iovec_increase( iovec_entries, iovector, new_alloc ) ) )
+    iovec_free( iovec_entries, iovector );
+
+  return new_ptr;
+}
+
+
 size_t iovec_length( int *iovec_entries, struct iovec **iovector ) {
   size_t length = 0;
   int i;
index a2d329d90dff1228c7d03a3750b44ce35781b95e..d52a167658a721b216f302b686a5795caeb6a80c 100644 (file)
@@ -7,8 +7,11 @@
 #include <sys/uio.h>
 
 void  *iovec_increase( int *iovec_entries, struct iovec **iovector, size_t new_alloc );
-void   iovec_fixlast( int *iovec_entries, struct iovec **iovector, size_t new_alloc );
+void   iovec_fixlast( int *iovec_entries, struct iovec **iovector, void *last_ptr );
 void   iovec_free( int *iovec_entries, struct iovec **iovector );
+
 size_t iovec_length( int *iovec_entries, struct iovec **iovector );
 
+void  *iovec_fix_increase_or_free( int *iovec_entries, struct iovec **iovector, void *last_ptr, size_t new_alloc );
+
 #endif