Exemplo n.º 1
0
static void setup_bad_read(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore :");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
	asfd_mock_read(asfd, &r, -1, CMD_GEN, "blah");
}
Exemplo n.º 2
0
static void setup_asfds_happy_path_one_blk_per_file_no_dedup_interrupt(
	struct asfd *asfd, struct asfd *chfd, struct slist *slist)
{
	int ar=0, aw=0, cr=0, cw=0;

	setup_writes_from_slist(asfd, &aw, slist);
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "requests_end");
	asfd_mock_read_no_op(asfd, &ar, 30);
	setup_reads_from_slist(asfd, &ar, slist, 1, 2 /* interrupt */);
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "sigs_end");

	setup_writes_from_slist_blk_requests(asfd,
		&aw, slist, 1, 2 /* interrupt */);
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "blk_requests_end");
	asfd_mock_read_no_op(asfd, &ar, 60);
	setup_reads_from_slist_blks(asfd, &ar, slist, 1, 2 /* interrupt */);
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "backup_end");

	setup_chfd_writes_from_slist(chfd, &cw, slist, 1, 2 /* interrupt */);
	asfd_mock_read_no_op(chfd, &cr, 60);
	setup_chfd_reads_from_slist_blks_not_got(chfd,
		&cr, slist, 1, 2 /* interrupt */);
	asfd_mock_read_no_op(chfd, &cr, 60);
	asfd_assert_write(chfd, &cw, 0, CMD_GEN, "sigs_end");
}
Exemplo n.º 3
0
static void setup_multiline_json(struct asfd *asfd)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "c:\n");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "\n{\n");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "\n\n\n");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "\n}\n");
}
Exemplo n.º 4
0
static void setup_read_fail_2(struct asfd *asfd)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w,  0, CMD_GEN, "hello:" VERSION);
	asfd_mock_read(asfd, &r,  0, CMD_GEN, "whoareyou");
	asfd_assert_write(asfd, &w,  0, CMD_GEN, "testclient");
	asfd_mock_read(asfd, &r, -1, CMD_GEN, "okpassword");
}
Exemplo n.º 5
0
static void setup_proto1_no_files(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore :");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend ok");
}
Exemplo n.º 6
0
static void setup_simplest_json(struct asfd *csin, struct asfd *csout,
	struct asfd *so_asfd)
{
	int r=0; int w=0;
	asfd_assert_write(csin, &w, 0, CMD_GEN, "c:\n");
	asfd_mock_read(csin, &r, 0, CMD_GEN, "{}");
	asfd_mock_read(csin, &r, -1, CMD_GEN, "blah");
}
Exemplo n.º 7
0
END_TEST

