Npcfsys* npc_start (int rfd, int wfd, int msize, int flags) { Npcfsys *fs; Npfcall *tc = NULL, *rc = NULL; if ((flags & NPC_MULTI_RPC)) fs = npc_create_mtfsys (rfd, wfd, msize, flags); else fs = npc_create_fsys (rfd, wfd, msize, flags); if (!fs) goto done; if (!(tc = np_create_tversion (msize, "9P2000.L"))) { np_uerror (ENOMEM); goto done; } if (fs->rpc (fs, tc, &rc) < 0) goto done; if (rc->u.rversion.msize < msize) fs->msize = rc->u.rversion.msize; if (np_strcmp (&rc->u.rversion.version, "9P2000.L") != 0) { np_uerror(EIO); goto done; } done: if (tc) free (tc); if (rc) free (rc); if (np_rerror () && fs) { npc_finish (fs); fs = NULL; } return fs; }
static Npfcall* np_default_version(Npconn *conn, u32 msize, Npstr *version) { int dotu; char *ver; Npfcall *rc; if (msize > conn->srv->msize) msize = conn->srv->msize; dotu = 0; if (np_strcmp(version, "9P2000.u")==0 && conn->srv->dotu) { ver = "9P2000.u"; dotu = 1; } else if (np_strncmp(version, "9P2000", 6) == 0) ver = "9P2000"; else ver = NULL; if (msize < IOHDRSZ) np_werror("msize too small", EIO); else if (ver) { np_conn_reset(conn, msize, dotu); rc = np_create_rversion(msize, ver); } else np_werror("unsupported 9P version", EIO); return rc; }
int np_strncmp(Npstr *str, char *cs, int len) { int ret; if (str->len >= len) ret = strncmp(str->str, cs, len); else ret = np_strcmp(str, cs); return ret; }
/* Take another reference on afid->user and return it. * If afid was for a different user return NULL. */ Npuser * np_afid2user (Npfid *afid, Npstr *uname, u32 n_uname) { Npuser *u = NULL; if (n_uname != P9_NONUNAME) { if (n_uname != afid->user->uid) { np_uerror (EPERM); goto done; } } else { if (np_strcmp (uname, afid->user->uname) != 0) { np_uerror (EPERM); goto done; } } u = afid->user; np_user_incref (u); done: return u; }
Npfcall * np_version(Npreq *req, Npfcall *tc) { Npfcall *rc = NULL; int msize = tc->u.tversion.msize; if (msize < P9_IOHDRSZ + 1) { np_uerror(EIO); return NULL; } if (msize > req->conn->msize) msize = req->conn->msize; if (msize < req->conn->msize) req->conn->msize = msize; /* conn->msize can only be reduced */ if (np_strcmp(&tc->u.tversion.version, "9P2000.L") == 0) { if (!(rc = np_create_rversion(msize, "9P2000.L"))) np_uerror(ENOMEM); } else np_uerror(EIO); return rc; }