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