===================================================================
RCS file: /cvsroot/amanda/amanda/server-src/taper.c,v
retrieving revision 1.47.2.15
retrieving revision 1.47.2.16
diff -u -r1.47.2.15 -r1.47.2.16
--- server-src/taper.c	2001/02/28 02:11:23	1.47.2.15
+++ server-src/taper.c	2001/03/09 19:28:24	1.47.2.16
@@ -143,7 +143,7 @@
 char *label = NULL;
 int filenum;
 char *errstr = NULL;
-int tape_fd;
+int tape_fd = -1;
 char *tapedev = NULL;
 static unsigned long malloc_hist_1, malloc_size_1;
 static unsigned long malloc_hist_2, malloc_size_2;
@@ -307,6 +307,7 @@
     char *q;
     int level, fd, data_port, data_socket, wpid;
     struct stat stat_file;
+    int tape_started;
 
     procname = "reader";
     syncpipe_init(rdpipe, wrpipe);
@@ -325,6 +326,7 @@
 
     taper_datestamp = newstralloc(taper_datestamp, argv[2]);
 
+    tape_started = 0;
     syncpipe_put('S');
     syncpipe_putstr(taper_datestamp);
 
@@ -334,6 +336,7 @@
     switch(tok) {
     case 'S':
 	putresult("TAPER-OK\n");
+	tape_started = 1;
 	/* start is logged in writer */
 	break;
     case 'E':
@@ -344,9 +347,8 @@
 	amfree(q);
 	log_add(L_ERROR,"no-tape [%s]", result);
 	amfree(result);
-	detach_buffers(buftable);
-	destroy_buffers();
-	exit(1);
+	syncpipe_put('e');			/* ACK error */
+	break;
     default:
 	error("expected 'S' or 'E' for START-TAPER, got '%c'", tok);
     }
@@ -356,6 +358,9 @@
     while(1) {
 	startclock();
 	cmd = getcmd(&argc, &argv);
+	if(cmd != QUIT && !tape_started) {
+	    error("error [file_reader_side cmd %d without tape ready]", cmd);
+	}
 	total_wait = timesadd(total_wait, stopclock());
 
 	switch(cmd) {
@@ -974,25 +979,39 @@
 	startclock();
 	tok = syncpipe_get();
 	idlewait = timesadd(idlewait, stopclock());
+	if(tok != 'S' && tok != 'Q' && !tape_started) {
+	    error("writer: token '%c' before start", tok);
+	}
 
 	switch(tok) {
 	case 'S':		/* start-tape */
-	    assert(!tape_started);
-	    tape_started = 1;
+	    if(tape_started) {
+		error("writer: multiple start requests");
+	    }
 	    str = syncpipe_getstr();
 	    if(!first_tape(str ? str : "bad-datestamp")) {
+		if(tape_fd >= 0) {
+		    tapefd_close(tape_fd);
+		    tape_fd = -1;
+		}
 		syncpipe_put('E');
 		syncpipe_putstr(errstr);
-		exit(1);
-	    }
-	    else
+		/* wait for reader to acknowledge error */
+		do {
+		    tok = syncpipe_get();
+		    if(tok != 'e') {
+			error("writer: got '%c' unexpectedly after error", tok);
+		    }
+		} while(tok != 'e');
+	    } else {
 		syncpipe_put('S');
+		tape_started = 1;
+	    }
 	    amfree(str);
 
 	    break;
 
 	case 'O':		/* open-output */
-	    assert(tape_started);
 	    write_file();
 	    break;
 
@@ -1032,6 +1051,7 @@
 	    }
 
 	    exit(0);
+
 	default:
 	    assert(0);
 	}
@@ -1801,7 +1821,7 @@
     }
 
 #ifdef HAVE_LINUX_ZFTAPE_H
-    if (is_zftape(tapedev) == 1){
+    if (tape_fd >= 0 && is_zftape(tapedev) == 1) {
 	/* rewind the tape */
 
 	if(tapefd_rewind(tape_fd) == -1 ) {
@@ -1922,7 +1942,7 @@
 
 common_exit:
 
-    if(tapefd_close(tape_fd) == -1 && ! writerror) {
+    if(tape_fd >= 0 && tapefd_close(tape_fd) == -1 && ! writerror) {
 	errstr = newstralloc2(errstr, "closing tape: ", strerror(errno));
 	rc = 1;
     }
