8 padname(uchar *buf, int len, char *name)
15 memmove(buf, name, n);
19 packshareinfo(Trans *t, int level, char *name, int *pstatus)
24 if((share = mapshare(name)) == nil){
26 *pstatus = 0x906; /* NERR_NetNameNotFound */
29 padname(buf, sizeof(buf), share->name);
32 return pack(t->out.data.b, t->out.data.p, t->out.data.e, "[]",
33 buf, buf+sizeof(buf));
35 return pack(t->out.data.b, t->out.data.p, t->out.data.e, "[]_w@1l{f}",
36 buf, buf+sizeof(buf), share->stype, smbstrpack8, share->remark);
38 return pack(t->out.data.b, t->out.data.p, t->out.data.e, "[]_w@1l__ww@2l__________{f}{f}",
39 buf, buf+sizeof(buf), share->stype, 100, 1, smbstrpack8, share->remark,
40 smbnamepack8, share->root);
50 int n, code, status, level, rbs;
51 uchar *ip, *ipe, *op, *opb, *ope;
57 ip = ipe = t->in.param.e;
58 if(!unpack(t->in.param.b, t->in.param.p, t->in.param.e, "wff[]", &code,
59 smbstrunpack8, &pd, smbstrunpack8, &dd, &ip, nil)){
60 t->respond(t, STATUS_NOT_SUPPORTED);
65 opb = op = t->out.param.b+2+2;
67 n = status = level = 0;
69 case 0x0000: /* NetShareEnum */
70 op += pack(opb, op, ope, "ww", 0, 0);
71 if(!unpack(ip, ip, ipe, "ww", &level, &rbs))
73 if((n = packshareinfo(t, level, "local", nil)) > 0){
75 pack(opb, opb, ope, "ww", 1, 1);
79 case 0x0001: /* NetShareGetInfo */
80 op += pack(opb, op, ope, "w", 0);
81 if(!unpack(ip, ip, ipe, "fww", smbstrunpack8, &name, &level, &rbs))
83 if((n = packshareinfo(t, level, name, &status)) > 0){
86 pack(opb, opb, ope, "w", n);
90 case 0x000d: /* NetServerGetInfo */
91 op += pack(opb, op, ope, "w", 0);
92 if(!unpack(ip, ip, ipe, "ww", &level, &rbs))
94 padname(buf, sizeof(buf), "");
97 if((n = pack(t->out.data.b, t->out.data.p, t->out.data.e, "[]",
98 buf, buf+sizeof(buf))) > 0)
102 if((n = pack(t->out.data.b, t->out.data.p, t->out.data.e, "[]bbl@1l{f}",
103 buf, buf+sizeof(buf), 0x05, 0x00, 2, smbstrpack8, osname)) > 0)
110 case 0x003f: /* NetWrkstaGetInfo */
111 op += pack(opb, op, ope, "w", 0);
112 if(!unpack(ip, ip, ipe, "ww", &level, &rbs))
118 if((n = pack(t->out.data.b, t->out.data.p, t->out.data.e,
119 "@0l____@1lbb________{f}{f}", 0x05, 0x00,
120 smbstrpack8, sysname(), smbstrpack8, domain)) > 0)
125 logit("[%.4x] unknown rap command pd=%s dd=%s", code, pd, dd);
128 logit("[%.4x] unknown rap level [%.4x]", code, level);
131 if((n = pack(t->out.param.b, t->out.param.p, t->out.param.e, "w__[]", status, opb, op)) == 0){
132 t->respond(t, STATUS_INVALID_SMB);