9 MAGIC = 0xFF | ('S'<<8) | ('M'<<16) | ('B'<<24),
11 SMB_FLAGS_CASE_INSENSITIVE = 0x08,
12 SMB_FLAGS_CANONICALIZED_PATHS = 0x10,
13 SMB_FLAGS_REPLY = 0x80,
15 NOCASEMASK = SMB_FLAGS_CASE_INSENSITIVE | SMB_FLAGS_CANONICALIZED_PATHS,
17 SMB_FLAGS2_LONG_NAMES = 0x0001,
18 SMB_FLAGS2_EAS = 0x0002,
19 SMB_FLAGS2_IS_LONG_NAME = 0x0040,
20 SMB_FLAGS2_NT_STATUS = 0x4000,
21 SMB_FLAGS2_UNICODE = 0x8000,
24 static int casesensitive = 0;
27 respond(Req *r, int err)
31 if(err && !(r->flags2 & SMB_FLAGS2_NT_STATUS))
33 flags = (r->flags & (r->namecmp != strcmp ? NOCASEMASK : 0)) |
35 flags2 = (r->flags2 & (SMB_FLAGS2_NT_STATUS |
36 SMB_FLAGS2_LONG_NAMES | SMB_FLAGS2_UNICODE)) |
37 SMB_FLAGS2_IS_LONG_NAME;
38 if(r->cmd != 0x73) /* SMB_COM_SESSION_SETUP_ANDX */
39 memset(r->sig, 0, sizeof(r->sig));
40 n = pack(r->rh, r->rh, r->rh+32, "lblbww[]__wwww",
41 MAGIC, r->cmd, err, flags, flags2, r->pid>>16, r->sig, r->sig+sizeof(r->sig),
42 r->tid, r->pid & 0xFFFF, r->uid, r->mid);
45 r->rp += pack(r->rh, r->rp, r->re, "#0b{*2}#1w{}");
48 dumphex("respond", r->rh, r->rp);
50 fprint(2, "respond: err=%x\n\n", err);
54 r->lh[2] = n>>8 & 0xFF;
56 write(1, r->lh, LENHDR+n);
60 receive(uchar *h, uchar *e)
62 static uchar buffer[LENHDR + BUFFERSIZE];
64 .strpack = smbstrpack8,
65 .strunpack = smbstrunpack8,
66 .namepack = smbnamepack8,
67 .nameunpack = smbnameunpack8,
68 .untermstrpack = smbuntermstrpack8,
69 .untermnamepack = smbuntermnamepack8,
71 .strpack = smbstrpack16,
72 .strunpack = smbstrunpack16,
73 .namepack = smbnamepack16,
74 .nameunpack = smbnameunpack16,
75 .untermstrpack = smbuntermstrpack16,
76 .untermnamepack = smbuntermnamepack16,
84 dumphex("receive", h, e);
85 if((n = unpack(h, h, e, "lb____bww{.________}__wwww", &magic,
86 &r.cmd, &r.flags, &r.flags2, &hpid, &sig, &r.tid, &r.pid, &r.uid, &r.mid)) == 0){
87 logit("bad smb header");
91 logit("bad smb magic");
98 r.re = r.rh + remotebuffersize;
99 r.o = (r.flags2 & SMB_FLAGS2_UNICODE) ? &rop16 : &rop8;
100 memmove(r.sig, sig, sizeof(r.sig));
103 r.namecmp = ((r.flags & NOCASEMASK) && !casesensitive) ? cistrcmp : strcmp;
104 smbcmd(&r, r.cmd, h, h+n, e);
110 static uchar buffer[LENHDR + BUFFERSIZE];
117 pe = p + LENHDR+BUFFERSIZE;
120 n = read(0, p, pe - p);
127 n = hl[2]<<8 | hl[3];
131 logit("message too big");
147 main(int argc, char *argv[])
153 { "trspaces", &trspaces },
154 { "casesensitive", &casesensitive },
165 domain = "WORKGROUP";
178 log = EARGF(exits("bad arg"));
181 domain = EARGF(exits("bad arg"));
184 opt = EARGF(exits("bad arg"));
185 for(o=opts; o->s; o++)
186 if(strcmp(opt, o->s) == 0){
196 if(!log || open(log, OWRITE) < 0){
197 open("/dev/null", OWRITE);
201 remotesys = argc ? getremote(argv[argc-1]) : nil;
203 remotebuffersize = BUFFERSIZE;
204 starttime = time(nil);
206 srand(starttime ^ pid);
207 tm = localtime(starttime);
210 logit("started [%d]", pid);
213 logit("exited [%d]", pid);