xref: /plan9/sys/src/cmd/aquarela/smbcomtransaction.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "headers.h"
2*8ccd4a63SDavid du Colombier 
3*8ccd4a63SDavid du Colombier static int
sendresponse(void * magic,SmbBuffer *,char ** errmsgp)4*8ccd4a63SDavid du Colombier sendresponse(void *magic, SmbBuffer *, char **errmsgp)
5*8ccd4a63SDavid du Colombier {
6*8ccd4a63SDavid du Colombier 	int rv;
7*8ccd4a63SDavid du Colombier 	SmbSession *s = magic;
8*8ccd4a63SDavid du Colombier 	rv = smbresponsesend(s);
9*8ccd4a63SDavid du Colombier 	if (rv < 0) {
10*8ccd4a63SDavid du Colombier 		smbstringprint(errmsgp, "sendresponse failed");
11*8ccd4a63SDavid du Colombier 		return 0;
12*8ccd4a63SDavid du Colombier 	}
13*8ccd4a63SDavid du Colombier 	return 1;
14*8ccd4a63SDavid du Colombier }
15*8ccd4a63SDavid du Colombier 
16*8ccd4a63SDavid du Colombier SmbTransactionMethod smbtransactionmethod = {
17*8ccd4a63SDavid du Colombier 	.encoderesponse = smbtransactionencoderesponse,
18*8ccd4a63SDavid du Colombier 	.sendresponse = sendresponse,
19*8ccd4a63SDavid du Colombier };
20*8ccd4a63SDavid du Colombier 
21*8ccd4a63SDavid du Colombier SmbTransactionMethod smbtransactionmethod2 = {
22*8ccd4a63SDavid du Colombier 	.encoderesponse = smbtransactionencoderesponse2,
23*8ccd4a63SDavid du Colombier 	.sendresponse = sendresponse,
24*8ccd4a63SDavid du Colombier };
25*8ccd4a63SDavid du Colombier 
26*8ccd4a63SDavid du Colombier int
smbcomtransaction(SmbSession * s,SmbHeader * h,uchar * pdata,SmbBuffer * b)27*8ccd4a63SDavid du Colombier smbcomtransaction(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
28*8ccd4a63SDavid du Colombier {
29*8ccd4a63SDavid du Colombier 	int rv;
30*8ccd4a63SDavid du Colombier 	char *errmsg;
31*8ccd4a63SDavid du Colombier 	SmbProcessResult pr = SmbProcessResultDie;
32*8ccd4a63SDavid du Colombier 	errmsg = nil;
33*8ccd4a63SDavid du Colombier 	rv = smbtransactiondecodeprimary(&s->transaction, h, pdata, b, &errmsg);
34*8ccd4a63SDavid du Colombier 	if (rv < 0) {
35*8ccd4a63SDavid du Colombier 		pr = SmbProcessResultFormat;
36*8ccd4a63SDavid du Colombier 		goto done;
37*8ccd4a63SDavid du Colombier 	}
38*8ccd4a63SDavid du Colombier 	if (rv == 0) {
39*8ccd4a63SDavid du Colombier 		h->wordcount = 0;
40*8ccd4a63SDavid du Colombier 		if (smbbufferputack(s->response, h, &s->peerinfo)) {
41*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultReply;
42*8ccd4a63SDavid du Colombier 			s->nextcommand = SMB_COM_TRANSACTION_SECONDARY;
43*8ccd4a63SDavid du Colombier 		}
44*8ccd4a63SDavid du Colombier 		goto done;
45*8ccd4a63SDavid du Colombier 	}
46*8ccd4a63SDavid du Colombier 	smblogprint(h->command, "smbcomtransaction: %s scount %ud tpcount %lud tdcount %lud maxscount %lud maxpcount %lud maxdcount %lud\n",
47*8ccd4a63SDavid du Colombier 		s->transaction.in.name, s->transaction.in.scount, s->transaction.in.tpcount, s->transaction.in.tdcount,
48*8ccd4a63SDavid du Colombier 		s->transaction.in.maxscount, s->transaction.in.maxpcount, s->transaction.in.maxdcount);
49*8ccd4a63SDavid du Colombier 	smbbufferfree(&s->transaction.out.parameters);
50*8ccd4a63SDavid du Colombier 	smbbufferfree(&s->transaction.out.data);
51*8ccd4a63SDavid du Colombier 	s->transaction.out.parameters = smbbuffernew(s->transaction.in.maxpcount);
52*8ccd4a63SDavid du Colombier 	s->transaction.out.data = smbbuffernew(s->transaction.in.maxdcount);
53*8ccd4a63SDavid du Colombier 	if (strcmp(s->transaction.in.name, smbglobals.pipelanman) == 0)
54*8ccd4a63SDavid du Colombier 		pr = smbrap2(s);
55*8ccd4a63SDavid du Colombier 	else {
56*8ccd4a63SDavid du Colombier 		smbseterror(s, ERRDOS, ERRbadpath);
57*8ccd4a63SDavid du Colombier 		pr = SmbProcessResultError;
58*8ccd4a63SDavid du Colombier 		goto done;
59*8ccd4a63SDavid du Colombier 	}
60*8ccd4a63SDavid du Colombier 	if (pr == SmbProcessResultReply) {
61*8ccd4a63SDavid du Colombier 		char *errmsg;
62*8ccd4a63SDavid du Colombier 		errmsg = nil;
63*8ccd4a63SDavid du Colombier 		rv = smbtransactionrespond(&s->transaction, h, &s->peerinfo, s->response, &smbtransactionmethod, s, &errmsg);
64*8ccd4a63SDavid du Colombier 		if (!rv) {
65*8ccd4a63SDavid du Colombier 			smblogprint(h->command, "smbcomtransaction: failed: %s\n", errmsg);
66*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultMisc;
67*8ccd4a63SDavid du Colombier 		}
68*8ccd4a63SDavid du Colombier 		else
69*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultOk;
70*8ccd4a63SDavid du Colombier 	}
71*8ccd4a63SDavid du Colombier done:
72*8ccd4a63SDavid du Colombier 	free(errmsg);
73*8ccd4a63SDavid du Colombier 	return pr;
74*8ccd4a63SDavid du Colombier }
75*8ccd4a63SDavid du Colombier 
76*8ccd4a63SDavid du Colombier int
smbcomtransaction2(SmbSession * s,SmbHeader * h,uchar * pdata,SmbBuffer * b)77*8ccd4a63SDavid du Colombier smbcomtransaction2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
78*8ccd4a63SDavid du Colombier {
79*8ccd4a63SDavid du Colombier 	int rv;
80*8ccd4a63SDavid du Colombier 	char *errmsg;
81*8ccd4a63SDavid du Colombier 	SmbProcessResult pr = SmbProcessResultDie;
82*8ccd4a63SDavid du Colombier 	ushort op;
83*8ccd4a63SDavid du Colombier 
84*8ccd4a63SDavid du Colombier 	errmsg = nil;
85*8ccd4a63SDavid du Colombier 	rv = smbtransactiondecodeprimary2(&s->transaction, h, pdata, b, &errmsg);
86*8ccd4a63SDavid du Colombier 	if (rv < 0) {
87*8ccd4a63SDavid du Colombier 	fmtfail:
88*8ccd4a63SDavid du Colombier 		pr = SmbProcessResultFormat;
89*8ccd4a63SDavid du Colombier 		goto done;
90*8ccd4a63SDavid du Colombier 	}
91*8ccd4a63SDavid du Colombier 	if (rv == 0) {
92*8ccd4a63SDavid du Colombier 		h->wordcount = 0;
93*8ccd4a63SDavid du Colombier 		if (smbbufferputack(s->response, h, &s->peerinfo)) {
94*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultReply;
95*8ccd4a63SDavid du Colombier 			s->nextcommand = SMB_COM_TRANSACTION2_SECONDARY;
96*8ccd4a63SDavid du Colombier 		}
97*8ccd4a63SDavid du Colombier 		goto done;
98*8ccd4a63SDavid du Colombier 	}
99*8ccd4a63SDavid du Colombier 	smblogprint(h->command, "smbcomtransaction2: scount %ud tpcount %lud tdcount %lud maxscount %lud maxpcount %lud maxdcount %lud\n",
100*8ccd4a63SDavid du Colombier 		s->transaction.in.scount, s->transaction.in.tpcount, s->transaction.in.tdcount,
101*8ccd4a63SDavid du Colombier 		s->transaction.in.maxscount, s->transaction.in.maxpcount, s->transaction.in.maxdcount);
102*8ccd4a63SDavid du Colombier 	smbbufferfree(&s->transaction.out.parameters);
103*8ccd4a63SDavid du Colombier 	smbbufferfree(&s->transaction.out.data);
104*8ccd4a63SDavid du Colombier 	s->transaction.out.parameters = smbbuffernew(s->transaction.in.maxpcount);
105*8ccd4a63SDavid du Colombier 	s->transaction.out.data = smbbuffernew(s->transaction.in.maxdcount);
106*8ccd4a63SDavid du Colombier 	if (s->transaction.in.scount != 1)
107*8ccd4a63SDavid du Colombier 		goto fmtfail;
108*8ccd4a63SDavid du Colombier 	op = s->transaction.in.setup[0];
109*8ccd4a63SDavid du Colombier 	if (op >= smbtrans2optablesize || smbtrans2optable[op].name == nil) {
110*8ccd4a63SDavid du Colombier 		smblogprint(-1, "smbcomtransaction2: function %d unknown\n", op);
111*8ccd4a63SDavid du Colombier 		pr = SmbProcessResultUnimp;
112*8ccd4a63SDavid du Colombier 		goto done;
113*8ccd4a63SDavid du Colombier 	}
114*8ccd4a63SDavid du Colombier 	if (smbtrans2optable[op].process == nil) {
115*8ccd4a63SDavid du Colombier 		smblogprint(-1, "smbcomtransaction2: %s unimplemented\n", smbtrans2optable[op].name);
116*8ccd4a63SDavid du Colombier 		pr = SmbProcessResultUnimp;
117*8ccd4a63SDavid du Colombier 		goto done;
118*8ccd4a63SDavid du Colombier 	}
119*8ccd4a63SDavid du Colombier 	pr = (*smbtrans2optable[op].process)(s, h);
120*8ccd4a63SDavid du Colombier 	if (pr == SmbProcessResultReply) {
121*8ccd4a63SDavid du Colombier 		char *errmsg;
122*8ccd4a63SDavid du Colombier 		errmsg = nil;
123*8ccd4a63SDavid du Colombier 		rv = smbtransactionrespond(&s->transaction, h, &s->peerinfo, s->response, &smbtransactionmethod2, s, &errmsg);
124*8ccd4a63SDavid du Colombier 		if (!rv) {
125*8ccd4a63SDavid du Colombier 			smblogprint(h->command, "smbcomtransaction2: failed: %s\n", errmsg);
126*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultMisc;
127*8ccd4a63SDavid du Colombier 		}
128*8ccd4a63SDavid du Colombier 		else
129*8ccd4a63SDavid du Colombier 			pr = SmbProcessResultOk;
130*8ccd4a63SDavid du Colombier 	}
131*8ccd4a63SDavid du Colombier done:
132*8ccd4a63SDavid du Colombier 	free(errmsg);
133*8ccd4a63SDavid du Colombier 	return pr;
134*8ccd4a63SDavid du Colombier }
135*8ccd4a63SDavid du Colombier 
136*8ccd4a63SDavid du Colombier 
137*8ccd4a63SDavid du Colombier 
138