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"
80 int main(int argc, char *const *argv)
85 int i, ch, hard_links;
90 setlocale(LC_ALL, "");
91 bindtextdomain("bacula", LOCALEDIR);
95 while ((ch = getopt(argc, argv, "ad:e:i:q?")) != -1) {
97 case 'a': /* print extended attributes *debug* */
101 case 'd': /* set debug level */
102 if (*optarg == 't') {
103 dbg_timestamp = true;
105 debug_level = atoi(optarg);
106 if (debug_level <= 0) {
112 case 'e': /* exclude patterns */
116 case 'i': /* include patterns */
133 jcr = new_jcr(sizeof(JCR), NULL);
135 ff = init_find_files();
136 if (argc == 0 && !inc) {
137 add_fname_to_include_list(ff, 0, "/"); /* default to / */
139 for (i=0; i < argc; i++) {
140 if (strcmp(argv[i], "-") == 0) {
141 while (fgets(name, sizeof(name)-1, stdin)) {
142 strip_trailing_junk(name);
143 add_fname_to_include_list(ff, 0, name);
147 add_fname_to_include_list(ff, 0, argv[i]);
151 fd = fopen(inc, "rb");
153 printf(_("Could not open include file: %s\n"), inc);
156 while (fgets(name, sizeof(name)-1, fd)) {
157 strip_trailing_junk(name);
158 add_fname_to_include_list(ff, 0, name);
164 fd = fopen(exc, "rb");
166 printf(_("Could not open exclude file: %s\n"), exc);
169 while (fgets(name, sizeof(name)-1, fd)) {
170 strip_trailing_junk(name);
171 add_fname_to_exclude_list(ff, name);
176 match_files(jcr, ff, count_files);
178 match_files(jcr, ff, print_file);
180 printf(_("Files seen = %d\n"), num_files);
181 term_include_exclude_files(ff);
182 hard_links = term_find_files(ff);
185 term_last_jobs_list(); /* free jcr chain */
192 static int count_files(JCR *jcr, FF_PKT *ff, bool top_level)
198 static int print_file(JCR *jcr, FF_PKT *ff, bool top_level)
208 print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
213 printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
216 printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
219 printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
222 printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
225 printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
228 printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
231 printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
234 printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
237 printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
244 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
251 if (type == FT_LNK) {
253 statp->st_mode |= 0777;
255 p = encode_mode(statp->st_mode, buf);
256 n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
258 n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
260 n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
262 if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
263 n = sprintf(p, "%4x ", (int)statp->st_rdev);
268 p = encode_time(statp->st_mtime, p);
271 for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
273 if (type == FT_LNK) {
278 for (f=link; *f && (p-buf) < (int)sizeof(buf); )
286 bool python_set_prog(JCR*, char const*) { return false; }