@@ -29,6 +29,7 @@ static uv_fs_t readdir_req;
29
29
static uv_fs_t closedir_req ;
30
30
31
31
static uv_dirent_t dirents [1 ];
32
+ static uv_dirent_t symlink_dirents [2 ];
32
33
33
34
static int empty_opendir_cb_count ;
34
35
static int empty_closedir_cb_count ;
@@ -460,3 +461,88 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
460
461
MAKE_VALGRIND_HAPPY (uv_default_loop ());
461
462
return 0 ;
462
463
}
464
+
465
+ static void readdir_symlink_readdir_cb (uv_fs_t * req ) {
466
+ uv_dir_t * dir ;
467
+
468
+ ASSERT_PTR_EQ (req , & readdir_req );
469
+ ASSERT_EQ (req -> fs_type , UV_FS_READDIR );
470
+ dir = req -> ptr ;
471
+
472
+ if (req -> result == 0 ) {
473
+ uv_fs_req_cleanup (req );
474
+ ASSERT_EQ (3 , non_empty_readdir_cb_count );
475
+ uv_fs_closedir (uv_default_loop (),
476
+ & closedir_req ,
477
+ dir ,
478
+ non_empty_closedir_cb );
479
+ } else {
480
+ if (strcmp (symlink_dirents [0 ].name , "test_symlink" ) == 0 ) {
481
+ ASSERT_EQ (symlink_dirents [0 ].type , UV_DIRENT_LINK );
482
+ } else {
483
+ ASSERT_EQ (symlink_dirents [1 ].type , UV_DIRENT_LINK );
484
+ }
485
+ uv_fs_req_cleanup (req );
486
+ }
487
+ }
488
+
489
+ static void readdir_symlink_opendir_cb (uv_fs_t * req ) {
490
+ uv_dir_t * dir ;
491
+ int r ;
492
+
493
+ ASSERT_PTR_EQ (req , & opendir_req );
494
+ ASSERT_EQ (req -> fs_type , UV_FS_OPENDIR );
495
+ ASSERT_OK (req -> result );
496
+ ASSERT_NOT_NULL (req -> ptr );
497
+
498
+ dir = req -> ptr ;
499
+ dir -> dirents = symlink_dirents ;
500
+ dir -> nentries = ARRAY_SIZE (symlink_dirents );
501
+
502
+ r = uv_fs_readdir (uv_default_loop (),
503
+ & readdir_req ,
504
+ dir ,
505
+ readdir_symlink_readdir_cb );
506
+ ASSERT_OK (r );
507
+ uv_fs_req_cleanup (req );
508
+ }
509
+
510
+ static void cleanup_symlink_test_files (void ) {
511
+ uv_fs_t req ;
512
+
513
+ uv_fs_rmdir (NULL , & req , "test_symlink_dir/test_subdir" , NULL );
514
+ uv_fs_req_cleanup (& req );
515
+ uv_fs_unlink (NULL , & req , "test_symlink_dir/test_symlink" , NULL );
516
+ uv_fs_req_cleanup (& req );
517
+ uv_fs_rmdir (NULL , & req , "test_symlink_dir" , NULL );
518
+ uv_fs_req_cleanup (& req );
519
+ }
520
+
521
+ TEST_IMPL (fs_readdir_symlink ) {
522
+
523
+ uv_fs_t mkdir_req ;
524
+ uv_fs_t symlink_req ;
525
+ int r ;
526
+
527
+ cleanup_symlink_test_files ();
528
+
529
+ r = uv_fs_mkdir (uv_default_loop (), & mkdir_req , "test_symlink_dir" , 0755 , NULL );
530
+ ASSERT_OK (r );
531
+
532
+ r = uv_fs_mkdir (uv_default_loop (), & mkdir_req , "test_symlink_dir/test_subdir" , 0755 , NULL );
533
+ ASSERT_OK (r );
534
+
535
+ r = uv_fs_symlink (uv_default_loop (), & symlink_req , "test_symlink_dir/test_subdir" , "test_symlink_dir/test_symlink" , UV_FS_SYMLINK_DIR , NULL );
536
+ ASSERT_OK (r );
537
+
538
+ r = uv_fs_opendir (uv_default_loop (), & opendir_req , "test_symlink_dir" , readdir_symlink_opendir_cb );
539
+ ASSERT_OK (r );
540
+
541
+ r = uv_run (uv_default_loop (), UV_RUN_DEFAULT );
542
+ ASSERT_OK (r );
543
+
544
+ cleanup_symlink_test_files ();
545
+
546
+ MAKE_VALGRIND_HAPPY (uv_default_loop ());
547
+ return 0 ;
548
+ }
0 commit comments