/* * Send an Amanda dump header to the output file and set file->blocksize */ static ssize_t write_header( XferDestHolding *self, int fd) { char *buffer; size_t written; self->chunk_header->blocksize = HEADER_BLOCK_BYTES; if (debug_chunker > 1) dump_dumpfile_t((dumpfile_t *)self->chunk_header); buffer = build_header((dumpfile_t *)self->chunk_header, NULL, HEADER_BLOCK_BYTES); if (!buffer) /* this shouldn't happen */ error(_("header does not fit in %zd bytes"), (size_t)HEADER_BLOCK_BYTES); written = db_full_write(fd, buffer, HEADER_BLOCK_BYTES); g_free(buffer); if(written == HEADER_BLOCK_BYTES) return HEADER_BLOCK_BYTES; /* fake ENOSPC when we get a short write without errno set */ if(errno == 0) errno = ENOSPC; return (ssize_t)-1; }
/* * Send an Amanda dump header to the output file and set file->blocksize */ static ssize_t write_tapeheader( int outfd, dumpfile_t *file) { char *buffer; size_t written; file->blocksize = DISK_BLOCK_BYTES; if (debug_chunker > 1) dump_dumpfile_t(file); buffer = build_header(file, NULL, DISK_BLOCK_BYTES); if (!buffer) /* this shouldn't happen */ error(_("header does not fit in %zd bytes"), (size_t)DISK_BLOCK_BYTES); written = full_write(outfd, buffer, DISK_BLOCK_BYTES); amfree(buffer); if(written == DISK_BLOCK_BYTES) return 0; /* fake ENOSPC when we get a short write without errno set */ if(errno == 0) errno = ENOSPC; return (ssize_t)-1; }
int rename_tmp_holding( char * holding_file, int complete) { int fd; size_t buflen; char buffer[DISK_BLOCK_BYTES]; dumpfile_t file; char *filename; char *filename_tmp = NULL; memset(buffer, 0, sizeof(buffer)); filename = g_strdup(holding_file); while(filename != NULL && filename[0] != '\0') { g_free(filename_tmp); filename_tmp = g_strconcat(filename, ".tmp", NULL); if((fd = robust_open(filename_tmp,O_RDONLY, 0)) == -1) { dbprintf(_("rename_tmp_holding: open of %s failed: %s\n"),filename_tmp,strerror(errno)); amfree(filename); amfree(filename_tmp); return 0; } buflen = read_fully(fd, buffer, sizeof(buffer), NULL); close(fd); if(rename(filename_tmp, filename) != 0) { dbprintf(_("rename_tmp_holding: could not rename \"%s\" to \"%s\": %s"), filename_tmp, filename, strerror(errno)); } if (buflen <= 0) { dbprintf(_("rename_tmp_holding: %s: empty file?\n"), filename); amfree(filename); amfree(filename_tmp); return 0; } parse_file_header(buffer, &file, (size_t)buflen); if(complete == 0 ) { char * header; if((fd = robust_open(filename, O_RDWR, 0)) == -1) { dbprintf(_("rename_tmp_holdingX: open of %s failed: %s\n"), filename, strerror(errno)); dumpfile_free_data(&file); amfree(filename); amfree(filename_tmp); return 0; } file.is_partial = 1; if (debug_holding > 1) dump_dumpfile_t(&file); header = build_header(&file, NULL, DISK_BLOCK_BYTES); if (!header) /* this shouldn't happen */ error(_("header does not fit in %zd bytes"), (size_t)DISK_BLOCK_BYTES); if (full_write(fd, header, DISK_BLOCK_BYTES) != DISK_BLOCK_BYTES) { dbprintf(_("rename_tmp_holding: writing new header failed: %s"), strerror(errno)); dumpfile_free_data(&file); amfree(filename); amfree(filename_tmp); free(header); close(fd); return 0; } free(header); close(fd); } g_free(filename); filename = g_strdup(file.cont_filename); dumpfile_free_data(&file); } amfree(filename); amfree(filename_tmp); return 1; }