@@ -952,6 +952,49 @@ static void test_parse_cifs_service(void) {
952952 test_parse_cifs_service_one ("//./a" , NULL , NULL , NULL , - EINVAL );
953953}
954954
955+ static void test_open_mkdir_at (void ) {
956+ _cleanup_close_ int fd = -1 , subdir_fd = -1 , subsubdir_fd = -1 ;
957+ _cleanup_ (rm_rf_physical_and_freep ) char * t = NULL ;
958+ log_info ("/* %s */" , __func__ );
959+
960+ assert_se (open_mkdir_at (AT_FDCWD , "/proc" , O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
961+
962+ fd = open_mkdir_at (AT_FDCWD , "/proc" , O_CLOEXEC , 0 );
963+ assert_se (fd >= 0 );
964+ fd = safe_close (fd );
965+
966+ assert_se (open_mkdir_at (AT_FDCWD , "/bin/sh" , O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
967+ assert_se (open_mkdir_at (AT_FDCWD , "/bin/sh" , O_CLOEXEC , 0 ) == - EEXIST );
968+
969+ assert_se (mkdtemp_malloc (NULL , & t ) >= 0 );
970+
971+ assert_se (open_mkdir_at (AT_FDCWD , t , O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
972+ assert_se (open_mkdir_at (AT_FDCWD , t , O_PATH |O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
973+
974+ fd = open_mkdir_at (AT_FDCWD , t , O_CLOEXEC , 0000 );
975+ assert_se (fd >= 0 );
976+ fd = safe_close (fd );
977+
978+ fd = open_mkdir_at (AT_FDCWD , t , O_PATH |O_CLOEXEC , 0000 );
979+ assert_se (fd >= 0 );
980+
981+ subdir_fd = open_mkdir_at (fd , "xxx" , O_PATH |O_EXCL |O_CLOEXEC , 0700 );
982+ assert_se (subdir_fd >= 0 );
983+
984+ assert_se (open_mkdir_at (fd , "xxx" , O_PATH |O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
985+
986+ subsubdir_fd = open_mkdir_at (subdir_fd , "yyy" , O_EXCL |O_CLOEXEC , 0700 );
987+ assert_se (subsubdir_fd >= 0 );
988+ subsubdir_fd = safe_close (subsubdir_fd );
989+
990+ assert_se (open_mkdir_at (subdir_fd , "yyy" , O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
991+
992+ assert_se (open_mkdir_at (fd , "xxx/yyy" , O_EXCL |O_CLOEXEC , 0 ) == - EEXIST );
993+
994+ subsubdir_fd = open_mkdir_at (fd , "xxx/yyy" , O_CLOEXEC , 0700 );
995+ assert_se (subsubdir_fd >= 0 );
996+ }
997+
955998int main (int argc , char * argv []) {
956999 test_setup_logging (LOG_INFO );
9571000
@@ -972,6 +1015,7 @@ int main(int argc, char *argv[]) {
9721015 test_conservative_rename ();
9731016 test_rmdir_parents ();
9741017 test_parse_cifs_service ();
1018+ test_open_mkdir_at ();
9751019
9761020 return 0 ;
9771021}
0 commit comments