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

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

tstNtFts: also compile against old code.

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