lpd,lpr: send/receive ACKs after filenames, not only after file bodies.

lpqr_main                                           1114    1149     +35
lpd_main                                             748     768     +20

diff --git a/printutils/lpd.c b/printutils/lpd.c
index 79119a4..43c2294 100644
--- a/printutils/lpd.c
+++ b/printutils/lpd.c
@@ -236,6 +236,9 @@
 				fd = xopen(queue, O_RDWR | O_APPEND);
 		}
 
+		// signal OK
+		safe_write(STDOUT_FILENO, "", 1);
+
 		// copy the file
 		real_len = bb_copyfd_size(STDIN_FILENO, fd, expected_len);
 		if (real_len != expected_len) {
@@ -243,7 +246,7 @@
 				expected_len, real_len);
 			goto err_exit;
 		}
-		// get ACK and see whether it is NUL (ok)
+		// get EOF indicator, see whether it is NUL (ok)
 		// (and don't trash s[0]!)
 		if (safe_read(STDIN_FILENO, &s[1], 1) != 1 || s[1] != 0) {
 			// don't send error msg to peer - it obviously
@@ -262,6 +265,9 @@
 
 		free(s);
 		close(fd); // NB: can do close(-1). Who cares?
+
+		// NB: don't do "signal OK" write here, it will be done
+		// at the top of the loop
 	} // while (1)
 
  err_exit:
diff --git a/printutils/lpr.c b/printutils/lpr.c
index 4f3b024..25cbcbc 100644
--- a/printutils/lpr.c
+++ b/printutils/lpr.c
@@ -149,6 +149,7 @@
 
 	// process files
 	do {
+		unsigned cflen;
 		int dfd;
 		struct stat st;
 		char *c;
@@ -194,23 +195,30 @@
 		);
 		// delete possible "\nX\n" patterns
 		c = controlfile;
+		cflen = (unsigned)strlen(controlfile);
 		while ((c = strchr(c, '\n')) != NULL) {
-			c++;
-			while (c[0] && c[1] == '\n')
-				memmove(c, c+2, strlen(c+1)); /* strlen(c+1) == strlen(c+2) + 1 */
+			if (c[1] && c[2] == '\n') {
+				/* can't use strcpy, results are undefined */
+				memmove(c, c+2, cflen - (c-controlfile) - 1);
+				cflen -= 2;
+			} else {
+				c++;
+			}
 		}
 
 		// send control file
 		if (opts & LPR_V)
 			bb_error_msg("sending control file");
+		/* "Acknowledgement processing must occur as usual
+		 * after the command is sent." */
+		fdprintf(fd, "\x2" "%u c%s\n", cflen, remote_filename);
+		get_response_or_say_and_die(fd, "sending control file");
 		/* "Once all of the contents have
 		 * been delivered, an octet of zero bits is sent as
 		 * an indication that the file being sent is complete.
 		 * A second level of acknowledgement processing
 		 * must occur at this point." */
-		fdprintf(fd, "\x2" "%u c%s\n" "%s" "%c",
-				(unsigned)strlen(controlfile),
-				remote_filename, controlfile, '\0');
+		full_write(fd, controlfile, cflen + 1); /* writes NUL byte too */
 		get_response_or_say_and_die(fd, "sending control file");
 
 		// send data file, with name "dfaXXX"
@@ -219,6 +227,7 @@
 		st.st_size = 0; /* paranoia: fstat may theoretically fail */
 		fstat(dfd, &st);
 		fdprintf(fd, "\x3" "%"OFF_FMT"u d%s\n", st.st_size, remote_filename);
+		get_response_or_say_and_die(fd, "sending data file");
 		if (bb_copyfd_size(dfd, fd, st.st_size) != st.st_size) {
 			// We're screwed. We sent less bytes than we advertised.
 			bb_error_msg_and_die("local file changed size?!");