* Authors: the Amanda Development Team. Its members are listed in a
* file named AUTHORS, in the root directory of this distribution.
*/
-/* $Id: taper.c,v 1.144.2.7 2007/01/18 12:57:16 martinea Exp $
+/* $Id: taper.c,v 1.144 2006/08/24 11:23:32 martinea Exp $
*
* moves files from holding disk to tape, or from a socket to tape
*/
#include <sys/mman.h>
#endif
+#define taper_debug(i,x) do { \
+ if ((i) <= debug_taper) { \
+ dbprintf(x); \
+ } \
+} while (0)
+
#ifdef HAVE_LIBVTBLC
#include <vtblc.h>
#include <strings.h>
#include <math.h>
-
static int vtbl_no = -1;
static int len = 0;
static int offset = 0;
} vtbl_lbls;
static vtbl_lbls vtbl_entry[MAX_VOLUMES];
#endif /* HAVE_LIBVTBLC */
+
/*
* XXX update stat collection/printing
* XXX advance to next tape first in next_tape
int interactive;
pid_t writerpid;
times_t total_wait;
-#ifdef TAPER_DEBUG
-int bufdebug = 1;
-#else
-int bufdebug = 0;
-#endif
char *buffers = NULL;
buffer_t *buftable = NULL;
malloc_size_1 = malloc_inuse(&malloc_hist_1);
- parse_server_conf(main_argc, main_argv, &new_argc, &new_argv);
+ parse_conf(main_argc, main_argv, &new_argc, &new_argv);
my_argc = new_argc;
my_argv = new_argv;
}
tapedev = getconf_str(CNF_TAPEDEV);
+ if (tapedev != NULL)
+ tapedev = stralloc(tapedev);
tapetype = getconf_str(CNF_TAPETYPE);
tt = lookup_tapetype(tapetype);
#ifdef HAVE_LIBVTBLC
if ((buffers = attach_buffers(size)) != NULL) {
break;
}
- log_add(L_INFO, "attach_buffers: (%d tapebuf%s: %zu bytes) %s",
+ log_add(L_INFO, "attach_buffers: (%d tapebuf%s: " SIZE_T_FMT " bytes) %s",
conf_tapebufs,
(conf_tapebufs == 1) ? "" : "s",
size,
/*NOTREACHED*/
}
splitsize = OFF_T_ATOI(cmdargs.argv[a++]);
+ if (SIZEOF_OFF_T == 4 && splitsize > 1048576) { /* 1G in 32 bits */
+ splitsize = 1048576;
+ }
if (a >= cmdargs.argc) {
error("error [taper PORT-WRITE: not enough args: split_diskbuffer]");
}
/* Must fit in memory... */
fallback_splitsize = (size_t)atoi(cmdargs.argv[a++]);
+ if (SIZEOF_OFF_T == 4 && fallback_splitsize > 1048576) { /* 1G */
+ fallback_splitsize = 1048576;
+ }
if (a != cmdargs.argc) {
error("error [taper file_reader_side PORT-WRITE: too many args: %d != %d]",
free_split_buffer();
amfree(datestamp);
clear_tapelist();
- free_server_config();
amfree(taper_timestamp);
amfree(label);
amfree(errstr);
memcpy(&cur_holdfile, save_holdfile, SIZEOF(dumpfile_t));
}
- if (bufdebug) {
- fprintf(stderr, "taper: r: start file\n");
- fflush(stderr);
- }
+ taper_debug(1, ("taper: r: start file\n"));
for (bp = buftable; bp < buftable + conf_tapebufs; bp++) {
bp->status = EMPTY;
}
bp = buftable;
- if (interactive || bufdebug)
+ if (interactive || debug_taper >= 1)
dumpstatus(bp);
if ((cur_span_chunkstart >= (off_t)0) && (splitsize > (off_t)0)) {
break;
case 'R':
- if (bufdebug) {
- fprintf(stderr, "taper: r: got R%d\n", bufnum);
- fflush(stderr);
- }
+ taper_debug(1, ("taper: r: got R%d\n", bufnum));
if (need_closing) {
if (syncpipe_put('C', 0) == -1) {
bp->status = FILLING;
buflen = header_read ? (size_t)tt_blocksize : DISK_BLOCK_BYTES;
- if (interactive || bufdebug)
+ if (interactive || debug_taper >= 1)
dumpstatus(bp);
if (header_written == 0 &&
(header_read == 1 || cur_span_chunkstart > (off_t)0)) {
}
memcpy(&cur_holdfile, &file, SIZEOF(dumpfile_t));
- if (interactive || bufdebug)
+ if (interactive || debug_taper >= 1)
dumpstatus(bp);
bp->size = (ssize_t)tt_blocksize;
rc = (ssize_t)tt_blocksize;
/* add CONT_FILENAME back to in-memory header */
strncpy(file.cont_filename, cont_filename,
SIZEOF(file.cont_filename));
- if (interactive || bufdebug)
+ if (interactive || debug_taper >= 1)
dumpstatus(bp);
bp->size = (ssize_t)tt_blocksize; /* output a full tape block */
/* save the header, we'll need it if we jump tapes */
filesize = kbytesread;
}
- if (bufdebug) {
- fprintf(stderr,"taper: r: put W%d\n",(int)(bp-buftable));
- fflush(stderr);
- }
+ taper_debug(1, ("taper: r: put W%d\n",
+ (int)(bp-buftable)));
if (syncpipe_put('W', (int)(bp-buftable)) == -1) {
put_syncpipe_fault_result(handle);
return (-1);
return(0);
if (adj_splitsize <= (off_t)0) {
- error("Split size must be > " OFF_T_FMT "k",
- (OFF_T_FMT_TYPE)(DISK_BLOCK_BYTES/1024));
+ error("Split size must be > " OFF_T_FMT "k",
+ (OFF_T_FMT_TYPE)(DISK_BLOCK_BYTES/1024));
/*NOTREACHED*/
}
if (expected_splits != 0)
return(expected_splits);
- total_kb = size_holding_files(filename, 1);
+ total_kb = holding_file_size(filename, 1);
if (total_kb <= (off_t)0) {
- fprintf(stderr, "taper: r: " OFF_T_FMT
- " kb holding file makes no sense, not precalculating splits\n",
+ fprintf(stderr, "taper: r: " OFF_T_FMT
+ " kb holding file makes no sense, setting splitsize to 0\n",
(OFF_T_FMT_TYPE)total_kb);
- fflush(stderr);
- return(0);
+ fflush(stderr);
+ splitsize = 0; /* disabling split */
+ return(0);
}
fprintf(stderr, "taper: r: Total dump size should be " OFF_T_FMT
case 'Q':
end_tape(0); /* XXX check results of end tape ?? */
clear_tapelist();
- free_server_config();
amfree(taper_timestamp);
amfree(label);
amfree(errstr);
full_buffers = 0;
tok = '?';
- if (bufdebug) {
- fprintf(stderr, "taper: w: start file\n");
- fflush(stderr);
- }
+ taper_debug(1, ("taper: w: start file\n"));
/*
* Tell the reader that the tape is open, and give it all the buffers.
/*NOTREACHED*/
}
for (i = 0; i < conf_tapebufs; i++) {
- if (bufdebug) {
- fprintf(stderr, "taper: w: put R%d\n", i);
- fflush(stderr);
- }
+ taper_debug(1, ("taper: w: put R%d\n", i));
if (syncpipe_put('R', i) == -1) {
error("writer: Syncpipe failure readying write buffers");
/*NOTREACHED*/
}
if (tok != 'W')
break;
- if (bufdebug) {
- fprintf(stderr,"taper: w: got W%d\n",bufnum);
- fflush(stderr);
- }
+ taper_debug(1, ("taper: w: got W%d\n",bufnum));
full_buffers++;
}
rdwait = timesadd(rdwait, stopclock());
}
if (tok == 'W') {
- if (bufdebug) {
- fprintf(stderr,"taper: w: got W%d\n",bufnum);
- fflush(stderr);
- }
+ taper_debug(1, ("taper: w: got W%d\n",bufnum));
if(bufnum != (int)(bp - buftable)) {
fprintf(stderr,
"taper: tape-writer: my buf %d reader buf %d\n",
return;
tape_error:
+ if (errstr)
+ dbprintf(("tape_error: %s\n", errstr));
/* got tape error */
if (next_tape(1)) {
if (syncpipe_put('T', 0) == -1) { /* next tape in place, try again */
total_writes += 1;
total_tape_used += (off_t)rc;
bp->status = EMPTY;
- if (interactive || bufdebug)
+ if (interactive || debug_taper >= 1)
dumpstatus(bp);
if (interactive)
fputs("W", stderr);
- if (bufdebug) {
- fprintf(stderr, "taper: w: put R%d\n", (int)(bp-buftable));
- fflush(stderr);
- }
+ taper_debug(1, ("taper: w: put R%d\n", (int)(bp-buftable)));
if (syncpipe_put('R', (int)(bp-buftable)) == -1) {
error("writer: Syncpipe failure during advancing write bufffer");
/*NOTREACHED*/
return (-1);
}
- if (bufdebug && *buf != 'R' && *buf != 'W') {
- fprintf(stderr,"taper: %c: getc %c\n", *procname, *buf);
- fflush(stderr);
+ if (debug_taper >= 1 && *buf != 'R' && *buf != 'W') {
+ taper_debug(1, ("taper: %c: getc %c\n", *procname, *buf));
}
memcpy(intp, &buf[1], SIZEOF(int));
buf[0] = (char)chi;
memcpy(&buf[1], &intval, SIZEOF(int));
- if (bufdebug && buf[0] != 'R' && buf[0] != 'W') {
- fprintf(stderr,"taper: %c: putc %c\n",*procname,buf[0]);
- fflush(stderr);
+ if (debug_taper >= 1 && buf[0] != 'R' && buf[0] != 'W') {
+ taper_debug(1, ("taper: %c: putc %c\n",*procname,buf[0]));
}
rc = fullwrite(putpipe, buf, SIZEOF(buf));
char *error_msg = NULL;
char *s, *r;
int slot = -1;
+ int scan_result;
amfree(label);
amfree(tapedev);
- if (taper_scan(NULL, &label, ×tamp, &tapedev, CHAR_taperscan_output_callback, &error_msg) < 0) {
+ if ((scan_result = taper_scan(NULL, &label, ×tamp, &tapedev, CHAR_taperscan_output_callback, &error_msg)) < 0) {
fprintf(stderr, "%s\n", error_msg);
errstr = error_msg;
error_msg = NULL;
return 0;
}
amfree(timestamp);
+
if(error_msg) {
s = error_msg; r = NULL;
while((s=strstr(s,"slot "))) { s += 5; r=s; };
return 0;
}
- if(slot > -1) {
- fprintf(stderr, "taper: slot: %d wrote label `%s' date `%s'\n", slot,
- label, taper_timestamp);
- }
- else {
- fprintf(stderr, "taper: wrote label `%s' date `%s'\n", label,
- taper_timestamp);
+ /* Output a description of what we just did. A result of '3' from taper_scan
+ * means that a new tape was found and will be labeled. */
+ if (slot > -1) {
+ fprintf(stderr, _("taper: slot: %d wrote label `%s' date `%s'\n"), slot, label, taper_timestamp);
+ if (scan_result == 3)
+ log_add(L_INFO, _("Wrote new label `%s' to new (non-amanda) tape in slot %d"), label, slot);
+ } else {
+ fprintf(stderr, _("taper: wrote label `%s' date `%s'\n"), label, taper_timestamp);
+ if (scan_result == 3)
+ log_add(L_INFO, _("Wrote new label `%s' to new (non-amanda) tape"), label);
}
fflush(stderr);