/* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
/* See COPYRIGHT */

#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <9pclient.h>
#include "fsimpl.h"

int
fsdirwstat(CFsys *fs, char *name, Dir *d)
{
	int n;
	CFid *fid;

	if((fid = fswalk(fs->root, name)) == nil)
		return -1;
	
	n = fsdirfwstat(fid, d);
	fsclose(fid);
	return n;
}

int
fsdirfwstat(CFid *fid, Dir *d)
{
	uchar *a;
	int n, nn;
	Fcall tx, rx;

	n = sizeD2Mu(d, fid->fs->dotu);
	a = malloc(n);
	if(a == nil)
		return -1;
	nn = convD2Mu(d, a, n, fid->fs->dotu);
	if(n != nn){
		werrstr("convD2M and sizeD2M disagree");
		free(a);
		return -1;
	}

	tx.type = Twstat;
	tx.fid = fid->fid;
	tx.stat = a;
	tx.nstat = n;
	n = _fsrpc(fid->fs, &tx, &rx, 0);
	free(a);
	return n;
}