static void setup_proto2_some_things(struct asfd *asfd, struct slist *slist)
{
	struct sbuf *s;
	struct stat statp_dir;
	struct stat statp_file;
	int r=0; int w=0;
	fail_unless(!lstat(BASE, &statp_dir));
	fail_unless(!lstat(BASE "/burp.conf", &statp_file));
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore :");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restore_stream");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore_stream_ok");
	for(s=slist->head; s; s=s->next)
	{
		s->winattr=0;
		s->compression=0;
		if(s->path.cmd==CMD_DIRECTORY)
		{
			memcpy(&s->statp, &statp_dir, sizeof(statp_dir));
			attribs_encode(s);
		}
		if(sbuf_is_link(s))
		{
			char path[256];
			if(s->path.cmd==CMD_HARD_LINK)
				snprintf(path, sizeof(path), "%s", s->link.buf);
			else
			{
				char *cp;
				snprintf(path, sizeof(path), "%s", s->path.buf);
				fail_unless((cp=strrchr(path, '/'))!=NULL);
				cp++;
				snprintf(cp, strlen(s->link.buf)+1, "%s",
					s->link.buf);
			}
			build_file(path, NULL);
			
			memcpy(&s->statp, &statp_file, sizeof(statp_file));
			attribs_encode(s);
			asfd_mock_read_iobuf(asfd, &r, 0, &s->attr);
			asfd_mock_read_iobuf(asfd, &r, 0, &s->path);
			asfd_mock_read_iobuf(asfd, &r, 0, &s->link);
		}
		else if(sbuf_is_filedata(s))
		{
			memcpy(&s->statp, &statp_file, sizeof(statp_file));
			attribs_encode(s);
			asfd_mock_read_iobuf(asfd, &r, 0, &s->attr);
			asfd_mock_read_iobuf(asfd, &r,
				0, &s->path);
			asfd_mock_read(asfd, &r, 0, CMD_DATA, "data");
		}
	}
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend ok");
}
Exemplo n.º 8
0
static void setup_proto1_no_attribs(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore :");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
	asfd_mock_read(asfd, &r, 0, CMD_DATAPTH, "datapth");
	asfd_mock_read(asfd, &r, 0, CMD_FILE, BASE "/afile");
	asfd_assert_write(asfd, &w, 0, CMD_ERROR, "read cmd with no attribs");
}
Exemplo n.º 9
0
static void setup_proto1_no_datapth(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore :");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
	asfd_mock_read(asfd, &r, 0, CMD_ATTRIBS, "attribs");
	asfd_mock_read(asfd, &r, 0, CMD_FILE, BASE "/afile");
	asfd_assert_write(asfd, &w, 0, CMD_ERROR, "datapth not supplied for f:utest_restore/afile in restore_switch_protocol1\n");
}
Exemplo n.º 10
0
static void setup_asfds_proto2_interrupt(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	struct sbuf *s;
	int count=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore_stream");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restore_stream_ok");
	for(s=slist->head; s; s=s->next)
	{
		if(sbuf_is_link(s))
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->link);
			asfd_mock_read_no_op(asfd, &r, 1);
		}
		else if(sbuf_is_filedata(s))
		{
			struct blk *b;
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			asfd_mock_read_no_op(asfd, &r, 1);
			if(count++==1)
			{
				asfd_assert_write(asfd,
					&w, 0, CMD_DATA, "data");
				asfd_assert_write(asfd,
					&w, 0, CMD_DATA, "data");
				asfd_mock_read_no_op(asfd, &r, 2);
				asfd_mock_read(asfd, &r, 0, CMD_INTERRUPT,
					s->path.buf);
				asfd_assert_write(asfd, &w, 0,
					CMD_END_FILE, "0:0");
				continue;
			}
			for(b=s->protocol2->bstart;
				b && b!=s->protocol2->bend; b=b->next)
			{
				asfd_assert_write(asfd,
					&w, 0, CMD_DATA, "data");
				asfd_mock_read_no_op(asfd, &r, 1);
			}
			asfd_assert_write(asfd, &w, 0, CMD_END_FILE, "0:0");
			asfd_mock_read_no_op(asfd, &r, 1);
		}
		else
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			asfd_mock_read_no_op(asfd, &r, 1);
		}
	}
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend");
	asfd_mock_read_no_op(asfd, &r, 200);
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend_ok");
}
Exemplo n.º 11
0
static void setup_multiline_json(struct asfd *csin, struct asfd *csout,
	struct asfd *so_asfd)
{
	int r=0; int w=0;
	asfd_assert_write(csin, &w, 0, CMD_GEN, "c:\n");
	asfd_mock_read(csin, &r, 0, CMD_GEN, "\n{\n");
	asfd_mock_read(csin, &r, 0, CMD_GEN, "\n\n\n");
	asfd_mock_read(csin, &r, 0, CMD_GEN, "\n}\n");
	asfd_mock_read(csin, &r, -1, CMD_GEN, "blah");
}
Exemplo n.º 12
0
static void setup_all_ok_server_version_empty(struct asfd *asfd)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "hello:" VERSION);
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "whoareyou:");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "testclient");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "okpassword");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "password");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "ok");
}
Exemplo n.º 13
0
static void setup_all_ok_version_warning_read_error(struct asfd *asfd)
{
	int r=0; int w=0;
	asfd_assert_write(asfd, &w,  0, CMD_GEN, "hello:" VERSION);
	asfd_mock_read(asfd, &r,  0, CMD_GEN, "whoareyou:" VERSION);
	asfd_assert_write(asfd, &w,  0, CMD_GEN, "testclient");
	asfd_mock_read(asfd, &r,  0, CMD_GEN, "okpassword");
	asfd_assert_write(asfd, &w,  0, CMD_GEN, "password");
	asfd_mock_read(asfd, &r,  0, CMD_WARNING, "This is a version warning");
	asfd_mock_read(asfd, &r, -1, CMD_GEN, "ok");
}
Exemplo n.º 14
0
END_TEST

