2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Test program for listing files during regression testing
36 #include "findlib/find.h"
39 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
40 int generate_job_event(JCR *jcr, const char *event) { return 1; }
41 void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) { }
44 /* Global variables */
48 static int num_files = 0;
50 static int print_file(JCR *jcr, FF_PKT *ff, bool);
51 static void print_ls_output(char *fname, char *link, int type, struct stat *statp);
52 static int count_files(JCR *jcr, FF_PKT *ff, bool top_level);
58 "Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
59 " -a print extended attributes (Win32 debug)\n"
60 " -d <nn> set debug level to <nn>\n"
61 " -dt print timestamp in debug output\n"
62 " -e specify file of exclude patterns\n"
63 " -i specify file of include patterns\n"
64 " -q quiet, don't print filenames (debug)\n"
65 " - read pattern(s) from stdin\n"
66 " -? print this message.\n"
68 "Patterns are file inclusion -- normally directories.\n"
69 "Debug level >= 1 prints each file found.\n"
70 "Debug level >= 10 prints path/file for catalog.\n"
71 "Errors always printed.\n"
72 "Files/paths truncated is number with len > 255.\n"
73 "Truncation is only in catalog.\n"
81 main (int argc, char *const *argv)
86 int i, ch, hard_links;
91 setlocale(LC_ALL, "");
92 bindtextdomain("bacula", LOCALEDIR);
96 while ((ch = getopt(argc, argv, "ad:e:i:q?")) != -1) {
98 case 'a': /* print extended attributes *debug* */
102 case 'd': /* set debug level */
103 if (*optarg == 't') {
104 dbg_timestamp = true;
106 debug_level = atoi(optarg);
107 if (debug_level <= 0) {
113 case 'e': /* exclude patterns */
117 case 'i': /* include patterns */
134 jcr = new_jcr(sizeof(JCR), NULL);
136 ff = init_find_files();
137 if (argc == 0 && !inc) {
138 add_fname_to_include_list(ff, 0, "/"); /* default to / */
140 for (i=0; i < argc; i++) {
141 if (strcmp(argv[i], "-") == 0) {
142 while (fgets(name, sizeof(name)-1, stdin)) {
143 strip_trailing_junk(name);
144 add_fname_to_include_list(ff, 0, name);
148 add_fname_to_include_list(ff, 0, argv[i]);
152 fd = fopen(inc, "rb");
154 printf(_("Could not open include file: %s\n"), inc);
157 while (fgets(name, sizeof(name)-1, fd)) {
158 strip_trailing_junk(name);
159 add_fname_to_include_list(ff, 0, name);
165 fd = fopen(exc, "rb");
167 printf(_("Could not open exclude file: %s\n"), exc);
170 while (fgets(name, sizeof(name)-1, fd)) {
171 strip_trailing_junk(name);
172 add_fname_to_exclude_list(ff, name);
177 match_files(jcr, ff, count_files);
179 match_files(jcr, ff, print_file);
181 printf(_("Files seen = %d\n"), num_files);
182 term_include_exclude_files(ff);
183 hard_links = term_find_files(ff);
186 term_last_jobs_list(); /* free jcr chain */
193 static int count_files(JCR *jcr, FF_PKT *ff, bool top_level)
199 static int print_file(JCR *jcr, FF_PKT *ff, bool top_level)
209 print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
214 printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
217 printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
220 printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
223 printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
226 printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
229 printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
232 printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
235 printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
238 printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
245 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
252 if (type == FT_LNK) {
254 statp->st_mode |= 0777;
256 p = encode_mode(statp->st_mode, buf);
257 n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
259 n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
261 n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
263 if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
264 n = sprintf(p, "%4x ", (int)statp->st_rdev);
269 p = encode_time(statp->st_mtime, p);
272 for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
274 if (type == FT_LNK) {
279 for (f=link; *f && (p-buf) < (int)sizeof(buf); )
287 bool python_set_prog(JCR*, char const*) { return false; }