From 639aaf1f240adb3b328c57fc2cbdd906b44c29e0 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@systemlinux.org>
Date: Mon, 1 Oct 2007 23:34:39 +0200
Subject: [PATCH] com_add(): Always check the return value of send_va_buffer().

And abort on send errors.
---
 aft.c | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/aft.c b/aft.c
index 99b132dd..cbea5eb1 100644
--- a/aft.c
+++ b/aft.c
@@ -1566,8 +1566,13 @@ static int add_one_audio_file(const char *arg, const void *private_data)
 	if (ret < 0)
 		goto out_free;
 	ret = guess_audio_format(path);
-	if (ret < 0 && !(pad->flags & ADD_FLAG_ALL))
+	if (ret < 0 && !(pad->flags & ADD_FLAG_ALL)) {
+		if (pad->flags & ADD_FLAG_VERBOSE)
+			ret = send_va_buffer(pad->fd, "%s: %s\n",
+				PARA_STRERROR(-ret), path);
+		ret = 1;
 		goto out_free;
+	}
 	query.data = path;
 	query.size = strlen(path) + 1;
 	ret = send_callback_request(path_brother_callback, &query, &result);
@@ -1618,8 +1623,11 @@ static int add_one_audio_file(const char *arg, const void *private_data)
 		format_num = ret;
 		afhi_ptr = &afhi;
 	}
-	if (pad->flags & ADD_FLAG_VERBOSE)
-		send_va_buffer(pad->fd, "adding %s\n", path);
+	if (pad->flags & ADD_FLAG_VERBOSE) {
+		ret = send_va_buffer(pad->fd, "adding %s\n", path);
+		if (ret < 0)
+			goto out_unmap;
+	}
 	munmap(map.data, map.size);
 	save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj);
 	/* Ask afs to consider this entry for adding. */
@@ -1629,14 +1637,15 @@ static int add_one_audio_file(const char *arg, const void *private_data)
 out_unmap:
 	munmap(map.data, map.size);
 out_free:
-	if (ret < 0)
+	if (ret < 0 && ret != -E_SEND)
 		send_va_buffer(pad->fd, "failed to add %s (%s)\n", path?
 			path : arg, PARA_STRERROR(-ret));
 	free(obj.data);
 	free(path);
 	if (afhi_ptr)
 		free(afhi_ptr->chunk_table);
-	return 1; /* it's not an error if not all files could be added */
+	/* it's not an error if not all files could be added */
+	return ret == -E_SEND? ret : 1;
 }
 
 int com_add(int fd, int argc, char * const * const argv)
@@ -1681,12 +1690,18 @@ int com_add(int fd, int argc, char * const * const argv)
 		if (ret < 0)
 			PARA_NOTICE_LOG("failed to stat %s (%s)", path,
 				strerror(errno));
-		else
+		else {
 			if (S_ISDIR(statbuf.st_mode))
-				for_each_file_in_dir(path, add_one_audio_file,
+				ret = for_each_file_in_dir(path, add_one_audio_file,
 					&pad);
 			else
-				add_one_audio_file(path, &pad);
+				ret = add_one_audio_file(path, &pad);
+			if (ret < 0) {
+				send_va_buffer(fd, "%s: %s\n", path, PARA_STRERROR(-ret));
+				free(path);
+				return ret;
+			}
+		}
 		free(path);
 	}
 	ret = 1;
-- 
2.39.5