static void setup_asfds_empty(struct asfd *asfd, struct asfd *chfd,
	struct slist *slist)
{
	int ar=0, aw=0, cw=0;
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "requests_end");
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "sigs_end");
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "blk_requests_end");
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "backup_end");

	asfd_assert_write(chfd, &cw, 0, CMD_GEN, "sigs_end");
}
Exemplo n.º 15
0
static void setup_asfds_no_sigs_from_client(struct asfd *asfd,
	struct asfd *chfd, struct slist *slist)
{
	int ar=0, aw=0, cw=0;

	setup_writes_from_slist(asfd, &aw, slist);
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "requests_end");
	asfd_mock_read_no_op(asfd, &ar, 60);
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "sigs_end");
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "blk_requests_end");
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "backup_end");

	asfd_assert_write(chfd, &cw, 0, CMD_GEN, "sigs_end");
}
Exemplo n.º 16
0
static void setup_sfd_to_output(struct asfd *sfd,
	struct asfd *in, struct asfd *out)
{
	int a=0;
	int r=0;
	int w=0;

	asfd_mock_read_no_op(in, &r, 3);

	asfd_mock_read(sfd, &a, 0, CMD_GEN, "blah");
	asfd_mock_read(sfd, &a, 0, CMD_GEN, "halb");
	asfd_assert_write(out, &w, 0, CMD_GEN, "blah");
	asfd_assert_write(out, &w, 0, CMD_GEN, "halb");

	asfd_mock_read(sfd, &a, -1, CMD_GEN, "blah2");
}
Exemplo n.º 17
0
static void setup_input_to_sfd(struct asfd *sfd,
	struct asfd *in, struct asfd *out)
{
	int r=0;
	int ar=0;
	int aw=0;

	asfd_mock_read_no_op(sfd, &ar, 3);

	asfd_mock_read(in, &r, 0, CMD_GEN, "blah");
	asfd_mock_read(in, &r, 0, CMD_GEN, "halb");
	asfd_assert_write(sfd, &aw, 0, CMD_GEN, "blah");
	asfd_assert_write(sfd, &aw, 0, CMD_GEN, "halb");

