You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-08 14:22:09 +03:00
the begginning
This commit is contained in:
12
utils/configcpp/Calpont.xml
Normal file
12
utils/configcpp/Calpont.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Calpont Version="V1.0.0">
|
||||
<Message>
|
||||
<Name>Message</Name>
|
||||
<Dir>.</Dir>
|
||||
<Length>875</Length>
|
||||
<Version>V1.0</Version>
|
||||
</Message>
|
||||
<SystemConfig>
|
||||
<SystemVersion>V1.0</SystemVersion>
|
||||
</SystemConfig>
|
||||
</Calpont>
|
96
utils/configcpp/Makefile
Executable file
96
utils/configcpp/Makefile
Executable file
@@ -0,0 +1,96 @@
|
||||
#******************************************************************************************
|
||||
# $Id: Makefile 3465 2012-12-21 17:17:23Z dhill $
|
||||
#
|
||||
# Copyright (C) 2009-2012 Calpont Corporation
|
||||
# All rights reserved
|
||||
#*****************************************************************************************/
|
||||
include ../../rules.mak
|
||||
.PHONY: install clean test docs coverage leakcheck
|
||||
|
||||
PROGRAM=libconfigcpp.so
|
||||
VERSION=1.0.0
|
||||
LIBRARY=$(PROGRAM).$(VERSION)
|
||||
|
||||
CPPFLAGS=-I. -I$(EXPORT_ROOT)/include -I/usr/include/libxml2
|
||||
CXXFLAGS+=$(DEBUG_FLAGS) -Wall -fpic
|
||||
|
||||
CLIBS=-L$(EXPORT_ROOT)/lib -lxml2 -lcppunit -ldl
|
||||
TLIBS=-L. -lconfigcpp -lmessageqcpp -lloggingcpp -lidbboot -lboost_idb $(CLIBS)
|
||||
GLIBS=$(TLIBS)
|
||||
|
||||
LLIBS=-L$(CALPONT_LIBRARY_PATH) -lmessageqcpp -lxml2
|
||||
|
||||
SRCS=configcpp.cpp writeonce.cpp xmlparser.cpp configstream.cpp
|
||||
LINCLUDES=configcpp.h config.h xmlparser.h
|
||||
|
||||
OBJS=$(SRCS:.cpp=.o)
|
||||
|
||||
$(LIBRARY): $(OBJS)
|
||||
$(LINK.cpp) -shared -o $(LIBRARY) $(OBJS)
|
||||
rm -f $(PROGRAM)
|
||||
ln -s $(LIBRARY) $(PROGRAM)
|
||||
|
||||
install: bootstrap $(LIBRARY)
|
||||
umask 002; \
|
||||
mkdir -p $(INSTALL_ROOT_LIB) $(INSTALL_ROOT_INCLUDE); \
|
||||
pushd $(INSTALL_ROOT_LIB) >/dev/null; \
|
||||
rm -f $(LIBRARY) $(PROGRAM); \
|
||||
ln -s $(LIBRARY) $(PROGRAM); \
|
||||
popd >/dev/null; \
|
||||
$(INSTALL) $(LIBRARY) $(INSTALL_ROOT_LIB)
|
||||
|
||||
bootstrap:
|
||||
$(INSTALL) $(LINCLUDES) $(INSTALL_ROOT_INCLUDE)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) tdriver*.o $(PROGRAM) $(LIBRARY) tdriver tdriver2 core *~ *.tag *-gcov.* *.gcov tdriver*-gcov *.d
|
||||
rm -rf html
|
||||
|
||||
docs:
|
||||
doxygen $(EXPORT_ROOT)/etc/Doxyfile
|
||||
|
||||
tdriver: tdriver.o
|
||||
$(LINK.cpp) -o $@ $^ $(TLIBS)
|
||||
|
||||
tdriver2: tdriver2.o
|
||||
$(LINK.cpp) -o $@ $^ $(TLIBS)
|
||||
|
||||
test: $(LIBRARY) tdriver tdriver2
|
||||
$(MAKE) -C ../messageqcpp install
|
||||
LD_LIBRARY_PATH=.:$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 ./tdriver
|
||||
LD_LIBRARY_PATH=.:$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 ./tdriver2
|
||||
|
||||
%-gcov.o: %.cpp
|
||||
$(COMPILE.cpp) -o $@ $^
|
||||
|
||||
tdriver-gcov: CXXFLAGS+=-fprofile-arcs -ftest-coverage
|
||||
tdriver-gcov: tdriver-gcov.o $(subst .o,-gcov.o,$(OBJS))
|
||||
$(LINK.cpp) -o $@ $^ $(GLIBS)
|
||||
|
||||
tdriver2-gcov: CXXFLAGS+=-fprofile-arcs -ftest-coverage
|
||||
tdriver2-gcov: tdriver2-gcov.o $(subst .o,-gcov.o,$(OBJS))
|
||||
$(LINK.cpp) -o $@ $^ $(GLIBS)
|
||||
|
||||
coverage: tdriver-gcov tdriver2-gcov
|
||||
rm -f *.gcda
|
||||
LD_LIBRARY_PATH=$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 ./tdriver-gcov
|
||||
LD_LIBRARY_PATH=$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 ./tdriver2-gcov
|
||||
for file in $(SRCS); do \
|
||||
bfile=`basename $$file .cpp`; \
|
||||
gcov -o $${bfile}-gcov $$file >/dev/null; \
|
||||
done
|
||||
/usr/local/bin/genCoverage.pl $(SRCS)
|
||||
|
||||
leakcheck: $(LIBRARY) tdriver tdriver2
|
||||
LD_LIBRARY_PATH=.:$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 valgrind --tool=memcheck --leak-check=yes ./tdriver
|
||||
LD_LIBRARY_PATH=.:$(EXPORT_ROOT)/lib:/usr/local/lib:/usr/local/gcc45/lib64 valgrind --tool=memcheck --leak-check=yes ./tdriver2
|
||||
|
||||
%.d: %.cpp
|
||||
@set -e; rm -f $@; \
|
||||
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
|
||||
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
|
||||
rm -f $@.$$$$
|
||||
|
||||
ifndef BOOTSTRAP
|
||||
-include $(SRCS:.cpp=.d) tdriver.d tdriver2.d
|
||||
endif
|
38
utils/configcpp/Makefile.am
Normal file
38
utils/configcpp/Makefile.am
Normal file
@@ -0,0 +1,38 @@
|
||||
# Copyright (C) 2014 InfiniDB, Inc.
|
||||
#
|
||||
# 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; version 2 of
|
||||
# the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
|
||||
# $Id$
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
AM_CPPFLAGS = $(idb_common_includes) $(idb_cppflags)
|
||||
AM_CFLAGS = $(idb_cflags)
|
||||
AM_CXXFLAGS = $(idb_cxxflags)
|
||||
AM_LDFLAGS = -version-info 1:0:0 $(idb_ldflags)
|
||||
lib_LTLIBRARIES = libconfigcpp.la
|
||||
libconfigcpp_la_SOURCES = configcpp.cpp xmlparser.cpp configstream.cpp
|
||||
include_HEADERS = configcpp.h xmlparser.h configstream.h
|
||||
|
||||
test:
|
||||
|
||||
coverage:
|
||||
|
||||
leakcheck:
|
||||
|
||||
docs:
|
||||
|
||||
bootstrap: install-data-am
|
||||
|
545
utils/configcpp/Makefile.in
Normal file
545
utils/configcpp/Makefile.in
Normal file
@@ -0,0 +1,545 @@
|
||||
# Makefile.in generated by automake 1.9.6 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
# Copyright (C) 2014 InfiniDB, Inc.
|
||||
#
|
||||
# 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; version 2 of
|
||||
# the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
|
||||
# $Id$
|
||||
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
top_builddir = ../..
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
INSTALL = @INSTALL@
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = utils/configcpp
|
||||
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/compilerflags.m4 \
|
||||
$(top_srcdir)/m4/functions.m4 $(top_srcdir)/m4/install.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
|
||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
|
||||
libLTLIBRARIES_INSTALL = $(INSTALL)
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libconfigcpp_la_LIBADD =
|
||||
am_libconfigcpp_la_OBJECTS = configcpp.lo xmlparser.lo configstream.lo
|
||||
libconfigcpp_la_OBJECTS = $(am_libconfigcpp_la_OBJECTS)
|
||||
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
CXXLD = $(CXX)
|
||||
CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
|
||||
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
SOURCES = $(libconfigcpp_la_SOURCES)
|
||||
DIST_SOURCES = $(libconfigcpp_la_SOURCES)
|
||||
includeHEADERS_INSTALL = $(INSTALL_HEADER)
|
||||
HEADERS = $(include_HEADERS)
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
ALLOCA = @ALLOCA@
|
||||
AMDEP_FALSE = @AMDEP_FALSE@
|
||||
AMDEP_TRUE = @AMDEP_TRUE@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
F77 = @F77@
|
||||
FFLAGS = @FFLAGS@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LEX = @LEX@
|
||||
LEXLIB = @LEXLIB@
|
||||
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
POW_LIB = @POW_LIB@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
XML2_CONFIG = @XML2_CONFIG@
|
||||
XML_CPPFLAGS = @XML_CPPFLAGS@
|
||||
XML_LIBS = @XML_LIBS@
|
||||
YACC = @YACC@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
ac_ct_RANLIB = @ac_ct_RANLIB@
|
||||
ac_ct_STRIP = @ac_ct_STRIP@
|
||||
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
|
||||
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
|
||||
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
|
||||
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
datadir = @datadir@
|
||||
etcdir = @etcdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
idb_brm_libs = @idb_brm_libs@
|
||||
idb_cflags = @idb_cflags@
|
||||
idb_common_includes = @idb_common_includes@
|
||||
idb_common_ldflags = @idb_common_ldflags@
|
||||
idb_common_libs = @idb_common_libs@
|
||||
idb_cppflags = @idb_cppflags@
|
||||
idb_cxxflags = @idb_cxxflags@
|
||||
idb_exec_libs = @idb_exec_libs@
|
||||
idb_ldflags = @idb_ldflags@
|
||||
idb_oam_libs = @idb_oam_libs@
|
||||
idb_write_libs = @idb_write_libs@
|
||||
idbinstall = @idbinstall@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localdir = @localdir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
march_flags = @march_flags@
|
||||
mibdir = @mibdir@
|
||||
mkdir_p = @mkdir_p@
|
||||
mysqldir = @mysqldir@
|
||||
netsnmp_libs = @netsnmp_libs@
|
||||
netsnmpagntdir = @netsnmpagntdir@
|
||||
netsnmpdir = @netsnmpdir@
|
||||
netsnmplibrdir = @netsnmplibrdir@
|
||||
netsnmpmachdir = @netsnmpmachdir@
|
||||
netsnmpsysdir = @netsnmpsysdir@
|
||||
oldincludedir = @oldincludedir@
|
||||
postdir = @postdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
sbindir = @sbindir@
|
||||
sharedir = @sharedir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
toolsdir = @toolsdir@
|
||||
AM_CPPFLAGS = $(idb_common_includes) $(idb_cppflags)
|
||||
AM_CFLAGS = $(idb_cflags)
|
||||
AM_CXXFLAGS = $(idb_cxxflags)
|
||||
AM_LDFLAGS = -version-info 1:0:0 $(idb_ldflags)
|
||||
lib_LTLIBRARIES = libconfigcpp.la
|
||||
libconfigcpp_la_SOURCES = configcpp.cpp xmlparser.cpp configstream.cpp
|
||||
include_HEADERS = configcpp.h xmlparser.h configstream.h
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .cpp .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/configcpp/Makefile'; \
|
||||
cd $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu utils/configcpp/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
|
||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
if test -f $$p; then \
|
||||
f=$(am__strip_dir) \
|
||||
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
|
||||
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
|
||||
else :; fi; \
|
||||
done
|
||||
|
||||
uninstall-libLTLIBRARIES:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
p=$(am__strip_dir) \
|
||||
echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
|
||||
$(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
|
||||
done
|
||||
|
||||
clean-libLTLIBRARIES:
|
||||
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||
test "$$dir" != "$$p" || dir=.; \
|
||||
echo "rm -f \"$${dir}/so_locations\""; \
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
libconfigcpp.la: $(libconfigcpp_la_OBJECTS) $(libconfigcpp_la_DEPENDENCIES)
|
||||
$(CXXLINK) -rpath $(libdir) $(libconfigcpp_la_LDFLAGS) $(libconfigcpp_la_OBJECTS) $(libconfigcpp_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configcpp.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configstream.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlparser.Plo@am__quote@
|
||||
|
||||
.cpp.o:
|
||||
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
|
||||
|
||||
.cpp.obj:
|
||||
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
|
||||
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.cpp.lo:
|
||||
@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
distclean-libtool:
|
||||
-rm -f libtool
|
||||
uninstall-info-am:
|
||||
install-includeHEADERS: $(include_HEADERS)
|
||||
@$(NORMAL_INSTALL)
|
||||
test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
|
||||
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
f=$(am__strip_dir) \
|
||||
echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
|
||||
$(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
|
||||
done
|
||||
|
||||
uninstall-includeHEADERS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||
f=$(am__strip_dir) \
|
||||
echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(includedir)/$$f"; \
|
||||
done
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$tags $$unique; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$tags $$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& cd $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) $$here
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
|
||||
list='$(DISTFILES)'; for file in $$list; do \
|
||||
case $$file in \
|
||||
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
|
||||
esac; \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
|
||||
dir="/$$dir"; \
|
||||
$(mkdir_p) "$(distdir)$$dir"; \
|
||||
else \
|
||||
dir=''; \
|
||||
fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||
fi; \
|
||||
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
|
||||
test -z "$$dir" || $(mkdir_p) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
`test -z '$(STRIP)' || \
|
||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-includeHEADERS
|
||||
|
||||
install-exec-am: install-libLTLIBRARIES
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-man:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-includeHEADERS uninstall-info-am \
|
||||
uninstall-libLTLIBRARIES
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||
clean-libLTLIBRARIES clean-libtool ctags distclean \
|
||||
distclean-compile distclean-generic distclean-libtool \
|
||||
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am install-exec \
|
||||
install-exec-am install-includeHEADERS install-info \
|
||||
install-info-am install-libLTLIBRARIES install-man \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags uninstall uninstall-am \
|
||||
uninstall-includeHEADERS uninstall-info-am \
|
||||
uninstall-libLTLIBRARIES
|
||||
|
||||
|
||||
test:
|
||||
|
||||
coverage:
|
||||
|
||||
leakcheck:
|
||||
|
||||
docs:
|
||||
|
||||
bootstrap: install-data-am
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
12
utils/configcpp/XCalpont.xml
Normal file
12
utils/configcpp/XCalpont.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<XCalpont Version="V1.0.0">
|
||||
<Message>
|
||||
<Name>Message</Name>
|
||||
<Dir>.</Dir>
|
||||
<Length>875</Length>
|
||||
<Version>V1.0</Version>
|
||||
</Message>
|
||||
<SystemConfig>
|
||||
<SystemVersion>V1.0</SystemVersion>
|
||||
</SystemConfig>
|
||||
</XCalpont>
|
108
utils/configcpp/config.h
Normal file
108
utils/configcpp/config.h
Normal file
@@ -0,0 +1,108 @@
|
||||
// A good set of defaults for the dev compile
|
||||
#ifndef CONFIGCPP_CONFIG_H__
|
||||
#define CONFIGCPP_CONFIG_H__
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
|
||||
#ifndef _MSC_VER
|
||||
|
||||
#define HAVE_ALARM 1
|
||||
#define HAVE_ALLOCA 1
|
||||
#define HAVE_ALLOCA_H 1
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
#define HAVE_DECL_STRERROR_R 1
|
||||
#define HAVE_DLFCN_H 1
|
||||
#define HAVE_DUP2 1
|
||||
#define HAVE_FCNTL_H 1
|
||||
#define HAVE_FLOOR 1
|
||||
#define HAVE_FORK 1
|
||||
#define HAVE_FTIME 1
|
||||
#define HAVE_FTRUNCATE 1
|
||||
#define HAVE_GETHOSTBYNAME 1
|
||||
#define HAVE_GETPAGESIZE 1
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
#define HAVE_INET_NTOA 1
|
||||
#define HAVE_INTTYPES_H 1
|
||||
#define HAVE_ISASCII 1
|
||||
#define HAVE_LIMITS_H 1
|
||||
#define HAVE_LOCALTIME_R 1
|
||||
#define HAVE_MALLOC 1
|
||||
#define HAVE_MALLOC_H 1
|
||||
#define HAVE_MBSTATE_T 1
|
||||
#define HAVE_MEMCHR 1
|
||||
#define HAVE_MEMMOVE 1
|
||||
#define HAVE_MEMORY_H 1
|
||||
#define HAVE_MEMSET 1
|
||||
#define HAVE_MKDIR 1
|
||||
#define HAVE_NETDB_H 1
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
#define HAVE_POW 1
|
||||
#define HAVE_PTRDIFF_T 1
|
||||
#define HAVE_REGCOMP 1
|
||||
#define HAVE_RMDIR 1
|
||||
#define HAVE_SELECT 1
|
||||
#define HAVE_SETENV 1
|
||||
#define HAVE_SETLOCALE 1
|
||||
#define HAVE_SOCKET 1
|
||||
#define HAVE_STDBOOL_H 1
|
||||
#define HAVE_STDDEF_H 1
|
||||
#define HAVE_STDINT_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_STRCASECMP 1
|
||||
#define HAVE_STRCHR 1
|
||||
#define HAVE_STRCSPN 1
|
||||
#define HAVE_STRDUP 1
|
||||
#define HAVE_STRERROR 1
|
||||
#define HAVE_STRERROR_R 1
|
||||
#define HAVE_STRFTIME 1
|
||||
#define HAVE_STRINGS_H 1
|
||||
#define HAVE_STRING_H 1
|
||||
#define HAVE_STRRCHR 1
|
||||
#define HAVE_STRSPN 1
|
||||
#define HAVE_STRSTR 1
|
||||
#define HAVE_STRTOL 1
|
||||
#define HAVE_STRTOUL 1
|
||||
#define HAVE_STRTOULL 1
|
||||
#define HAVE_SYSLOG_H 1
|
||||
#define HAVE_SYS_FILE_H 1
|
||||
#define HAVE_SYS_MOUNT_H 1
|
||||
#define HAVE_SYS_SELECT_H 1
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
#define HAVE_SYS_STATFS_H 1
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
#define HAVE_SYS_TIMEB_H 1
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_SYS_WAIT_H 1
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_UTIME 1
|
||||
#define HAVE_UTIME_H 1
|
||||
#define HAVE_VALUES_H 1
|
||||
#define HAVE_VFORK 1
|
||||
#define HAVE_WORKING_VFORK 1
|
||||
#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
|
||||
//#define PACKAGE "calpont"
|
||||
//#define PACKAGE_BUGREPORT "support@calpont.com"
|
||||
//#define PACKAGE_NAME "Calpont"
|
||||
//#define PACKAGE_STRING "Calpont 1.0.0"
|
||||
//#define PACKAGE_TARNAME "calpont"
|
||||
//#define PACKAGE_VERSION "1.0.0"
|
||||
#define PROTOTYPES 1
|
||||
#define RETSIGTYPE void
|
||||
#define SELECT_TYPE_ARG1 int
|
||||
#define SELECT_TYPE_ARG234 (fd_set *)
|
||||
#define SELECT_TYPE_ARG5 (struct timeval *)
|
||||
#define STDC_HEADERS 1
|
||||
#define STRERROR_R_CHAR_P 1
|
||||
#define TIME_WITH_SYS_TIME 1
|
||||
#define VERSION "1.0.0"
|
||||
#define __PROTOTYPES 1
|
||||
#define restrict __restrict
|
||||
|
||||
#else // _MSC_VER
|
||||
#endif
|
||||
|
||||
#endif //!HAVE_CONFIG_H
|
||||
|
||||
#endif //!CONFIGCPP_CONFIG_H__
|
||||
|
620
utils/configcpp/configcpp.cpp
Normal file
620
utils/configcpp/configcpp.cpp
Normal file
@@ -0,0 +1,620 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id: configcpp.cpp 3899 2013-06-17 20:54:10Z rdempsey $
|
||||
*
|
||||
******************************************************************************************/
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
using namespace boost;
|
||||
namespace fs=boost::filesystem;
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <libxml/xmlmemory.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#endif
|
||||
#include <cstring>
|
||||
//#define NDEBUG
|
||||
#include <cassert>
|
||||
|
||||
#include "configcpp.h"
|
||||
|
||||
#include "exceptclasses.h"
|
||||
#include "installdir.h"
|
||||
#ifdef _MSC_VER
|
||||
#include "idbregistry.h"
|
||||
#endif
|
||||
|
||||
#include "bytestream.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
const fs::path defaultCalpontConfigFile("Calpont.xml");
|
||||
}
|
||||
|
||||
namespace config
|
||||
{
|
||||
Config::configMap_t Config::fInstanceMap;
|
||||
boost::mutex Config::fInstanceMapMutex;
|
||||
boost::mutex Config::fXmlLock;
|
||||
boost::mutex Config::fWriteXmlLock;
|
||||
|
||||
Config* Config::makeConfig(const string& cf)
|
||||
{
|
||||
return makeConfig(cf.c_str());
|
||||
}
|
||||
|
||||
Config* Config::makeConfig(const char* cf)
|
||||
{
|
||||
mutex::scoped_lock lk(fInstanceMapMutex);
|
||||
|
||||
string configFile;
|
||||
string installDir = startup::StartUp::installDir();
|
||||
|
||||
if (cf == 0)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
string cfStr = IDBreadRegistry("ConfigFile");
|
||||
if (!cfStr.empty())
|
||||
cf = cfStr.c_str();
|
||||
#else
|
||||
cf = getenv("CALPONT_CONFIG_FILE");
|
||||
#endif
|
||||
if (cf == 0 || *cf == 0)
|
||||
{
|
||||
fs::path configFilePath = fs::path(installDir) / fs::path("etc") / defaultCalpontConfigFile;
|
||||
configFile = configFilePath.string();
|
||||
}
|
||||
else
|
||||
{
|
||||
configFile = cf;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
configFile = cf;
|
||||
}
|
||||
|
||||
if (fInstanceMap.find(configFile) == fInstanceMap.end())
|
||||
{
|
||||
Config* instance = new Config(configFile, installDir);
|
||||
fInstanceMap[configFile] = instance;
|
||||
}
|
||||
|
||||
return fInstanceMap[configFile];
|
||||
}
|
||||
|
||||
Config::Config(const string& configFile, const string& installDir) :
|
||||
fDoc(0), fConfigFile(configFile), fMtime(0), fInstallDir(installDir), fParser(fInstallDir)
|
||||
{
|
||||
for ( int i = 0 ; i < 20 ; i++ )
|
||||
{
|
||||
if (access(fConfigFile.c_str(), R_OK) != 0) {
|
||||
if ( i >= 15 )
|
||||
throw runtime_error("Config::Config: error accessing config file " + fConfigFile);
|
||||
sleep (1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(configFile.c_str(), &statbuf) == 0)
|
||||
fMtime = statbuf.st_mtime;
|
||||
|
||||
parseDoc();
|
||||
}
|
||||
|
||||
Config::~Config()
|
||||
{
|
||||
if (fDoc != 0)
|
||||
closeConfig();
|
||||
}
|
||||
|
||||
void Config::parseDoc(void)
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
memset(&fl, 0, sizeof(fl));
|
||||
fl.l_type = F_RDLCK; // read lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0; //lock whole file
|
||||
|
||||
// lock file if exist
|
||||
if ((fd = open(fConfigFile.c_str(), O_RDONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) != 0)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Config::parseDoc: error locking file " <<
|
||||
fConfigFile <<
|
||||
": " <<
|
||||
strerror(errno) <<
|
||||
", proceding anyway.";
|
||||
cerr << oss.str() << endl;
|
||||
}
|
||||
|
||||
fXmlLock.lock();
|
||||
fDoc = xmlParseFile(fConfigFile.c_str());
|
||||
fXmlLock.unlock();
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
fcntl(fd, F_SETLK, &fl);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Config::parseDoc: error opening file " <<
|
||||
fConfigFile <<
|
||||
": " <<
|
||||
strerror(errno);
|
||||
throw runtime_error(oss.str());
|
||||
}
|
||||
|
||||
|
||||
if (fDoc == 0 ) {
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
xmlNodePtr cur = xmlDocGetRootElement(fDoc);
|
||||
|
||||
if (cur == NULL)
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
if (xmlStrcmp(cur->name, (const xmlChar *)"Calpont"))
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::closeConfig(void)
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
}
|
||||
|
||||
const string Config::getConfig(const string& section, const string& name)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0)
|
||||
throw invalid_argument("Config::getConfig: both section and name must have a length");
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.getConfig(fDoc, section, name);
|
||||
}
|
||||
|
||||
void Config::getConfig(const string& section, const string& name, vector<string>& values)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0)
|
||||
throw invalid_argument("Config::getConfig: section must have a length");
|
||||
|
||||
if (fDoc == 0)
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.getConfig(fDoc, section, name, values);
|
||||
}
|
||||
|
||||
void Config::setConfig(const string& section, const string& name, const string& value)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0 )
|
||||
throw invalid_argument("Config::setConfig: all of section and name must have a length");
|
||||
|
||||
if (fDoc == 0) {
|
||||
throw runtime_error("Config::setConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
memset(&statbuf, 0, sizeof(statbuf));
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.setConfig(fDoc, section, name, value);
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::delConfig(const string& section, const string& name)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0)
|
||||
throw invalid_argument("Config::delConfig: both section and name must have a length");
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::delConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.delConfig(fDoc, section, name);
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::writeConfig(const string& configFile) const
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
FILE *fi;
|
||||
if (fDoc == 0)
|
||||
throw runtime_error("Config::writeConfig: no XML document!");
|
||||
|
||||
#ifdef _MSC_VER
|
||||
fs::path configFilePth(configFile);
|
||||
fs::path outFilePth(configFilePth);
|
||||
outFilePth.replace_extension("temp");
|
||||
if ((fi = fopen(outFilePth.string().c_str(), "wt")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error opening config file for write " + outFilePth.string());
|
||||
int rc = -1;
|
||||
rc = xmlDocDump(fi, fDoc);
|
||||
if (rc < 0) {
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + outFilePth.string());
|
||||
}
|
||||
fclose(fi);
|
||||
if (fs::exists(configFilePth))
|
||||
fs::remove(configFilePth);
|
||||
fs::rename(outFilePth, configFilePth);
|
||||
#else
|
||||
|
||||
const fs::path defaultCalpontConfigFileTemp("Calpont.xml.temp");
|
||||
const fs::path saveCalpontConfigFileTemp("Calpont.xml.calpontSave");
|
||||
const fs::path tmpCalpontConfigFileTemp("Calpont.xml.temp1");
|
||||
|
||||
fs::path etcdir = fs::path(fInstallDir) / fs::path("etc");
|
||||
|
||||
fs::path dcf = etcdir / fs::path(defaultCalpontConfigFile);
|
||||
fs::path dcft = etcdir / fs::path(defaultCalpontConfigFileTemp);
|
||||
fs::path scft = etcdir / fs::path(saveCalpontConfigFileTemp);
|
||||
fs::path tcft = etcdir / fs::path(tmpCalpontConfigFileTemp);
|
||||
//perform a temp write first if Calpont.xml file to prevent possible corruption
|
||||
if ( configFile == dcf ) {
|
||||
|
||||
if (exists(dcft)) fs::remove(dcft);
|
||||
if ((fi = fopen(dcft.string().c_str(), "w+")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
|
||||
int rc;
|
||||
rc = xmlDocDump(fi, fDoc);
|
||||
if ( rc < 0) {
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
//cout << "xmlDocDump " << rc << " " << errno << endl;
|
||||
}
|
||||
|
||||
fclose(fi);
|
||||
|
||||
//check temp file
|
||||
try {
|
||||
Config* c1 = makeConfig(dcft.string().c_str());
|
||||
|
||||
string value;
|
||||
value = c1->getConfig("SystemConfig", "SystemName");
|
||||
|
||||
//good read, save copy, copy temp file tp tmp then to Calpont.xml
|
||||
//move to /tmp to get around a 'same file error' in mv command
|
||||
try {
|
||||
if (exists(scft)) fs::remove(scft);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
fs::copy_file(dcf, scft, fs::copy_option::overwrite_if_exists);
|
||||
try {
|
||||
fs::permissions(scft, fs::add_perms | fs::owner_read | fs::owner_write |
|
||||
fs::group_read | fs::group_write |
|
||||
fs::others_read | fs::others_write);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
|
||||
if (exists(tcft)) fs::remove(tcft);
|
||||
fs::rename(dcft, tcft);
|
||||
|
||||
if (exists(dcf)) fs::remove(dcf);
|
||||
fs::rename(tcft, dcf);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // non Calpont.xml, perform update
|
||||
if ((fi = fopen(configFile.c_str(), "w")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
|
||||
xmlDocDump(fi, fDoc);
|
||||
|
||||
fclose(fi);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::write(void) const
|
||||
{
|
||||
mutex::scoped_lock lk(fWriteXmlLock);
|
||||
#ifdef _MSC_VER
|
||||
writeConfig(fConfigFile);
|
||||
#else
|
||||
write(fConfigFile);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Config::write(const string& configFile) const
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
fl.l_type = F_WRLCK; // write lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_pid = getpid();
|
||||
|
||||
// lock file if it exists
|
||||
if ((fd = open(configFile.c_str(), O_WRONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) == -1)
|
||||
throw runtime_error("Config::write: file lock error " + configFile);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
writeConfig(configFile);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error after exception in writeConfig " + configFile);
|
||||
throw;
|
||||
}
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error " + configFile);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeConfig(configFile);
|
||||
}
|
||||
}
|
||||
|
||||
void Config::writeConfigFile(messageqcpp::ByteStream msg) const
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
//get config file name being udated
|
||||
string fileName;
|
||||
msg >> fileName;
|
||||
|
||||
fl.l_type = F_WRLCK; // write lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_pid = getpid();
|
||||
|
||||
// lock file if it exists
|
||||
if ((fd = open(fileName.c_str(), O_WRONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) == -1)
|
||||
throw runtime_error("Config::write: file lock error " + fileName);
|
||||
|
||||
ofstream out(fileName.c_str());
|
||||
out << msg;
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error " + fileName);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
ofstream out(fileName.c_str());
|
||||
out << msg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
void Config::deleteInstanceMap()
|
||||
{
|
||||
mutex::scoped_lock lk(fInstanceMapMutex);
|
||||
for (Config::configMap_t::iterator iter = fInstanceMap.begin();
|
||||
iter != fInstanceMap.end(); ++iter)
|
||||
{
|
||||
Config* instance = iter->second;
|
||||
delete instance;
|
||||
}
|
||||
fInstanceMap.clear();
|
||||
}
|
||||
|
||||
/* static */
|
||||
int64_t Config::fromText(const std::string& text)
|
||||
{
|
||||
if (text.length() == 0) return 0;
|
||||
|
||||
int64_t val = 0;
|
||||
char* ctext = static_cast<char*>(alloca(text.length() + 1));
|
||||
strcpy(ctext, text.c_str());
|
||||
char* cptr;
|
||||
|
||||
val = strtoll(ctext, &cptr, 0);
|
||||
|
||||
switch (*cptr)
|
||||
{
|
||||
case 'T':
|
||||
case 't':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'G':
|
||||
case 'g':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'M':
|
||||
case 'm':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'K':
|
||||
case 'k':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case '\0':
|
||||
break;
|
||||
default:
|
||||
ostringstream oss;
|
||||
oss << "Invalid character '" << *cptr << "' found in numeric parameter '" << text <<
|
||||
"'. Since this will not do what you want it is fatal." << endl;
|
||||
throw runtime_error(oss.str());
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
time_t Config::getCurrentMTime()
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
return statbuf.st_mtime;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
const vector<string> Config::enumConfig()
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.enumConfig(fDoc);
|
||||
}
|
||||
|
||||
const vector<string> Config::enumSection(const string& section)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.enumSection(fDoc, section);
|
||||
}
|
||||
|
||||
} //namespace config
|
||||
// vim:ts=4 sw=4:
|
||||
|
633
utils/configcpp/configcpp.cpp.nonroottest
Normal file
633
utils/configcpp/configcpp.cpp.nonroottest
Normal file
@@ -0,0 +1,633 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id: configcpp.cpp 3899 2013-06-17 20:54:10Z rdempsey $
|
||||
*
|
||||
******************************************************************************************/
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
using namespace boost;
|
||||
namespace fs=boost::filesystem;
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <libxml/xmlmemory.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#endif
|
||||
#include <cstring>
|
||||
//#define NDEBUG
|
||||
#include <cassert>
|
||||
|
||||
#include "configcpp.h"
|
||||
|
||||
#include "exceptclasses.h"
|
||||
#include "installdir.h"
|
||||
#ifdef _MSC_VER
|
||||
#include "idbregistry.h"
|
||||
#endif
|
||||
|
||||
#include "bytestream.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
const fs::path defaultCalpontConfigFile("Calpont.xml");
|
||||
}
|
||||
|
||||
namespace config
|
||||
{
|
||||
Config::configMap_t Config::fInstanceMap;
|
||||
boost::mutex Config::fInstanceMapMutex;
|
||||
boost::mutex Config::fXmlLock;
|
||||
boost::mutex Config::fWriteXmlLock;
|
||||
|
||||
Config* Config::makeConfig(const string& cf)
|
||||
{
|
||||
return makeConfig(cf.c_str());
|
||||
}
|
||||
|
||||
Config* Config::makeConfig(const char* cf)
|
||||
{
|
||||
mutex::scoped_lock lk(fInstanceMapMutex);
|
||||
|
||||
string configFile;
|
||||
string installDir = startup::StartUp::installDir();
|
||||
|
||||
if (cf == 0)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
string cfStr = IDBreadRegistry("ConfigFile");
|
||||
if (!cfStr.empty())
|
||||
cf = cfStr.c_str();
|
||||
#else
|
||||
cf = getenv("CALPONT_CONFIG_FILE");
|
||||
#endif
|
||||
if (cf == 0 || *cf == 0)
|
||||
{
|
||||
fs::path configFilePath = fs::path(installDir) / fs::path("etc") / defaultCalpontConfigFile;
|
||||
configFile = configFilePath.string();
|
||||
}
|
||||
else
|
||||
{
|
||||
configFile = cf;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
configFile = cf;
|
||||
}
|
||||
|
||||
if (fInstanceMap.find(configFile) == fInstanceMap.end())
|
||||
{
|
||||
Config* instance = new Config(configFile, installDir);
|
||||
fInstanceMap[configFile] = instance;
|
||||
}
|
||||
|
||||
return fInstanceMap[configFile];
|
||||
}
|
||||
|
||||
Config::Config(const string& configFile, const string& installDir) :
|
||||
fDoc(0), fConfigFile(configFile), fMtime(0), fInstallDir(installDir), fParser(fInstallDir)
|
||||
{
|
||||
for ( int i = 0 ; i < 20 ; i++ )
|
||||
{
|
||||
if (access(fConfigFile.c_str(), R_OK) != 0) {
|
||||
if ( i >= 15 )
|
||||
throw runtime_error("Config::Config: error accessing config file " + fConfigFile);
|
||||
sleep (1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(configFile.c_str(), &statbuf) == 0)
|
||||
fMtime = statbuf.st_mtime;
|
||||
|
||||
parseDoc();
|
||||
}
|
||||
|
||||
Config::~Config()
|
||||
{
|
||||
if (fDoc != 0)
|
||||
closeConfig();
|
||||
}
|
||||
|
||||
void Config::parseDoc(void)
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
memset(&fl, 0, sizeof(fl));
|
||||
fl.l_type = F_RDLCK; // read lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0; //lock whole file
|
||||
|
||||
// lock file if exist
|
||||
if ((fd = open(fConfigFile.c_str(), O_RDONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) != 0)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Config::parseDoc: error locking file " <<
|
||||
fConfigFile <<
|
||||
": " <<
|
||||
strerror(errno) <<
|
||||
", proceding anyway.";
|
||||
cerr << oss.str() << endl;
|
||||
}
|
||||
|
||||
fXmlLock.lock();
|
||||
fDoc = xmlParseFile(fConfigFile.c_str());
|
||||
fXmlLock.unlock();
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
fcntl(fd, F_SETLK, &fl);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Config::parseDoc: error opening file " <<
|
||||
fConfigFile <<
|
||||
": " <<
|
||||
strerror(errno);
|
||||
throw runtime_error(oss.str());
|
||||
}
|
||||
|
||||
|
||||
if (fDoc == 0 ) {
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
xmlNodePtr cur = xmlDocGetRootElement(fDoc);
|
||||
|
||||
if (cur == NULL)
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
if (xmlStrcmp(cur->name, (const xmlChar *)"Calpont"))
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
throw runtime_error("Config::parseDoc: error parsing config file " + fConfigFile);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::closeConfig(void)
|
||||
{
|
||||
xmlFreeDoc(fDoc);
|
||||
fDoc = 0;
|
||||
}
|
||||
|
||||
const string Config::getConfig(const string& section, const string& name)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0)
|
||||
throw invalid_argument("Config::getConfig: both section and name must have a length");
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.getConfig(fDoc, section, name);
|
||||
}
|
||||
|
||||
void Config::getConfig(const string& section, const string& name, vector<string>& values)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0)
|
||||
throw invalid_argument("Config::getConfig: section must have a length");
|
||||
|
||||
if (fDoc == 0)
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.getConfig(fDoc, section, name, values);
|
||||
}
|
||||
|
||||
void Config::setConfig(const string& section, const string& name, const string& value)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0 )
|
||||
throw invalid_argument("Config::setConfig: all of section and name must have a length");
|
||||
|
||||
if (fDoc == 0) {
|
||||
throw runtime_error("Config::setConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
memset(&statbuf, 0, sizeof(statbuf));
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.setConfig(fDoc, section, name, value);
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::delConfig(const string& section, const string& name)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (section.length() == 0 || name.length() == 0)
|
||||
throw invalid_argument("Config::delConfig: both section and name must have a length");
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::delConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
fParser.delConfig(fDoc, section, name);
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::writeConfig(const string& configFile) const
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
FILE *fi;
|
||||
if (fDoc == 0)
|
||||
throw runtime_error("Config::writeConfig: no XML document!");
|
||||
|
||||
#ifdef _MSC_VER
|
||||
fs::path configFilePth(configFile);
|
||||
fs::path outFilePth(configFilePth);
|
||||
outFilePth.replace_extension("temp");
|
||||
if ((fi = fopen(outFilePth.string().c_str(), "wt")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error opening config file for write " + outFilePth.string());
|
||||
int rc = -1;
|
||||
rc = xmlDocDump(fi, fDoc);
|
||||
if (rc < 0) {
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + outFilePth.string());
|
||||
}
|
||||
fclose(fi);
|
||||
if (fs::exists(configFilePth))
|
||||
fs::remove(configFilePth);
|
||||
fs::rename(outFilePth, configFilePth);
|
||||
#else
|
||||
|
||||
const fs::path defaultCalpontConfigFileTemp("Calpont.xml.temp");
|
||||
const fs::path saveCalpontConfigFileTemp("Calpont.xml.calpontSave");
|
||||
const fs::path tmpCalpontConfigFileTemp("Calpont.xml.temp1");
|
||||
|
||||
fs::path etcdir = fs::path(fInstallDir) / fs::path("etc");
|
||||
|
||||
fs::path dcf = etcdir / fs::path(defaultCalpontConfigFile);
|
||||
fs::path dcft = etcdir / fs::path(defaultCalpontConfigFileTemp);
|
||||
fs::path scft = etcdir / fs::path(saveCalpontConfigFileTemp);
|
||||
fs::path tcft = etcdir / fs::path(tmpCalpontConfigFileTemp);
|
||||
//perform a temp write first if Calpont.xml file to prevent possible corruption
|
||||
if ( configFile == dcf ) {
|
||||
|
||||
if (exists(dcft)) fs::remove(dcft);
|
||||
if ((fi = fopen(dcft.string().c_str(), "w+")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
|
||||
int rc;
|
||||
rc = xmlDocDump(fi, fDoc);
|
||||
if ( rc < 0) {
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
//cout << "xmlDocDump " << rc << " " << errno << endl;
|
||||
}
|
||||
|
||||
fclose(fi);
|
||||
|
||||
//check temp file
|
||||
try {
|
||||
Config* c1 = makeConfig(dcft.string().c_str());
|
||||
|
||||
string value;
|
||||
value = c1->getConfig("SystemConfig", "SystemName");
|
||||
|
||||
//good read, save copy, copy temp file tp tmp then to Calpont.xml
|
||||
//move to /tmp to get around a 'same file error' in mv command
|
||||
try {
|
||||
if (exists(scft)) fs::remove(scft);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
fs::copy_file(dcf, scft, fs::copy_option::overwrite_if_exists);
|
||||
try {
|
||||
fs::permissions(scft, fs::add_perms | fs::owner_read | fs::owner_write | fs::owner_exe |
|
||||
fs::group_read | fs::group_write | fs::group_exe |
|
||||
fs::others_read | fs::others_write | fs::others_exe);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
|
||||
if (exists(tcft)) fs::remove(tcft);
|
||||
fs::rename(dcft, tcft);
|
||||
|
||||
try {
|
||||
fs::permissions(tcft, fs::add_perms | fs::owner_read | fs::owner_write | fs::owner_exe |
|
||||
fs::group_read | fs::group_write | fs::group_exe |
|
||||
fs::others_read | fs::others_write | fs::others_exe);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
|
||||
if (exists(dcf)) fs::remove(dcf);
|
||||
fs::rename(tcft, dcf);
|
||||
|
||||
try {
|
||||
fs::permissions(dcf, fs::add_perms | fs::owner_read | fs::owner_write | fs::owner_exe |
|
||||
fs::group_read | fs::group_write | fs::group_exe |
|
||||
fs::others_read | fs::others_write | fs::others_exe);
|
||||
} catch (fs::filesystem_error&) { }
|
||||
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // non Calpont.xml, perform update
|
||||
if ((fi = fopen(configFile.c_str(), "w")) == NULL)
|
||||
throw runtime_error("Config::writeConfig: error writing config file " + configFile);
|
||||
|
||||
xmlDocDump(fi, fDoc);
|
||||
|
||||
fclose(fi);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
void Config::write(void) const
|
||||
{
|
||||
mutex::scoped_lock lk(fWriteXmlLock);
|
||||
#ifdef _MSC_VER
|
||||
writeConfig(fConfigFile);
|
||||
#else
|
||||
write(fConfigFile);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Config::write(const string& configFile) const
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
fl.l_type = F_WRLCK; // write lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_pid = getpid();
|
||||
|
||||
// lock file if it exists
|
||||
if ((fd = open(configFile.c_str(), O_WRONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) == -1)
|
||||
throw runtime_error("Config::write: file lock error " + configFile);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
writeConfig(configFile);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error after exception in writeConfig " + configFile);
|
||||
throw;
|
||||
}
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error " + configFile);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeConfig(configFile);
|
||||
}
|
||||
}
|
||||
|
||||
void Config::writeConfigFile(messageqcpp::ByteStream msg) const
|
||||
{
|
||||
struct flock fl;
|
||||
int fd;
|
||||
|
||||
//get config file name being udated
|
||||
string fileName;
|
||||
msg >> fileName;
|
||||
|
||||
fl.l_type = F_WRLCK; // write lock
|
||||
fl.l_whence = SEEK_SET;
|
||||
fl.l_start = 0;
|
||||
fl.l_len = 0;
|
||||
fl.l_pid = getpid();
|
||||
|
||||
// lock file if it exists
|
||||
if ((fd = open(fileName.c_str(), O_WRONLY)) >= 0)
|
||||
{
|
||||
if (fcntl(fd, F_SETLKW, &fl) == -1)
|
||||
throw runtime_error("Config::write: file lock error " + fileName);
|
||||
|
||||
ofstream out(fileName.c_str());
|
||||
out << msg;
|
||||
|
||||
fl.l_type = F_UNLCK; //unlock
|
||||
if (fcntl(fd, F_SETLK, &fl) == -1)
|
||||
throw runtime_error("Config::write: file unlock error " + fileName);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
ofstream out(fileName.c_str());
|
||||
out << msg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
void Config::deleteInstanceMap()
|
||||
{
|
||||
mutex::scoped_lock lk(fInstanceMapMutex);
|
||||
for (Config::configMap_t::iterator iter = fInstanceMap.begin();
|
||||
iter != fInstanceMap.end(); ++iter)
|
||||
{
|
||||
Config* instance = iter->second;
|
||||
delete instance;
|
||||
}
|
||||
fInstanceMap.clear();
|
||||
}
|
||||
|
||||
/* static */
|
||||
int64_t Config::fromText(const std::string& text)
|
||||
{
|
||||
if (text.length() == 0) return 0;
|
||||
|
||||
int64_t val = 0;
|
||||
char* ctext = static_cast<char*>(alloca(text.length() + 1));
|
||||
strcpy(ctext, text.c_str());
|
||||
char* cptr;
|
||||
|
||||
val = strtoll(ctext, &cptr, 0);
|
||||
|
||||
switch (*cptr)
|
||||
{
|
||||
case 'T':
|
||||
case 't':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'G':
|
||||
case 'g':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'M':
|
||||
case 'm':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case 'K':
|
||||
case 'k':
|
||||
val *= 1024;
|
||||
/* fallthru */
|
||||
case '\0':
|
||||
break;
|
||||
default:
|
||||
ostringstream oss;
|
||||
oss << "Invalid character '" << *cptr << "' found in numeric parameter '" << text <<
|
||||
"'. Since this will not do what you want it is fatal." << endl;
|
||||
throw runtime_error(oss.str());
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
time_t Config::getCurrentMTime()
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
return statbuf.st_mtime;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
const vector<string> Config::enumConfig()
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.enumConfig(fDoc);
|
||||
}
|
||||
|
||||
const vector<string> Config::enumSection(const string& section)
|
||||
{
|
||||
mutex::scoped_lock lk(fLock);
|
||||
|
||||
if (fDoc == 0){
|
||||
throw runtime_error("Config::getConfig: no XML document!");
|
||||
}
|
||||
|
||||
struct stat statbuf;
|
||||
if (stat(fConfigFile.c_str(), &statbuf) == 0)
|
||||
{
|
||||
if (statbuf.st_mtime != fMtime)
|
||||
{
|
||||
closeConfig();
|
||||
fMtime = statbuf.st_mtime;
|
||||
parseDoc();
|
||||
}
|
||||
}
|
||||
|
||||
return fParser.enumSection(fDoc, section);
|
||||
}
|
||||
|
||||
} //namespace config
|
||||
// vim:ts=4 sw=4:
|
||||
|
235
utils/configcpp/configcpp.h
Normal file
235
utils/configcpp/configcpp.h
Normal file
@@ -0,0 +1,235 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id: configcpp.h 3495 2013-01-21 14:09:51Z rdempsey $
|
||||
*
|
||||
******************************************************************************************/
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
#ifndef CONFIG_CONFIGCPP_H
|
||||
#define CONFIG_CONFIGCPP_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <libxml/parser.h>
|
||||
|
||||
#include "xmlparser.h"
|
||||
|
||||
namespace messageqcpp
|
||||
|
||||
{
|
||||
|
||||
class ByteStream;
|
||||
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER) && defined(LIBCONFIG_DLLEXPORT)
|
||||
#define EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define EXPORT
|
||||
#endif
|
||||
|
||||
namespace config {
|
||||
|
||||
/** @brief a config file I/F class
|
||||
*
|
||||
* This is a singleton pattern: you must use the makeConfig() factory method to get a
|
||||
* pointer to the config file. You can have as many config files open at the same time as you like,
|
||||
* but you need different pointers to each. This class handles locking internally using an NFS-compatible
|
||||
* fcntl() call.
|
||||
*/
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
/** @brief Config factory method
|
||||
*
|
||||
* Creates a singleton Config object
|
||||
*/
|
||||
EXPORT static Config* makeConfig(const char* cf=0);
|
||||
|
||||
/** @brief Config factory method
|
||||
*
|
||||
* Creates a singleton Config object
|
||||
*/
|
||||
EXPORT static Config* makeConfig(const std::string& cf);
|
||||
|
||||
/** @brief dtor
|
||||
*/
|
||||
EXPORT virtual ~Config();
|
||||
|
||||
/** @brief get name's value from section
|
||||
*
|
||||
* get name's value from section in the current config file.
|
||||
* @param section the name of the config file section to search
|
||||
* @param name the param name whose value is to be returned
|
||||
*/
|
||||
EXPORT const std::string getConfig(const std::string& section, const std::string& name);
|
||||
|
||||
/** @brief get all name's values from a section
|
||||
*
|
||||
* get name's values from section in the current config file.
|
||||
* @param section the name of the config file section to search
|
||||
* @param name the param name whose value is to be returned
|
||||
* @param values the values in the section are returned in this vector
|
||||
*/
|
||||
EXPORT void getConfig(const std::string& section, const std::string& name,
|
||||
std::vector<std::string>& values);
|
||||
|
||||
/** @brief set name's value in section
|
||||
*
|
||||
* set name's value in section in the current config file.
|
||||
* @param section the name of the config file section to update
|
||||
* @param name the param name whose value is to be updated
|
||||
* @param value the param value
|
||||
*/
|
||||
EXPORT void setConfig(const std::string& section, const std::string& name, const std::string& value);
|
||||
|
||||
/** @brief delete name from section
|
||||
*
|
||||
* delete name from section in the current config file.
|
||||
* @param section the name of the config file section to search
|
||||
* @param name the param name whose entry is to be deleted
|
||||
* @note if you delete the last param from a section, the section will still remain
|
||||
*/
|
||||
EXPORT void delConfig(const std::string& section, const std::string& name);
|
||||
|
||||
/** @brief write the config file back out to disk
|
||||
*
|
||||
* write the config file back out to disk using the current filename.
|
||||
*/
|
||||
EXPORT void write(void) const;
|
||||
|
||||
/** @brief write the config file back out to disk as fileName
|
||||
*
|
||||
* write the config file out to disk as a new file fileName. Does not affect the current
|
||||
* config filename.
|
||||
*/
|
||||
EXPORT void write(const std::string& fileName) const;
|
||||
|
||||
/** @brief write a stream copy of config file to disk
|
||||
*
|
||||
* write a stream copy of config file to disk. used to distributed mass updates to system nodes
|
||||
*
|
||||
*/
|
||||
EXPORT void writeConfigFile(messageqcpp::ByteStream msg) const;
|
||||
|
||||
/** @brief return the name of this config file
|
||||
*
|
||||
* return the name of this config file.
|
||||
*/
|
||||
EXPORT inline const std::string& configFile() const { return fConfigFile; }
|
||||
|
||||
/** @brief delete all config file instances
|
||||
*
|
||||
* deletes \b all config file maps
|
||||
*/
|
||||
EXPORT static void deleteInstanceMap();
|
||||
|
||||
/** @brief parse config file numerics
|
||||
*
|
||||
* Convert human-friendly number formats to machine-friendly. Handle suffixes 'K', 'M', 'G'.
|
||||
* Handle decimal, hex and octal notation in the same way as the C compiler.
|
||||
* Ignore any 'B' following [KMG]. Ignore case in suffixes.
|
||||
* An empty string or an unparseable string returns 0.
|
||||
* Return a signed numeric value.
|
||||
*/
|
||||
EXPORT static int64_t fromText(const std::string& text);
|
||||
|
||||
/** @brief parse config file numerics
|
||||
*
|
||||
* Return an unsigned numeric value.
|
||||
*/
|
||||
EXPORT static inline uint64_t uFromText(const std::string& text) { return static_cast<uint64_t>(fromText(text)); }
|
||||
|
||||
/** @brief Used externally to check whether there has been a config change without loading everything
|
||||
*
|
||||
*/
|
||||
inline time_t getLastMTime() const { return fMtime; }
|
||||
|
||||
/** @brief Used externally to check whether there has been a config change without loading everything
|
||||
*
|
||||
*/
|
||||
EXPORT time_t getCurrentMTime();
|
||||
|
||||
/** @brief Enumerate all the sections in the config file
|
||||
*
|
||||
*/
|
||||
EXPORT const std::vector<std::string> enumConfig();
|
||||
|
||||
/** @brief Enumerate all the names in a section in the config file
|
||||
*
|
||||
*/
|
||||
EXPORT const std::vector<std::string> enumSection(const std::string& section);
|
||||
|
||||
protected:
|
||||
/** @brief parse the XML file
|
||||
*
|
||||
*/
|
||||
void parseDoc(void);
|
||||
|
||||
/** @brief write the XML tree to disk
|
||||
*
|
||||
*/
|
||||
EXPORT void writeConfig(const std::string& fileName) const;
|
||||
|
||||
/** @brief stop processing this XML file
|
||||
*
|
||||
*/
|
||||
void closeConfig(void);
|
||||
|
||||
private:
|
||||
typedef std::map<std::string, Config*> configMap_t;
|
||||
|
||||
/*
|
||||
*/
|
||||
Config(const Config& rhs);
|
||||
/*
|
||||
*/
|
||||
Config& operator=(const Config& rhs);
|
||||
|
||||
/** @brief ctor with config file specified
|
||||
*/
|
||||
Config(const std::string& configFile, const std::string& installDir);
|
||||
|
||||
static configMap_t fInstanceMap;
|
||||
static boost::mutex fInstanceMapMutex;
|
||||
static boost::mutex fXmlLock;
|
||||
static boost::mutex fWriteXmlLock;
|
||||
|
||||
xmlDocPtr fDoc;
|
||||
const std::string fConfigFile;
|
||||
time_t fMtime;
|
||||
mutable boost::mutex fLock;
|
||||
const std::string fInstallDir;
|
||||
XMLParser fParser;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#undef EXPORT
|
||||
|
||||
#endif
|
||||
// vim:ts=4 sw=4:
|
||||
|
71
utils/configcpp/configstream.cpp
Normal file
71
utils/configcpp/configstream.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id$
|
||||
*
|
||||
******************************************************************************************/
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <libxml/xmlmemory.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <stdexcept>
|
||||
using namespace std;
|
||||
|
||||
#include "bytestream.h"
|
||||
using namespace messageqcpp;
|
||||
|
||||
#include "configstream.h"
|
||||
|
||||
namespace config
|
||||
{
|
||||
|
||||
ConfigStream::ConfigStream(const ByteStream& bs, const string& installDir) :
|
||||
fParser(installDir)
|
||||
{
|
||||
init(reinterpret_cast<const xmlChar*>(bs.buf()));
|
||||
}
|
||||
|
||||
ConfigStream::ConfigStream(const string& str, const string& installDir) :
|
||||
fParser(installDir)
|
||||
{
|
||||
init(reinterpret_cast<const xmlChar*>(str.c_str()));
|
||||
}
|
||||
|
||||
ConfigStream::ConfigStream(const char* cptr, const string& installDir) :
|
||||
fParser(installDir)
|
||||
{
|
||||
init(reinterpret_cast<const xmlChar*>(cptr));
|
||||
}
|
||||
|
||||
ConfigStream::~ConfigStream()
|
||||
{
|
||||
if (fDoc != NULL)
|
||||
xmlFreeDoc(fDoc);
|
||||
}
|
||||
|
||||
void ConfigStream::init(const xmlChar* xp)
|
||||
{
|
||||
fDoc = xmlParseDoc(xp);
|
||||
if (fDoc == NULL)
|
||||
throw runtime_error("ConfigStream::ConfigStream: bad XML stream");
|
||||
}
|
||||
|
||||
} //namespace
|
||||
// vim:ts=4 sw=4:
|
||||
|
66
utils/configcpp/configstream.h
Normal file
66
utils/configcpp/configstream.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id$
|
||||
*
|
||||
******************************************************************************************/
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
#ifndef CONFIG_CONFIGSTREAM_H_
|
||||
#define CONFIG_CONFIGSTREAM_H_
|
||||
|
||||
#include <string>
|
||||
#include <libxml/parser.h>
|
||||
|
||||
#include "bytestream.h"
|
||||
|
||||
#include "xmlparser.h"
|
||||
|
||||
namespace config
|
||||
{
|
||||
|
||||
/** @brief a config ByteStream I/F class
|
||||
*
|
||||
*/
|
||||
class ConfigStream
|
||||
{
|
||||
public:
|
||||
ConfigStream(const messageqcpp::ByteStream& bs, const std::string& installDir);
|
||||
ConfigStream(const std::string& str, const std::string& installDir);
|
||||
ConfigStream(const char* cptr, const std::string& installDir);
|
||||
~ConfigStream();
|
||||
|
||||
const std::string getConfig(const std::string& section, const std::string& name) const
|
||||
{ return fParser.getConfig(fDoc, section, name); }
|
||||
|
||||
private:
|
||||
ConfigStream(const ConfigStream& rhs);
|
||||
ConfigStream& operator=(const ConfigStream& rhs);
|
||||
|
||||
void init(const xmlChar* xp);
|
||||
|
||||
XMLParser fParser;
|
||||
xmlDocPtr fDoc;
|
||||
};
|
||||
|
||||
} //namespace
|
||||
|
||||
#endif
|
||||
// vim:ts=4 sw=4:
|
||||
|
102
utils/configcpp/libconfigcpp.rc
Normal file
102
utils/configcpp/libconfigcpp.rc
Normal file
@@ -0,0 +1,102 @@
|
||||
// Microsoft Visual C++ generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,6,0,0
|
||||
PRODUCTVERSION 4,6,0,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "InfiniDB, Inc."
|
||||
VALUE "FileDescription", "InfiniDB Config API"
|
||||
VALUE "FileVersion", "4.6.0-0"
|
||||
VALUE "InternalName", "libconfigcpp"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014"
|
||||
VALUE "OriginalFilename", "libconfigcpp.dll"
|
||||
VALUE "ProductName", "InfiniDB"
|
||||
VALUE "ProductVersion", "4.6.0.0 Beta"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
39
utils/configcpp/md5/Makefile
Normal file
39
utils/configcpp/md5/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
include ../../../rules.mak
|
||||
LIBRARY=libmd5.a
|
||||
|
||||
SRCS= md5_dgst.c md5_one.c mem_clr.c
|
||||
|
||||
CFLAGS+=$(DEBUG_FLAGS) -Wall -fpic
|
||||
|
||||
OBJS=$(SRCS:.c=.o)
|
||||
|
||||
$(LIBRARY): $(OBJS)
|
||||
$(AR) scru $(LIBRARY) $(OBJS)
|
||||
|
||||
bootstrap:
|
||||
|
||||
install: bootstrap $(LIBRARY)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) core *~ *-gcov.* *.gcov *.d config.tag *.d.* $(LIBRARY)
|
||||
rm -rf html
|
||||
|
||||
docs:
|
||||
$(EXPORT_ROOT)/etc/Doxyfile
|
||||
|
||||
coverage:
|
||||
|
||||
test:
|
||||
|
||||
leakcheck:
|
||||
|
||||
%.d: %.c
|
||||
@set -e; rm -f $@; \
|
||||
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
|
||||
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
|
||||
rm -f $@.$$$$
|
||||
|
||||
ifndef BOOTSTRAP
|
||||
-include $(SRCS:.c=.d)
|
||||
endif
|
||||
|
14
utils/configcpp/md5/Makefile.am
Normal file
14
utils/configcpp/md5/Makefile.am
Normal file
@@ -0,0 +1,14 @@
|
||||
AM_CFLAGS = $(idb_cflags)
|
||||
noinst_LIBRARIES = libmd5.a
|
||||
libmd5_a_SOURCES = md5_dgst.c md5_one.c mem_clr.c
|
||||
|
||||
test:
|
||||
|
||||
coverage:
|
||||
|
||||
leakcheck:
|
||||
|
||||
docs:
|
||||
|
||||
bootstrap:
|
||||
|
415
utils/configcpp/md5/md32_common.h
Normal file
415
utils/configcpp/md5/md32_common.h
Normal file
@@ -0,0 +1,415 @@
|
||||
/* crypto/md32_common.h */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is a generic 32 bit "collector" for message digest algorithms.
|
||||
* Whenever needed it collects input character stream into chunks of
|
||||
* 32 bit values and invokes a block function that performs actual hash
|
||||
* calculations.
|
||||
*
|
||||
* Porting guide.
|
||||
*
|
||||
* Obligatory macros:
|
||||
*
|
||||
* DATA_ORDER_IS_BIG_ENDIAN or DATA_ORDER_IS_LITTLE_ENDIAN
|
||||
* this macro defines byte order of input stream.
|
||||
* HASH_CBLOCK
|
||||
* size of a unit chunk HASH_BLOCK operates on.
|
||||
* HASH_LONG
|
||||
* has to be at lest 32 bit wide, if it's wider, then
|
||||
* HASH_LONG_LOG2 *has to* be defined along
|
||||
* HASH_CTX
|
||||
* context structure that at least contains following
|
||||
* members:
|
||||
* typedef struct {
|
||||
* ...
|
||||
* HASH_LONG Nl,Nh;
|
||||
* either {
|
||||
* HASH_LONG data[HASH_LBLOCK];
|
||||
* unsigned char data[HASH_CBLOCK];
|
||||
* };
|
||||
* unsigned int num;
|
||||
* ...
|
||||
* } HASH_CTX;
|
||||
* data[] vector is expected to be zeroed upon first call to
|
||||
* HASH_UPDATE.
|
||||
* HASH_UPDATE
|
||||
* name of "Update" function, implemented here.
|
||||
* HASH_TRANSFORM
|
||||
* name of "Transform" function, implemented here.
|
||||
* HASH_FINAL
|
||||
* name of "Final" function, implemented here.
|
||||
* HASH_BLOCK_DATA_ORDER
|
||||
* name of "block" function capable of treating *unaligned* input
|
||||
* message in original (data) byte order, implemented externally.
|
||||
* HASH_MAKE_STRING
|
||||
* macro convering context variables to an ASCII hash string.
|
||||
*
|
||||
* MD5 example:
|
||||
*
|
||||
* #define DATA_ORDER_IS_LITTLE_ENDIAN
|
||||
*
|
||||
* #define HASH_LONG MD5_LONG
|
||||
* #define HASH_LONG_LOG2 MD5_LONG_LOG2
|
||||
* #define HASH_CTX MD5_CTX
|
||||
* #define HASH_CBLOCK MD5_CBLOCK
|
||||
* #define HASH_UPDATE MD5_Update
|
||||
* #define HASH_TRANSFORM MD5_Transform
|
||||
* #define HASH_FINAL MD5_Final
|
||||
* #define HASH_BLOCK_DATA_ORDER md5_block_data_order
|
||||
*
|
||||
* <appro@fy.chalmers.se>
|
||||
*/
|
||||
|
||||
#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
|
||||
#error "DATA_ORDER must be defined!"
|
||||
#endif
|
||||
|
||||
#ifndef HASH_CBLOCK
|
||||
#error "HASH_CBLOCK must be defined!"
|
||||
#endif
|
||||
#ifndef HASH_LONG
|
||||
#error "HASH_LONG must be defined!"
|
||||
#endif
|
||||
#ifndef HASH_CTX
|
||||
#error "HASH_CTX must be defined!"
|
||||
#endif
|
||||
|
||||
#ifndef HASH_UPDATE
|
||||
#error "HASH_UPDATE must be defined!"
|
||||
#endif
|
||||
#ifndef HASH_TRANSFORM
|
||||
#error "HASH_TRANSFORM must be defined!"
|
||||
#endif
|
||||
#ifndef HASH_FINAL
|
||||
#error "HASH_FINAL must be defined!"
|
||||
#endif
|
||||
|
||||
#ifndef HASH_BLOCK_DATA_ORDER
|
||||
#error "HASH_BLOCK_DATA_ORDER must be defined!"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Engage compiler specific rotate intrinsic function if available.
|
||||
*/
|
||||
#undef ROTATE
|
||||
#ifndef PEDANTIC
|
||||
# if defined(_MSC_VER) || defined(__ICC)
|
||||
# define ROTATE(a,n) _lrotl(a,n)
|
||||
# elif defined(__MWERKS__)
|
||||
# if defined(__POWERPC__)
|
||||
# define ROTATE(a,n) __rlwinm(a,n,0,31)
|
||||
# elif defined(__MC68K__)
|
||||
/* Motorola specific tweak. <appro@fy.chalmers.se> */
|
||||
# define ROTATE(a,n) ( n<24 ? __rol(a,n) : __ror(a,32-n) )
|
||||
# else
|
||||
# define ROTATE(a,n) __rol(a,n)
|
||||
# endif
|
||||
# elif defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
|
||||
/*
|
||||
* Some GNU C inline assembler templates. Note that these are
|
||||
* rotates by *constant* number of bits! But that's exactly
|
||||
* what we need here...
|
||||
* <appro@fy.chalmers.se>
|
||||
*/
|
||||
# if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
|
||||
# define ROTATE(a,n) ({ register unsigned int ret; \
|
||||
asm ( \
|
||||
"roll %1,%0" \
|
||||
: "=r"(ret) \
|
||||
: "I"(n), "0"((unsigned int)(a)) \
|
||||
: "cc"); \
|
||||
ret; \
|
||||
})
|
||||
# elif defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
|
||||
defined(__powerpc) || defined(__ppc__) || defined(__powerpc64__)
|
||||
# define ROTATE(a,n) ({ register unsigned int ret; \
|
||||
asm ( \
|
||||
"rlwinm %0,%1,%2,0,31" \
|
||||
: "=r"(ret) \
|
||||
: "r"(a), "I"(n)); \
|
||||
ret; \
|
||||
})
|
||||
# elif defined(__s390x__)
|
||||
# define ROTATE(a,n) ({ register unsigned int ret; \
|
||||
asm ("rll %0,%1,%2" \
|
||||
: "=r"(ret) \
|
||||
: "r"(a), "I"(n)); \
|
||||
ret; \
|
||||
})
|
||||
# endif
|
||||
# endif
|
||||
#endif /* PEDANTIC */
|
||||
|
||||
#ifndef ROTATE
|
||||
#define ROTATE(a,n) (((a)<<(n))|(((a)&0xffffffff)>>(32-(n))))
|
||||
#endif
|
||||
|
||||
#if defined(DATA_ORDER_IS_BIG_ENDIAN)
|
||||
|
||||
#ifndef PEDANTIC
|
||||
# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
|
||||
# if ((defined(__i386) || defined(__i386__)) && !defined(I386_ONLY)) || \
|
||||
(defined(__x86_64) || defined(__x86_64__))
|
||||
# if !defined(B_ENDIAN)
|
||||
/*
|
||||
* This gives ~30-40% performance improvement in SHA-256 compiled
|
||||
* with gcc [on P4]. Well, first macro to be frank. We can pull
|
||||
* this trick on x86* platforms only, because these CPUs can fetch
|
||||
* unaligned data without raising an exception.
|
||||
*/
|
||||
# define HOST_c2l(c,l) ({ unsigned int r=*((const unsigned int *)(c)); \
|
||||
asm ("bswapl %0":"=r"(r):"0"(r)); \
|
||||
(c)+=4; (l)=r; })
|
||||
# define HOST_l2c(l,c) ({ unsigned int r=(l); \
|
||||
asm ("bswapl %0":"=r"(r):"0"(r)); \
|
||||
*((unsigned int *)(c))=r; (c)+=4; r; })
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__s390__) || defined(__s390x__)
|
||||
# define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, (l))
|
||||
# define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, (l))
|
||||
#endif
|
||||
|
||||
#ifndef HOST_c2l
|
||||
#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++)))<<24), \
|
||||
l|=(((unsigned long)(*((c)++)))<<16), \
|
||||
l|=(((unsigned long)(*((c)++)))<< 8), \
|
||||
l|=(((unsigned long)(*((c)++))) ), \
|
||||
l)
|
||||
#endif
|
||||
#ifndef HOST_l2c
|
||||
#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l) )&0xff), \
|
||||
l)
|
||||
#endif
|
||||
|
||||
#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
|
||||
|
||||
#ifndef PEDANTIC
|
||||
# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
|
||||
# if defined(__s390x__)
|
||||
# define HOST_c2l(c,l) ({ asm ("lrv %0,%1" \
|
||||
:"=d"(l) :"m"(*(const unsigned int *)(c)));\
|
||||
(c)+=4; (l); })
|
||||
# define HOST_l2c(l,c) ({ asm ("strv %1,%0" \
|
||||
:"=m"(*(unsigned int *)(c)) :"d"(l));\
|
||||
(c)+=4; (l); })
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
|
||||
# ifndef B_ENDIAN
|
||||
/* See comment in DATA_ORDER_IS_BIG_ENDIAN section. */
|
||||
# define HOST_c2l(c,l) ((l)=*((const unsigned int *)(c)), (c)+=4, l)
|
||||
# define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, l)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HOST_c2l
|
||||
#define HOST_c2l(c,l) (l =(((unsigned long)(*((c)++))) ), \
|
||||
l|=(((unsigned long)(*((c)++)))<< 8), \
|
||||
l|=(((unsigned long)(*((c)++)))<<16), \
|
||||
l|=(((unsigned long)(*((c)++)))<<24), \
|
||||
l)
|
||||
#endif
|
||||
#ifndef HOST_l2c
|
||||
#define HOST_l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
|
||||
*((c)++)=(unsigned char)(((l)>>24)&0xff), \
|
||||
l)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Time for some action:-)
|
||||
*/
|
||||
|
||||
int HASH_UPDATE (HASH_CTX *c, const void *data_, size_t len)
|
||||
{
|
||||
const unsigned char *data=data_;
|
||||
unsigned char *p;
|
||||
HASH_LONG l;
|
||||
size_t n;
|
||||
|
||||
if (len==0) return 1;
|
||||
|
||||
l=(c->Nl+(((HASH_LONG)len)<<3))&0xffffffffUL;
|
||||
/* 95-05-24 eay Fixed a bug with the overflow handling, thanks to
|
||||
* Wei Dai <weidai@eskimo.com> for pointing it out. */
|
||||
if (l < c->Nl) /* overflow */
|
||||
c->Nh++;
|
||||
c->Nh+=(HASH_LONG)(len>>29); /* might cause compiler warning on 16-bit */
|
||||
c->Nl=l;
|
||||
|
||||
n = c->num;
|
||||
if (n != 0)
|
||||
{
|
||||
p=(unsigned char *)c->data;
|
||||
|
||||
if (len >= HASH_CBLOCK || len+n >= HASH_CBLOCK)
|
||||
{
|
||||
memcpy (p+n,data,HASH_CBLOCK-n);
|
||||
HASH_BLOCK_DATA_ORDER (c,p,1);
|
||||
n = HASH_CBLOCK-n;
|
||||
data += n;
|
||||
len -= n;
|
||||
c->num = 0;
|
||||
memset (p,0,HASH_CBLOCK); /* keep it zeroed */
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy (p+n,data,len);
|
||||
c->num += (unsigned int)len;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
n = len/HASH_CBLOCK;
|
||||
if (n > 0)
|
||||
{
|
||||
HASH_BLOCK_DATA_ORDER (c,data,n);
|
||||
n *= HASH_CBLOCK;
|
||||
data += n;
|
||||
len -= n;
|
||||
}
|
||||
|
||||
if (len != 0)
|
||||
{
|
||||
p = (unsigned char *)c->data;
|
||||
c->num = (unsigned int)len;
|
||||
memcpy (p,data,len);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void HASH_TRANSFORM (HASH_CTX *c, const unsigned char *data)
|
||||
{
|
||||
HASH_BLOCK_DATA_ORDER (c,data,1);
|
||||
}
|
||||
|
||||
|
||||
int HASH_FINAL (unsigned char *md, HASH_CTX *c)
|
||||
{
|
||||
unsigned char *p = (unsigned char *)c->data;
|
||||
size_t n = c->num;
|
||||
|
||||
p[n] = 0x80; /* there is always room for one */
|
||||
n++;
|
||||
|
||||
if (n > (HASH_CBLOCK-8))
|
||||
{
|
||||
memset (p+n,0,HASH_CBLOCK-n);
|
||||
n=0;
|
||||
HASH_BLOCK_DATA_ORDER (c,p,1);
|
||||
}
|
||||
memset (p+n,0,HASH_CBLOCK-8-n);
|
||||
|
||||
p += HASH_CBLOCK-8;
|
||||
#if defined(DATA_ORDER_IS_BIG_ENDIAN)
|
||||
(void)HOST_l2c(c->Nh,p);
|
||||
(void)HOST_l2c(c->Nl,p);
|
||||
#elif defined(DATA_ORDER_IS_LITTLE_ENDIAN)
|
||||
(void)HOST_l2c(c->Nl,p);
|
||||
(void)HOST_l2c(c->Nh,p);
|
||||
#endif
|
||||
p -= HASH_CBLOCK;
|
||||
HASH_BLOCK_DATA_ORDER (c,p,1);
|
||||
c->num=0;
|
||||
memset (p,0,HASH_CBLOCK);
|
||||
|
||||
#ifndef HASH_MAKE_STRING
|
||||
#error "HASH_MAKE_STRING must be defined!"
|
||||
#else
|
||||
HASH_MAKE_STRING(c,md);
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef MD32_REG_T
|
||||
#if defined(__alpha) || defined(__sparcv9) || defined(__mips)
|
||||
#define MD32_REG_T long
|
||||
/*
|
||||
* This comment was originaly written for MD5, which is why it
|
||||
* discusses A-D. But it basically applies to all 32-bit digests,
|
||||
* which is why it was moved to common header file.
|
||||
*
|
||||
* In case you wonder why A-D are declared as long and not
|
||||
* as MD5_LONG. Doing so results in slight performance
|
||||
* boost on LP64 architectures. The catch is we don't
|
||||
* really care if 32 MSBs of a 64-bit register get polluted
|
||||
* with eventual overflows as we *save* only 32 LSBs in
|
||||
* *either* case. Now declaring 'em long excuses the compiler
|
||||
* from keeping 32 MSBs zeroed resulting in 13% performance
|
||||
* improvement under SPARC Solaris7/64 and 5% under AlphaLinux.
|
||||
* Well, to be honest it should say that this *prevents*
|
||||
* performance degradation.
|
||||
* <appro@fy.chalmers.se>
|
||||
*/
|
||||
#else
|
||||
/*
|
||||
* Above is not absolute and there are LP64 compilers that
|
||||
* generate better code if MD32_REG_T is defined int. The above
|
||||
* pre-processor condition reflects the circumstances under which
|
||||
* the conclusion was made and is subject to further extension.
|
||||
* <appro@fy.chalmers.se>
|
||||
*/
|
||||
#define MD32_REG_T int
|
||||
#endif
|
||||
#endif
|
116
utils/configcpp/md5/md5.h
Normal file
116
utils/configcpp/md5/md5.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/* crypto/md5/md5.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#ifndef HEADER_MD5_H
|
||||
#define HEADER_MD5_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef OPENSSL_NO_MD5
|
||||
#error MD5 is disabled.
|
||||
#endif
|
||||
|
||||
/*
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
* ! MD5_LONG has to be at least 32 bits wide. If it's wider, then !
|
||||
* ! MD5_LONG_LOG2 has to be defined along. !
|
||||
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
*/
|
||||
|
||||
#if defined(__LP32__)
|
||||
#define MD5_LONG unsigned long
|
||||
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
|
||||
#define MD5_LONG unsigned long
|
||||
#define MD5_LONG_LOG2 3
|
||||
/*
|
||||
* _CRAY note. I could declare short, but I have no idea what impact
|
||||
* does it have on performance on none-T3E machines. I could declare
|
||||
* int, but at least on C90 sizeof(int) can be chosen at compile time.
|
||||
* So I've chosen long...
|
||||
* <appro@fy.chalmers.se>
|
||||
*/
|
||||
#else
|
||||
#define MD5_LONG unsigned int
|
||||
#endif
|
||||
|
||||
#define MD5_CBLOCK 64
|
||||
#define MD5_LBLOCK (MD5_CBLOCK/4)
|
||||
#define MD5_DIGEST_LENGTH 16
|
||||
|
||||
typedef struct MD5state_st
|
||||
{
|
||||
MD5_LONG A,B,C,D;
|
||||
MD5_LONG Nl,Nh;
|
||||
MD5_LONG data[MD5_LBLOCK];
|
||||
unsigned int num;
|
||||
} MD5_CTX;
|
||||
|
||||
int MD5_Init(MD5_CTX *c);
|
||||
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
|
||||
int MD5_Final(unsigned char *md, MD5_CTX *c);
|
||||
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
|
||||
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
183
utils/configcpp/md5/md5_dgst.c
Normal file
183
utils/configcpp/md5/md5_dgst.c
Normal file
@@ -0,0 +1,183 @@
|
||||
/* crypto/md5/md5_dgst.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "md5_locl.h"
|
||||
|
||||
const char MD5_version[]="MD5" OPENSSL_VERSION_PTEXT;
|
||||
|
||||
/* Implemented from RFC1321 The MD5 Message-Digest Algorithm
|
||||
*/
|
||||
|
||||
#define INIT_DATA_A (unsigned long)0x67452301L
|
||||
#define INIT_DATA_B (unsigned long)0xefcdab89L
|
||||
#define INIT_DATA_C (unsigned long)0x98badcfeL
|
||||
#define INIT_DATA_D (unsigned long)0x10325476L
|
||||
|
||||
int MD5_Init(MD5_CTX *c)
|
||||
{
|
||||
memset (c,0,sizeof(*c));
|
||||
c->A=INIT_DATA_A;
|
||||
c->B=INIT_DATA_B;
|
||||
c->C=INIT_DATA_C;
|
||||
c->D=INIT_DATA_D;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef md5_block_data_order
|
||||
#ifdef X
|
||||
#undef X
|
||||
#endif
|
||||
void md5_block_data_order (MD5_CTX *c, const void *data_, size_t num)
|
||||
{
|
||||
const unsigned char *data=data_;
|
||||
register unsigned MD32_REG_T A,B,C,D,l;
|
||||
#ifndef MD32_XARRAY
|
||||
/* See comment in crypto/sha/sha_locl.h for details. */
|
||||
unsigned MD32_REG_T XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
|
||||
XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
|
||||
# define X(i) XX##i
|
||||
#else
|
||||
MD5_LONG XX[MD5_LBLOCK];
|
||||
# define X(i) XX[i]
|
||||
#endif
|
||||
|
||||
A=c->A;
|
||||
B=c->B;
|
||||
C=c->C;
|
||||
D=c->D;
|
||||
|
||||
for (;num--;)
|
||||
{
|
||||
HOST_c2l(data,l); X( 0)=l; HOST_c2l(data,l); X( 1)=l;
|
||||
/* Round 0 */
|
||||
R0(A,B,C,D,X( 0), 7,0xd76aa478L); HOST_c2l(data,l); X( 2)=l;
|
||||
R0(D,A,B,C,X( 1),12,0xe8c7b756L); HOST_c2l(data,l); X( 3)=l;
|
||||
R0(C,D,A,B,X( 2),17,0x242070dbL); HOST_c2l(data,l); X( 4)=l;
|
||||
R0(B,C,D,A,X( 3),22,0xc1bdceeeL); HOST_c2l(data,l); X( 5)=l;
|
||||
R0(A,B,C,D,X( 4), 7,0xf57c0fafL); HOST_c2l(data,l); X( 6)=l;
|
||||
R0(D,A,B,C,X( 5),12,0x4787c62aL); HOST_c2l(data,l); X( 7)=l;
|
||||
R0(C,D,A,B,X( 6),17,0xa8304613L); HOST_c2l(data,l); X( 8)=l;
|
||||
R0(B,C,D,A,X( 7),22,0xfd469501L); HOST_c2l(data,l); X( 9)=l;
|
||||
R0(A,B,C,D,X( 8), 7,0x698098d8L); HOST_c2l(data,l); X(10)=l;
|
||||
R0(D,A,B,C,X( 9),12,0x8b44f7afL); HOST_c2l(data,l); X(11)=l;
|
||||
R0(C,D,A,B,X(10),17,0xffff5bb1L); HOST_c2l(data,l); X(12)=l;
|
||||
R0(B,C,D,A,X(11),22,0x895cd7beL); HOST_c2l(data,l); X(13)=l;
|
||||
R0(A,B,C,D,X(12), 7,0x6b901122L); HOST_c2l(data,l); X(14)=l;
|
||||
R0(D,A,B,C,X(13),12,0xfd987193L); HOST_c2l(data,l); X(15)=l;
|
||||
R0(C,D,A,B,X(14),17,0xa679438eL);
|
||||
R0(B,C,D,A,X(15),22,0x49b40821L);
|
||||
/* Round 1 */
|
||||
R1(A,B,C,D,X( 1), 5,0xf61e2562L);
|
||||
R1(D,A,B,C,X( 6), 9,0xc040b340L);
|
||||
R1(C,D,A,B,X(11),14,0x265e5a51L);
|
||||
R1(B,C,D,A,X( 0),20,0xe9b6c7aaL);
|
||||
R1(A,B,C,D,X( 5), 5,0xd62f105dL);
|
||||
R1(D,A,B,C,X(10), 9,0x02441453L);
|
||||
R1(C,D,A,B,X(15),14,0xd8a1e681L);
|
||||
R1(B,C,D,A,X( 4),20,0xe7d3fbc8L);
|
||||
R1(A,B,C,D,X( 9), 5,0x21e1cde6L);
|
||||
R1(D,A,B,C,X(14), 9,0xc33707d6L);
|
||||
R1(C,D,A,B,X( 3),14,0xf4d50d87L);
|
||||
R1(B,C,D,A,X( 8),20,0x455a14edL);
|
||||
R1(A,B,C,D,X(13), 5,0xa9e3e905L);
|
||||
R1(D,A,B,C,X( 2), 9,0xfcefa3f8L);
|
||||
R1(C,D,A,B,X( 7),14,0x676f02d9L);
|
||||
R1(B,C,D,A,X(12),20,0x8d2a4c8aL);
|
||||
/* Round 2 */
|
||||
R2(A,B,C,D,X( 5), 4,0xfffa3942L);
|
||||
R2(D,A,B,C,X( 8),11,0x8771f681L);
|
||||
R2(C,D,A,B,X(11),16,0x6d9d6122L);
|
||||
R2(B,C,D,A,X(14),23,0xfde5380cL);
|
||||
R2(A,B,C,D,X( 1), 4,0xa4beea44L);
|
||||
R2(D,A,B,C,X( 4),11,0x4bdecfa9L);
|
||||
R2(C,D,A,B,X( 7),16,0xf6bb4b60L);
|
||||
R2(B,C,D,A,X(10),23,0xbebfbc70L);
|
||||
R2(A,B,C,D,X(13), 4,0x289b7ec6L);
|
||||
R2(D,A,B,C,X( 0),11,0xeaa127faL);
|
||||
R2(C,D,A,B,X( 3),16,0xd4ef3085L);
|
||||
R2(B,C,D,A,X( 6),23,0x04881d05L);
|
||||
R2(A,B,C,D,X( 9), 4,0xd9d4d039L);
|
||||
R2(D,A,B,C,X(12),11,0xe6db99e5L);
|
||||
R2(C,D,A,B,X(15),16,0x1fa27cf8L);
|
||||
R2(B,C,D,A,X( 2),23,0xc4ac5665L);
|
||||
/* Round 3 */
|
||||
R3(A,B,C,D,X( 0), 6,0xf4292244L);
|
||||
R3(D,A,B,C,X( 7),10,0x432aff97L);
|
||||
R3(C,D,A,B,X(14),15,0xab9423a7L);
|
||||
R3(B,C,D,A,X( 5),21,0xfc93a039L);
|
||||
R3(A,B,C,D,X(12), 6,0x655b59c3L);
|
||||
R3(D,A,B,C,X( 3),10,0x8f0ccc92L);
|
||||
R3(C,D,A,B,X(10),15,0xffeff47dL);
|
||||
R3(B,C,D,A,X( 1),21,0x85845dd1L);
|
||||
R3(A,B,C,D,X( 8), 6,0x6fa87e4fL);
|
||||
R3(D,A,B,C,X(15),10,0xfe2ce6e0L);
|
||||
R3(C,D,A,B,X( 6),15,0xa3014314L);
|
||||
R3(B,C,D,A,X(13),21,0x4e0811a1L);
|
||||
R3(A,B,C,D,X( 4), 6,0xf7537e82L);
|
||||
R3(D,A,B,C,X(11),10,0xbd3af235L);
|
||||
R3(C,D,A,B,X( 2),15,0x2ad7d2bbL);
|
||||
R3(B,C,D,A,X( 9),21,0xeb86d391L);
|
||||
|
||||
A = c->A += A;
|
||||
B = c->B += B;
|
||||
C = c->C += C;
|
||||
D = c->D += D;
|
||||
}
|
||||
}
|
||||
#endif
|
132
utils/configcpp/md5/md5_locl.h
Normal file
132
utils/configcpp/md5/md5_locl.h
Normal file
@@ -0,0 +1,132 @@
|
||||
/* crypto/md5/md5_locl.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "md5.h"
|
||||
|
||||
#define OPENSSL_VERSION_PTEXT " part of OpenSSL 0.9.8e-rhel5 01 Jul 2008"
|
||||
|
||||
#ifndef MD5_LONG_LOG2
|
||||
#define MD5_LONG_LOG2 2 /* default to 32 bits */
|
||||
#endif
|
||||
|
||||
#ifdef MD5_ASM
|
||||
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__) || \
|
||||
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
|
||||
# define md5_block_data_order md5_block_asm_data_order
|
||||
# elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
|
||||
# define md5_block_data_order md5_block_asm_data_order
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void md5_block_data_order (MD5_CTX *c, const void *p,size_t num);
|
||||
|
||||
#define DATA_ORDER_IS_LITTLE_ENDIAN
|
||||
|
||||
#define HASH_LONG MD5_LONG
|
||||
#define HASH_CTX MD5_CTX
|
||||
#define HASH_CBLOCK MD5_CBLOCK
|
||||
#define HASH_UPDATE MD5_Update
|
||||
#define HASH_TRANSFORM MD5_Transform
|
||||
#define HASH_FINAL MD5_Final
|
||||
#define HASH_MAKE_STRING(c,s) do { \
|
||||
unsigned long ll; \
|
||||
ll=(c)->A; HOST_l2c(ll,(s)); \
|
||||
ll=(c)->B; HOST_l2c(ll,(s)); \
|
||||
ll=(c)->C; HOST_l2c(ll,(s)); \
|
||||
ll=(c)->D; HOST_l2c(ll,(s)); \
|
||||
} while (0)
|
||||
#define HASH_BLOCK_DATA_ORDER md5_block_data_order
|
||||
|
||||
#include "md32_common.h"
|
||||
|
||||
/*
|
||||
#define F(x,y,z) (((x) & (y)) | ((~(x)) & (z)))
|
||||
#define G(x,y,z) (((x) & (z)) | ((y) & (~(z))))
|
||||
*/
|
||||
|
||||
/* As pointed out by Wei Dai <weidai@eskimo.com>, the above can be
|
||||
* simplified to the code below. Wei attributes these optimizations
|
||||
* to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
|
||||
*/
|
||||
#define F(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
|
||||
#define G(b,c,d) ((((b) ^ (c)) & (d)) ^ (c))
|
||||
#define H(b,c,d) ((b) ^ (c) ^ (d))
|
||||
#define I(b,c,d) (((~(d)) | (b)) ^ (c))
|
||||
|
||||
#define R0(a,b,c,d,k,s,t) { \
|
||||
a+=((k)+(t)+F((b),(c),(d))); \
|
||||
a=ROTATE(a,s); \
|
||||
a+=b; };\
|
||||
|
||||
#define R1(a,b,c,d,k,s,t) { \
|
||||
a+=((k)+(t)+G((b),(c),(d))); \
|
||||
a=ROTATE(a,s); \
|
||||
a+=b; };
|
||||
|
||||
#define R2(a,b,c,d,k,s,t) { \
|
||||
a+=((k)+(t)+H((b),(c),(d))); \
|
||||
a=ROTATE(a,s); \
|
||||
a+=b; };
|
||||
|
||||
#define R3(a,b,c,d,k,s,t) { \
|
||||
a+=((k)+(t)+I((b),(c),(d))); \
|
||||
a=ROTATE(a,s); \
|
||||
a+=b; };
|
101
utils/configcpp/md5/md5_one.c
Normal file
101
utils/configcpp/md5/md5_one.c
Normal file
@@ -0,0 +1,101 @@
|
||||
/* crypto/md5/md5_one.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
//#include <openssl/md5.h>
|
||||
//#include <openssl/crypto.h>
|
||||
|
||||
#ifdef CHARSET_EBCDIC
|
||||
//#include <openssl/ebcdic.h>
|
||||
#endif
|
||||
|
||||
#include "md5.h"
|
||||
|
||||
extern void OPENSSL_cleanse(void *ptr, size_t len);
|
||||
|
||||
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md)
|
||||
{
|
||||
MD5_CTX c;
|
||||
static unsigned char m[MD5_DIGEST_LENGTH];
|
||||
|
||||
if (md == NULL) md=m;
|
||||
if (!MD5_Init(&c))
|
||||
return NULL;
|
||||
#ifndef CHARSET_EBCDIC
|
||||
MD5_Update(&c,d,n);
|
||||
#else
|
||||
{
|
||||
char temp[1024];
|
||||
unsigned long chunk;
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
chunk = (n > sizeof(temp)) ? sizeof(temp) : n;
|
||||
ebcdic2ascii(temp, d, chunk);
|
||||
MD5_Update(&c,temp,chunk);
|
||||
n -= chunk;
|
||||
d += chunk;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
MD5_Final(md,&c);
|
||||
OPENSSL_cleanse(&c,sizeof(c)); /* security consideration */
|
||||
return(md);
|
||||
}
|
||||
|
76
utils/configcpp/md5/mem_clr.c
Normal file
76
utils/configcpp/md5/mem_clr.c
Normal file
@@ -0,0 +1,76 @@
|
||||
/* crypto/mem_clr.c -*- mode:C; c-file-style: "eay" -*- */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2002.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
unsigned char cleanse_ctr = 0;
|
||||
|
||||
void OPENSSL_cleanse(void *ptr, size_t len)
|
||||
{
|
||||
unsigned char *p = ptr;
|
||||
size_t loop = len, ctr = cleanse_ctr;
|
||||
while(loop--)
|
||||
{
|
||||
*(p++) = (unsigned char)ctr;
|
||||
ctr += (17 + ((size_t)p & 0xF));
|
||||
}
|
||||
p=memchr(ptr, (unsigned char)ctr, len);
|
||||
if(p)
|
||||
ctr += (63 + (size_t)p);
|
||||
cleanse_ctr = (unsigned char)ctr;
|
||||
}
|
14
utils/configcpp/resource.h
Normal file
14
utils/configcpp/resource.h
Normal file
@@ -0,0 +1,14 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by libconfigcpp.rc
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 101
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
359
utils/configcpp/tdriver.cpp
Normal file
359
utils/configcpp/tdriver.cpp
Normal file
@@ -0,0 +1,359 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <sys/types.h>
|
||||
#include <utime.h>
|
||||
#include <sys/stat.h>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <fstream>
|
||||
using namespace std;
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
using namespace boost;
|
||||
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
|
||||
#include "bytestream.h"
|
||||
using namespace messageqcpp;
|
||||
|
||||
#include "configcpp.h"
|
||||
#include "configstream.h"
|
||||
using namespace config;
|
||||
|
||||
class ConfigFileTest : public CppUnit::TestFixture {
|
||||
|
||||
CPPUNIT_TEST_SUITE( ConfigFileTest );
|
||||
|
||||
CPPUNIT_TEST( test1 );
|
||||
|
||||
CPPUNIT_TEST_EXCEPTION( test2, std::runtime_error );
|
||||
CPPUNIT_TEST( test3 );
|
||||
CPPUNIT_TEST( test4 );
|
||||
CPPUNIT_TEST_EXCEPTION( test5, std::runtime_error );
|
||||
CPPUNIT_TEST_EXCEPTION( test6, std::runtime_error );
|
||||
CPPUNIT_TEST_EXCEPTION( test7, std::invalid_argument );
|
||||
CPPUNIT_TEST_EXCEPTION( test8, std::invalid_argument );
|
||||
CPPUNIT_TEST( test9 );
|
||||
CPPUNIT_TEST( test10 );
|
||||
CPPUNIT_TEST( test11 );
|
||||
CPPUNIT_TEST( test12 );
|
||||
CPPUNIT_TEST_EXCEPTION( test13_1, std::runtime_error );
|
||||
CPPUNIT_TEST_EXCEPTION( test13_2, std::runtime_error );
|
||||
CPPUNIT_TEST( test14 );
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
private:
|
||||
public:
|
||||
void setUp() {
|
||||
}
|
||||
|
||||
void tearDown() {
|
||||
}
|
||||
|
||||
void test1() {
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
string value;
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
|
||||
value = c1->getConfig("Message", "xName");
|
||||
CPPUNIT_ASSERT(value.size() == 0);
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test2() {
|
||||
Config* c1 = Config::makeConfig("./yadayada.xml");
|
||||
string value;
|
||||
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value.size() == 0);
|
||||
|
||||
value = c1->getConfig("Message", "xName");
|
||||
CPPUNIT_ASSERT(value.size() == 0);
|
||||
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test3() {
|
||||
Config* c1;
|
||||
string value;
|
||||
|
||||
for (int i = 0; i < 1000; i++)
|
||||
{
|
||||
c1 = Config::makeConfig("./Calpont.xml");
|
||||
value = c1->getConfig("Message", "Name");
|
||||
assert(value == "Message");
|
||||
}
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test4() {
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
string value;
|
||||
|
||||
value = c1->getConfig("SystemConfig", "SystemVersion");
|
||||
c1->setConfig("SystemConfig", "SystemVersion", "2.2.versionversionversion");
|
||||
value = c1->getConfig("SystemConfig", "SystemVersion");
|
||||
CPPUNIT_ASSERT(value == "2.2.versionversionversion");
|
||||
|
||||
::unlink("./Calpont.xml.new");
|
||||
c1->write("./Calpont.xml.new");
|
||||
|
||||
value = c1->getConfig("SystemConfig", "SystemVersion");
|
||||
CPPUNIT_ASSERT(value == "2.2.versionversionversion");
|
||||
|
||||
c1->setConfig("SystemConfig", "SystemVersion1", "V1.x");
|
||||
value = c1->getConfig("SystemConfig", "SystemVersion1");
|
||||
CPPUNIT_ASSERT(value == "V1.x");
|
||||
|
||||
c1->setConfig("SystemConfig1", "SystemVersion1", "Vx.x");
|
||||
value = c1->getConfig("SystemConfig1", "SystemVersion1");
|
||||
CPPUNIT_ASSERT(value == "Vx.x");
|
||||
|
||||
c1->write("./Calpont.xml.new");
|
||||
Config* c2 = Config::makeConfig("./Calpont.xml.new");
|
||||
value = c2->getConfig("SystemConfig1", "SystemVersion1");
|
||||
CPPUNIT_ASSERT(value == "Vx.x");
|
||||
c2->setConfig("SystemConfig", "SystemVersion1", "V1.1");
|
||||
value = c2->getConfig("SystemConfig", "SystemVersion1");
|
||||
CPPUNIT_ASSERT(value == "V1.1");
|
||||
c2->write();
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test5() {
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
c1->write("/cantwritethis");
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test6() {
|
||||
Config* c1 = Config::makeConfig("./XCalpont.xml");
|
||||
// compiler warning...we won't actually get here
|
||||
c1 = 0;
|
||||
}
|
||||
|
||||
void test7() {
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
string s;
|
||||
string n;
|
||||
string v;
|
||||
c1->setConfig(s, n, v);
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test8() {
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
string s;
|
||||
string n;
|
||||
string v;
|
||||
v = c1->getConfig(s, n);
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test9() {
|
||||
string value;
|
||||
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml");
|
||||
Config* c2 = Config::makeConfig("./Calpont.xml.new");
|
||||
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
|
||||
value = c2->getConfig("SystemConfig", "SystemVersion1");
|
||||
CPPUNIT_ASSERT(value == "V1.1");
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test10() {
|
||||
string value;
|
||||
|
||||
setenv("CALPONT_CONFIG_FILE", "./Calpont.xml", 1);
|
||||
Config* c1 = Config::makeConfig();
|
||||
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
Config::deleteInstanceMap();
|
||||
|
||||
}
|
||||
|
||||
void test11() {
|
||||
string value;
|
||||
struct stat stat_buf;
|
||||
struct utimbuf utime_buf;
|
||||
|
||||
CPPUNIT_ASSERT(stat("./Calpont.xml.new", &stat_buf) == 0);
|
||||
|
||||
Config* c1 = Config::makeConfig("./Calpont.xml.new");
|
||||
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
|
||||
utime_buf.actime = utime_buf.modtime = stat_buf.st_mtime + 1;
|
||||
CPPUNIT_ASSERT(utime("./Calpont.xml.new", &utime_buf) == 0);
|
||||
|
||||
value = c1->getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
Config::deleteInstanceMap();
|
||||
}
|
||||
|
||||
void test12() {
|
||||
string value;
|
||||
int64_t ival;
|
||||
uint64_t uval;
|
||||
|
||||
value = "10";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == 10);
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 10);
|
||||
|
||||
value = "0x10";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == 0x10);
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 0x10);
|
||||
|
||||
value = "010";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == 010);
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 010);
|
||||
|
||||
value = "-10";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == -10);
|
||||
|
||||
value = "10K";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024));
|
||||
|
||||
value = "10k";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024));
|
||||
|
||||
value = "10M";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024 * 1024));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024 * 1024));
|
||||
|
||||
value = "10m";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024 * 1024));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024 * 1024));
|
||||
|
||||
value = "10G";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024 * 1024 * 1024LL));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024 * 1024 * 1024ULL));
|
||||
|
||||
value = "10g";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024 * 1024 * 1024LL));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024 * 1024 * 1024ULL));
|
||||
|
||||
value = "10MB";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == (10 * 1024 * 1024));
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == (10 * 1024 * 1024));
|
||||
|
||||
value = "0x7afafafafafafafa";
|
||||
ival = Config::fromText(value);
|
||||
CPPUNIT_ASSERT(ival == 0x7afafafafafafafaLL);
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 0x7afafafafafafafaULL);
|
||||
|
||||
value = "-0x7afafafafafafafa";
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 0x8505050505050506ULL);
|
||||
|
||||
value = "-1";
|
||||
uval = Config::uFromText(value);
|
||||
CPPUNIT_ASSERT(uval == 0xffffffffffffffffULL);
|
||||
|
||||
}
|
||||
|
||||
void test13_1() {
|
||||
string value;
|
||||
int64_t ival;
|
||||
|
||||
value = "2.2MB"; //invalid char causes throw
|
||||
ival = Config::fromText(value);
|
||||
}
|
||||
|
||||
void test13_2() {
|
||||
string value;
|
||||
int64_t ival;
|
||||
|
||||
value = "10,000"; //invalid char causes throw
|
||||
ival = Config::fromText(value);
|
||||
}
|
||||
|
||||
void test14() {
|
||||
ByteStream bs;
|
||||
ifstream ifs("./Calpont.xml");
|
||||
ifs >> bs;
|
||||
string id(".");
|
||||
string value;
|
||||
{
|
||||
ConfigStream cs(bs, id);
|
||||
value = cs.getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
}
|
||||
string bss(reinterpret_cast<const char*>(bs.buf()), bs.length());
|
||||
{
|
||||
ConfigStream cs(bss, id);
|
||||
value = cs.getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
}
|
||||
{
|
||||
ConfigStream cs(bss.c_str(), id);
|
||||
value = cs.getConfig("Message", "Name");
|
||||
CPPUNIT_ASSERT(value == "Message");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( ConfigFileTest );
|
||||
|
||||
#include <cppunit/extensions/TestFactoryRegistry.h>
|
||||
#include <cppunit/ui/text/TestRunner.h>
|
||||
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
CppUnit::TextUi::TestRunner runner;
|
||||
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
|
||||
runner.addTest( registry.makeTest() );
|
||||
bool wasSuccessful = runner.run( "", false );
|
||||
return (wasSuccessful ? 0 : 1);
|
||||
}
|
||||
|
||||
|
||||
|
123
utils/configcpp/tdriver2.cpp
Normal file
123
utils/configcpp/tdriver2.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <sys/types.h>
|
||||
#include <utime.h>
|
||||
#include <sys/stat.h>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
using namespace boost;
|
||||
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
|
||||
#include "configcpp.h"
|
||||
#include "writeonce.h"
|
||||
using namespace config;
|
||||
|
||||
namespace
|
||||
{
|
||||
const string cf("./woparms.dat");
|
||||
}
|
||||
|
||||
class WOConfigFileTest : public CppUnit::TestFixture {
|
||||
|
||||
CPPUNIT_TEST_SUITE( WOConfigFileTest );
|
||||
|
||||
CPPUNIT_TEST( test1 );
|
||||
CPPUNIT_TEST_EXCEPTION( test2, std::runtime_error );
|
||||
CPPUNIT_TEST_EXCEPTION( test3, std::runtime_error );
|
||||
CPPUNIT_TEST_EXCEPTION( test4, std::runtime_error );
|
||||
CPPUNIT_TEST( test5 );
|
||||
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
private:
|
||||
|
||||
public:
|
||||
void setUp() {
|
||||
unlink(cf.c_str());
|
||||
}
|
||||
|
||||
void tearDown() {
|
||||
unlink(cf.c_str());
|
||||
}
|
||||
|
||||
void test1() {
|
||||
WriteOnceConfig woc(cf);
|
||||
CPPUNIT_ASSERT(woc.owns("PrimitiveServers", "LBID_Shift"));
|
||||
CPPUNIT_ASSERT(woc.owns("SystemConfig", "DBRootCount"));
|
||||
CPPUNIT_ASSERT(woc.owns("SystemConfig", "DBRMRoot"));
|
||||
|
||||
CPPUNIT_ASSERT(!woc.owns("dummy", "dummy"));
|
||||
|
||||
int vali;
|
||||
|
||||
vali = Config::fromText(woc.getConfig("PrimitiveServers", "LBID_Shift"));
|
||||
CPPUNIT_ASSERT(vali == 13);
|
||||
|
||||
woc.setConfig("SystemConfig", "DBRootCount", "10");
|
||||
vali = Config::fromText(woc.getConfig("SystemConfig", "DBRootCount"));
|
||||
CPPUNIT_ASSERT(vali == 10);
|
||||
|
||||
WriteOnceConfig woc2(cf.c_str());
|
||||
vali = Config::fromText(woc2.getConfig("SystemConfig", "DBRootCount"));
|
||||
CPPUNIT_ASSERT(vali == 10);
|
||||
}
|
||||
|
||||
void test2() {
|
||||
WriteOnceConfig woc(cf);
|
||||
woc.getConfig("dummy", "dummy");
|
||||
}
|
||||
|
||||
void test3() {
|
||||
WriteOnceConfig woc(cf);
|
||||
woc.setConfig("dummy", "dummy", "100");
|
||||
}
|
||||
|
||||
void test4() {
|
||||
WriteOnceConfig woc(cf);
|
||||
woc.setConfig("SystemConfig", "DBRootCount", "10");
|
||||
woc.setConfig("SystemConfig", "DBRootCount", "11");
|
||||
}
|
||||
|
||||
void test5() {
|
||||
WriteOnceConfig woc(cf);
|
||||
woc.setConfig("SystemConfig", "DBRootCount", "10");
|
||||
woc.setConfig("SystemConfig", "DBRootCount", "11", true);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( WOConfigFileTest );
|
||||
|
||||
#include <cppunit/extensions/TestFactoryRegistry.h>
|
||||
#include <cppunit/ui/text/TestRunner.h>
|
||||
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
CppUnit::TextUi::TestRunner runner;
|
||||
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
|
||||
runner.addTest( registry.makeTest() );
|
||||
bool wasSuccessful = runner.run( "", false );
|
||||
return (wasSuccessful ? 0 : 1);
|
||||
}
|
||||
|
8
utils/configcpp/versionnumber.h
Normal file
8
utils/configcpp/versionnumber.h
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
#ifndef VERSIONNUMBER_H_
|
||||
#define VERSIONNUMBER_H_
|
||||
#include <string>
|
||||
const std::string idb_version("4.6");
|
||||
const std::string idb_release("0");
|
||||
#endif
|
||||
|
214
utils/configcpp/writeonce.cpp
Normal file
214
utils/configcpp/writeonce.cpp
Normal file
@@ -0,0 +1,214 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
// $Id: writeonce.cpp 3495 2013-01-21 14:09:51Z rdempsey $
|
||||
|
||||
#include "writeonce.h"
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
//#define NDEBUG
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
|
||||
#include <boost/any.hpp>
|
||||
using namespace boost;
|
||||
|
||||
#include "bytestream.h"
|
||||
using namespace messageqcpp;
|
||||
|
||||
#include "installdir.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
const string DefaultWriteOnceConfigFilename("woparms.dat");
|
||||
}
|
||||
|
||||
namespace config
|
||||
{
|
||||
|
||||
//If you add parm, you need to update all the methods below until the next comment
|
||||
|
||||
void WriteOnceConfig::initializeDefaults()
|
||||
{
|
||||
fLBID_Shift = make_pair("13", false);
|
||||
fDBRootCount = make_pair("1", false);
|
||||
fDBRMRoot = make_pair("/mnt/OAM/dbrm/BRM_saves", false);
|
||||
fSharedMemoryTmpFile1 = make_pair("/tmp/CalpontShm,", false);
|
||||
fTxnIDFile = make_pair("/mnt/OAM/dbrm/SMTxnID", false);
|
||||
fSharedMemoryTmpFile2 = make_pair("/tmp/CalpontSessionMonitorShm", false);
|
||||
}
|
||||
|
||||
void WriteOnceConfig::setup()
|
||||
{
|
||||
typedef EntryMap_t::value_type VT;
|
||||
|
||||
fEntryMap.insert(VT("PrimitiveServers.LBID_Shift", &fLBID_Shift));
|
||||
fEntryMap.insert(VT("SystemConfig.DBRootCount", &fDBRootCount));
|
||||
fEntryMap.insert(VT("SystemConfig.DBRMRoot", &fDBRMRoot));
|
||||
fEntryMap.insert(VT("SessionManager.SharedMemoryTmpFile", &fSharedMemoryTmpFile1));
|
||||
fEntryMap.insert(VT("SessionManager.TxnIDFile", &fTxnIDFile));
|
||||
fEntryMap.insert(VT("SessionMonitor.SharedMemoryTmpFile", &fSharedMemoryTmpFile2));
|
||||
|
||||
ByteStream ibs = load();
|
||||
if (ibs.length() > 0)
|
||||
unserialize(ibs);
|
||||
else
|
||||
initializeDefaults();
|
||||
}
|
||||
|
||||
void WriteOnceConfig::serialize(ByteStream& obs) const
|
||||
{
|
||||
obs << WriteOnceConfigVersion;
|
||||
|
||||
obs << fLBID_Shift.first;
|
||||
obs << fDBRootCount.first;
|
||||
obs << fDBRMRoot.first;
|
||||
obs << fSharedMemoryTmpFile1.first;
|
||||
obs << fTxnIDFile.first;
|
||||
obs << fSharedMemoryTmpFile2.first;
|
||||
}
|
||||
|
||||
void WriteOnceConfig::unserialize(ByteStream& ibs)
|
||||
{
|
||||
uint32_t version;
|
||||
ibs >> version;
|
||||
|
||||
if (version < WriteOnceConfigVersion)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Invalid version found in WriteOnceConfig file: " << version;
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
else if (version > WriteOnceConfigVersion)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Invalid version found in WriteOnceConfig file: " << version;
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
|
||||
ibs >> fLBID_Shift.first; fLBID_Shift.second = true;
|
||||
ibs >> fDBRootCount.first; fDBRootCount.second = true;
|
||||
ibs >> fDBRMRoot.first; fDBRMRoot.second = true;
|
||||
ibs >> fSharedMemoryTmpFile1.first; fSharedMemoryTmpFile1.second = true;
|
||||
ibs >> fTxnIDFile.first; fTxnIDFile.second = true;
|
||||
ibs >> fSharedMemoryTmpFile2.first; fSharedMemoryTmpFile2.second = true;
|
||||
}
|
||||
|
||||
|
||||
//End of methods that need to be changed when adding parms
|
||||
|
||||
ByteStream WriteOnceConfig::load()
|
||||
{
|
||||
ByteStream bs;
|
||||
if (access(fConfigFileName.c_str(), F_OK) != 0)
|
||||
{
|
||||
initializeDefaults();
|
||||
return bs;
|
||||
}
|
||||
|
||||
idbassert(access(fConfigFileName.c_str(), F_OK) == 0);
|
||||
|
||||
ifstream ifs(fConfigFileName.c_str());
|
||||
int e = errno;
|
||||
if (!ifs.good())
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Error opening WriteOnceConfig file " << fConfigFileName << ": " << strerror(e);
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
ifs >> bs;
|
||||
return bs;
|
||||
}
|
||||
|
||||
void WriteOnceConfig::save(ByteStream& ibs) const
|
||||
{
|
||||
ofstream ofs(fConfigFileName.c_str());
|
||||
int e = errno;
|
||||
if (!ofs.good())
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Error opening WriteOnceConfig file " << fConfigFileName << ": " << strerror(e);
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
ofs << ibs;
|
||||
}
|
||||
|
||||
WriteOnceConfig::WriteOnceConfig(const char* cf)
|
||||
{
|
||||
string cfs;
|
||||
|
||||
if (cf != 0)
|
||||
cfs = cf;
|
||||
else
|
||||
cfs = startup::StartUp::installDir() + "/etc/" + DefaultWriteOnceConfigFilename;
|
||||
|
||||
fConfigFileName = cfs;
|
||||
|
||||
setup();
|
||||
}
|
||||
|
||||
void WriteOnceConfig::setConfig(const string& section, const string& name, const string& value, bool force)
|
||||
{
|
||||
EntryMap_t::iterator iter;
|
||||
iter = fEntryMap.find(string(section + "." + name));
|
||||
if (iter == fEntryMap.end())
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Invalid request for " << section << '.' << name;
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
|
||||
if ((*iter->second).second && !force)
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Invalid attempt to write read-only " << section << '.' << name;
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
|
||||
(*iter->second).first = value;
|
||||
(*iter->second).second = true;
|
||||
|
||||
ByteStream obs;
|
||||
serialize(obs);
|
||||
save(obs);
|
||||
}
|
||||
|
||||
const string WriteOnceConfig::getConfig(const string& section, const string& name) const
|
||||
{
|
||||
string val;
|
||||
EntryMap_t::const_iterator iter;
|
||||
iter = fEntryMap.find(string(section + "." + name));
|
||||
if (iter == fEntryMap.end())
|
||||
{
|
||||
ostringstream oss;
|
||||
oss << "Invalid request for " << section << '.' << name;
|
||||
throw runtime_error(oss.str().c_str());
|
||||
}
|
||||
|
||||
val = (*iter->second).first;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
}
|
||||
|
142
utils/configcpp/writeonce.h
Normal file
142
utils/configcpp/writeonce.h
Normal file
@@ -0,0 +1,142 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id: writeonce.h 3495 2013-01-21 14:09:51Z rdempsey $
|
||||
*
|
||||
******************************************************************************************/
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
#ifndef CONFIG_WRITEONCECONFIG_H
|
||||
#define CONFIG_WRITEONCECONFIG_H
|
||||
|
||||
#include <string>
|
||||
#ifndef _MSC_VER
|
||||
#include <tr1/unordered_map>
|
||||
#else
|
||||
#include <unordered_map>
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "bytestream.h"
|
||||
|
||||
namespace config {
|
||||
|
||||
/** @brief a write-once config file I/F class
|
||||
*
|
||||
* This class handles write-once config items
|
||||
*/
|
||||
class WriteOnceConfig
|
||||
{
|
||||
public:
|
||||
/** @brief ctor
|
||||
*
|
||||
*/
|
||||
explicit WriteOnceConfig(const char* cf=0);
|
||||
|
||||
/** @brief ctor
|
||||
*
|
||||
*/
|
||||
explicit WriteOnceConfig(const std::string& cf) :
|
||||
fConfigFileName(cf)
|
||||
{
|
||||
setup();
|
||||
}
|
||||
|
||||
/** @brief dtor
|
||||
*
|
||||
*/
|
||||
virtual ~WriteOnceConfig() {}
|
||||
|
||||
/** @brief check if this class owns parm
|
||||
*
|
||||
*/
|
||||
bool owns(const std::string& section, const std::string& name) const {
|
||||
return (fEntryMap.find(std::string(section + "." + name)) != fEntryMap.end());
|
||||
}
|
||||
|
||||
/** @brief set parm to value
|
||||
*
|
||||
* If you attempt to set a value more than once, and force is false, this will throw a runtime_error.
|
||||
*/
|
||||
void setConfig(const std::string& section, const std::string& name, const std::string& value, bool force=false);
|
||||
|
||||
/** @brief get value of parm
|
||||
*
|
||||
*/
|
||||
const std::string getConfig(const std::string& section, const std::string& name) const;
|
||||
|
||||
protected:
|
||||
/** @brief load from file
|
||||
*
|
||||
*/
|
||||
messageqcpp::ByteStream load();
|
||||
|
||||
/** @brief save to file
|
||||
*
|
||||
*/
|
||||
void save(messageqcpp::ByteStream& ibs) const;
|
||||
|
||||
/** @brief serialize to ByteStream
|
||||
*
|
||||
*/
|
||||
virtual void serialize(messageqcpp::ByteStream& obs) const;
|
||||
|
||||
/** @brief load from ByteStream
|
||||
*
|
||||
*/
|
||||
virtual void unserialize(messageqcpp::ByteStream& ibs);
|
||||
|
||||
private:
|
||||
typedef std::pair<std::string, bool> ConfigItem_t;
|
||||
typedef std::tr1::unordered_map<std::string, ConfigItem_t*> EntryMap_t;
|
||||
|
||||
static const uint32_t WriteOnceConfigVersion = 1;
|
||||
|
||||
//defaults okay
|
||||
//WriteOnceConfig(const WriteOnceConfig& rhs);
|
||||
//WriteOnceConfig& operator=(const WriteOnceConfig& rhs);
|
||||
|
||||
/** @brief ctor helper
|
||||
*
|
||||
*/
|
||||
void setup();
|
||||
|
||||
/** @brief setup defaults when file doesn't exist
|
||||
*
|
||||
*/
|
||||
void initializeDefaults();
|
||||
|
||||
EntryMap_t fEntryMap;
|
||||
|
||||
std::string fConfigFileName;
|
||||
|
||||
ConfigItem_t fLBID_Shift;
|
||||
ConfigItem_t fDBRootCount;
|
||||
ConfigItem_t fDBRMRoot;
|
||||
ConfigItem_t fSharedMemoryTmpFile1;
|
||||
ConfigItem_t fTxnIDFile;
|
||||
ConfigItem_t fSharedMemoryTmpFile2;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
249
utils/configcpp/xmlparser.cpp
Normal file
249
utils/configcpp/xmlparser.cpp
Normal file
@@ -0,0 +1,249 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id$
|
||||
*
|
||||
******************************************************************************************/
|
||||
#include "config.h"
|
||||
|
||||
#include <string>
|
||||
#include <stdexcept>
|
||||
#include <libxml/xmlmemory.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
#include "xmlparser.h"
|
||||
|
||||
namespace config
|
||||
{
|
||||
|
||||
const string XMLParser::getConfig(const xmlDocPtr doc, const string& section, const string& name) const
|
||||
{
|
||||
string res;
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::getConfig: error accessing XML root");
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur1->name, (const xmlChar *)section.c_str())))
|
||||
{
|
||||
xmlNodePtr cur2 = cur1->xmlChildrenNode;
|
||||
while (cur2 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur2->name, (const xmlChar*)name.c_str())))
|
||||
{
|
||||
xmlNodePtr cur3 = cur2->xmlChildrenNode;
|
||||
if (cur3)
|
||||
res = (const char*)cur3->content;
|
||||
return expand(res);
|
||||
}
|
||||
cur2 = cur2->next;
|
||||
}
|
||||
}
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
// maybe nullstr if not found
|
||||
return expand(res);
|
||||
}
|
||||
|
||||
void XMLParser::getConfig(const xmlDocPtr doc, const string& section, const string& name, vector<string>& values) const
|
||||
{
|
||||
string res;
|
||||
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::getConfig: error accessing XML root");
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur1->name, (const xmlChar *)section.c_str())))
|
||||
{
|
||||
xmlNodePtr cur2 = cur1->xmlChildrenNode;
|
||||
while (cur2 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur2->name, (const xmlChar*)name.c_str())))
|
||||
{
|
||||
res.clear();
|
||||
xmlNodePtr cur3 = cur2->xmlChildrenNode;
|
||||
if (cur3)
|
||||
res = (const char*)cur3->content;
|
||||
values.push_back(expand(res));
|
||||
}
|
||||
cur2 = cur2->next;
|
||||
}
|
||||
}
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
}
|
||||
|
||||
void XMLParser::setConfig(xmlDocPtr doc, const string& section, const string& name, const string& value)
|
||||
{
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::setConfig: error accessing XML root");
|
||||
|
||||
xmlNodePtr cur2;
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
if (xmlStrcmp(cur1->name, (const xmlChar *)section.c_str()) == 0)
|
||||
{
|
||||
cur2 = cur1->xmlChildrenNode;
|
||||
while (cur2 != NULL)
|
||||
{
|
||||
if (xmlStrcmp(cur2->name, (const xmlChar*)name.c_str()) == 0)
|
||||
{
|
||||
xmlNodePtr cur3 = cur2->xmlChildrenNode;
|
||||
if (cur3 == NULL)
|
||||
{
|
||||
xmlAddChild(cur2, xmlNewText((const xmlChar*)"\t"));
|
||||
cur3 = cur2->xmlChildrenNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
xmlFree(cur3->content);
|
||||
}
|
||||
cur3->content = xmlStrdup((const xmlChar*)value.c_str());
|
||||
return;
|
||||
}
|
||||
cur2 = cur2->next;
|
||||
}
|
||||
// We found the section, but not the name, so we need to add a new node here
|
||||
xmlAddChild(cur1, xmlNewText((const xmlChar*)"\t"));
|
||||
xmlNewTextChild(cur1, NULL, (const xmlChar*)name.c_str(), (const xmlChar*)value.c_str());
|
||||
xmlAddChild(cur1, xmlNewText((const xmlChar*)"\n\t"));
|
||||
return;
|
||||
}
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
|
||||
// We did not find the section, so we need to add it and the name here
|
||||
cur1 = xmlDocGetRootElement(doc);
|
||||
xmlAddChild(cur1, xmlNewText((const xmlChar*)"\t"));
|
||||
cur2 = xmlNewChild(cur1, NULL, (const xmlChar*)section.c_str(), NULL);
|
||||
xmlAddChild(cur2, xmlNewText((const xmlChar*)"\n\t\t"));
|
||||
xmlNewTextChild(cur2, NULL, (const xmlChar*)name.c_str(), (const xmlChar*)value.c_str());
|
||||
xmlAddChild(cur2, xmlNewText((const xmlChar*)"\n\t"));
|
||||
xmlAddChild(cur1, xmlNewText((const xmlChar*)"\n"));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void XMLParser::delConfig(xmlDocPtr doc, const string& section, const string& name)
|
||||
{
|
||||
string res;
|
||||
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::delConfig: error accessing XML root");
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur1->name, (const xmlChar *)section.c_str())))
|
||||
{
|
||||
xmlNodePtr cur2 = cur1->xmlChildrenNode;
|
||||
while (cur2 != NULL)
|
||||
{
|
||||
xmlNodePtr tmp = cur2;
|
||||
cur2 = cur2->next;
|
||||
if ((!xmlStrcmp(tmp->name, (const xmlChar*)name.c_str())))
|
||||
{
|
||||
xmlUnlinkNode(tmp);
|
||||
xmlFreeNode(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const string XMLParser::expand(const std::string& in) const
|
||||
{
|
||||
string out(in);
|
||||
string::size_type pos;
|
||||
const string::size_type len=11;
|
||||
|
||||
pos = out.find("$INSTALLDIR");
|
||||
while (pos != string::npos)
|
||||
{
|
||||
out.replace(pos, len, fInstallDir);
|
||||
pos = out.find("$INSTALLDIR");
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
const vector<string> XMLParser::enumConfig(const xmlDocPtr doc) const
|
||||
{
|
||||
vector<string> resv;
|
||||
string res;
|
||||
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::getConfig: error accessing XML root");
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
res = reinterpret_cast<const char*>(cur1->name);
|
||||
if (res != "text" && res != "comment")
|
||||
resv.push_back(res);
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
return resv;
|
||||
}
|
||||
|
||||
const vector<string> XMLParser::enumSection(const xmlDocPtr doc, const string& section) const
|
||||
{
|
||||
vector<string> resv;
|
||||
string res;
|
||||
|
||||
xmlNodePtr cur1 = xmlDocGetRootElement(doc);
|
||||
if (cur1 == NULL)
|
||||
throw runtime_error("XMLParser::getConfig: error accessing XML root");
|
||||
|
||||
cur1 = cur1->xmlChildrenNode;
|
||||
while (cur1 != NULL)
|
||||
{
|
||||
if ((!xmlStrcmp(cur1->name, (const xmlChar *)section.c_str())))
|
||||
{
|
||||
xmlNodePtr cur2 = cur1->xmlChildrenNode;
|
||||
while (cur2 != NULL)
|
||||
{
|
||||
res = reinterpret_cast<const char*>(cur2->name);
|
||||
if (res != "text" && res != "comment")
|
||||
resv.push_back(expand(res));
|
||||
cur2 = cur2->next;
|
||||
}
|
||||
}
|
||||
cur1 = cur1->next;
|
||||
}
|
||||
return resv;
|
||||
}
|
||||
|
||||
} //namespace
|
||||
// vim:ts=4 sw=4:
|
||||
|
73
utils/configcpp/xmlparser.h
Normal file
73
utils/configcpp/xmlparser.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/* Copyright (C) 2014 InfiniDB, Inc.
|
||||
|
||||
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; version 2 of
|
||||
the 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/******************************************************************************************
|
||||
* $Id$
|
||||
*
|
||||
******************************************************************************************/
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
#ifndef CONFIG_XMLPARSER_H_
|
||||
#define CONFIG_XMLPARSER_H_
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <libxml/parser.h>
|
||||
|
||||
namespace config
|
||||
{
|
||||
|
||||
/** class XMLParser */
|
||||
class XMLParser
|
||||
{
|
||||
public:
|
||||
XMLParser(const std::string& installDir) : fInstallDir(installDir) { }
|
||||
~XMLParser() { }
|
||||
|
||||
const std::string getConfig(const xmlDocPtr doc, const std::string& section, const std::string& name) const;
|
||||
|
||||
void getConfig(const xmlDocPtr doc, const std::string& section, const std::string& name,
|
||||
std::vector<std::string>& values) const;
|
||||
|
||||
void setConfig(xmlDocPtr doc, const std::string& section, const std::string& name,
|
||||
const std::string& value);
|
||||
|
||||
void delConfig(xmlDocPtr doc, const std::string& section, const std::string& name);
|
||||
|
||||
const std::vector<std::string> enumConfig(const xmlDocPtr doc) const;
|
||||
|
||||
const std::vector<std::string> enumSection(const xmlDocPtr doc, const std::string& section) const;
|
||||
|
||||
private:
|
||||
//defaults okay
|
||||
//XMLParser(const XMLParser& rhs);
|
||||
//XMLParser& operator=(const XMLParser& rhs);
|
||||
|
||||
/** @brief expand macros in config file to actual values
|
||||
*/
|
||||
const std::string expand(const std::string& in) const;
|
||||
|
||||
const std::string fInstallDir;
|
||||
|
||||
};
|
||||
|
||||
} //namespace
|
||||
|
||||
#endif
|
||||
// vim:ts=4 sw=4:
|
||||
|
Reference in New Issue
Block a user