static Npfcall * myattach (Npfid *fid, Npfid *afid, Npstr *aname) { Npqid qid = { 1, 2, 3}; Npfcall *ret = NULL; if (!(ret = np_create_rattach(&qid))) { np_uerror (ENOMEM); return NULL; } np_fid_incref (fid); return ret; }
/* Tattach - attach a new user (fid->user) to aname. * diod_auth.c::diod_checkauth first authenticates/authorizes user */ Npfcall* diod_attach (Npfid *fid, Npfid *afid, Npstr *aname) { Npfcall* ret = NULL; Fid *f = NULL; Npqid qid; struct stat sb; int xflags; if (aname->len == 0 || *aname->str != '/') { np_uerror (EPERM); goto error; } if (!(f = diod_fidalloc (fid, aname))) { np_uerror (ENOMEM); goto error; } if (diod_conf_opt_runasuid ()) { if (fid->user->uid != diod_conf_get_runasuid ()) { np_uerror (EPERM); goto error; } } if (!diod_match_exports (path_s (f->path), fid->conn, fid->user, &xflags)) goto error; if ((xflags & XFLAGS_RO)) f->flags |= DIOD_FID_FLAGS_ROFS; if ((xflags & XFLAGS_SHAREFD)) f->flags |= DIOD_FID_FLAGS_SHAREFD; if (stat (path_s (f->path), &sb) < 0) { /* OK to follow symbolic links */ np_uerror (errno); goto error; } /* N.B. removed S_ISDIR (sb.st_mode) || return ENOTDIR check. * Allow a regular file or a blcok device to be exported. */ diod_ustat2qid (&sb, &qid); if ((ret = np_create_rattach (&qid)) == NULL) { np_uerror (ENOMEM); goto error; } return ret; error: errn (np_rerror (), "diod_attach %s@%s:%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), aname->len, aname->str); diod_fiddestroy (fid); return NULL; }
/* Tattach - attach a new user (fid->user) to aname. * diod_auth.c::diod_checkauth first authenticates/authorizes user */ Npfcall* diod_attach (Npfid *fid, Npfid *afid, Npstr *aname) { Npfcall* ret = NULL; Fid *f = NULL; Npqid qid; struct stat sb; if (aname->len == 0 || *aname->str != '/') { np_uerror (EPERM); goto error; } if (!(f = _fidalloc ()) || !(f->path = np_strdup (aname))) { np_uerror (ENOMEM); goto error; } if (diod_conf_opt_runasuid ()) { if (fid->user->uid != diod_conf_get_runasuid ()) { np_uerror (EPERM); goto error; } } if (!diod_match_exports (f->path, fid->conn, fid->user, &f->xflags)) goto error; if (stat (f->path, &sb) < 0) { /* OK to follow symbolic links */ np_uerror (errno); goto error; } if (!S_ISDIR (sb.st_mode)) { np_uerror (ENOTDIR); goto error; } _ustat2qid (&sb, &qid); if ((ret = np_create_rattach (&qid)) == NULL) { np_uerror (ENOMEM); goto error; } fid->aux = f; np_fid_incref (fid); return ret; error: errn (np_rerror (), "diod_attach %s@%s:%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), aname->len, aname->str); if (f) _fidfree (f); return NULL; }
static void test_rattach (void) { Npfcall *fc, *fc2; struct p9_qid qid = { 1, 2, 3 }; if (!(fc = np_create_rattach (&qid))) msg_exit ("out of memory in %s", __FUNCTION__); fc2 = _rcv_buf (fc, P9_RATTACH, __FUNCTION__); assert (fc->u.rattach.qid.type == fc2->u.rattach.qid.type); assert (fc->u.rattach.qid.version == fc2->u.rattach.qid.version); assert (fc->u.rattach.qid.path == fc2->u.rattach.qid.path); free (fc); free (fc2); }