コード例 #1
0
ファイル: dir.c プロジェクト: jgarzik/nfs4d
nfsstat4 nfs_op_lookupp(struct nfs_cxn *cxn,
		       struct list_head *writes, struct rpc_write **wr)
{
	nfsstat4 status = NFS4_OK;
	struct nfs_inode *ino = NULL;

	if (debugging)
		applog(LOG_INFO, "op LOOKUPP");

	status = dir_curfh(NULL, cxn, &ino, 0);
	if (status != NFS4_OK)
		goto out;

	if (ino->inum == INO_ROOT) {	/* root inode, no parents */
		status = NFS4ERR_NOENT;
		goto out;
	}

	fh_set(&cxn->current_fh, ino->parent);

out:
	WR32(status);
	inode_free(ino);
	return status;
}
コード例 #2
0
ファイル: Error.c プロジェクト: ndreynolds/flathead
// [new] URIError(message)
js_val *
error_uri_new(js_val *instance, js_args *args, eval_state *state)
{
  js_val *err = error_new(instance, args, state);
  fh_set(err, "name", JSSTR(E_URI));
  err->proto = fh_try_get_proto(E_URI);
  return err;
}
コード例 #3
0
ファイル: Error.c プロジェクト: pstef/flathead
// [new] Error(message)
js_val *
error_new(js_val *instance, js_args *args, eval_state *state)
{
  js_val *err = JSOBJ();
  js_val *msg = ARG(args, 0);
  fh_set_class(err, "Error");

  if (!IS_UNDEF(msg))
    fh_set(err, "message", TO_STR(msg));

  err->proto = fh_try_get_proto("Error");
  return err;
}
コード例 #4
0
ファイル: dir.c プロジェクト: jgarzik/nfs4d
nfsstat4 nfs_op_lookup(struct nfs_cxn *cxn, const LOOKUP4args *args,
		       struct list_head *writes, struct rpc_write **wr)
{
	nfsstat4 status = NFS4_OK;
	struct nfs_inode *ino = NULL;
	bool printed = false;
	struct nfs_buf objname;
	nfsino_t inum;
	DB_TXN *txn = NULL;
	DB_ENV *dbenv = srv.fsdb.env;
	int rc;

	objname.len = args->objname.utf8string_len;
	objname.val = args->objname.utf8string_val;

	if (!objname.len) {
		status = NFS4ERR_INVAL;
		goto out;
	}
	if (!objname.val) {
		status = NFS4ERR_BADXDR;
		goto out;
	}

	if (objname.len > SRV_MAX_NAME) {
		status = NFS4ERR_NAMETOOLONG;
		goto out;
	}

	rc = dbenv->txn_begin(dbenv, NULL, &txn, 0);
	if (rc) {
		status = NFS4ERR_IO;
		dbenv->err(dbenv, rc, "DB_ENV->txn_begin");
		goto out;
	}

	status = dir_curfh(txn, cxn, &ino, 0);
	if (status != NFS4_OK) {
		if ((status == NFS4ERR_NOTDIR) &&
		    (ino->type == NF4LNK))
			status = NFS4ERR_SYMLINK;
		goto out_abort;
	}

	status = dir_lookup(txn, ino, &objname, 0, &inum);
	if (status != NFS4_OK)
		goto out_abort;

	rc = txn->commit(txn, 0);
	if (rc) {
		dbenv->err(dbenv, rc, "DB_ENV->txn_commit");
		status = NFS4ERR_IO;
		goto out;
	}

	fh_set(&cxn->current_fh, inum);

	if (debugging) {
		applog(LOG_INFO, "op LOOKUP ('%.*s') -> %016llX",
		       objname.len,
		       objname.val,
		       (unsigned long long) cxn->current_fh.inum);
		printed = true;
	}

out:
	if (!printed) {
		if (debugging)
			applog(LOG_INFO, "op LOOKUP ('%.*s')",
			       objname.len,
			       objname.val);
	}

	WR32(status);
	inode_free(ino);
	return status;

out_abort:
	if (txn->abort(txn))
		dbenv->err(dbenv, rc, "DB_ENV->txn_abort");
	goto out;
}