diff options
author | aiju <devnull@localhost> | 2018-05-27 11:06:07 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-05-27 11:06:07 +0000 |
commit | 41013392a1077d5e0171b75cdf1864cd9492e6b6 (patch) | |
tree | b471be6216d7db874e7d7dafb0a71b529be4bbd1 /sys/src/cmd/sshfs.c | |
parent | 2b5dfee06cc6a7b915d6b7fe7cfe2942a660cde0 (diff) |
sshfs(4): replace the much maligned -r option
Diffstat (limited to 'sys/src/cmd/sshfs.c')
-rw-r--r-- | sys/src/cmd/sshfs.c | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/sys/src/cmd/sshfs.c b/sys/src/cmd/sshfs.c index 9a30191b5..f85c72dae 100644 --- a/sys/src/cmd/sshfs.c +++ b/sys/src/cmd/sshfs.c @@ -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)); @@ -1364,8 +1384,6 @@ threadmain(int argc, char **argv) sshfssrv.wstat = nil; sshfssrv.remove = nil; } - if(mtpt == nil) - root = "."; if(pflag){ rdfd = 0; |