diff options
Diffstat (limited to 'security/zoneminder/patches/patch-src_zmf_cpp')
-rw-r--r-- | security/zoneminder/patches/patch-src_zmf_cpp | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/security/zoneminder/patches/patch-src_zmf_cpp b/security/zoneminder/patches/patch-src_zmf_cpp deleted file mode 100644 index b5e0b2db76b..00000000000 --- a/security/zoneminder/patches/patch-src_zmf_cpp +++ /dev/null @@ -1,89 +0,0 @@ -$NetBSD: patch-src_zmf_cpp,v 1.2 2013/03/24 16:47:47 joerg Exp $ - -http://www.zoneminder.com/wiki/index.php/1.24.2_Patches - -Fix Incomplete Image errors in zmf - -This patch changes the socket reader in zmf from a single read, to a loop -read. Incomplete reads would be reported even though the image writer wrote -the whole image to the socket. The problem was when the read went to read the -image frame from the socket, all the data had not yet been written to the -socket by the writer, so the reader thought there was a problem. The loop -reads from the socket until a full image frame is read, or there is an error. - ---- src/zmf.cpp.orig 2011-06-21 09:19:11.000000000 +0000 -+++ src/zmf.cpp -@@ -231,16 +231,39 @@ int main( int argc, char *argv[] ) - } - Debug( 1, "Read frame header, expecting %ld bytes of image", frame_header.image_length ); - static unsigned char image_data[ZM_MAX_IMAGE_SIZE]; -- n_bytes = read( sd, image_data, frame_header.image_length ); -- if ( n_bytes != (ssize_t)frame_header.image_length ) -+ -+ // Read for pipe and loop until bytes expected have been read or an error occures -+ int bytes_read = 0; -+ do - { -- if ( n_bytes < 0 ) -+ n_bytes = read( sd, image_data+bytes_read, frame_header.image_length-bytes_read ); -+ if (n_bytes < 0) break; // break on error -+ if (n_bytes < frame_header.image_length) - { -- Error( "Can't read frame image data: %s", strerror(errno) ); -+ // print some informational messages -+ if (bytes_read == 0) -+ { -+ Warning("Image read : Short read %d bytes of %d expected bytes",n_bytes,frame_header.image_length); -+ } -+ else if (bytes_read+n_bytes == frame_header.image_length) -+ { -+ Warning("Image read : Read rest of short read: %d bytes read total of %d bytes",n_bytes,frame_header.image_length); -+ } -+ else -+ { -+ Warning("Image read : continuing, read %d bytes (%d so far)", n_bytes, bytes_read+n_bytes); -+ } - } -- else if ( n_bytes > 0 ) -+ bytes_read+= n_bytes; -+ } while (n_bytes>0 && (bytes_read < (ssize_t)frame_header.image_length) ); -+ -+ // Print errors if there was a problem -+ if ( n_bytes < 1 ) -+ { -+ Error( "Only read %d bytes of %d\n", bytes_read, frame_header.image_length); -+ if ( n_bytes < 0 ) - { -- Error( "Incomplete read of frame image data, %d bytes only", n_bytes ); -+ Error( "Can't read frame image data: %s", strerror(errno) ); - } - else - { -@@ -249,16 +272,18 @@ int main( int argc, char *argv[] ) - ReopenSocket( sd, monitor->Id() ); - continue; - } -+ - static char subpath[PATH_MAX] = ""; -- if ( config.use_deep_storage ) -- { -- struct tm *time = localtime( &frame_header.event_time ); -- snprintf( subpath, sizeof(subpath), "%02d/%02d/%02d/%02d/%02d/%02d", time->tm_year-100, time->tm_mon+1, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec ); -- } -- else -- { -- snprintf( subpath, sizeof(subpath), "%ld", frame_header.event_id ); -- } -+ if ( config.use_deep_storage ) -+ { -+ struct tm *time = localtime( &frame_header.event_time ); -+ snprintf( subpath, sizeof(subpath), "%02d/%02d/%02d/%02d/%02d/%02d", time->tm_year-100, time->tm_mon+1, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec ); -+ } -+ else -+ { -+ snprintf( subpath, sizeof(subpath), "%ld", frame_header.event_id ); -+ } -+ - static char path[PATH_MAX] = ""; - snprintf( path, sizeof(path), frame_header.alarm_frame?anal_path:capt_path, subpath, frame_header.frame_id ); - Debug( 1, "Got image, writing to %s", path ); |