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 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 */
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);
93 while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
95 case 'a': /* print extended attributes *debug* */
99 case 'd': /* set debug level */
100 if (*optarg == 't') {
101 dbg_timestamp = true;
103 debug_level = atoi(optarg);
104 if (debug_level <= 0) {
110 case 'e': /* exclude patterns */
114 case 'i': /* include patterns */
127 jcr = new_jcr(sizeof(JCR), NULL);
129 ff = init_find_files();
130 if (argc == 0 && !inc) {
131 add_fname_to_include_list(ff, 0, "/"); /* default to / */
133 for (i=0; i < argc; i++) {
134 if (strcmp(argv[i], "-") == 0) {
135 while (fgets(name, sizeof(name)-1, stdin)) {
136 strip_trailing_junk(name);
137 add_fname_to_include_list(ff, 0, name);
141 add_fname_to_include_list(ff, 0, argv[i]);
145 fd = fopen(inc, "rb");
147 printf(_("Could not open include file: %s\n"), inc);
150 while (fgets(name, sizeof(name)-1, fd)) {
151 strip_trailing_junk(name);
152 add_fname_to_include_list(ff, 0, name);
158 fd = fopen(exc, "rb");
160 printf(_("Could not open exclude file: %s\n"), exc);
163 while (fgets(name, sizeof(name)-1, fd)) {
164 strip_trailing_junk(name);
165 add_fname_to_exclude_list(ff, name);
169 match_files(jcr, ff, print_file);
170 term_include_exclude_files(ff);
171 hard_links = term_find_files(ff);
174 term_last_jobs_list(); /* free jcr chain */
181 static int print_file(JCR *jcr, FF_PKT *ff, bool top_level)
191 print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
196 printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
199 printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
202 printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
205 printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
208 printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
211 printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
214 printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
217 printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
220 printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
226 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
233 if (type == FT_LNK) {
235 statp->st_mode |= 0777;
237 p = encode_mode(statp->st_mode, buf);
238 n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
240 n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
242 n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
244 if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
245 n = sprintf(p, "%4x ", (int)statp->st_rdev);
250 p = encode_time(statp->st_mtime, p);
253 for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
255 if (type == FT_LNK) {
260 for (f=link; *f && (p-buf) < (int)sizeof(buf); )
268 bool python_set_prog(JCR*, char const*) { return false; }