Patch submitted by hoefnix. Ref. https://groups.google.com/d/msg/minix-dev/sHQDVJRyx1c/eJjrYOqk5bgJ Change-Id: I2fcdf4cf119ef252ccc7df06849baf37ffd08440
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Part of libhgfs - (c) 2009, D.C. van Moolenbroek */
 | 
						|
 | 
						|
#include "inc.h"
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				hgfs_opendir				     *
 | 
						|
 *===========================================================================*/
 | 
						|
int hgfs_opendir(char *path, sffs_dir_t *handle)
 | 
						|
{
 | 
						|
/* Open a directory. Store a directory handle upon success.
 | 
						|
 */
 | 
						|
  int r;
 | 
						|
 | 
						|
  RPC_REQUEST(HGFS_REQ_OPENDIR);
 | 
						|
 | 
						|
  path_put(path);
 | 
						|
 | 
						|
  if ((r = rpc_query()) != OK)
 | 
						|
	return r;
 | 
						|
 | 
						|
  *handle = (sffs_dir_t)RPC_NEXT32;
 | 
						|
 | 
						|
  return OK;
 | 
						|
}
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				hgfs_readdir				     *
 | 
						|
 *===========================================================================*/
 | 
						|
int hgfs_readdir(sffs_dir_t handle, unsigned int index, char *buf,
 | 
						|
	size_t size, struct sffs_attr *attr)
 | 
						|
{
 | 
						|
/* Read a directory entry from an open directory, using a zero-based index
 | 
						|
 * number. Upon success, the resulting path name is stored in the given buffer
 | 
						|
 * and the given attribute structure is filled selectively as requested. Upon
 | 
						|
 * error, the contents of the path buffer and attribute structure are
 | 
						|
 * undefined. ENOENT is returned upon end of directory.
 | 
						|
 */
 | 
						|
  int r;
 | 
						|
 | 
						|
  RPC_REQUEST(HGFS_REQ_READDIR);
 | 
						|
  RPC_NEXT32 = (u32_t)handle;
 | 
						|
  RPC_NEXT32 = index;
 | 
						|
 | 
						|
  /* EINVAL signifies end of directory. */
 | 
						|
  if ((r = rpc_query()) != OK)
 | 
						|
	return (r == EINVAL) ? ENOENT : OK;
 | 
						|
 | 
						|
  attr_get(attr);
 | 
						|
 | 
						|
  if ((r = path_get(buf, size)) != OK)
 | 
						|
	return r;
 | 
						|
 | 
						|
  /* VMware Player 3 returns an empty name, instead of EINVAL, when reading
 | 
						|
   * from an EOF position right after opening the directory handle. Seems to be
 | 
						|
   * a newly introduced bug..
 | 
						|
   */
 | 
						|
  return (!buf[0]) ? ENOENT : OK;
 | 
						|
}
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				hgfs_closedir				     *
 | 
						|
 *===========================================================================*/
 | 
						|
int hgfs_closedir(sffs_dir_t handle)
 | 
						|
{
 | 
						|
/* Close an open directory.
 | 
						|
 */
 | 
						|
 | 
						|
  RPC_REQUEST(HGFS_REQ_CLOSEDIR);
 | 
						|
  RPC_NEXT32 = (u32_t)handle;
 | 
						|
 | 
						|
  return rpc_query();
 | 
						|
}
 |