2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 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 John Walker.
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 */
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);
57 "Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
58 " -a print extended attributes (Win32 debug)\n"
59 " -d <nn> set debug level to <nn>\n"
60 " -dt print timestamp in debug output\n"
61 " -e specify file of exclude patterns\n"
62 " -i specify file of include patterns\n"
63 " - read pattern(s) from stdin\n"
64 " -? print this message.\n"
66 "Patterns are file inclusion -- normally directories.\n"
67 "Debug level >= 1 prints each file found.\n"
68 "Debug level >= 10 prints path/file for catalog.\n"
69 "Errors always printed.\n"
70 "Files/paths truncated is number with len > 255.\n"
71 "Truncation is only in catalog.\n"
79 main (int argc, char *const *argv)
83 int i, ch, hard_links;
88 setlocale(LC_ALL, "");
89 bindtextdomain("bacula", LOCALEDIR);
92 while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
94 case 'a': /* print extended attributes *debug* */
98 case 'd': /* set debug level */
100 dbg_timestamp = true;
102 debug_level = atoi(optarg);
103 if (debug_level <= 0) {
109 case 'e': /* exclude patterns */
113 case 'i': /* include patterns */
126 jcr = new_jcr(sizeof(JCR), NULL);
128 ff = init_find_files();
129 if (argc == 0 && !inc) {
130 add_fname_to_include_list(ff, 0, "/"); /* default to / */
132 for (i=0; i < argc; i++) {
133 if (strcmp(argv[i], "-") == 0) {
134 while (fgets(name, sizeof(name)-1, stdin)) {
135 strip_trailing_junk(name);
136 add_fname_to_include_list(ff, 0, name);
140 add_fname_to_include_list(ff, 0, argv[i]);
144 fd = fopen(inc, "rb");
146 printf(_("Could not open include file: %s\n"), inc);
149 while (fgets(name, sizeof(name)-1, fd)) {
150 strip_trailing_junk(name);
151 add_fname_to_include_list(ff, 0, name);
157 fd = fopen(exc, "rb");
159 printf(_("Could not open exclude file: %s\n"), exc);
162 while (fgets(name, sizeof(name)-1, fd)) {
163 strip_trailing_junk(name);
164 add_fname_to_exclude_list(ff, name);
168 match_files(jcr, ff, print_file);
169 term_include_exclude_files(ff);
170 hard_links = term_find_files(ff);
173 term_last_jobs_list(); /* free jcr chain */
179 static int print_file(JCR *jcr, FF_PKT *ff, bool top_level)
189 print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
194 printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
197 printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
200 printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
203 printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
206 printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
209 printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
212 printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
215 printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
218 printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
224 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
231 if (type == FT_LNK) {
233 statp->st_mode |= 0777;
235 p = encode_mode(statp->st_mode, buf);
236 n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
238 n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
240 n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
242 if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
243 n = sprintf(p, "%4x ", (int)statp->st_rdev);
248 p = encode_time(statp->st_mtime, p);
251 for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
253 if (type == FT_LNK) {
258 for (f=link; *f && (p-buf) < (int)sizeof(buf); )
266 bool python_set_prog(JCR*, char const*) { return false; }