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:
Shi Lei 2018-09-12 17:46:34 +08:00 committed by Michal Privoznik
parent 7ea7342996
commit 09d35afd2c

View File

@ -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;