]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/tools/testls.c
- Move Python variables from Job to Bacula. They are
[bacula/bacula] / bacula / src / tools / testls.c
1 /*
2  * Test program for listing files during regression testing
3  */
4 /*
5    Copyright (C) 2000-2005 Kern Sibbald
6
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License
9    version 2 as amended with additional clauses defined in the
10    file LICENSE in the main source directory.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
15    the file LICENSE for additional details.
16
17  */
18
19 #include "bacula.h"
20 #include "findlib/find.h"
21
22 #if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
23 int win32_client = 1;
24 #else
25 int win32_client = 0;
26 #endif
27
28 /* Dummy functions */
29 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
30 int generate_job_event(JCR *jcr, const char *event) { return 1; }
31
32
33 /* Global variables */
34 int attrs = 0;
35
36 static JCR *jcr;
37
38
39 static int print_file(FF_PKT *ff, void *pkt, bool);
40 static void print_ls_output(char *fname, char *link, int type, struct stat *statp);
41
42 static void usage()
43 {
44    fprintf(stderr, _(
45 "\n"
46 "Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
47 "       -a          print extended attributes (Win32 debug)\n"
48 "       -dnn        set debug level to nn\n"
49 "       -e          specify file of exclude patterns\n"
50 "       -i          specify file of include patterns\n"
51 "       -           read pattern(s) from stdin\n"
52 "       -?          print this message.\n"
53 "\n"
54 "Patterns are file inclusion -- normally directories.\n"
55 "Debug level >= 1 prints each file found.\n"
56 "Debug level >= 10 prints path/file for catalog.\n"
57 "Errors always printed.\n"
58 "Files/paths truncated is number with len > 255.\n"
59 "Truncation is only in catalog.\n"
60 "\n"));
61
62    exit(1);
63 }
64
65
66 int
67 main (int argc, char *const *argv)
68 {
69    FF_PKT *ff;
70    char name[1000];
71    int i, ch, hard_links;
72    char *inc = NULL;
73    char *exc = NULL;
74    FILE *fd;
75
76    while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
77       switch (ch) {
78       case 'a':                       /* print extended attributes *debug* */
79          attrs = 1;
80          break;
81
82       case 'd':                       /* set debug level */
83          debug_level = atoi(optarg);
84          if (debug_level <= 0) {
85             debug_level = 1;
86          }
87          break;
88
89       case 'e':                       /* exclude patterns */
90          exc = optarg;
91          break;
92
93       case 'i':                       /* include patterns */
94          inc = optarg;
95          break;
96
97       case '?':
98       default:
99          usage();
100
101       }
102    }
103    argc -= optind;
104    argv += optind;
105
106    jcr = new_jcr(sizeof(JCR), NULL);
107
108    ff = init_find_files();
109    if (argc == 0 && !inc) {
110       add_fname_to_include_list(ff, 0, "/"); /* default to / */
111    } else {
112       for (i=0; i < argc; i++) {
113          if (strcmp(argv[i], "-") == 0) {
114              while (fgets(name, sizeof(name)-1, stdin)) {
115                 strip_trailing_junk(name);
116                 add_fname_to_include_list(ff, 0, name);
117               }
118               continue;
119          }
120          add_fname_to_include_list(ff, 0, argv[i]);
121       }
122    }
123    if (inc) {
124       fd = fopen(inc, "r");
125       if (!fd) {
126          printf("Could not open include file: %s\n", inc);
127          exit(1);
128       }
129       while (fgets(name, sizeof(name)-1, fd)) {
130          strip_trailing_junk(name);
131          add_fname_to_include_list(ff, 0, name);
132       }
133       fclose(fd);
134    }
135
136    if (exc) {
137       fd = fopen(exc, "r");
138       if (!fd) {
139          printf("Could not open exclude file: %s\n", exc);
140          exit(1);
141       }
142       while (fgets(name, sizeof(name)-1, fd)) {
143          strip_trailing_junk(name);
144          add_fname_to_exclude_list(ff, name);
145       }
146       fclose(fd);
147    }
148    match_files(jcr, ff, print_file, NULL);
149    term_include_exclude_files(ff);
150    hard_links = term_find_files(ff);
151
152    free_jcr(jcr);
153    term_last_jobs_list();             /* free jcr chain */
154    close_memory_pool();
155    sm_dump(false);
156    exit(0);
157 }
158
159 static int print_file(FF_PKT *ff, void *pkt, bool top_level) 
160 {
161
162    switch (ff->type) {
163    case FT_LNKSAVED:
164    case FT_REGE:
165    case FT_REG:
166    case FT_LNK:
167    case FT_DIREND:
168    case FT_SPEC:
169       print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
170       break;
171    case FT_DIRBEGIN:
172       break;
173    case FT_NOACCESS:
174       printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
175       break;
176    case FT_NOFOLLOW:
177       printf(_("Err: Could not follow ff->link %s: %s\n"), ff->fname, strerror(errno));
178       break;
179    case FT_NOSTAT:
180       printf(_("Err: Could not stat %s: %s\n"), ff->fname, strerror(errno));
181       break;
182    case FT_NOCHG:
183       printf(_("Skip: File not saved. No change. %s\n"), ff->fname);
184       break;
185    case FT_ISARCH:
186       printf(_("Err: Attempt to backup archive. Not saved. %s\n"), ff->fname);
187       break;
188    case FT_NORECURSE:
189       printf(_("Recursion turned off. Directory not entered. %s\n"), ff->fname);
190       break;
191    case FT_NOFSCHG:
192       printf(_("Skip: File system change prohibited. Directory not entered. %s\n"), ff->fname);
193       break;
194    case FT_NOOPEN:
195       printf(_("Err: Could not open directory %s: %s\n"), ff->fname, strerror(errno));
196       break;
197    default:
198       printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
199       break;
200    }
201    return 1;
202 }
203
204 static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
205 {
206    char buf[1000];
207    char ec1[30];
208    char *p, *f;
209    int n;
210
211    if (type == FT_LNK) {
212       statp->st_mtime = 0;
213       statp->st_mode |= 0777;
214    }
215    p = encode_mode(statp->st_mode, buf);
216    n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
217    p += n;
218    n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
219    p += n;
220    n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
221    p += n;
222    if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
223       n = sprintf(p, "%4x ", (int)statp->st_rdev);
224    } else {
225       n = sprintf(p, "     ");
226    }
227    p += n;
228    p = encode_time(statp->st_mtime, p);
229    *p++ = ' ';
230    /* Copy file name */
231    for (f=fname; *f && (p-buf) < (int)sizeof(buf); )
232       *p++ = *f++;
233    if (type == FT_LNK) {
234       *p++ = '-';
235       *p++ = '>';
236       *p++ = ' ';
237       /* Copy link name */
238       for (f=link; *f && (p-buf) < (int)sizeof(buf); )
239          *p++ = *f++;
240    }
241    *p++ = '\n';
242    *p = 0;
243    fputs(buf, stdout);
244 }
245
246 bool python_set_prog(JCR*, char const*) { return false; }