-/*
- * Test program for listing files during regression testing
- */
-
/*
- Copyright (C) 2000-2003 Kern Sibbald and John Walker
+ Bacula® - The Network Backup Solution
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
+ Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version three of the GNU Affero General Public
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- MA 02111-1307, USA.
+ You should have received a copy of the GNU Affero General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+ Bacula® is a registered trademark of Kern Sibbald.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
+/*
+ * Test program for listing files during regression testing
+ * Links have their permissions and time bashed since they cannot
+ * be set by Bacula.
+ *
+ * Kern Sibbald, MM
+ *
*/
#include "bacula.h"
#include "findlib/find.h"
-#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32)
-int win32_client = 1;
-#else
-int win32_client = 0;
-#endif
+/* Dummy functions */
+int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+int generate_job_event(JCR *jcr, const char *event) { return 1; }
+void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) { }
/* Global variables */
int attrs = 0;
static JCR *jcr;
+static int num_files = 0;
-
-static int print_file(FF_PKT *ff, void *pkt);
+static int print_file(JCR *jcr, FF_PKT *ff, bool);
static void print_ls_output(char *fname, char *link, int type, struct stat *statp);
+static int count_files(JCR *jcr, FF_PKT *ff, bool top_level);
static void usage()
{
"\n"
"Usage: testls [-d debug_level] [-] [pattern1 ...]\n"
" -a print extended attributes (Win32 debug)\n"
-" -dnn set debug level to nn\n"
+" -d <nn> set debug level to <nn>\n"
+" -dt print timestamp in debug output\n"
" -e specify file of exclude patterns\n"
" -i specify file of include patterns\n"
+" -q quiet, don't print filenames (debug)\n"
" - read pattern(s) from stdin\n"
" -? print this message.\n"
"\n"
}
-int
-main (int argc, char *const *argv)
+int main(int argc, char *const *argv)
{
FF_PKT *ff;
char name[1000];
- int i, ch, hard_links;
+ bool quiet = false;
+ int i, ch;
char *inc = NULL;
char *exc = NULL;
FILE *fd;
- while ((ch = getopt(argc, argv, "ad:e:i:?")) != -1) {
+ setlocale(LC_ALL, "");
+ bindtextdomain("bacula", LOCALEDIR);
+ textdomain("bacula");
+ lmgr_init_thread();
+
+ while ((ch = getopt(argc, argv, "ad:e:i:q?")) != -1) {
switch (ch) {
case 'a': /* print extended attributes *debug* */
- attrs = 1;
- break;
+ attrs = 1;
+ break;
case 'd': /* set debug level */
- debug_level = atoi(optarg);
- if (debug_level <= 0) {
- debug_level = 1;
- }
- break;
+ if (*optarg == 't') {
+ dbg_timestamp = true;
+ } else {
+ debug_level = atoi(optarg);
+ if (debug_level <= 0) {
+ debug_level = 1;
+ }
+ }
+ break;
case 'e': /* exclude patterns */
- exc = optarg;
- break;
+ exc = optarg;
+ break;
case 'i': /* include patterns */
- inc = optarg;
- break;
+ inc = optarg;
+ break;
+
+ case 'q':
+ quiet = true;
+ break;
case '?':
default:
- usage();
+ usage();
- }
+ }
}
argc -= optind;
argv += optind;
ff = init_find_files();
if (argc == 0 && !inc) {
add_fname_to_include_list(ff, 0, "/"); /* default to / */
- } else {
+ } else {
for (i=0; i < argc; i++) {
if (strcmp(argv[i], "-") == 0) {
- while (fgets(name, sizeof(name)-1, stdin)) {
- strip_trailing_junk(name);
- add_fname_to_include_list(ff, 0, name);
- }
- continue;
- }
- add_fname_to_include_list(ff, 0, argv[i]);
+ while (fgets(name, sizeof(name)-1, stdin)) {
+ strip_trailing_junk(name);
+ add_fname_to_include_list(ff, 0, name);
+ }
+ continue;
+ }
+ add_fname_to_include_list(ff, 0, argv[i]);
}
}
if (inc) {
- fd = fopen(inc, "r");
+ fd = fopen(inc, "rb");
if (!fd) {
- printf("Could not open include file: %s\n", inc);
- exit(1);
+ printf(_("Could not open include file: %s\n"), inc);
+ exit(1);
}
while (fgets(name, sizeof(name)-1, fd)) {
- strip_trailing_junk(name);
- add_fname_to_include_list(ff, 0, name);
+ strip_trailing_junk(name);
+ add_fname_to_include_list(ff, 0, name);
}
fclose(fd);
}
if (exc) {
- fd = fopen(exc, "r");
+ fd = fopen(exc, "rb");
if (!fd) {
- printf("Could not open exclude file: %s\n", exc);
- exit(1);
+ printf(_("Could not open exclude file: %s\n"), exc);
+ exit(1);
}
while (fgets(name, sizeof(name)-1, fd)) {
- strip_trailing_junk(name);
- add_fname_to_exclude_list(ff, name);
+ strip_trailing_junk(name);
+ add_fname_to_exclude_list(ff, name);
}
fclose(fd);
}
- find_files(jcr, ff, print_file, NULL);
- hard_links = term_find_files(ff);
-
+ if (quiet) {
+ match_files(jcr, ff, count_files);
+ } else {
+ match_files(jcr, ff, print_file);
+ }
+ printf(_("Files seen = %d\n"), num_files);
+ term_include_exclude_files(ff);
+ term_find_files(ff);
+
free_jcr(jcr);
+ term_last_jobs_list(); /* free jcr chain */
close_memory_pool();
- sm_dump(False);
+ lmgr_cleanup_main();
+ sm_dump(false);
exit(0);
}
-static int print_file(FF_PKT *ff, void *pkt)
+static int count_files(JCR *jcr, FF_PKT *ff, bool top_level)
+{
+ num_files++;
+ return 1;
+}
+
+static int print_file(JCR *jcr, FF_PKT *ff, bool top_level)
{
switch (ff->type) {
case FT_REGE:
case FT_REG:
case FT_LNK:
- case FT_DIR:
+ case FT_DIREND:
case FT_SPEC:
print_ls_output(ff->fname, ff->link, ff->type, &ff->statp);
break;
+ case FT_DIRBEGIN:
+ break;
case FT_NOACCESS:
printf(_("Err: Could not access %s: %s\n"), ff->fname, strerror(errno));
break;
printf(_("Err: Unknown file ff->type %d: %s\n"), ff->type, ff->fname);
break;
}
+ num_files++;
return 1;
}
static void print_ls_output(char *fname, char *link, int type, struct stat *statp)
{
- char buf[1000];
+ char buf[2000];
char ec1[30];
char *p, *f;
int n;
p += n;
n = sprintf(p, "%-4d %-4d", (int)statp->st_uid, (int)statp->st_gid);
p += n;
- n = sprintf(p, "%7.7s ", edit_uint64(statp->st_size, ec1));
+ n = sprintf(p, "%10.10s ", edit_uint64(statp->st_size, ec1));
p += n;
if (S_ISCHR(statp->st_mode) || S_ISBLK(statp->st_mode)) {
n = sprintf(p, "%4x ", (int)statp->st_rdev);
- } else {
+ } else {
n = sprintf(p, " ");
}
p += n;
*p++ = ' ';
/* Copy link name */
for (f=link; *f && (p-buf) < (int)sizeof(buf); )
- *p++ = *f++;
+ *p++ = *f++;
}
*p++ = '\n';
*p = 0;
fputs(buf, stdout);
}
+
+bool python_set_prog(JCR*, char const*) { return false; }