xref: /plan9-contrib/sys/src/cmd/aquarela/smbcomecho.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier 
3*8ccd4a63SDavid du Colombier SmbProcessResult
smbcomecho(SmbSession * s,SmbHeader * h,uchar * pdata,SmbBuffer * b)4*8ccd4a63SDavid du Colombier smbcomecho(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier 	ushort echocount, e;
7*8ccd4a63SDavid du Colombier 	if (!smbcheckwordcount("comecho", h, 1))
8*8ccd4a63SDavid du Colombier 		return SmbProcessResultFormat;
9*8ccd4a63SDavid du Colombier 	echocount = smbnhgets(pdata);
10*8ccd4a63SDavid du Colombier 	for (e = 0; e < echocount; e++) {
11*8ccd4a63SDavid du Colombier 		ulong bytecountfixupoffset;
12*8ccd4a63SDavid du Colombier 		SmbProcessResult pr;
13*8ccd4a63SDavid du Colombier 		if (!smbbufferputheader(s->response, h, &s->peerinfo)
14*8ccd4a63SDavid du Colombier 			|| !smbbufferputs(s->response, e))
15*8ccd4a63SDavid du Colombier 			return SmbProcessResultMisc;
16*8ccd4a63SDavid du Colombier 		bytecountfixupoffset = smbbufferwriteoffset(s->response);
17*8ccd4a63SDavid du Colombier 		if (!smbbufferputbytes(s->response, smbbufferreadpointer(b), smbbufferreadspace(b))
18*8ccd4a63SDavid du Colombier 			|| !smbbufferfixuprelatives(s->response, bytecountfixupoffset))
19*8ccd4a63SDavid du Colombier 			return SmbProcessResultMisc;
20*8ccd4a63SDavid du Colombier 		pr = smbresponsesend(s);
21*8ccd4a63SDavid du Colombier 		if (pr != SmbProcessResultOk)
22*8ccd4a63SDavid du Colombier 			return SmbProcessResultDie;
23*8ccd4a63SDavid du Colombier 	}
24*8ccd4a63SDavid du Colombier 	return SmbProcessResultOk;
25*8ccd4a63SDavid du Colombier }
26