	asfd_mock_read(in, &r, -1, CMD_GEN, "blah2");
}
Exemplo n.º 18
0
static void setup_read_error(struct asfd *csin, struct asfd *csout,
	struct asfd *so_asfd)
{
	int r=0; int w=0;
	asfd_assert_write(csin, &w, 0, CMD_GEN, "c:\n");
	asfd_mock_read(csin, &r, -1, CMD_GEN, "");
}
Exemplo n.º 19
0
static void setup_bad_json(struct asfd *csin, struct asfd *csout,
	struct asfd *so_asfd)
{
	int r=0; int w=0;
	asfd_assert_write(csin, &w, 0, CMD_GEN, "c:\n");
	asfd_mock_read(csin, &r, 0, CMD_GEN, "{ adfdff }\n");
}
Exemplo n.º 20
0
static void setup_asfds_read_error(struct asfd *asfd, struct asfd *chfd,
	struct slist *slist)
{
	int ar=0, aw=0;
	asfd_assert_write(asfd, &aw,  0, CMD_GEN, "requests_end");
	asfd_mock_read(asfd, &ar, -1, CMD_DATA, "some data");
}
Exemplo n.º 21
0
static void setup_in_error(struct asfd *sfd,
	struct asfd *in, struct asfd *out)
{
	int a=0;
	int r=0;
	asfd_mock_read_no_op(sfd, &a, 1);
	asfd_mock_read(in, &r, -1, CMD_GEN, "blah");
}
Exemplo n.º 22
0
static void setup_asfds_chfd_bad_cmd(struct asfd *asfd, struct asfd *chfd,
	struct slist *slist)
{
	int ar=0, aw=0, cr=0;
	asfd_assert_write(asfd, &aw,  0, CMD_GEN, "requests_end");
	asfd_mock_read_no_op(asfd, &ar, 1);
	asfd_mock_read(chfd, &cr,  0, CMD_MESSAGE, "some message");
}
Exemplo n.º 23
0
static void setup_asfds_read_error_chfd(struct asfd *asfd, struct asfd *chfd,
	struct slist *slist)
{
	int ar=0, aw=0, cr=0;
	asfd_assert_write(asfd, &aw,  0, CMD_GEN, "requests_end");
	asfd_mock_read_no_op(asfd, &ar, 1);
	asfd_mock_read(chfd, &cr, -1, CMD_SIG, "some sig");
}
Exemplo n.º 24
0
static void setup_asfds_proto1_stuff(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	struct sbuf *s;
	for(s=slist->head; s; s=s->next)
	{
		if(sbuf_is_link(s))
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->link);
		}
		else if(sbuf_is_filedata(s))
		{
			struct iobuf wbuf;
			// The string "data" gzipped.
			unsigned char gzipped_data1[10] = {
				0x1f, 0x8b, 0x08, 0, 0,
				0, 0, 0, 0x02, 0x03
			};
			unsigned char gzipped_data2[14] = {
				0x4b, 0x49, 0x2c, 0x49, 0x04, 0x00, 0x63,
				0xf3, 0xf3, 0xad, 0x04, 0x00, 0x00, 0x00
			};
			asfd_assert_write_iobuf(asfd, &w,
				0, &s->protocol1->datapth);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			if(sbuf_is_encrypted(s))
			{
				// Encrypted files get sent as is.
				asfd_assert_write(asfd, &w, 0, CMD_APPEND,
					"data");
				asfd_assert_write(asfd, &w, 0, CMD_END_FILE,
					"4:8d777f385d3dfec8815d20f7496026dc");
				continue;
			}
			// Protocol1 always sends it gzipped.
			iobuf_set(&wbuf, CMD_APPEND,
				(char *)gzipped_data1, sizeof(gzipped_data1));
			asfd_assert_write_iobuf(asfd, &w, 0, &wbuf);
			iobuf_set(&wbuf, CMD_APPEND,
				(char *)gzipped_data2, sizeof(gzipped_data2));
			asfd_assert_write_iobuf(asfd, &w, 0, &wbuf);
			asfd_assert_write(asfd, &w, 0, CMD_END_FILE,
				"4:8d777f385d3dfec8815d20f7496026dc");
		}
		else
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
		}
	}
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend");
	asfd_mock_read_no_op(asfd, &r, 100);
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend_ok");
}
Exemplo n.º 25
0
static void setup_asfds_proto2_interrupt_on_non_filedata(struct asfd *asfd,
	struct slist *slist)
{
	int r=0; int w=0;
	struct sbuf *s;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore_stream");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restore_stream_ok");
	for(s=slist->head; s; s=s->next)
	{
		asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
		asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
	}
	asfd_mock_read_no_op(asfd, &r, 1);
	asfd_mock_read(asfd, &r, 0, CMD_INTERRUPT, "00000");
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend");
	asfd_mock_read_no_op(asfd, &r, 200);
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend_ok");
}
Exemplo n.º 26
0
static void setup_ncurses_input_size_error(struct asfd *csin,
	struct asfd *csout,
	struct asfd *nin, struct asfd *so_asfd)
{
	int r=0; int w=0;
	int nr=0;
	asfd_mock_read(nin, &nr, 0, CMD_GEN, "Q");
	asfd_mock_read_no_op(csin, &r, 1);
	asfd_assert_write(csin, &w, 0, CMD_GEN, "c:\n");
}
Exemplo n.º 27
0
static void setup_asfds_write_error_chfd(struct asfd *asfd, struct asfd *chfd,
	struct slist *slist)
{
	int ar=0, aw=0, cw=0;
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "requests_end");
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "sigs_end");
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "blk_requests_end");

	asfd_assert_write(chfd, &cw, -1, CMD_GEN, "sigs_end");
}
Exemplo n.º 28
0
static void setup_asfds_happy_path_three_blks_per_file_full_dedup(
	struct asfd *asfd, struct asfd *chfd, struct slist *slist)
{
	int ar=0, aw=0, cr=0, cw=0;

