--- Unixsock.pm.orig	2013-01-30 22:01:00.000000000 +0000
+++ Unixsock.pm	2013-03-31 16:38:53.000000000 +0100
@@ -366,18 +366,7 @@
 	. _escape_argument ($identifier)
 	. $interval
 	. ' ' . _escape_argument ($values) . "\n";
-	_debug "-> $msg";
-	print $fh $msg;
-
-	$msg = <$fh>;
-	chomp ($msg);
-	_debug "<- $msg\n";
-
-	($status, $msg) = split (' ', $msg, 2);
-	return (1) if ($status == 0);
-
-	$obj->{'error'} = $msg;
-	return;
+	return $obj->_send_msg($msg);
 } # putval
 
 =item I<$res> = I<$obj>-E<gt>B<listval> ()
@@ -500,18 +489,7 @@
 	. join (' ', map { $_ . '=' . _escape_argument ($args{$_}) } (keys %args))
 	. "\n";
 
-	_debug "-> $msg";
-	print $fh $msg;
-
-	$msg = <$fh>;
-	chomp ($msg);
-	_debug "<- $msg\n";
-
-	($status, $msg) = split (' ', $msg, 2);
-	return (1) if ($status == 0);
-
-	$obj->{'error'} = $msg;
-	return;
+	return $obj->_send_msg($msg);
 } # putnotif
 
 =item I<$obj>-E<gt>B<flush> (B<timeout> =E<gt> I<$timeout>, B<plugins> =E<gt> [...], B<identifier>  =E<gt> [...]);
@@ -549,7 +527,6 @@
 
 	my $fh = $obj->{'sock'} or confess;
 
-	my $status = 0;
 	my $msg    = "FLUSH";
 
 	if (defined ($args{'timeout'}))
@@ -567,6 +544,7 @@
 
 	if ($args{'identifier'})
 	{
+		my $pre = $msg;
 		for (@{$args{'identifier'}})
 		{
 			my $identifier = $_;
@@ -585,13 +563,31 @@
 			{
 				return;
 			}
+			$ident_str = ' identifier=' . _escape_argument ($ident_str);
 
-			$msg .= ' identifier=' . _escape_argument ($ident_str);
+			if (length($msg)+length($ident_str) >= 1023) { #1024 - 1 byte for \n
+			    $obj->_send_msg($msg) or return;
+			    $msg = $pre;
+			};
+			$msg .= $ident_str;
 		}
 	}
+	return $obj->_send_msg($msg);
+}
 
-	$msg .= "\n";
-
+sub _send_msg 
+{
+	my $obj = shift;
+	my $msg = shift;
+	
+	my $fh = $obj->{'sock'} or confess;
+	my $status = 0;
+	
+	$msg .= "\n" unless $msg =~/\n$/;
+	
+	#1024 is default buffer size at unixsock.c us_handle_client()
+	warn "Collectd::Unixsock->_send_msg(\$msg): message is too long!" if length($msg) > 1024; 
+	
 	_debug "-> $msg";
 	print $fh $msg;
 
