]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/tools/testls.c
Eliminate pesky compiler warnings
[bacula/bacula] / bacula / src / tools / testls.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
5
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
11    in the file LICENSE.
12
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.
17
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
21    02110-1301, USA.
22
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.
27 */
28 /*
29  * Test program for listing files during regression testing
30  *
31  *  Kern Sibbald, MM
32  *
33  */
34
35 #include "bacula.h"
36 #include "findlib/find.h"
37
38 /* Dummy functions */
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) { }
42
43
44 /* Global variables */
45 int attrs = 0;
46
47 static JCR *jcr;
48
49
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
53 static void usage()
54 {
55    fprintf(stderr, _(
56 "\n"
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"
65 "\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"
72 "\n"));
73
74    exit(1);
75 }
76
77
78 int
79 main (int argc, char *const *argv)
80 {
81    FF_PKT *ff;
82    char name[1000];
83    int i, ch, hard_links;
84    char *inc = NULL;
85    char *exc = NULL;
86    FILE *fd;
87
88    setlocale(LC_ALL, "");
89    bindtextdomain("bacula", LOCALEDIR);
90    textdomain("bacula");
91
92    while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
93       switch (ch) {
94       case 'a':                       /* print extended attributes *debug* */
95          attrs = 1;
96          break;
97
98       case 'd':                       /* set debug level */
99          if (*optarg == 't') {
100             dbg_timestamp = true;
101          } else {
102             debug_level = atoi(optarg);
103             if (debug_level <= 0) {
104                debug_level = 1;
105             }
106          }
107          break;
108
109       case 'e':                       /* exclude patterns */
110          exc = optarg;
111          break;
112
113       case 'i':                       /* include patterns */
114          inc = optarg;
115          break;
116
117       case '?':
118       default:
119          usage();
120
121       }
122    }
123    argc -= optind;
124    argv += optind;
125
126    jcr = new_jcr(sizeof(JCR), NULL);
127
128    ff = init_find_files();
129    if (argc == 0 && !inc) {
130       add_fname_to_include_list(ff, 0, "/"); /* default to / */
131    } else {
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);
137               }
138               continue;
139          }
140          add_fname_to_include_list(ff, 0, argv[i]);
141       }
142    }
143    if (inc) {
144       fd = fopen(inc, "rb");
145       if (!fd) {
146          printf(_("Could not open include file: %s\n"), inc);
147          exit(1);
148       }
149       while (fgets(name, sizeof(name)-1, fd)) {
150          strip_trailing_junk(name);
151          add_fname_to_include_list(ff, 0, name);
152       }
153       fclose(fd);
154    }
155
156    if (exc) {
157       fd = fopen(exc, "rb");
158       if (!fd) {
159          printf(_("Could not open exclude file: %s\n"), exc);
160          exit(1);
161       }
162       while (fgets(name, sizeof(name)-1, fd)) {
163          strip_trailing_junk(name);
164          add_fname_to_exclude_list(ff, name);
165       }
166       fclose(fd);
167    }
168    match_files(jcr, ff, print_file);
169    term_include_exclude_files(ff);
170    hard_links = term_find_files(ff);
171
172    free_jcr(jcr);
173    term_last_jobs_list();             /* free jcr chain */
174    close_memory_pool();
175    sm_dump(false);
176    exit(0);
177 }
178
179 static int print_file(JCR *jcr, FF_PKT *ff, bool top_level) 
180 {
181
182    switch (ff->type) {
183    case FT_LNKSAVED:
184    case FT_REGE:
185    case FT_REG:
186    case FT_LNK:
187    case FT_DIREND:
188    case FT_SPEC:
189       print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
190       break;
191    case FT_DIRBEGIN:
192       break;
193    case FT_NOACCESS:
194       printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
195       break;
196    case FT_NOFOLLOW:
197       printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
198       break;
199    case FT_NOSTAT:
200       printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
201       break;
202    case FT_NOCHG:
203       printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
204       break;
205    case FT_ISARCH:
206       printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
207       break;
208    case FT_NORECURSE:
209       printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
210       break;
211    case FT_NOFSCHG:
212       printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
213       break;
214    case FT_NOOPEN:
215       printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
216       break;
217    default:
218       printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
219       break;
220    }
221    return 1;
222 }
223
224 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
225 {
226    char buf[1000];
227    char ec1[30];
228    char *p, *f;
229    int n;
230
231    if (type == FT_LNK) {
232       statp->st_mtime = 0;
233       statp->st_mode |= 0777;
234    }
235    p = encode_mode(statp->st_mode, buf);
236    n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
237    p += n;
238    n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
239    p += n;
240    n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
241    p += n;
242    if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
243       n = sprintf(p, "%4x ", (int)statp->st_rdev);
244    } else {
245       n = sprintf(p, "     ");
246    }
247    p += n;
248    p = encode_time(statp->st_mtime, p);
249    *p++ = ' ';
250    /* Copy file name */
251    for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
252       *p++ = *f++;
253    if (type == FT_LNK) {
254       *p++ = '-';
255       *p++ = '>';
256       *p++ = ' ';
257       /* Copy link name */
258       for (f=link; *f && (p-buf) < (int)sizeof(buf); )
259          *p++ = *f++;
260    }
261    *p++ = '\n';
262    *p = 0;
263    fputs(buf, stdout);
264 }
265
266 bool python_set_prog(JCR*, char const*) { return false; }