/* 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"

Dir*
fsdirstat(CFsys *fs, char *name)
{
	Dir *d;
	CFid *fid;

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

Dir*
fsdirfstat(CFid *fid)
{
	Dir *d;
	CFsys *fs;
	Fcall tx, rx;
	void *freep;
	int n;

	fs = fid->fs;
	tx.type = Tstat;
	tx.fid = fid->fid;

	if(_fsrpc(fs, &tx, &rx, &freep) < 0)
		return nil;

	d = malloc(sizeof(Dir)+rx.nstat);
	if(d == nil){
		free(freep);
		return nil;
	}
	n = convM2Du(rx.stat, rx.nstat, d, (char*)&d[1], fs->dotu);
	free(freep);
	if(n != rx.nstat){
		free(d);
		werrstr("rx.nstat and convM2D disagree about dir length");
		return nil;
	}
	return d;
}

