1 /* Part of libhgfs - (c) 2009, D.C. van Moolenbroek */
8 /*===========================================================================*
10 *===========================================================================*/
11 PUBLIC
int hgfs_open(path
, flags
, mode
, handle
)
12 char *path
; /* path name to open */
13 int flags
; /* open flags to use */
14 int mode
; /* mode to create (user bits only) */
15 hgfs_file_t
*handle
; /* place to store resulting handle */
17 /* Open a file. Store a file handle upon success.
21 /* We could implement this, but that means we would have to start tracking
22 * open files in order to associate data with them. Rather not.
24 if (flags
& O_APPEND
) return EINVAL
;
26 if (flags
& O_CREAT
) {
27 if (flags
& O_EXCL
) type
= HGFS_OPEN_TYPE_C
;
28 else if (flags
& O_TRUNC
) type
= HGFS_OPEN_TYPE_COT
;
29 else type
= HGFS_OPEN_TYPE_CO
;
31 if (flags
& O_TRUNC
) type
= HGFS_OPEN_TYPE_OT
;
32 else type
= HGFS_OPEN_TYPE_O
;
35 RPC_REQUEST(HGFS_REQ_OPEN
);
36 RPC_NEXT32
= (flags
& O_ACCMODE
);
38 RPC_NEXT8
= HGFS_MODE_TO_PERM(mode
);
42 if ((r
= rpc_query()) != OK
)
45 *handle
= (hgfs_file_t
)RPC_NEXT32
;
50 /*===========================================================================*
52 *===========================================================================*/
53 PUBLIC
int hgfs_read(handle
, buf
, size
, off
)
54 hgfs_file_t handle
; /* handle to open file */
55 char *buf
; /* data buffer or NULL */
56 size_t size
; /* maximum number of bytes to read */
57 u64_t off
; /* file offset */
59 /* Read from an open file. Upon success, return the number of bytes read.
63 RPC_REQUEST(HGFS_REQ_READ
);
64 RPC_NEXT32
= (u32_t
)handle
;
65 RPC_NEXT32
= ex64lo(off
);
66 RPC_NEXT32
= ex64hi(off
);
68 max
= RPC_BUF_SIZE
- RPC_LEN
- sizeof(u32_t
);
69 RPC_NEXT32
= (size
< max
) ? size
: max
;
71 if ((r
= rpc_query()) != OK
)
75 if (len
> max
) len
= max
; /* sanity check */
77 /* Only copy out data if we're requested to do so. */
79 memcpy(buf
, RPC_PTR
, len
);
84 /*===========================================================================*
86 *===========================================================================*/
87 PUBLIC
int hgfs_write(handle
, buf
, len
, off
, append
)
88 hgfs_file_t handle
; /* handle to open file */
89 const char *buf
; /* data buffer or NULL */
90 size_t len
; /* number of bytes to write */
91 u64_t off
; /* file offset */
92 int append
; /* if set, append to file (ignore offset) */
94 /* Write to an open file. Upon success, return the number of bytes written.
98 RPC_REQUEST(HGFS_REQ_WRITE
);
99 RPC_NEXT32
= (u32_t
)handle
;
108 RPC_NEXT32
= ex64lo(off
);
109 RPC_NEXT32
= ex64hi(off
);
114 /* Only copy in data if we're requested to do so. */
116 memcpy(RPC_PTR
, buf
, len
);
119 if ((r
= rpc_query()) != OK
)
125 /*===========================================================================*
127 *===========================================================================*/
128 PUBLIC
int hgfs_close(handle
)
129 hgfs_file_t handle
; /* handle to open file */
131 /* Close an open file.
134 RPC_REQUEST(HGFS_REQ_CLOSE
);
135 RPC_NEXT32
= (u32_t
)handle
;
140 /*===========================================================================*
142 *===========================================================================*/
143 PUBLIC
size_t hgfs_readbuf(ptr
)
146 /* Return information about the read buffer, for zero-copy purposes. Store a
147 * pointer to the first byte of the read buffer, and return the maximum data
148 * size. The results are static, but must only be used directly prior to a
149 * hgfs_read() call (with a NULL data buffer address).
153 off
= RPC_HDR_SIZE
+ sizeof(u32_t
);
159 return RPC_BUF_SIZE
- off
;
162 /*===========================================================================*
164 *===========================================================================*/
165 PUBLIC
size_t hgfs_writebuf(ptr
)
168 /* Return information about the write buffer, for zero-copy purposes. Store a
169 * pointer to the first byte of the write buffer, and return the maximum data
170 * size. The results are static, but must only be used immediately after a
171 * hgfs_write() call (with a NULL data buffer address).
175 off
= RPC_HDR_SIZE
+ sizeof(u32_t
) + sizeof(u8_t
) + sizeof(u32_t
) * 3;
181 return RPC_BUF_SIZE
- off
;