1 /* Part of libhgfs - (c) 2009, D.C. van Moolenbroek */
8 /*===========================================================================*
10 *===========================================================================*/
12 const char *path
, /* path name to open */
13 int flags
, /* open flags to use */
14 int mode
, /* mode to create (user bits only) */
15 sffs_file_t
*handle
/* place to store resulting handle */
18 /* Open a file. Store a file handle upon success.
22 /* We could implement this, but that means we would have to start tracking
23 * open files in order to associate data with them. Rather not.
25 if (flags
& O_APPEND
) return EINVAL
;
27 if (flags
& O_CREAT
) {
28 if (flags
& O_EXCL
) type
= HGFS_OPEN_TYPE_C
;
29 else if (flags
& O_TRUNC
) type
= HGFS_OPEN_TYPE_COT
;
30 else type
= HGFS_OPEN_TYPE_CO
;
32 if (flags
& O_TRUNC
) type
= HGFS_OPEN_TYPE_OT
;
33 else type
= HGFS_OPEN_TYPE_O
;
36 RPC_REQUEST(HGFS_REQ_OPEN
);
37 RPC_NEXT32
= (flags
& O_ACCMODE
);
39 RPC_NEXT8
= HGFS_MODE_TO_PERM(mode
);
43 if ((r
= rpc_query()) != OK
)
46 *handle
= (sffs_file_t
)RPC_NEXT32
;
51 /*===========================================================================*
53 *===========================================================================*/
55 sffs_file_t handle
, /* handle to open file */
56 char *buf
, /* data buffer or NULL */
57 size_t size
, /* maximum number of bytes to read */
58 u64_t off
/* file offset */
61 /* Read from an open file. Upon success, return the number of bytes read.
66 RPC_REQUEST(HGFS_REQ_READ
);
67 RPC_NEXT32
= (u32_t
)handle
;
68 RPC_NEXT32
= ex64lo(off
);
69 RPC_NEXT32
= ex64hi(off
);
71 max
= RPC_BUF_SIZE
- RPC_LEN
- sizeof(u32_t
);
72 RPC_NEXT32
= (size
< max
) ? size
: max
;
74 if ((r
= rpc_query()) != OK
)
78 if (len
> max
) len
= max
; /* sanity check */
80 /* Only copy out data if we're not operating directly on the RPC buffer. */
82 memcpy(buf
, RPC_PTR
, len
);
87 /*===========================================================================*
89 *===========================================================================*/
91 sffs_file_t handle
, /* handle to open file */
92 char *buf
, /* data buffer or NULL */
93 size_t len
, /* number of bytes to write */
94 u64_t off
/* file offset */
97 /* Write to an open file. Upon success, return the number of bytes written.
101 RPC_REQUEST(HGFS_REQ_WRITE
);
102 RPC_NEXT32
= (u32_t
)handle
;
103 RPC_NEXT8
= 0; /* append flag */
104 RPC_NEXT32
= ex64lo(off
);
105 RPC_NEXT32
= ex64hi(off
);
108 /* Only copy in data if we're not operating directly on the RPC buffer. */
110 memcpy(RPC_PTR
, buf
, len
);
113 if ((r
= rpc_query()) != OK
)
119 /*===========================================================================*
121 *===========================================================================*/
123 sffs_file_t handle
/* handle to open file */
126 /* Close an open file.
129 RPC_REQUEST(HGFS_REQ_CLOSE
);
130 RPC_NEXT32
= (u32_t
)handle
;
135 /*===========================================================================*
137 *===========================================================================*/
138 size_t hgfs_readbuf(char **ptr
)
140 /* Return information about the read buffer, for zero-copy purposes. Store a
141 * pointer to the first byte of the read buffer, and return the maximum data
142 * size. The results are static, but must only be used directly prior to a
143 * hgfs_read() call (with a NULL data buffer address).
147 off
= RPC_HDR_SIZE
+ sizeof(u32_t
);
153 return RPC_BUF_SIZE
- off
;
156 /*===========================================================================*
158 *===========================================================================*/
159 size_t hgfs_writebuf(char **ptr
)
161 /* Return information about the write buffer, for zero-copy purposes. Store a
162 * pointer to the first byte of the write buffer, and return the maximum data
163 * size. The results are static, but must only be used immediately after a
164 * hgfs_write() call (with a NULL data buffer address).
168 off
= RPC_HDR_SIZE
+ sizeof(u32_t
) + sizeof(u8_t
) + sizeof(u32_t
) * 3;
174 return RPC_BUF_SIZE
- off
;