2 * Test program for listing files during regression testing
5 Copyright (C) 2000-2005 Kern Sibbald
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 version 2 as amended with additional clauses defined in the
10 file LICENSE in the main source directory.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 the file LICENSE for additional details.
20 #include "findlib/find.h"
22 #if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
29 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
30 int generate_job_event(JCR *jcr, const char *event) { return 1; }
33 /* Global variables */
39 static int print_file(FF_PKT *ff, void *pkt, bool);
40 static void print_ls_output(char *fname, char *link, int type, struct stat *statp);
46 "Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
47 " -a print extended attributes (Win32 debug)\n"
48 " -dnn set debug level to nn\n"
49 " -e specify file of exclude patterns\n"
50 " -i specify file of include patterns\n"
51 " - read pattern(s) from stdin\n"
52 " -? print this message.\n"
54 "Patterns are file inclusion -- normally directories.\n"
55 "Debug level >= 1 prints each file found.\n"
56 "Debug level >= 10 prints path/file for catalog.\n"
57 "Errors always printed.\n"
58 "Files/paths truncated is number with len > 255.\n"
59 "Truncation is only in catalog.\n"
67 main (int argc, char *const *argv)
71 int i, ch, hard_links;
76 setlocale(LC_ALL, "");
77 bindtextdomain("bacula", LOCALEDIR);
80 while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
82 case 'a': /* print extended attributes *debug* */
86 case 'd': /* set debug level */
87 debug_level = atoi(optarg);
88 if (debug_level <= 0) {
93 case 'e': /* exclude patterns */
97 case 'i': /* include patterns */
110 jcr = new_jcr(sizeof(JCR), NULL);
112 ff = init_find_files();
113 if (argc == 0 && !inc) {
114 add_fname_to_include_list(ff, 0, "/"); /* default to / */
116 for (i=0; i < argc; i++) {
117 if (strcmp(argv[i], "-") == 0) {
118 while (fgets(name, sizeof(name)-1, stdin)) {
119 strip_trailing_junk(name);
120 add_fname_to_include_list(ff, 0, name);
124 add_fname_to_include_list(ff, 0, argv[i]);
128 fd = fopen(inc, "r");
130 printf(_("Could not open include file: %s\n"), inc);
133 while (fgets(name, sizeof(name)-1, fd)) {
134 strip_trailing_junk(name);
135 add_fname_to_include_list(ff, 0, name);
141 fd = fopen(exc, "r");
143 printf(_("Could not open exclude file: %s\n"), exc);
146 while (fgets(name, sizeof(name)-1, fd)) {
147 strip_trailing_junk(name);
148 add_fname_to_exclude_list(ff, name);
152 match_files(jcr, ff, print_file, NULL);
153 term_include_exclude_files(ff);
154 hard_links = term_find_files(ff);
157 term_last_jobs_list(); /* free jcr chain */
163 static int print_file(FF_PKT *ff, void *pkt, bool top_level)
173 print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
178 printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
181 printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
184 printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
187 printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
190 printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
193 printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
196 printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
199 printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
202 printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
208 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
215 if (type == FT_LNK) {
217 statp->st_mode |= 0777;
219 p = encode_mode(statp->st_mode, buf);
220 n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
222 n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
224 n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
226 if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
227 n = sprintf(p, "%4x ", (int)statp->st_rdev);
232 p = encode_time(statp->st_mtime, p);
235 for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
237 if (type == FT_LNK) {
242 for (f=link; *f && (p-buf) < (int)sizeof(buf); )
250 bool python_set_prog(JCR*, char const*) { return false; }