os/fileio: Add ability to use os/fileio.c for file descriptors

Code imported from #6299
This commit is contained in:
ZyX
2017-07-04 17:08:43 +03:00
parent 5ab9e9f617
commit 72b3fd9664
2 changed files with 98 additions and 4 deletions

View File

@@ -49,7 +49,6 @@ int file_open(FileDescriptor *const ret_fp, const char *const fname,
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
int os_open_flags = 0;
int fd;
TriState wr = kNone;
// -V:FLAG:501
#define FLAG(flags, flag, fcntl_flags, wrval, cond) \
@@ -74,14 +73,35 @@ int file_open(FileDescriptor *const ret_fp, const char *const fname,
FLAG(flags, kFileNoSymlink, O_NOFOLLOW, kNone, true);
#endif
#undef FLAG
// wr is used for kFileReadOnly flag, but on
// QB:neovim-qb-slave-ubuntu-12-04-64bit it still errors out with
// `error: variable wr set but not used [-Werror=unused-but-set-variable]`
(void)wr;
fd = os_open(fname, os_open_flags, mode);
const int fd = os_open(fname, os_open_flags, mode);
if (fd < 0) {
return fd;
}
return file_open_fd(ret_fp, fd, (wr == kTrue));
}
ret_fp->wr = (wr == kTrue);
/// Wrap file descriptor with FileDescriptor structure
///
/// @warning File descriptor wrapped like this must not be accessed by other
/// means.
///
/// @param[out] ret_fp Address where information needed for reading from or
/// writing to a file is saved
/// @param[in] fd File descriptor to wrap.
/// @param[in] wr True if fd is opened for writing only, false if it is read
/// only.
///
/// @return Error code (@see os_strerror()) or 0. Currently always returns 0.
int file_open_fd(FileDescriptor *const ret_fp, const int fd, const bool wr)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
ret_fp->wr = wr;
ret_fp->fd = fd;
ret_fp->eof = false;
ret_fp->rv = rbuffer_new(kRWBufferSize);
@@ -115,6 +135,26 @@ FileDescriptor *file_open_new(int *const error, const char *const fname,
return fp;
}
/// Like file_open_fd(), but allocate and return ret_fp
///
/// @param[out] error Error code, @see os_strerror(). Is set to zero on
/// success.
/// @param[in] fd File descriptor to wrap.
/// @param[in] wr True if fd is opened for writing only, false if it is read
/// only.
///
/// @return [allocated] Opened file or NULL in case of error.
FileDescriptor *file_open_fd_new(int *const error, const int fd, const bool wr)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_MALLOC FUNC_ATTR_WARN_UNUSED_RESULT
{
FileDescriptor *const fp = xmalloc(sizeof(*fp));
if ((*error = file_open_fd(fp, fd, wr)) != 0) {
xfree(fp);
return NULL;
}
return fp;
}
/// Close file and free its buffer
///
/// @param[in,out] fp File to close.