source: trunk/src/lib/nt/tstNtFts.c@ 2990

Last change on this file since 2990 was 2989, checked in by bird, 9 years ago

fts-nt: test case and svn keywords.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 7.1 KB
Line 
1
2
3/*********************************************************************************************************************************
4* Header Files *
5*********************************************************************************************************************************/
6#include "fts-nt.h"
7#include <stdlib.h>
8#include <stdio.h>
9#include <string.h>
10#include <errno.h>
11
12
13static int usage(const char *argv0)
14{
15 printf("usage: %s [options] <dirs & files>\n", argv0);
16 printf("\n"
17 "options:\n"
18 " -d, --see-dot\n"
19 " FTS_SEEDOT\n"
20 " -p, --physical\n"
21 " FTS_PHYSICAL\n"
22 " -l, --logical\n"
23 " FTS_LOGICAL\n"
24 " -H, --dereference-command-line\n"
25 " FTS_COMFOLLOW\n"
26 " -L, --dereference\n"
27 " Follow symbolic links while scanning directories.\n"
28 " -P, --no-dereference\n"
29 " Do not follow symbolic links while scanning directories.\n"
30 " -c, --no-chdir\n"
31 " FTS_NOCHDIR\n"
32 " -s, --no-stat\n"
33 " FTS_NOSTAT\n"
34 " -x, --one-file-system\n"
35 " FTS_XDEV\n"
36 );
37 return 0;
38}
39
40
41int main(int argc, char **argv)
42{
43 FTS *pFts;
44 int i;
45 int rcExit = 0;
46 int cVerbosity = 1;
47 int fFollowLinks = 0;
48 int fFtsFlags = 0;
49 unsigned fDoneOptions = 0;
50 unsigned cFtsArgs = 0;
51 char const **papszFtsArgs = calloc(argc + 1, sizeof(char *));
52
53 /*
54 * Parse options and heap up non-options.
55 */
56 for (i = 1; i < argc; i++)
57 {
58 const char *pszArg = argv[i];
59 if (*pszArg == '-' && !fDoneOptions)
60 {
61 char chOpt = *++pszArg;
62 pszArg++;
63 if (chOpt == '-')
64 {
65 chOpt = *pszArg++;
66 if (!chOpt)
67 {
68 fDoneOptions = 1;
69 continue;
70 }
71 if (strcmp(pszArg, "help") == 0)
72 chOpt = 'h';
73 else if (strcmp(pszArg, "version") == 0)
74 chOpt = 'V';
75 else if (strcmp(pszArg, "see-dot") == 0)
76 chOpt = 'd';
77 else if (strcmp(pszArg, "physical") == 0)
78 chOpt = 'p';
79 else if (strcmp(pszArg, "logical") == 0)
80 chOpt = 'l';
81 else if (strcmp(pszArg, "dereference-command-line") == 0)
82 chOpt = 'H';
83 else if (strcmp(pszArg, "no-chdir") == 0)
84 chOpt = 'c';
85 else if (strcmp(pszArg, "no-stat") == 0)
86 chOpt = 's';
87 else if (strcmp(pszArg, "one-file-system") == 0)
88 chOpt = 'x';
89 else
90 {
91 fprintf(stderr, "syntax error: Unknown option: --%s\n", pszArg);
92 return 2;
93 }
94 }
95 do
96 {
97 switch (chOpt)
98 {
99 case '?':
100 case 'h':
101 return usage(argv[0]);
102 case 'V':
103 printf("v0.0.0\n");
104 return 0;
105
106 case 'd':
107 fFtsFlags |= FTS_SEEDOT;
108 break;
109 case 'l':
110 fFtsFlags |= FTS_LOGICAL;
111 break;
112 case 'p':
113 fFtsFlags |= FTS_PHYSICAL;
114 break;
115 case 'H':
116 fFtsFlags |= FTS_COMFOLLOW;
117 break;
118 case 'c':
119 fFtsFlags |= FTS_NOCHDIR;
120 break;
121 case 's':
122 fFtsFlags |= FTS_NOSTAT;
123 break;
124 case 'x':
125 fFtsFlags |= FTS_XDEV;
126 break;
127 case 'L':
128 fFollowLinks = 1;
129 break;
130 case 'P':
131 fFollowLinks = 0;
132 break;
133
134 case 'v':
135 cVerbosity++;
136 break;
137
138 default:
139 fprintf(stderr, "syntax error: Unknown option: -%c (%s)\n", chOpt, argv[i]);
140 return 2;
141 }
142 chOpt = *pszArg++;
143 } while (chOpt != '\0');
144 }
145 else
146 papszFtsArgs[cFtsArgs++] = pszArg;
147 }
148
149 /*
150 * Do the traversal.
151 */
152 errno = 0;
153 pFts = fts_open((char **)papszFtsArgs, fFtsFlags, NULL /*pfnCompare*/);
154 if (pFts)
155 {
156 for (;;)
157 {
158 FTSENT *pFtsEnt = fts_read(pFts);
159 if (pFtsEnt)
160 {
161 const char *pszState;
162 switch (pFtsEnt->fts_info)
163 {
164 case FTS_D: pszState = "D"; break;
165 case FTS_DC: pszState = "DC"; break;
166 case FTS_DEFAULT: pszState = "DEFAULT"; break;
167 case FTS_DNR: pszState = "DNR"; break;
168 case FTS_DOT: pszState = "DOT"; break;
169 case FTS_DP: pszState = "DP"; break;
170 case FTS_ERR: pszState = "ERR"; break;
171 case FTS_F: pszState = "F"; break;
172 case FTS_INIT: pszState = "INIT"; break;
173 case FTS_NS: pszState = "NS"; break;
174 case FTS_NSOK: pszState = "NSOK"; break;
175 case FTS_SL: pszState = "SL"; break;
176 case FTS_SLNONE: pszState = "SLNONE"; break;
177 default:
178 pszState = "Invalid";
179 rcExit = 1;
180 break;
181 }
182
183 printf("%8s %s\n", pszState, pFtsEnt->fts_accpath);
184 if ( pFtsEnt->fts_info == FTS_SL
185 && pFtsEnt->fts_number == 0
186 && fFollowLinks
187 && ( (fFtsFlags & FTS_COMFOLLOW)
188 || pFtsEnt->fts_level > FTS_ROOTLEVEL) ) {
189 pFtsEnt->fts_number++;
190 fts_set(pFts, pFtsEnt, FTS_FOLLOW);
191 }
192 }
193 else
194 {
195 if (errno != 0)
196 {
197 fprintf(stderr, "fts_read failed: errno=%d\n", errno);
198 rcExit = 1;
199 }
200 break;
201 }
202 } /* enum loop */
203
204 errno = 0;
205 i = fts_close(pFts);
206 if (i != 0)
207 {
208 fprintf(stderr, "fts_close failed: errno=%d\n", errno);
209 rcExit = 1;
210 }
211 }
212 else
213 {
214 fprintf(stderr, "fts_open failed: errno=%d (cFtsArgs=%u)\n", errno, cFtsArgs);
215 rcExit = 1;
216 }
217
218 return rcExit;
219}
Note: See TracBrowser for help on using the repository browser.