1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2010-11-17     Bernard      first version
9  */
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <finsh.h>
13 
14 #include <dirent.h>
libc_dirent()15 int libc_dirent()
16 {
17     DIR * dirp;
18     long int save3 = 0;
19     long int cur;
20     int i = 0;
21     int result = 0;
22     struct dirent *dp;
23 
24     dirp = opendir("/");
25     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
26     {
27         /* save position 3 (after fourth entry) */
28         if (i++ == 3)
29             save3 = telldir(dirp);
30 
31         printf("%s\n", dp->d_name);
32 
33         /* stop at 400 (just to make sure dirp->__offset and dirp->__size are
34          scrambled */
35         if (i == 400)
36             break;
37     }
38 
39     printf("going back past 4-th entry...\n");
40 
41     /* go back to saved entry */
42     seekdir(dirp, save3);
43 
44     /* Check whether telldir equals to save3 now.  */
45     cur = telldir(dirp);
46     if (cur != save3)
47     {
48         printf("seekdir (d, %ld); telldir (d) == %ld\n", save3, cur);
49         result = 1;
50     }
51 
52     /* print remaining files (3-last) */
53     for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
54         printf("%s\n", dp->d_name);
55 
56     closedir(dirp);
57     return result;
58 }
59 FINSH_FUNCTION_EXPORT(libc_dirent, dirent test for libc);
60