2017-11-18 19:09:20 +03:00
/* SPDX-License-Identifier: LGPL-2.1+ */
2016-03-03 02:31:23 +03:00
/***
This file is part of systemd .
Copyright 2010 Lennart Poettering
systemd is free software ; you can redistribute it and / or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation ; either version 2.1 of the License , or
( at your option ) any later version .
systemd is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public License
along with systemd ; If not , see < http : //www.gnu.org/licenses/>.
* * */
# include <fcntl.h>
2017-04-26 06:44:34 +03:00
# include <glob.h>
# include <sys/stat.h>
2016-03-03 02:31:23 +03:00
# include <unistd.h>
# include "alloc-util.h"
2017-04-26 06:44:34 +03:00
# include "dirent-util.h"
2016-03-03 02:31:23 +03:00
# include "fileio.h"
2017-04-26 06:44:34 +03:00
# include "fs-util.h"
2016-03-03 02:31:23 +03:00
# include "glob-util.h"
# include "macro.h"
2017-04-26 06:44:34 +03:00
# include "rm-rf.h"
2016-03-03 02:31:23 +03:00
static void test_glob_exists ( void ) {
char name [ ] = " /tmp/test-glob_exists.XXXXXX " ;
int fd = - 1 ;
int r ;
2016-09-13 09:20:38 +03:00
fd = mkostemp_safe ( name ) ;
2016-03-03 02:31:23 +03:00
assert_se ( fd > = 0 ) ;
close ( fd ) ;
r = glob_exists ( " /tmp/test-glob_exists* " ) ;
assert_se ( r = = 1 ) ;
r = unlink ( name ) ;
assert_se ( r = = 0 ) ;
r = glob_exists ( " /tmp/test-glob_exists* " ) ;
assert_se ( r = = 0 ) ;
}
2017-04-26 06:44:34 +03:00
static void test_glob_no_dot ( void ) {
char template [ ] = " /tmp/test-glob-util.XXXXXXX " ;
const char * fn ;
_cleanup_globfree_ glob_t g = {
. gl_closedir = ( void ( * ) ( void * ) ) closedir ,
. gl_readdir = ( struct dirent * ( * ) ( void * ) ) readdir_no_dot ,
. gl_opendir = ( void * ( * ) ( const char * ) ) opendir ,
. gl_lstat = lstat ,
. gl_stat = stat ,
} ;
int r ;
assert_se ( mkdtemp ( template ) ) ;
fn = strjoina ( template , " /* " ) ;
r = glob ( fn , GLOB_NOSORT | GLOB_BRACE | GLOB_ALTDIRFUNC , NULL , & g ) ;
assert_se ( r = = GLOB_NOMATCH ) ;
fn = strjoina ( template , " /.* " ) ;
r = glob ( fn , GLOB_NOSORT | GLOB_BRACE | GLOB_ALTDIRFUNC , NULL , & g ) ;
assert_se ( r = = GLOB_NOMATCH ) ;
( void ) rm_rf ( template , REMOVE_ROOT | REMOVE_PHYSICAL ) ;
}
static void test_safe_glob ( void ) {
char template [ ] = " /tmp/test-glob-util.XXXXXXX " ;
const char * fn , * fn2 , * fname ;
_cleanup_globfree_ glob_t g = { } ;
int r ;
assert_se ( mkdtemp ( template ) ) ;
fn = strjoina ( template , " /* " ) ;
r = safe_glob ( fn , 0 , & g ) ;
assert_se ( r = = - ENOENT ) ;
fn2 = strjoina ( template , " /.* " ) ;
r = safe_glob ( fn2 , GLOB_NOSORT | GLOB_BRACE , & g ) ;
assert_se ( r = = - ENOENT ) ;
fname = strjoina ( template , " /.foobar " ) ;
assert_se ( touch ( fname ) = = 0 ) ;
r = safe_glob ( fn , 0 , & g ) ;
assert_se ( r = = - ENOENT ) ;
r = safe_glob ( fn2 , GLOB_NOSORT | GLOB_BRACE , & g ) ;
assert_se ( r = = 0 ) ;
assert_se ( g . gl_pathc = = 1 ) ;
assert_se ( streq ( g . gl_pathv [ 0 ] , fname ) ) ;
assert_se ( g . gl_pathv [ 1 ] = = NULL ) ;
( void ) rm_rf ( template , REMOVE_ROOT | REMOVE_PHYSICAL ) ;
}
2016-03-03 02:31:23 +03:00
int main ( void ) {
test_glob_exists ( ) ;
2017-04-26 06:44:34 +03:00
test_glob_no_dot ( ) ;
test_safe_glob ( ) ;
2016-03-03 02:31:23 +03:00
return 0 ;
}