// yfs client interface.
// really the "clerk" that decides what server to talk to
// as well as sending RPCs.
// you only need one instance per host.
// assumes threading: blocking calls, uses pthreads locks, &c.
// intended to be called from a fuse, but doesn't actually
// know anything about fuse.

#ifndef yfs_client_h
#define yfs_client_h

#include <string>
#include "yfs_protocol.h"
#include "rpc.h"

class yfs_client {
 private:
  rpcc cl;
  struct sockaddr_in dst;

 public:
  yfs_client(struct sockaddr_in dst);

  bool isfile(yfs_protocol::inum);
  bool isdir(yfs_protocol::inum);

  // send an RPC to fuse_server
  yfs_protocol::status getfile(yfs_protocol::inum, yfs_protocol::fileinfo &);
  yfs_protocol::status getdir(yfs_protocol::inum, yfs_protocol::dirinfo &);
  yfs_protocol::status mknod(yfs_protocol::inum parent, const char * name, mode_t mode, dev_t dev, yfs_protocol::inum & inum); 
  yfs_protocol::status mkdir(yfs_protocol::inum parent, const char * name, mode_t mode,  yfs_protocol::inum & inum); 
  yfs_protocol::status lookup(yfs_protocol::inum parent,const char * name, yfs_protocol::inum & inum);
  yfs_protocol::status readdir(yfs_protocol::inum inum, std::list<yfs_protocol::dirent> &lst);
  //int test_server_connection(int value,const char * name, int &); 
  yfs_protocol::status setattr(yfs_protocol::inum inode, int  to_set, yfs_protocol::fileinfo fi);
  yfs_protocol::status read(yfs_protocol::inum inum,  std::string & value);
  yfs_protocol::status write(yfs_protocol::inum inum, std::string to_copy, long long off, int & r);
  yfs_protocol::status unlink(yfs_protocol::inum , yfs_protocol::inum);
  				
};

#endif 
