mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
util: file: introduce VIR_AUTOCLOSE macro to close fd of the file automatically
Signed-off-by: Shi Lei <shi_lei@massclouds.com>
This commit is contained in:
parent
7ea7342996
commit
09d35afd2c
@ -54,6 +54,11 @@ int virFileClose(int *fdptr, virFileCloseFlags flags)
|
||||
int virFileFclose(FILE **file, bool preserve_errno) ATTRIBUTE_RETURN_CHECK;
|
||||
FILE *virFileFdopen(int *fdptr, const char *mode) ATTRIBUTE_RETURN_CHECK;
|
||||
|
||||
static inline void virForceCloseHelper(int *fd)
|
||||
{
|
||||
ignore_value(virFileClose(fd, VIR_FILE_CLOSE_PRESERVE_ERRNO));
|
||||
}
|
||||
|
||||
/* For use on normal paths; caller must check return value,
|
||||
and failure sets errno per close. */
|
||||
# define VIR_CLOSE(FD) virFileClose(&(FD), 0)
|
||||
@ -64,8 +69,7 @@ FILE *virFileFdopen(int *fdptr, const char *mode) ATTRIBUTE_RETURN_CHECK;
|
||||
|
||||
/* For use on cleanup paths; errno is unaffected by close,
|
||||
and no return value to worry about. */
|
||||
# define VIR_FORCE_CLOSE(FD) \
|
||||
ignore_value(virFileClose(&(FD), VIR_FILE_CLOSE_PRESERVE_ERRNO))
|
||||
# define VIR_FORCE_CLOSE(FD) virForceCloseHelper(&(FD))
|
||||
# define VIR_FORCE_FCLOSE(FILE) ignore_value(virFileFclose(&(FILE), true))
|
||||
|
||||
/* Similar VIR_FORCE_CLOSE() but ignores EBADF errors since they are expected
|
||||
@ -80,6 +84,16 @@ FILE *virFileFdopen(int *fdptr, const char *mode) ATTRIBUTE_RETURN_CHECK;
|
||||
VIR_FILE_CLOSE_PRESERVE_ERRNO | \
|
||||
VIR_FILE_CLOSE_DONT_LOG))
|
||||
|
||||
/**
|
||||
* VIR_AUTOCLOSE:
|
||||
*
|
||||
* Macro to automatically force close the fd by calling virForceCloseHelper
|
||||
* when the fd goes out of scope. It's used to eliminate VIR_FORCE_CLOSE
|
||||
* in cleanup sections.
|
||||
*/
|
||||
# define VIR_AUTOCLOSE __attribute__((cleanup(virForceCloseHelper))) int
|
||||
|
||||
|
||||
/* Opaque type for managing a wrapper around a fd. */
|
||||
struct _virFileWrapperFd;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user