]> git.lizzy.rs Git - plan9front.git/commitdiff
ip/cifsd: add basic support for UNIX extensions
authorcinap_lenrek <cinap_lenrek@felloff.net>
Tue, 10 Sep 2019 19:19:34 +0000 (21:19 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Tue, 10 Sep 2019 19:19:34 +0000 (21:19 +0200)
sys/src/cmd/ip/cifsd/dat.h
sys/src/cmd/ip/cifsd/smb.c

index 5e8198cc9d5713b43aa6e3f953718c8867dde9ab..94235cf48185fdd5e165ef86cc330f6706572579 100644 (file)
@@ -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,
index 45a9aff5564ac76b14855320f41b85d6a2f9d6a1..2bcd6e1df05067486bed8200dcd09c0557077c87 100644 (file)
@@ -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);