From 88b386a4a15654bcc9d34a534812f1ec9c77e069 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 10 Sep 2019 21:19:34 +0200 Subject: [PATCH] ip/cifsd: add basic support for UNIX extensions --- sys/src/cmd/ip/cifsd/dat.h | 1 + sys/src/cmd/ip/cifsd/smb.c | 44 +++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/sys/src/cmd/ip/cifsd/dat.h b/sys/src/cmd/ip/cifsd/dat.h index 5e8198cc9..94235cf48 100644 --- a/sys/src/cmd/ip/cifsd/dat.h +++ b/sys/src/cmd/ip/cifsd/dat.h @@ -168,6 +168,7 @@ enum CAP_NT_SMBS = 0x10, CAP_NT_STATUS = 0x40, CAP_NT_FIND = 0x200, + CAP_UNIX = 0x800000, /* extended file attributes */ ATTR_READONLY = 0x1, diff --git a/sys/src/cmd/ip/cifsd/smb.c b/sys/src/cmd/ip/cifsd/smb.c index 45a9aff55..2bcd6e1df 100644 --- a/sys/src/cmd/ip/cifsd/smb.c +++ b/sys/src/cmd/ip/cifsd/smb.c @@ -63,7 +63,7 @@ err: de = dom + smbstrpack16(d, d, d + sizeof(dom), domain); if(!pack(r->rh, r->rp, r->re, "#0b{*2wbwwllllvw#2b}#1w{[][]}.", x, mode, 50, 1, BUFFERSIZE, 0x10000, sessionkey, - CAP_UNICODE | CAP_LARGEFILES | + CAP_UNIX | CAP_UNICODE | CAP_LARGEFILES | CAP_NT_FIND | CAP_NT_SMBS | CAP_NT_STATUS, tofiletime(time(0)), -tzoff/60, c, ce, d, de, &r->rp)) goto err; @@ -1012,6 +1012,22 @@ smbqueryinformationdisk(Req *r, uchar *h, uchar *p, uchar *e) r->respond(r, 0); } +static int +unixuid(char *) +{ + return 99999; +} +static int +unixgid(char *) +{ + return 99999; +} +static int +unixtype(Dir *d) +{ + return (d->qid.type & QTDIR) != 0; +} + static int fpackdir(Req *r, Dir *d, Tree *t, int i, int level, uchar *b, uchar *p, uchar *e, uchar **prevoff, uchar **nameoff) { @@ -1053,6 +1069,19 @@ fpackdir(Req *r, Dir *d, Tree *t, int i, int level, uchar *b, uchar *p, uchar *e &namep, r->o->untermnamepack, d->name); break; + case 0x0202: /* SMB_FIND_FILE_UNIX */ + n = pack(b, p, e, "llvvvvvvvlvvvvv.f", + 0, i, + dlen, alen, + mtime, atime, mtime, + unixuid(d->uid), unixgid(d->gid), unixtype(d), + 0, 0, /* MAJ/MIN */ + d->qid.path, + d->mode & 0777, + 1, /* NLINKS */ + &namep, r->o->namepack, d->name); + break; + default: logit("[%.4x] unknown FIND infolevel", level); return -1; @@ -1107,6 +1136,15 @@ qpackdir(Req *, Dir *d, Tree *t, File *f, int level, uchar *b, uchar *p, uchar * return 0; return pack(b, p, e, "l#0lvv{f}", 0, dlen, alen, smbuntermstrpack16, "::$DATA"); + case 0x0200: /* SMB_QUERY_FILE_UNIX_BASIC */ + return pack(b, p, e, "vvvvvvvlvvvvv", + dlen, alen, + mtime, atime, mtime, + unixuid(d->uid), unixgid(d->gid), unixtype(d), + 0, 0, /* MAJ/MIN */ + d->qid.path, + d->mode & 0777, + link); /* NLINKS */ default: logit("[%.4x] unknown QUERY infolevel", level); return -1; @@ -1381,6 +1419,10 @@ trans2queryfsinformation(Trans *t) share->namelen, smbuntermstrpack16, share->fsname); break; + case 0x0200: /* SMB_QUERY_CIFS_UNIX_INFO */ + n = pack(t->out.data.b, t->out.data.p, t->out.data.e, "wwv", 1, 0, 0x800000); + break; + default: logit("[%.4x] unknown FS infolevel", level); t->respond(t, STATUS_OS2_INVALID_LEVEL); -- 2.44.0