]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/sshfs.c
cc: use 7 octal digits for 21 bit runes
[plan9front.git] / sys / src / cmd / sshfs.c
index c25b4eba867b752cfb7902d25aa984949b9ad207..d0c21ec74e0c6dc2e6dae93c62172ea67e4bc7c5 100644 (file)
@@ -600,6 +600,7 @@ attrfixupqid(Qid *qid)
        if(flags & SSH_FILEXFER_ATTR_PERMISSIONS){
                if(p + 4 > rxpkt + rxlen) return -1;
                if((GET4(p) & 0170000) != 0040000) qid->type = 0;
+               else qid->type = QTDIR;
                p += 4;
        }
        if(flags & SSH_FILEXFER_ATTR_ACMODTIME){
@@ -722,21 +723,40 @@ sshfsattach(Req *r)
 {
        SFid *sf;
 
-       if(r->ifcall.aname != nil && *r->ifcall.aname != 0 && r->aux == nil){
+       if(r->aux == nil){
+               sf = emalloc9p(sizeof(SFid));
+               if(r->ifcall.aname != nil)
+                       switch(*r->ifcall.aname){
+                       case '~':
+                               switch(r->ifcall.aname[1]){
+                               case 0: sf->fn = estrdup9p("."); break;
+                               case '/': sf->fn = estrdup9p(r->ifcall.aname + 2); break;
+                               default:
+                                       free(sf);
+                                       respond(r, "invalid attach name");
+                                       return;
+                               }
+                               break;
+                       case '/':
+                               sf->fn = estrdup9p(r->ifcall.aname);
+                               break;
+                       case 0:
+                               sf->fn = estrdup9p(root);
+                               break;
+                       default:
+                               sf->fn = pathcat(root, r->ifcall.aname);
+                       }
+               else
+                       sf->fn = estrdup9p(root);
+               r->fid->aux = sf;
                submitreq(r);
-               return;
+       }else{
+               sf = r->fid->aux;
+               sf->qid = (Qid){qidcalc(sf->fn), 0, QTDIR};
+               r->ofcall.qid = sf->qid;
+               r->fid->qid = sf->qid;
+               respond(r, nil);
        }
-       sf = emalloc9p(sizeof(SFid));
-       if(r->ifcall.aname != nil && *r->ifcall.aname != 0)
-               sf->fn = estrdup9p(r->ifcall.aname);
-       else
-               sf->fn = estrdup9p(root);
-       root = ".";
-       sf->qid = (Qid){qidcalc(sf->fn), 0, QTDIR};
-       r->ofcall.qid = sf->qid;
-       r->fid->qid = sf->qid;
-       r->fid->aux = sf;
-       respond(r, nil);
 }
 
 void
@@ -783,7 +803,7 @@ sendproc(void *)
                sf = r->req->fid != nil ? r->req->fid->aux : nil;
                switch(r->req->ifcall.type){
                case Tattach:
-                       sendpkt("bus", SSH_FXP_STAT, r->reqid, r->req->ifcall.aname, strlen(r->req->ifcall.aname));
+                       sendpkt("bus", SSH_FXP_STAT, r->reqid, sf->fn, strlen(sf->fn));
                        break;
                case Twalk:
                        sendpkt("bus", SSH_FXP_STAT, r->reqid, r->req->aux, strlen(r->req->aux));
@@ -1394,4 +1414,6 @@ threadmain(int argc, char **argv)
        passwdparse(gidtab, readfile(gidfile));
        
        threadpostmountsrv(&sshfssrv, svc, mtpt, MCREATE | mflag);
+
+       exits(nil);
 }