# libbaccfg (config functions)
#
LIBBACCFG_SRCS = ini.c parse_conf.c res.c bjson.c
-LIBBACCFG_OBJS = $(LIBBACCFG_SRCS:.c=.o)
-LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo)
+LIBBACCFG_OBJS = $(LIBBACCFG_SRCS:.c=.o)
+LIBBACCFG_LOBJS = $(LIBBACCFG_SRCS:.c=.lo)
+
+# libbacfind
+LIBBACFINDTARGET = ../findlib/libbacfind.la
.SUFFIXES: .c .cc .o .lo .ch .dvi .pdf .tex .view .w .1
.PHONY:
# specific build rules
+$(LIBBACFINDTARGET):
+ make -C ../findlib libbacfind.la
+
#-------------------------------------------------------------------------
all: Makefile libbac$(DEFAULT_ARCHIVE_TYPE) libbaccfg$(DEFAULT_ARCHIVE_TYPE)
@echo "==== Make of lib is good ===="
$(AR) rc $@ $(LIBBAC_OBJS)
$(RANLIB) $@
-libbac.la: Makefile $(LIBBAC_LOBJS)
+libbac.la: Makefile $(LIBBAC_LOBJS)
@echo "Making $@ ..."
- $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBAC_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBAC_LT_RELEASE) $(WRAPLIBS) $(CAP_LIBS) $(ZLIBS) $(OPENSSL_LIBS) $(LIBS) $(DLLIBS)
+ $(LIBTOOL_LINK) $(CXX) $(DEFS) $(DEBUG) $(LDFLAGS) -o $@ $(LIBBAC_LOBJS) -export-dynamic -rpath $(libdir) -release $(LIBBAC_LT_RELEASE) $(WRAPLIBS) $(CAP_LIBS) $(ZLIBS) $(OPENSSL_LIBS) $(LIBS) $(DLLIBS)
libbaccfg.a: $(LIBBACCFG_OBJS)
@echo "Making $@ ..."
cd $(topdir) \
&& CONFIG_FILES=$(thisdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-bsys_test: Makefile bsys.c unittests.o
+bsys_test: Makefile bsys.c unittests.o libbac.la $(LIBBACFINDTARGET)
$(CXX) -DTEST_PROGRAM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) -o bsys_test.o bsys.c
$(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -L../findlib -o $@ bsys_test.o unittests.o $(DLIB) -lbac -lbacfind -lm $(LIBS) $(OPENSSL_LIBS)
$(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ htable.o unittests.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS)
$(LIBTOOL_INSTALL) $(INSTALL_PROGRAM) $@ $(DESTDIR)$(sbindir)/
$(RMF) htable.o
- $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) htable.c
+ $(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) htable.c
alist_test: Makefile libbac.la alist.c unittests.o
$(RMF) alist.o
$(RMF) sellist.o
$(CXX) $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) sellist.c
-bcrc32sum: Makefile bcrc32.o
+bcrc32sum: Makefile bcrc32.o
$(RMF) bcrc32.o
$(CXX) -DCRC32_SUM $(DEFS) $(DEBUG) -c $(CPPFLAGS) -I$(srcdir) -I$(basedir) $(DINCLUDE) $(CFLAGS) bcrc32.c
$(LIBTOOL_LINK) $(CXX) $(LDFLAGS) -L. -o $@ bcrc32.o $(DLIB) -lbac -lm $(LIBS) $(OPENSSL_LIBS)
return escaped_path;
}
+char * escape_filename_pathsep(const char* fname, char *buf, int len)
+{
+ if (fname != NULL && buf != NULL && len > 0) {
+ memset(buf, 0, len);
+ char ch[2]; // we do a simple one char string
+ ch[0] = fname[0];
+ ch[1] = '\0';
+ for (int i = 0; i < (len - 1) && ch[0] != '\0'; i++)
+ {
+ ch[0] = fname[i];
+ switch (ch[0])
+ {
+ case '/':
+ strcat(buf, "%2F");
+ break;
+ default:
+ strcat(buf, ch);
+ break;
+ }
+ }
+ }
+
+ return buf;
+}
+
+char * unescape_filename_pathsep(const char* fname, char *buf, int len)
+{
+ if (fname != NULL && buf != NULL && len > 0) {
+ memset(buf, 0, len);
+ char ch[2]; // we do a simple one char string
+ ch[0] = fname[0];
+ ch[1] = '\0';
+ for (int i = 0; len > 0 && ch[0] != '\0'; i++)
+ {
+ ch[0] = fname[i];
+ switch (ch[0])
+ {
+ case '%':
+ // we always have the next char available because `nul` character is required
+ if (fname[i + 1] == '2'){
+ // so the next char should be available too
+ if (fname[i + 2] == 'F'){
+ // bingo, got escaped char, proceed
+ strcat(buf, "/");
+ i += 2;
+ len--;
+ break;
+ }
+ }
+#if __cplusplus >= 201703L
+ [[fallthrough]];
+#endif
+ default:
+ strcat(buf, ch);
+ len--;
+ break;
+ }
+ }
+ }
+
+ return buf;
+}
+
#if HAVE_BACKTRACE && HAVE_GCC && HAVE_LINUX_OS
/* if some names are not resolved you can try using : addr2line, like this
* $ addr2line -e bin/bacula-sd -a 0x43cd11
char type[10];
bstrncpy(type, p, 8);
ok(strcmp(type, "/@MYSQL") == 0, "bstrncpy()");
+
+ int len = 100;
+ char buf[len];
+ struct testvectdata
+ {
+ const char * fname;
+ const char *result;
+ };
+ testvectdata vector[] = {
+ {"/ - testvect file", "%2F - testvect file"},
+ {"filename/value", "filename%2Fvalue"},
+ {"directory/value/", "directory%2Fvalue%2F"},
+ {"/path///value/", "%2Fpath%2F%2F%2Fvalue%2F"},
+ {"/////", "%2F%2F%2F%2F%2F"},
+ {NULL, NULL},
+ };
+
+ int i = 0;
+ while (vector[i].fname != NULL)
+ {
+ char *retp = escape_filename_pathsep(vector[i].fname, &buf[0], len);
+ ok(retp != NULL, vector[i].fname);
+ ok(retp == &buf[0], "escape checking value return pointer");
+ ok(strcmp(retp, vector[i].result) == 0, "escape checking result vector");
+
+ retp = unescape_filename_pathsep(vector[i].result, &buf[0], len);
+ ok(retp != NULL, vector[i].result);
+ ok(retp == &buf[0], "unescape checking value return pointer");
+ ok(strcmp(retp, vector[i].fname) == 0, "unescape checking result vector");
+
+ i++;
+ }
+
return report();
}
#endif
void display_last(HPKT &hpkt);
void init_hpkt(HPKT &hpkt);
void term_hpkt(HPKT &hpkt);
-int display_global_item(HPKT &hpkt); //
+int display_global_item(HPKT &hpkt); //
void display_collector_types(HPKT &hpkt);
/* bsys.c */
void read_state_file(char *dir, const char *progname, int port);
int b_strerror(int errnum, char *buf, size_t bufsiz);
char *escape_filename(const char *file_path);
+char *escape_filename_pathsep(const char *fname, char *buf, int len);
+char *unescape_filename_pathsep(const char *fname, char *buf, int len);
int Zdeflate(char *in, int in_len, char *out, int &out_len);
int Zinflate(char *in, int in_len, char *out, int &out_len);
void stack_trace();
objectClass: organizationalRole
cn: root
description: Directory Manager
+
+# The regress special object
+dn: cn=other/name,dc=$db_name,dc=bacula,dc=com
+objectClass: top
+objectClass: device
END_OF_DATA
ldapadd -f $tmp/entries.ldif -x -D "cn=root,dc=$db_name,dc=bacula,dc=com" -w rootroot -H ldap://localhost:3890 2>&1 > ${tmp}/ldap.add.log