int ndmca_test_tape_write (struct ndm_session *sess, ndmp9_error expect_err, char *buf, unsigned count) { struct ndmconn * conn = sess->plumb.tape; int rc; /* close previous test if there is one */ ndmca_test_close (sess); rc = ndmca_tape_write (sess, buf, count); rc = ndmca_test_check_expect (conn, rc, expect_err); return rc; }
/* * type is either 'm' or 'V', see above */ int ndmca_media_write_label (struct ndm_session *sess, int type, char labbuf[]) { int rc; char buf[512]; char * p; ndmalogf (sess, 0, 1, "Writing tape label '%s' type=%c", labbuf, type); for (p = buf; p < &buf[512]; p++) *p = '#'; for (p = buf+63; p < &buf[512]; p += 64) *p = '\n'; snprintf (buf, sizeof(buf), "##ndmjob -%c %s", type, labbuf); for (p = buf; *p; p++) continue; *p++ = '\n'; rc = ndmca_tape_write (sess, buf, 512); return rc; }
/* * Precedes tt_read() so that we can make a "known" tape. */ int ndmca_tt_write (struct ndm_session *sess) { int rc; unsigned n_rec; unsigned recsize; unsigned fileno, recno; char * what; char note[128]; char buf[64*1024]; ndmca_test_phase (sess, "T-WRITE", "Tape Write Series"); rc = ndmca_test_tape_open(sess,NDMP9_NO_ERR,0,NDMP9_TAPE_RDWR_MODE); if (rc) return rc; for (fileno = 0; tt_series[fileno].n_rec > 0; fileno++) { n_rec = tt_series[fileno].n_rec; recsize = tt_series[fileno].recsize; sprintf (note, "Write tape file %d", fileno+1); ndmca_test_open (sess, note, 0); sprintf (note, "file #%d, %d records, %d bytes/rec", fileno+1, n_rec, recsize); ndmca_test_log_note (sess, 2, note); for (recno = 0; recno < n_rec; recno++) { ndmca_test_fill_data (buf, recsize, recno, fileno); what = "write"; rc = ndmca_tape_write (sess, buf, recsize); if (rc) goto fail; CHECK_FILENO_RECNO ("write", fileno, recno+1); } what = "write filemark"; rc = ndmca_tape_mtio (sess, NDMP9_MTIO_EOF, 1, 0); if (rc) goto fail; CHECK_FILENO_RECNO ("wfm", fileno+1, 0); /* no test calls so the file operation is the test */ sprintf (buf, "Passed tape write %s", note); ndmca_test_log_step (sess, 2, buf); } rc = ndmca_test_tape_mtio (sess, NDMP9_NO_ERR, NDMP9_MTIO_REW, 1, 0); if (rc) return rc; rc = ndmca_test_tape_close (sess, NDMP9_NO_ERR); if (rc) return rc; return 0; fail: sprintf (buf, "Failed %s recno=%d; %s", what, recno, note); ndmca_test_fail (sess, buf); return -1; }
/* * Precedes tt_basic_read() so that we can make a "known" tape. */ int ndmca_tt_basic_write (struct ndm_session *sess) { int rc, ix; char buf[1024]; ndmp9_error expect_errs[5]; ndmca_test_phase (sess, "T-BW", "Tape Write Basics"); rc = ndmca_test_tape_write (sess, NDMP9_DEV_NOT_OPEN_ERR, buf, 1024); if (rc) return rc; /* * Write w/ read-only open mode */ rc = ndmca_test_tape_open(sess,NDMP9_NO_ERR,0,NDMP9_TAPE_READ_MODE); if (rc) return rc; rc = ndmca_test_tape_write (sess, NDMP9_PERMISSION_ERR, buf, 1024); if (rc) return rc; rc = ndmca_test_tape_mtio (sess, NDMP9_NO_ERR, NDMP9_MTIO_REW, 1, 0); if (rc) return rc; rc = ndmca_test_tape_close (sess, NDMP9_NO_ERR); if (rc) return rc; /* * Write w/ bogus lengths */ rc = ndmca_test_tape_open(sess,NDMP9_NO_ERR,0,NDMP9_TAPE_RDWR_MODE); if (rc) return rc; /* OPEN Question: what does len==0 mean? */ /* write/len=0 MUST be NDMP[234]_NO_ERR or NDMP[234]_ILLEGAL_ARGS */ /* write/len=0 MUST be NDMP4_NO_ERR */ ix = 0; if (sess->plumb.tape->protocol_version < 5) { expect_errs[ix++] = NDMP9_ILLEGAL_ARGS_ERR; } expect_errs[ix++] = NDMP9_NO_ERR; expect_errs[ix++] = -1; rc = ndmca_tape_write (sess, buf, 0); rc = ndmca_test_check_expect_errs (sess->plumb.tape, rc, expect_errs); if (rc) return rc; rc = ndmca_test_tape_mtio (sess, NDMP9_NO_ERR, NDMP9_MTIO_REW, 1, 0); if (rc) return rc; rc = ndmca_test_tape_close (sess, NDMP9_NO_ERR); if (rc) return rc; /* * TODO: bogus length */ /* * Write works */ rc = ndmca_test_tape_open(sess,NDMP9_NO_ERR,0,NDMP9_TAPE_RDWR_MODE); if (rc) return rc; rc = ndmca_test_tape_write (sess, NDMP9_NO_ERR, buf, 1024); if (rc) return rc; rc = ndmca_test_tape_mtio (sess, NDMP9_NO_ERR, NDMP9_MTIO_EOF, 1, 0); if (rc) return rc; rc = ndmca_test_tape_mtio (sess, NDMP9_NO_ERR, NDMP9_MTIO_REW, 1, 0); if (rc) return rc; rc = ndmca_test_tape_close (sess, NDMP9_NO_ERR); if (rc) return rc; return 0; /* pass */ }