	setup_writes_from_slist(asfd, &aw, slist);
	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "requests_end");
	asfd_mock_read_no_op(asfd, &ar, 200);
	setup_reads_from_slist(asfd, &ar, slist, 3, 0);
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "sigs_end");

	asfd_assert_write(asfd, &aw, 0, CMD_GEN, "blk_requests_end");
	asfd_mock_read_no_op(asfd, &ar, 1000);
	asfd_mock_read(asfd, &ar, 0, CMD_GEN, "backup_end");

	setup_chfd_writes_from_slist(chfd, &cw, slist, 3, 0);
	asfd_mock_read_no_op(chfd, &cr, 1000);
	setup_chfd_reads_from_slist_blks_got(chfd, &cr, slist, 3, 0);
	asfd_mock_read_no_op(chfd, &cr, 1000);
	asfd_assert_write(chfd, &cw, 0, CMD_GEN, "sigs_end");
}
Exemplo n.º 29
0
static void setup_reads_from_slist(struct asfd *asfd,
	int *ar, struct slist *slist, int number_of_blks, uint64_t interrupt)
{
	int file_no=1;
	struct sbuf *s;
	struct blk blk;
	struct iobuf iobuf;
	if(!slist) return;
	for(s=slist->head; s; s=s->next)
	{
		if(sbuf_is_filedata(s)
		  && !sbuf_is_encrypted(s)) // Not working for proto2 yet.
		{
			int b;
			s->protocol2->index=file_no++;
			if(interrupt==s->protocol2->index)
			{
				char buf[32]="";
				asfd_mock_read(asfd,
					ar, 0, CMD_WARNING, "path vanished\n");
				base64_from_uint64(interrupt, buf);
				asfd_mock_read(asfd, ar, 0, CMD_INTERRUPT,
					buf);
				continue;
			}
			iobuf_free_content(&s->attr);
			attribs_encode(s);
			asfd_mock_read(asfd,
				ar, 0, CMD_ATTRIBS_SIGS, s->attr.buf);
			blk.fingerprint=file_no;
			memset(&blk.md5sum, file_no, MD5_DIGEST_LENGTH);
			blk_to_iobuf_sig(&blk, &iobuf);
			for(b=0; b<number_of_blks; b++)
				asfd_mock_read_iobuf(asfd, ar, 0, &iobuf);
		}
	}
}
Exemplo n.º 30
0
END_TEST

static void setup_asfds_proto2_stuff(struct asfd *asfd, struct slist *slist)
{
	int r=0; int w=0;
	struct sbuf *s;
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restore_stream");
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restore_stream_ok");
	for(s=slist->head; s; s=s->next)
	{
		if(sbuf_is_link(s))
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->link);
		}
		else if(sbuf_is_filedata(s))
		{
			struct blk *b;
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
			for(b=s->protocol2->bstart;
			  b && b!=s->protocol2->bend; b=b->next)
				asfd_assert_write(asfd,
					&w, 0, CMD_DATA, "data");
			asfd_assert_write(asfd, &w, 0, CMD_END_FILE, "0:0");
		}
		else
		{
			asfd_assert_write_iobuf(asfd, &w, 0, &s->attr);
			asfd_assert_write_iobuf(asfd, &w, 0, &s->path);
		}
	}
	asfd_assert_write(asfd, &w, 0, CMD_GEN, "restoreend");
	asfd_mock_read_no_op(asfd, &r, 300);
	asfd_mock_read(asfd, &r, 0, CMD_GEN, "restoreend_ok");
}