2017-11-18 19:09:20 +03:00
/* SPDX-License-Identifier: LGPL-2.1+ */
2015-04-04 12:52:57 +03:00
# pragma once
# include <sys/stat.h>
2019-03-14 14:24:39 +03:00
# include "errno-util.h"
2018-01-10 19:21:15 +03:00
2015-04-04 12:52:57 +03:00
typedef enum RemoveFlags {
2019-03-29 18:13:03 +03:00
REMOVE_ONLY_DIRECTORIES = 1 < < 0 , /* Only remove empty directories, no files */
REMOVE_ROOT = 1 < < 1 , /* Remove the specified directory itself too, not just the contents of it */
REMOVE_PHYSICAL = 1 < < 2 , /* If not set, only removes files on tmpfs, never physical file systems */
REMOVE_SUBVOLUME = 1 < < 3 , /* Drop btrfs subvolumes in the tree too */
REMOVE_MISSING_OK = 1 < < 4 , /* If the top-level directory is missing, ignore the ENOENT for it */
2015-04-04 12:52:57 +03:00
} RemoveFlags ;
int rm_rf_children ( int fd , RemoveFlags flags , struct stat * root_dev ) ;
int rm_rf ( const char * path , RemoveFlags flags ) ;
2016-04-08 19:54:05 +03:00
/* Useful for usage with _cleanup_(), destroys a directory and frees the pointer */
2016-05-20 16:08:24 +03:00
static inline void rm_rf_physical_and_free ( char * p ) {
2018-01-10 19:21:15 +03:00
PROTECT_ERRNO ;
2016-05-20 16:08:24 +03:00
( void ) rm_rf ( p , REMOVE_ROOT | REMOVE_PHYSICAL ) ;
2016-04-08 19:54:05 +03:00
free ( p ) ;
}
2016-05-20 16:08:24 +03:00
DEFINE_TRIVIAL_CLEANUP_FUNC ( char * , rm_rf_physical_and_free ) ;
2018-10-10 22:20:08 +03:00
/* Similar as above, but also has magic btrfs subvolume powers */
static inline void rm_rf_subvolume_and_free ( char * p ) {
PROTECT_ERRNO ;
( void ) rm_rf ( p , REMOVE_ROOT | REMOVE_PHYSICAL | REMOVE_SUBVOLUME ) ;
free ( p ) ;
}
DEFINE_TRIVIAL_CLEANUP_FUNC ( char * , rm_rf_subvolume_and_free ) ;