commit 6658888da36b684c02f27edaf6f7752b9db9a92c from: Omar Polo date: Sun Jan 09 09:29:51 2022 UTC simplify walk_path interface commit - 17391a5db4bf92ad21c2da3d6d2b2f1205606dd3 commit + 6658888da36b684c02f27edaf6f7752b9db9a92c blob - 6a011c9806e1da49b76ca09bd701941b2ada6a0c blob + 86e1de297b54b57c3e50b5bef3d7eeed6bcee85d --- ftp.c +++ ftp.c @@ -413,8 +413,8 @@ dup_fid(int fid, int nfid) ASSERT_EMPTYBUF(); } -static size_t -walk_path(int fid, int newfid, const char *path, size_t *rnw, struct qid *qids) +static int +walk_path(int fid, int newfid, const char *path, struct qid *qid) { char *wnames[MAXWELEM], *p, *t; size_t nwname, i; @@ -434,8 +434,6 @@ walk_path(int fid, int newfid, const char *path, size_ nwname++; } - *rnw = nwname; - twalk(fid, newfid, (const char **)wnames, nwname); do_send(); recv_msg(); @@ -444,12 +442,13 @@ walk_path(int fid, int newfid, const char *path, size_ nwqid = np_read16(buf); assert(nwqid <= nwname); + /* consume all qids */ for (i = 0; i < nwname; ++i) - np_read_qid(buf, &qids[i]); + np_read_qid(buf, qid); free(p); - return nwqid; + return nwqid == nwname; } static void @@ -705,16 +704,15 @@ cmd_bye(int argc, const char **argv) static void cmd_cd(int argc, const char **argv) { - struct qid qids[MAXWELEM]; - size_t nwname, nwqid; + struct qid qid; if (argc != 1) { printf("usage: cd remote-path\n"); return; } - nwqid = walk_path(PWDFID, PWDFID, argv[0], &nwname, qids); - if (nwqid != nwname) + if (walk_path(PWDFID, PWDFID, argv[0], &qid) == -1 || + !(qid.type & QTDIR)) printf("can't cd %s\n", argv[0]); }