mirror of
https://codeberg.org/scip/dbtool.git
synced 2025-12-16 02:50:56 +01:00
migrated to github
This commit is contained in:
340
COPYING
Normal file
340
COPYING
Normal file
@@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
57
ChangeLog
Normal file
57
ChangeLog
Normal file
@@ -0,0 +1,57 @@
|
||||
1.8:
|
||||
- configure didn't take existing $LDFLAGS, $CPPFLAGS
|
||||
into account.
|
||||
1.7:
|
||||
- applied freebsd port patches
|
||||
- applied openpkg source patches
|
||||
- made default_db a const char
|
||||
- fixed configure.in variable bug
|
||||
|
||||
1.6:
|
||||
- applied patch by Thierry Thomas <thierry@pompo.net> which
|
||||
makes the code gcc 3.2 compliant (with some additional changes
|
||||
made by me).
|
||||
- changed the header of all sourcefiles.
|
||||
|
||||
1.5:
|
||||
- added using namespace std to enable gcc 3.0 to work
|
||||
- renamed Engine::stdin() to Engine::from_stdin() because
|
||||
stdin is a symbol used by C (the *FILE handle for STDIN).
|
||||
- added -g and -O compilerflags to configure.in
|
||||
1.4:
|
||||
- added encryption support (which was planned since a long time)
|
||||
using rijndael cipher. The rijndael code was not written by me,
|
||||
see rijndael.h for more details.
|
||||
- added digest.h + digest.cc from the common-c++ library. I
|
||||
modified it a little bit to suite my needs. Using the whole
|
||||
library was too much overhead IMHO.
|
||||
- the cipher class is just a wrapper around the rijndael+digest
|
||||
classes.
|
||||
- source code re-organised. Every .cc file has it's corresponding
|
||||
.h file. The Config class is now in config.h, the Engine
|
||||
class has it's own engine.h header. dbtool.h contains now
|
||||
only global stuff, no class definitions. main.cc has been
|
||||
renamed to dbtool.cc.
|
||||
- fixed bug in configure.in (which I found in the FreeBSD
|
||||
port of dbtool. It contains a patch to fix this)
|
||||
- added -R feature to -S, -s and -D too
|
||||
- added sample shell scripts showing the capabilities of dbtool (locate)
|
||||
- manpage updated and usage string too
|
||||
|
||||
1.3:
|
||||
- moved the pcre_compile calls outa the
|
||||
while() loops, be more efficient, thanks to Robert <robert@ilse.nl> :-)
|
||||
- fixed a bug in the pcre_exec call, there was "key.length() + 1" which
|
||||
caused pcre to search through the whole C-string including the terminating \0
|
||||
, in fact if a key ended with the character "B" then the following expression
|
||||
did not match: ".*B$" because the last character in the string was the \0, not the "B".
|
||||
- files are now only opened readonly if one use -s, -S or -D
|
||||
|
||||
1.2:
|
||||
- added regexp support and dump mode
|
||||
|
||||
1.1:
|
||||
- moved to autoconf/automake
|
||||
|
||||
1.0:
|
||||
- initial version
|
||||
370
INSTALL
Normal file
370
INSTALL
Normal file
@@ -0,0 +1,370 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
9
Makefile.am
Normal file
9
Makefile.am
Normal file
@@ -0,0 +1,9 @@
|
||||
ACLOCAL_AMFLAGS = -I config
|
||||
bin_PROGRAMS = dbtool
|
||||
dbtool_SOURCES = cipher.cc config.cc dbtool.cc digest.cc engine.cc rijndael.cc
|
||||
man_MANS = dbtool.1
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
|
||||
clean:
|
||||
rm -rf autom4te.cache dbtool *.o *~ config.log config.status Makefile .deps
|
||||
|
||||
80
README
Normal file
80
README
Normal file
@@ -0,0 +1,80 @@
|
||||
README for dbtool 1.8 (13/04/2015)
|
||||
============================================================
|
||||
|
||||
dbtool can be used to store and retrieve data in a key/value
|
||||
format in a hash database. Perl compatible regular expressions
|
||||
are supported both for storing and retrieving of data. It's
|
||||
main advantages are the ability to maintain huge amounts of
|
||||
data and speed.
|
||||
|
||||
|
||||
|
||||
|
||||
Requirements
|
||||
============================================================
|
||||
|
||||
You need either the GNU gdbm library or the Berkeley database
|
||||
system. You can find gdbm at:
|
||||
http://www.gnu.org/software/gdbm/gdbm.html
|
||||
And the berkeley library at: http://www.sleepycat.com.
|
||||
|
||||
|
||||
|
||||
Installation
|
||||
============================================================
|
||||
|
||||
For installation run:
|
||||
|
||||
% ./configure
|
||||
% make
|
||||
% su
|
||||
# make install
|
||||
|
||||
You can supply some additional parameters to configure,
|
||||
type ./configure --help for details.
|
||||
|
||||
|
||||
|
||||
|
||||
Documentation
|
||||
============================================================
|
||||
|
||||
After successfully installation read the installed man-
|
||||
page:
|
||||
|
||||
% man dbtool
|
||||
|
||||
|
||||
|
||||
|
||||
License and Disclaimer
|
||||
============================================================
|
||||
|
||||
dbtool is Copyright (c) 2001-2015 by T.v. Dein. dbtool may be
|
||||
used and distributed under the terms of the GNU General Public
|
||||
License. All other brand and product names are trademarks,
|
||||
registered trademarks or service marks of their respective
|
||||
holders.
|
||||
|
||||
These programs are 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 distribution; if not, write to the
|
||||
Free Software Foundation, Inc.
|
||||
59 Temple Place
|
||||
Suite 330
|
||||
Boston, MA 02111
|
||||
USA
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
============================================================
|
||||
|
||||
T.v. Dein <tlinden@cpan.org>
|
||||
http://www.daemon.de/dbtool
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# dbtool
|
||||
A command line tool to manage a key/value database (gdbm or berkeley-db)
|
||||
16
autogen.sh
Executable file
16
autogen.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
case $1 in
|
||||
clean)
|
||||
rm -rf .deps *~ config.cache config.status *.o \
|
||||
dbtool Makefile Makefile.in autom4te.cache .libs depcomp install-sh libtool \
|
||||
dbtool.1 missing mkinstalldirs platform.h stamp* \
|
||||
config/[cdilm]* config.cache aclocal.m4 configure
|
||||
;;
|
||||
*)
|
||||
pod2man dbtool.pod \
|
||||
| sed -e 's#\.TH DBTOOL 1 "....-..-.." "perl v.\..\.." "User Contributed Perl Documentation"#\.TH DBTOOL 1#g' > dbtool.1
|
||||
mkdir -p config
|
||||
autoreconf --install --force --verbose -I config
|
||||
;;
|
||||
esac
|
||||
146
cipher.cc
Normal file
146
cipher.cc
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "cipher.h"
|
||||
|
||||
void cipher::init(const string& phrase) {
|
||||
/*
|
||||
* 1st create a MD5 checksum of the passphrase and
|
||||
* use this instead of the phrase itself for encryption
|
||||
*/
|
||||
char *__key;
|
||||
dig.initDigest();
|
||||
dig.putDigest( (unsigned char *)phrase.c_str(), phrase.length() );
|
||||
__key = dig.stringDigest(); // this is a 32 byte long string, as Rijndael:: expects
|
||||
|
||||
/* convert the key to unsigned char[] */
|
||||
for(int i=0; i<32; i++) {
|
||||
key[i] = __key[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
string cipher::encrypt(const string& source) {
|
||||
size_t size = source.length();
|
||||
|
||||
/* convert the source to unsigned char[] */
|
||||
unsigned char* plainText;
|
||||
plainText = new unsigned char[size];
|
||||
for(int a=0; a<size; a++) {
|
||||
plainText[a] = source[a];
|
||||
}
|
||||
|
||||
/* initialize encryptor */
|
||||
rijn.init(Rijndael::CBC, Rijndael::Encrypt, key, Rijndael::Key32Bytes);
|
||||
|
||||
/* encrypt the source */
|
||||
unsigned char output[size + 16];
|
||||
int res = rijn.padEncrypt(plainText, (int)size, output);
|
||||
|
||||
/* convert the result back to char[] */
|
||||
char outText[res];
|
||||
for(int y=0; y<(res); y++) {
|
||||
outText[y] = output[y];
|
||||
}
|
||||
|
||||
/* return the crypted string */
|
||||
if (res >= 0) {
|
||||
return string(outText, res);
|
||||
}
|
||||
else {
|
||||
cerr << "Failed to encrypt: " << error(res) << "!" << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string cipher::decrypt(const string& source) {
|
||||
size_t size = source.length();
|
||||
|
||||
/* convert the source to unsigned char[] */
|
||||
unsigned char* cryptedText;
|
||||
cryptedText = new unsigned char[size];
|
||||
for(int a=0; a<size; a++) {
|
||||
cryptedText[a] = source[a];
|
||||
}
|
||||
|
||||
/* initialize decryptor */
|
||||
rijn.init(Rijndael::CBC, Rijndael::Decrypt, key, Rijndael::Key32Bytes);
|
||||
|
||||
/* decrypt the source */
|
||||
unsigned char output[size];
|
||||
int res = rijn.padDecrypt(cryptedText, (int)size, output);
|
||||
|
||||
/* convert the result back to char[] */
|
||||
char outText[res];
|
||||
for(int y=0; y<(res); y++) {
|
||||
outText[y] = output[y];
|
||||
}
|
||||
|
||||
/* return the decrypted string */
|
||||
if (res >= 0)
|
||||
return string(outText, res);
|
||||
else {
|
||||
cerr << "Failed to decrypt: " << error(res) << " (passphrase invalid?) !" << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
const char* cipher::error(int num) {
|
||||
switch(num) {
|
||||
case 0: return "RIJNDAEL_SUCCESS"; break;
|
||||
case -1: return "RIJNDAEL_UNSUPPORTED_MODE"; break;
|
||||
case -2: return "RIJNDAEL_UNSUPPORTED_DIRECTION"; break;
|
||||
case -3: return "RIJNDAEL_UNSUPPORTED_KEY_LENGTH"; break;
|
||||
case -4: return "RIJNDAEL_BAD_KEY"; break;
|
||||
case -5: return "RIJNDAEL_NOT_INITIALIZED"; break;
|
||||
case -6: return "RIJNDAEL_BAD_DIRECTION"; break;
|
||||
case -7: return "RIJNDAEL_CORRUPTED_DATA"; break;
|
||||
default: return "UNKNOWN"; break;
|
||||
}
|
||||
}
|
||||
77
cipher.h
Normal file
77
cipher.h
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CIPHER_H
|
||||
#define CIPHER_H
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include "rijndael.h"
|
||||
#include "digest.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class cipher {
|
||||
private:
|
||||
Rijndael rijn;
|
||||
MD5Digest dig;
|
||||
unsigned char key[32];
|
||||
string blah;
|
||||
const char* error(int num);
|
||||
|
||||
public:
|
||||
cipher() {};
|
||||
~cipher() {};
|
||||
void init(const string & phrase);
|
||||
string encrypt(const string& source);
|
||||
string decrypt(const string& source);
|
||||
};
|
||||
|
||||
string get_my_phrase();
|
||||
|
||||
#endif
|
||||
218
config.cc
Normal file
218
config.cc
Normal file
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include "dbtool.h"
|
||||
#include "config.h"
|
||||
#include "platform.h"
|
||||
|
||||
|
||||
Config::Config() {
|
||||
/* konstructor */
|
||||
pkg = PACKAGE;
|
||||
default_db = DB_VARNAME;
|
||||
|
||||
usage =
|
||||
"\nUsage: " + pkg + " -d database [DirusSfwVhtRFpP] [-k key] [-v value]\n"
|
||||
+ " -d database Specify the filename of the database\n"
|
||||
+ " -i Insert data, -k and -v is required (*)\n"
|
||||
+ " -r Remove data, -k is required\n"
|
||||
+ " -u Update data, -k and -v is required\n"
|
||||
+ " -s Search for a key, -k is required\n"
|
||||
+ " -S Search for all entrys which match a regular\n"
|
||||
+ " expression, the regexp must be specified with\n"
|
||||
+ " the -k parameter, i.e.: " + pkg + " -d file -S -k \"^[a-z]+\\d{3}.*$\"\n"
|
||||
+ " -D Dump all keys/values of the specified gdbm file\n"
|
||||
+ " -w Print out keys too, only possible with -S and -s\n"
|
||||
+ " -f Force mode (overwrite file and data!)\n"
|
||||
+ " -k key the key for an entry\n"
|
||||
+ " -v value the value for the corresponding key, -k is required\n"
|
||||
+ " -F separator field separator, optional used together with\n"
|
||||
+ " -i if no -k and -v is specified, and with -D as\n"
|
||||
+ " output separator\n"
|
||||
+ " -t expression Use expression to decide which part of an input line\n"
|
||||
+ " is to be used as the key and which one as the value, i.e.:\n"
|
||||
+ " " + pkg + " -i -d file -t \"^(.*)(\\/.*)$\";\n"
|
||||
+ " only possible with -i and without -k and -v(read from stdin)\n"
|
||||
+ " -R Reverse meaning of token -t, the first match will be the\n"
|
||||
+ " value and the second one the key, if used with -s, -S or -D then\n"
|
||||
+ " first the value and then the key will be printed\n"
|
||||
+ " -p Use encrypted database. " + pkg + " will ask you for the passphrase,\n"
|
||||
+ " unless the environment variable DB_PASSPHRASE is set.\n"
|
||||
+ " -P passphrase Use encrypted database. Specify the passphrase on the commandline\n"
|
||||
+ " -V Print the version of dbtool\n"
|
||||
+ " -h Print this usage message\n"
|
||||
+ "\n"
|
||||
+ "If you insert data and omit -k and -v then " + pkg + " will read\n"
|
||||
+ "the key/value pair from STDIN, key and value will be\n"
|
||||
+ "separated by the parameter of the -F option or, if -F\n"
|
||||
+ "is omited, by whitespace, the record separator is the\n"
|
||||
+ "newline, thus one line stands for one key/value pair.\n"
|
||||
+ "\n"
|
||||
+ "If no database filename is specified (-d) but the\n"
|
||||
+ "environment variable DB_DATABASE exists, " + pkg + " will\n"
|
||||
+ "use the file specified in DB_DATABASE.\n"
|
||||
+ "\n"
|
||||
+ "" + pkg + " is free software under the terms of the GPL.\n"
|
||||
+ "Report bugs to T.v. Dein <tlinden@cpan.org>.\n";
|
||||
}
|
||||
|
||||
|
||||
void Config::args(int argc, char *argv[]) {
|
||||
_argc = argc;
|
||||
_argv = argv;
|
||||
}
|
||||
|
||||
int Config::parse() {
|
||||
/* parse commandline parameters */
|
||||
|
||||
int option;
|
||||
int cmd_insert = 0;
|
||||
|
||||
separator = ' '; /* default field separator, used by -S and -D and -i */
|
||||
command = 'X'; /* this should get something else */
|
||||
with = 0; /* do not print keys, used by -S and -s */
|
||||
reverse = 0; /* first key, then value (not reverse is the default) */
|
||||
|
||||
char *fname;
|
||||
fname = getenv(default_db);
|
||||
if(fname != NULL) {
|
||||
filename = fname; /* will be overwritten by -d */
|
||||
}
|
||||
|
||||
while (1) {
|
||||
option = getopt(_argc, _argv, "F:DSRft:wuirsd:k:v:VhpP:");
|
||||
if(option == -1) break;
|
||||
|
||||
switch(option) {
|
||||
case 'f':
|
||||
force = 1;
|
||||
break;
|
||||
case 'i':
|
||||
command = 'i';
|
||||
break;
|
||||
case 'r':
|
||||
command = 'r';
|
||||
break;
|
||||
case 's':
|
||||
command = 's';
|
||||
readonly = 1;
|
||||
break;
|
||||
case 'S':
|
||||
command = 'S';
|
||||
readonly = 1;
|
||||
break;
|
||||
case 'u':
|
||||
command = 'u';
|
||||
break;
|
||||
case 'd':
|
||||
filename = optarg;
|
||||
break;
|
||||
case 'k':
|
||||
key = optarg;
|
||||
cmd_insert = 1;
|
||||
break;
|
||||
case 'v':
|
||||
value = optarg;
|
||||
cmd_insert = 1;
|
||||
break;
|
||||
case 'F':
|
||||
separator = optarg[0];
|
||||
break;
|
||||
case 'R':
|
||||
reverse = 1;
|
||||
break;
|
||||
case 'D':
|
||||
command = 'd';
|
||||
readonly = 1;
|
||||
break;
|
||||
case 't':
|
||||
token = optarg;
|
||||
break;
|
||||
case 'w':
|
||||
with = 1;
|
||||
break;
|
||||
case 'V':
|
||||
command = 'v';
|
||||
break;
|
||||
case 'h':
|
||||
command = 'h';
|
||||
break;
|
||||
case 'p':
|
||||
encrypted = 1;
|
||||
phrase = "";
|
||||
break;
|
||||
case 'P':
|
||||
encrypted = 1;
|
||||
phrase = optarg;
|
||||
break;
|
||||
case '?':
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* check the sence of some options */
|
||||
if(token != "" && command != 'i') {
|
||||
cerr << pkg << ": -t only suitable with -i!\n";
|
||||
exit(1);
|
||||
}
|
||||
if(command == 'i' && cmd_insert != 1) {
|
||||
command = 'I'; /* read from stdin! */
|
||||
}
|
||||
else if(command == 'X') {
|
||||
command = 'h'; /* no command mode specified, so print out the usage message and exit */
|
||||
}
|
||||
if(with == 1 && command != 'S' && command != 's') {
|
||||
cerr << pkg << ": -w only suitable with -S or -s!\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
82
config.h
Normal file
82
config.h
Normal file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
extern "C" {
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The Config class will hold all flags, modes and other
|
||||
* parameters we need for running.
|
||||
* methods defined in cmd.cc
|
||||
*/
|
||||
class Config {
|
||||
private:
|
||||
int _argc;
|
||||
char **_argv;
|
||||
string pkg;
|
||||
const char *default_db;
|
||||
|
||||
public:
|
||||
Config();
|
||||
void args(int argc, char *argv[]);
|
||||
int parse();
|
||||
int force, command, with, reverse, readonly, encrypted;
|
||||
string filename, key, value, usage, token, phrase;
|
||||
char separator;
|
||||
};
|
||||
|
||||
|
||||
#endif // CONFIG_H
|
||||
152
config/ax_berkeley_db_cxx.m4
Normal file
152
config/ax_berkeley_db_cxx.m4
Normal file
@@ -0,0 +1,152 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_berkeley_db_cxx.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_BERKELEY_DB_CXX([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro tries to find Berkeley DB C++ support. It honors
|
||||
# MINIMUM-VERSION if given.
|
||||
#
|
||||
# If libdb_cxx is found, DB_CXX_HEADER and DB_CXX_LIBS variables are set
|
||||
# and ACTION-IF-FOUND shell code is executed if specified. DB_CXX_HEADER
|
||||
# is set to location of db.h header in quotes (e.g. "db3/db_cxx.h") and
|
||||
# AC_DEFINE_UNQUOTED is called on it, so that you can type
|
||||
#
|
||||
# #include DB_CXX_HEADER
|
||||
#
|
||||
# in your C/C++ code. DB_CXX_LIBS is set to linker flags needed to link
|
||||
# against the library (e.g. -ldb3.1_cxx) and AC_SUBST is called on it.
|
||||
#
|
||||
# when specified user-selected spot (via --with-libdb) also sets
|
||||
#
|
||||
# DB_CXX_CPPFLAGS to the include directives required
|
||||
# DB_CXX_LDFLAGS to the -L flags required
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Vaclav Slavik <vaclav.slavik@matfyz.cz>
|
||||
# Copyright (c) 2011 Stephan Suerken <absurd@debian.org>
|
||||
# Copyright (c) 2014 Kirill A. Korinskiy <catap@catap.ru>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 4
|
||||
|
||||
AC_DEFUN([AX_BERKELEY_DB_CXX],
|
||||
[
|
||||
AC_LANG_ASSERT(C++)
|
||||
|
||||
old_LIBS="$LIBS"
|
||||
old_LDFLAGS="$LDFLAGS"
|
||||
old_CPPFLAGS="$CPPFLAGS"
|
||||
|
||||
libdbdir=""
|
||||
AC_ARG_WITH(libdb,
|
||||
AS_HELP_STRING([--with-libdb=DIR],
|
||||
[root of the Berkeley DB directory]),
|
||||
[
|
||||
case "$withval" in
|
||||
"" | y | ye | yes | n | no)
|
||||
AC_MSG_ERROR([Invalid --with-libdb value])
|
||||
;;
|
||||
*) libdbdir="$withval"
|
||||
;;
|
||||
esac
|
||||
], [])
|
||||
|
||||
minversion=ifelse([$1], ,,$1)
|
||||
|
||||
DB_CXX_HEADER=""
|
||||
DB_CXX_LIBS=""
|
||||
DB_CXX_LDFLAGS=""
|
||||
DB_CXX_CPPFLAGS=""
|
||||
|
||||
if test -z $minversion ; then
|
||||
minvermajor=0
|
||||
minverminor=0
|
||||
minverpatch=0
|
||||
AC_MSG_CHECKING([for Berkeley DB (C++)])
|
||||
else
|
||||
minvermajor=`echo $minversion | cut -d. -f1`
|
||||
minverminor=`echo $minversion | cut -d. -f2`
|
||||
minverpatch=`echo $minversion | cut -d. -f3`
|
||||
minvermajor=${minvermajor:-0}
|
||||
minverminor=${minverminor:-0}
|
||||
minverpatch=${minverpatch:-0}
|
||||
AC_MSG_CHECKING([for Berkeley DB (C++) >= $minvermajor.$minverminor.$minverpatch])
|
||||
fi
|
||||
|
||||
if test x$libdbdir != x""; then
|
||||
DB_CXX_CPPFLAGS="-I${libdbdir}/include"
|
||||
DB_CXX_LDFLAGS="-L${libdbdir}/lib"
|
||||
LDFLAGS="$DB_CXX_LDFLAGS $old_LDFLAGS"
|
||||
CPPFLAGS="$DB_CXX_CPPFLAGS $old_CPPFLAGS"
|
||||
fi
|
||||
|
||||
for major in 4; do
|
||||
for minor in 0 1 2 3 4 5 6 7 8 9; do
|
||||
for version in "${major}.${minor}" "${major}${minor}"; do
|
||||
|
||||
try_libs="-ldb_cxx-${version}%-ldb-${version} -ldb${version}_cxx%-ldb${version}"
|
||||
try_headers="db$version/db_cxx.h db`echo $version | sed -e 's,\..*,,g'`/db_cxx.h"
|
||||
|
||||
for db_cxx_hdr in $try_headers ; do
|
||||
for db_cxx_lib in $try_libs; do
|
||||
db_cxx_lib="$libdbdir `echo "$db_cxx_lib" | sed 's/%/ /g'`"
|
||||
LIBS="$old_LIBS $db_cxx_lib"
|
||||
if test -z $DB_CXX_HEADER ; then
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[
|
||||
#include <${db_cxx_hdr}>
|
||||
],
|
||||
[
|
||||
#if !((DB_VERSION_MAJOR > (${minvermajor}) || \
|
||||
(DB_VERSION_MAJOR == (${minvermajor}) && \
|
||||
DB_VERSION_MINOR > (${minverminor})) || \
|
||||
(DB_VERSION_MAJOR == (${minvermajor}) && \
|
||||
DB_VERSION_MINOR == (${minverminor}) && \
|
||||
DB_VERSION_PATCH >= (${minverpatch}))))
|
||||
#error "too old version"
|
||||
#endif
|
||||
|
||||
DB *db;
|
||||
db_create(&db, NULL, 0);
|
||||
])],
|
||||
[
|
||||
AC_MSG_RESULT([header $db_cxx_hdr, library $db_cxx_lib])
|
||||
DB_CXX_HEADER="$db_cxx_hdr"
|
||||
DB_CXX_LIBS="$db_cxx_lib"
|
||||
],
|
||||
)
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
LIBS="$old_LIBS"
|
||||
LDFLAGS="$old_LDFLAGS"
|
||||
CPPFLAGS="$old_CPPFLAGS"
|
||||
|
||||
if test -z $DB_CXX_HEADER ; then
|
||||
AC_MSG_RESULT([not found])
|
||||
DB_CXX_LDFLAGS=""
|
||||
DB_CXX_CPPFLAGS=""
|
||||
ifelse([$3], , :, [$3])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(DB_CXX_HEADER, ["$DB_CXX_HEADER"], ["Berkeley DB C++ Header File"])
|
||||
AC_SUBST(DB_CXX_LIBS)
|
||||
AC_SUBST(DB_CXX_LDFLAGS)
|
||||
AC_SUBST(DB_CXX_CPPFLAGS)
|
||||
ifelse([$2], , :, [$2])
|
||||
fi
|
||||
])
|
||||
177
config/ax_compare_version.m4
Normal file
177
config/ax_compare_version.m4
Normal file
@@ -0,0 +1,177 @@
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_compare_version.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro compares two version strings. Due to the various number of
|
||||
# minor-version numbers that can exist, and the fact that string
|
||||
# comparisons are not compatible with numeric comparisons, this is not
|
||||
# necessarily trivial to do in a autoconf script. This macro makes doing
|
||||
# these comparisons easy.
|
||||
#
|
||||
# The six basic comparisons are available, as well as checking equality
|
||||
# limited to a certain number of minor-version levels.
|
||||
#
|
||||
# The operator OP determines what type of comparison to do, and can be one
|
||||
# of:
|
||||
#
|
||||
# eq - equal (test A == B)
|
||||
# ne - not equal (test A != B)
|
||||
# le - less than or equal (test A <= B)
|
||||
# ge - greater than or equal (test A >= B)
|
||||
# lt - less than (test A < B)
|
||||
# gt - greater than (test A > B)
|
||||
#
|
||||
# Additionally, the eq and ne operator can have a number after it to limit
|
||||
# the test to that number of minor versions.
|
||||
#
|
||||
# eq0 - equal up to the length of the shorter version
|
||||
# ne0 - not equal up to the length of the shorter version
|
||||
# eqN - equal up to N sub-version levels
|
||||
# neN - not equal up to N sub-version levels
|
||||
#
|
||||
# When the condition is true, shell commands ACTION-IF-TRUE are run,
|
||||
# otherwise shell commands ACTION-IF-FALSE are run. The environment
|
||||
# variable 'ax_compare_version' is always set to either 'true' or 'false'
|
||||
# as well.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[lt],[3.15.8])
|
||||
#
|
||||
# would both be true.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8])
|
||||
# AX_COMPARE_VERSION([3.15],[gt],[3.15.8])
|
||||
#
|
||||
# would both be false.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8])
|
||||
#
|
||||
# would be true because it is only comparing two minor versions.
|
||||
#
|
||||
# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15])
|
||||
#
|
||||
# would be true because it is only comparing the lesser number of minor
|
||||
# versions of the two values.
|
||||
#
|
||||
# Note: The characters that separate the version numbers do not matter. An
|
||||
# empty string is the same as version 0. OP is evaluated by autoconf, not
|
||||
# configure, so must be a string, not a variable.
|
||||
#
|
||||
# The author would like to acknowledge Guido Draheim whose advice about
|
||||
# the m4_case and m4_ifvaln functions make this macro only include the
|
||||
# portions necessary to perform the specific comparison specified by the
|
||||
# OP argument in the final configure script.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
#serial 11
|
||||
|
||||
dnl #########################################################################
|
||||
AC_DEFUN([AX_COMPARE_VERSION], [
|
||||
AC_REQUIRE([AC_PROG_AWK])
|
||||
|
||||
# Used to indicate true or false condition
|
||||
ax_compare_version=false
|
||||
|
||||
# Convert the two version strings to be compared into a format that
|
||||
# allows a simple string comparison. The end result is that a version
|
||||
# string of the form 1.12.5-r617 will be converted to the form
|
||||
# 0001001200050617. In other words, each number is zero padded to four
|
||||
# digits, and non digits are removed.
|
||||
AS_VAR_PUSHDEF([A],[ax_compare_version_A])
|
||||
A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
AS_VAR_PUSHDEF([B],[ax_compare_version_B])
|
||||
B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
|
||||
-e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
|
||||
-e 's/[[^0-9]]//g'`
|
||||
|
||||
dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary
|
||||
dnl # then the first line is used to determine if the condition is true.
|
||||
dnl # The sed right after the echo is to remove any indented white space.
|
||||
m4_case(m4_tolower($2),
|
||||
[lt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[gt],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"`
|
||||
],
|
||||
[le],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],
|
||||
[ge],[
|
||||
ax_compare_version=`echo "x$A
|
||||
x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"`
|
||||
],[
|
||||
dnl Split the operator from the subversion count if present.
|
||||
m4_bmatch(m4_substr($2,2),
|
||||
[0],[
|
||||
# A count of zero means use the length of the shorter version.
|
||||
# Determine the number of characters in A and B.
|
||||
ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'`
|
||||
ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'`
|
||||
|
||||
# Set A to no more than B's length and B to no more than A's length.
|
||||
A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"`
|
||||
],
|
||||
[[0-9]+],[
|
||||
# A count greater than zero means use only that many subversions
|
||||
A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
|
||||
],
|
||||
[.+],[
|
||||
AC_WARNING(
|
||||
[illegal OP numeric parameter: $2])
|
||||
],[])
|
||||
|
||||
# Pad zeros at end of numbers to make same length.
|
||||
ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`"
|
||||
B="$B`echo $A | sed 's/./0/g'`"
|
||||
A="$ax_compare_version_tmp_A"
|
||||
|
||||
# Check for equality or inequality as necessary.
|
||||
m4_case(m4_tolower(m4_substr($2,0,2)),
|
||||
[eq],[
|
||||
test "x$A" = "x$B" && ax_compare_version=true
|
||||
],
|
||||
[ne],[
|
||||
test "x$A" != "x$B" && ax_compare_version=true
|
||||
],[
|
||||
AC_WARNING([illegal OP parameter: $2])
|
||||
])
|
||||
])
|
||||
|
||||
AS_VAR_POPDEF([A])dnl
|
||||
AS_VAR_POPDEF([B])dnl
|
||||
|
||||
dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE.
|
||||
if test "$ax_compare_version" = "true" ; then
|
||||
m4_ifvaln([$4],[$4],[:])dnl
|
||||
m4_ifvaln([$5],[else $5])dnl
|
||||
fi
|
||||
]) dnl AX_COMPARE_VERSION
|
||||
287
configure.ac
Normal file
287
configure.ac
Normal file
@@ -0,0 +1,287 @@
|
||||
# -*-sh-*-
|
||||
|
||||
AC_PREREQ(2.61)
|
||||
|
||||
define([dbtoolversion], esyscmd([sh -c "cat VERSION|head -1"]))
|
||||
|
||||
# what we are compiling
|
||||
AC_INIT([dbtool], [dbtoolversion], [tlinden@cpan.org])
|
||||
|
||||
AC_CONFIG_AUX_DIR(config)
|
||||
AC_CONFIG_MACRO_DIR(config)
|
||||
AC_CONFIG_HEADER(platform.h)
|
||||
|
||||
AM_INIT_AUTOMAKE()
|
||||
LT_INIT
|
||||
|
||||
# default values, dynamically linking and stripped binary
|
||||
STATIC="no"
|
||||
|
||||
|
||||
# provide flag --enable-static
|
||||
AC_ARG_ENABLE([static-binary],
|
||||
AS_HELP_STRING([--enable-static-binary], [create a statically linked binary]),
|
||||
[
|
||||
if test "x$enableval" = "xyes"; then
|
||||
STATIC="yes"
|
||||
LDFLAGS="$LDFLAGS -static"
|
||||
fi
|
||||
])
|
||||
|
||||
AC_ARG_ENABLE([debug],
|
||||
AS_HELP_STRING([--disable-debug], [Disable debugging]))
|
||||
AS_IF([test "x$enable_debug" != "xno"], [
|
||||
CXXFLAGS="$CFLAGS -g -DDEBUG"
|
||||
enable_debug="yes"
|
||||
])
|
||||
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
|
||||
# look for the existence of install
|
||||
AC_PROG_INSTALL
|
||||
|
||||
# look if c++ compiler exists
|
||||
AC_PROG_CXX
|
||||
|
||||
# look for libc
|
||||
AC_HEADER_STDC
|
||||
|
||||
# additional headers which are required
|
||||
AC_CHECK_HEADERS(unistd.h stdio.h stdlib.h)
|
||||
|
||||
|
||||
# Check for some target-specific stuff
|
||||
case "$host" in
|
||||
*aix*)
|
||||
# libm is required as well
|
||||
CXXFLAGS="$CFLAGS -D_AIX_SOURCE=1"
|
||||
LDFLAGS="$LDFLAGS -lm"
|
||||
;;
|
||||
*-*-android*) ;;
|
||||
*-*-cygwin*) ;;
|
||||
*-*-dgux*) ;;
|
||||
*-*-darwin*) ;;
|
||||
*-*-dragonfly*) ;;
|
||||
*-*-haiku*) ;;
|
||||
*-*-hpux*) ;;
|
||||
*-*-irix5*) ;;
|
||||
*-*-irix6*) ;;
|
||||
*-*-k*bsd*-gnu | *-*-kopensolaris*-gnu) ;;
|
||||
*-*-linux*) ;;
|
||||
*-*-netbsd*) ;;
|
||||
*-*-freebsd*)
|
||||
# ports install to /usr/local by default, check
|
||||
if test -d "/usr/local/lib" -a -d "/usr/local/include"; then
|
||||
CXXFLAGS="$CFLAGS -I/usr/local/include"
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
fi
|
||||
;;
|
||||
*-*-bsdi*) ;;
|
||||
*-next-*) ;;
|
||||
*-*-openbsd*) ;;
|
||||
*-*-solaris*) ;;
|
||||
*-*-sunos4*) ;;
|
||||
*-ncr-sysv*) ;;
|
||||
*-sni-sysv*) ;;
|
||||
*-*-sysv4.2*) ;;
|
||||
*-*-sysv5*) ;;
|
||||
*-*-sysv*) ;;
|
||||
*-*-sco*) ;;
|
||||
*-*-unicos*) ;;
|
||||
*-dec-osf*) ;;
|
||||
*-*-nto-qnx*) ;;
|
||||
*-*-ultrix*) ;;
|
||||
*-*-lynxos) ;;
|
||||
esac
|
||||
|
||||
|
||||
# look for libs
|
||||
GDBM="yes"
|
||||
BERKELEY="no"
|
||||
PCRE="no"
|
||||
|
||||
|
||||
# configure args
|
||||
AC_ARG_WITH([gdbm],
|
||||
[AS_HELP_STRING([--with-gdbm=DIR],
|
||||
[Use GNU gdbm library in DIR])],
|
||||
[
|
||||
AC_MSG_CHECKING([checking $with_gdbm_dir/include/gdbm.h presence])
|
||||
if test -r "$with_gdbm_dir/include/gdbm.h" ; then
|
||||
CXXFLAGS="-I$with_gdbm_dir/include $CXXFLAGS"
|
||||
CFLAGS="$CXXFLAGS"
|
||||
LDFLAGS="-L$with_gdbm_dir/lib $LDFLAGS"
|
||||
LIBS="-lgdbm"
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_ARG_WITH([pcre],
|
||||
[AS_HELP_STRING([--with-pcre=DIR],
|
||||
[Use GNU pcre library in DIR])],
|
||||
[
|
||||
AC_MSG_CHECKING([checking $with_pcre_dir/include/pcre.h presence])
|
||||
if test -r "$with_pcre_dir/include/pcre.h" ; then
|
||||
CXXFLAGS="-I$with_pcre_dir/include $CXXFLAGS"
|
||||
CFLAGS="$CXXFLAGS"
|
||||
LDFLAGS="-L$with_pcre_dir/lib $LDFLAGS"
|
||||
LIBS="-lpcre"
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_ARG_WITH([bdb-include-dir],
|
||||
[AS_HELP_STRING([--with-bdb-include-dir],
|
||||
[Specify bdb include prefix])],
|
||||
[
|
||||
GDBM="no"
|
||||
BERKELEY="yes"
|
||||
CXXFLAGS="-I${with_bdb_include_dir} ${CXXFLAGS}"
|
||||
CFLAGS="$CXXFLAGS"
|
||||
],
|
||||
[])
|
||||
|
||||
AC_ARG_WITH([bdb_lib_dir],
|
||||
[AS_HELP_STRING([--with-bdb-lib-dir],
|
||||
[Specify bdb library prefix])],
|
||||
[
|
||||
# dont check presence since lib file name unpredictable
|
||||
GDBM="no"
|
||||
BERKELEY="yes"
|
||||
LDFLAGS="-L${with_bdb_lib_dir} ${LDFLAGS}"
|
||||
])
|
||||
|
||||
|
||||
# first, check for gdbm, which is the default
|
||||
if test "$GDBM" = "yes"; then
|
||||
# search for it via pkg-config
|
||||
PKG_CHECK_MODULES([GDBM], [gdbm], _gdbm=yes, _gdbm=no)
|
||||
if test "x$_gdbm" = "xyes"; then
|
||||
AC_SUBST([GDBM_CFLAGS])
|
||||
AC_SUBST([GDBM_CXXFLAGS])
|
||||
AC_SUBST([GDBM_LIBS])
|
||||
GDBM="yes"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$GDBM" = "yes"; then
|
||||
export LDFLAGS
|
||||
export LIBS
|
||||
export CFLAGS
|
||||
AC_CHECK_LIB(gdbm, gdbm_open)
|
||||
if test "x$ac_cv_lib_gdbm_gdbm_open" = "xno"; then
|
||||
GDBM="no"
|
||||
fi
|
||||
fi
|
||||
|
||||
# now, if we didn't find gdbm or it was disabled, try berkeley db
|
||||
if test "$GDBM" = "no"; then
|
||||
AC_LANG(C++)
|
||||
export LDFLAGS
|
||||
export LIBS
|
||||
export CXXFLAGS
|
||||
AX_BERKELEY_DB_CXX([4.0.0],[
|
||||
LDFLAGS="$DB_CXX_LIBS $LDFLAGS"
|
||||
BERKELEY="yes"
|
||||
],[BERKELEY="no"])
|
||||
fi
|
||||
|
||||
|
||||
|
||||
export CFLAGS
|
||||
export LIBS
|
||||
export LDFLAGS
|
||||
AC_CHECK_LIB(pcre, pcre_compile)
|
||||
|
||||
|
||||
|
||||
# these functions must exist
|
||||
AC_CHECK_FUNCS(getopt fdopen fgetc getenv getpass)
|
||||
|
||||
# complain if the functions checked for above does not exists
|
||||
if test "$ac_cv_func_getopt" != yes; then
|
||||
echo
|
||||
echo "*** Warning: function getopt() not found!"
|
||||
echo "*** You will not be able to compile dbtool!"
|
||||
#exit 1
|
||||
fi
|
||||
|
||||
if test "$ac_cv_func_fdopen" != yes; then
|
||||
echo
|
||||
echo "*** Warning: function fdopen() not found!"
|
||||
echo "*** You will not be able to compile dbtool!"
|
||||
#exit 1
|
||||
fi
|
||||
|
||||
if test "$ac_cv_func_fgetc" != yes; then
|
||||
echo
|
||||
echo "*** Warning: function fgetc() not found!"
|
||||
echo "*** You will not be able to compile dbtool!"
|
||||
#exit 1
|
||||
fi
|
||||
|
||||
if test "$ac_cv_func_getenv" != yes; then
|
||||
echo
|
||||
echo "*** Warning: function getenv() not found!"
|
||||
echo "*** You will not be able to compile dbtool!"
|
||||
#exit 1
|
||||
fi
|
||||
|
||||
if test "$ac_cv_lib_pcre_pcre_compile" != yes; then
|
||||
echo
|
||||
echo "*** Warning: the PCRE library could not be found!"
|
||||
echo "*** You will not be able to compile dbtool!"
|
||||
echo "*** Please get a copy from http://www.pcre.org,"
|
||||
echo "*** install it and then retry!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test "$GDBM" = "yes"; then
|
||||
USEDB="GDBM"
|
||||
elif test "$BERKELEY" = "yes"; then
|
||||
USEDB="BERKELEY-DB"
|
||||
CXXFLAGS="-DHAVE_BERKELEY=1 $CXXFLAGS"
|
||||
else
|
||||
echo "Neither gdbm or berkeley-db is instaled!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
|
||||
# the default prefix
|
||||
AC_PREFIX_DEFAULT(/usr/local)
|
||||
|
||||
# finaly write out
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
|
||||
AC_MSG_RESULT([
|
||||
Build configured for $PACKAGE $VERSION:
|
||||
CXX: ${CXX}
|
||||
CXXFLAGS: ${CXXFLAGS}
|
||||
LDFLAGS: ${LDFLAGS}
|
||||
LIBS: ${LIBS}
|
||||
debug: ${enable_debug}
|
||||
static build: ${STATIC}
|
||||
|
||||
prefix: ${prefix}
|
||||
libdir: ${libdir}
|
||||
includedir: ${includedir}
|
||||
|
||||
target platform: ${host}
|
||||
|
||||
db backend: ${USEDB}
|
||||
Type 'make' to build, 'make install' to install.
|
||||
])
|
||||
|
||||
|
||||
echo
|
||||
151
dbtool.cc
Normal file
151
dbtool.cc
Normal file
@@ -0,0 +1,151 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "platform.h"
|
||||
#include "dbtool.h"
|
||||
#include "config.h"
|
||||
#include "engine.h"
|
||||
#include "cipher.h"
|
||||
|
||||
Config config;
|
||||
cipher rijn;
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
config.args(argc, argv);
|
||||
Engine engine;
|
||||
string pkg = PACKAGE;
|
||||
|
||||
if(config.parse() != 0) {
|
||||
cerr << config.usage;
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
switch(config.command) {
|
||||
case 'i':
|
||||
/* insert */
|
||||
if(config.key == "") {
|
||||
cerr << pkg << ": key required\n";
|
||||
exit(1);
|
||||
}
|
||||
engine.insert();
|
||||
break;
|
||||
case 'd':
|
||||
/* dump */
|
||||
engine.dump();
|
||||
break;
|
||||
case 'I':
|
||||
engine.from_stdin();
|
||||
break;
|
||||
case 's':
|
||||
/* select */
|
||||
if(config.key == "") {
|
||||
cerr << pkg << ": key required\n";
|
||||
exit(1);
|
||||
}
|
||||
engine.select();
|
||||
break;
|
||||
case 'S':
|
||||
/* regexp select */
|
||||
if(config.key == "") {
|
||||
cerr << pkg << ": key (regexp) required\n";
|
||||
exit(1);
|
||||
}
|
||||
engine.regexp();
|
||||
break;
|
||||
case 'r':
|
||||
/* remove */
|
||||
if(config.key == "") {
|
||||
cerr << pkg << ": key required\n";
|
||||
exit(1);
|
||||
}
|
||||
engine.remove();
|
||||
break;
|
||||
case 'u':
|
||||
/* update */
|
||||
if(config.key == "") {
|
||||
cerr << pkg << ": key required\n";
|
||||
exit(1);
|
||||
}
|
||||
engine.update();
|
||||
break;
|
||||
case 'v':
|
||||
/* version */
|
||||
cerr << "This is " << pkg << " version " << VERSION << " by T.v. Dein.\n";
|
||||
exit(1);
|
||||
case 'h':
|
||||
/* usage/help */
|
||||
cerr << config.usage;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
string readpass() {
|
||||
char *pass;
|
||||
char *envpass;
|
||||
envpass = getenv(PW_VARNAME);
|
||||
if(envpass != NULL) {
|
||||
string pw = envpass;
|
||||
return pw;
|
||||
}
|
||||
else {
|
||||
#ifdef HAVE_GETPASS
|
||||
pass = getpass("passphrase: ");
|
||||
string password = pass;
|
||||
free(pass);
|
||||
#else
|
||||
cout << "passphrase: ";
|
||||
string password;
|
||||
cin >> password;
|
||||
#endif
|
||||
return password;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
74
dbtool.h
Normal file
74
dbtool.h
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef DBTOOL_H
|
||||
#define DBTOOL_H
|
||||
|
||||
using namespace std;
|
||||
|
||||
/* the name of the environment variable to be used if -d is omited */
|
||||
#ifndef DB_VARNAME
|
||||
#define DB_VARNAME "DB_DATABASE"
|
||||
#endif
|
||||
|
||||
#ifndef PW_VARNAME
|
||||
#define PW_VARNAME "DB_PASSPHRASE"
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
extern "C" {
|
||||
#include <unistd.h>
|
||||
}
|
||||
|
||||
|
||||
// pure functions
|
||||
string readpass();
|
||||
|
||||
#endif // DBTOOL_H
|
||||
|
||||
|
||||
298
dbtool.pod
Normal file
298
dbtool.pod
Normal file
@@ -0,0 +1,298 @@
|
||||
# -*-cperl-*-
|
||||
=head1 NAME
|
||||
|
||||
dbtool - a tool for storing key/value pairs in a hash database
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
dbtool -d database [DirusSfwVhtRFpP] [-k key] [-v value]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This manual page documents the program B<dbtool>. B<dbtool> can be used
|
||||
to store and retrieve data in a key/value format in
|
||||
a hash database. Perl compatible regular expressions are supported
|
||||
both for storing and retrieving of data. It's main advantages are the
|
||||
ability to maintain huge amounts of data and speed.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over
|
||||
|
||||
=item B<-D>
|
||||
|
||||
Dump all key/value pairs of the database. Keys and values will be
|
||||
separated by whitespace or by the character specified by B<-F>.
|
||||
|
||||
=item B<-f>
|
||||
|
||||
Enable B<force mode>, which has the following causes:
|
||||
|
||||
=over
|
||||
|
||||
=item I<insert>
|
||||
|
||||
Keys (and the associated value) will be overwritten if it already
|
||||
exists.
|
||||
|
||||
=item I<update>
|
||||
|
||||
Key/value will be created if it does not exist.
|
||||
|
||||
=back
|
||||
|
||||
=item B<-F> -I<separator>
|
||||
|
||||
Optional field separator. The default separator is one whitespace.
|
||||
Use B<-F> in conjunction with B<-D> to specify an alternate output
|
||||
field separator or with B<-i> if data is read in from I<STDIN> (without
|
||||
B<-k> and B<-v>).
|
||||
|
||||
=item B<-h>
|
||||
|
||||
Prints out a short help message to I<STDERR> and exits.
|
||||
|
||||
=item B<-i>
|
||||
|
||||
Insert data. The B<-k> and B<-v> options are required. You will get an error
|
||||
message if the key already exists. Use B<-f> to avoid such a message
|
||||
and let B<dbtool> overwrite the key instead.
|
||||
If both key (B<-k>) and value (B<-v>) are not provided, B<dbtool>
|
||||
will read in the data from I<STDIN>. The default input separator
|
||||
is one whitespace. The first field (separated by whitespace) will be
|
||||
considered as the key and the rest of the input line will be considered
|
||||
as the value associated with the key. You can provide an alternate
|
||||
input field separator using the option B<-F>.
|
||||
It is also possible to separate the key and value of an input line
|
||||
using a regular expression with the B<-t> option(see below).
|
||||
|
||||
=item B<-k> I<key>
|
||||
|
||||
Use I<key> as the key. Use B<-k> in conjunction with B<-i>, B<-u>, B<-r>,
|
||||
B<-s> or B<-S>.
|
||||
|
||||
=item B<-r>
|
||||
|
||||
Remove data. Only the key to be removed (B<-k>) is required.
|
||||
|
||||
=item B<-R>
|
||||
|
||||
Reverse the meaning of the expression provided with B<-t>. By default
|
||||
B<dbtool> will use the first match as the key and the second one as
|
||||
the value. With B<-R> this will be reversed.
|
||||
|
||||
=item B<-s>
|
||||
|
||||
Search for a key specified by B<-k>. The associated value will be printed
|
||||
to I<STDOUT>. You can use B<-w> to get the key too separated by whitespace
|
||||
or by the parameter of B<-F>. You can only search for keys, not for values.
|
||||
|
||||
=item B<-S>
|
||||
|
||||
Search for a key. The parameter to the option B<-k> will be considered
|
||||
as a perl compatible regular expression. It is possible to get multiple
|
||||
results, which will be printed to I<STDOUT> separated by newline. Otherwise
|
||||
B<-S> behaves like B<-s>.
|
||||
|
||||
=item B<-t> I<expression>
|
||||
|
||||
Use I<expression> to decide which part of an input line has to be used as the
|
||||
key and which one as the value. The regular expression must contain two
|
||||
parts surrounded by round parenthesis'. See the section EXAMPLES for some
|
||||
uses of B<-t>. This option can only be used in conjunction with B<-i> without
|
||||
B<-k> and B<-v>.
|
||||
|
||||
=item B<-u>
|
||||
|
||||
Update data. A key (B<-k>) and a value (B<-v>) is required. You will get an
|
||||
error message if the key does not exist. You can use the option B<-f> to avoid
|
||||
such a message and to insert the data if it does not exist instead.
|
||||
|
||||
=item B<-p>
|
||||
|
||||
Use encrypted database. dbtool will ask you for the passphrase,
|
||||
unless the environment variable DB_PASSPHRASE is set.
|
||||
|
||||
|
||||
=item B<-P> I<passphrase>
|
||||
|
||||
Use encrypted database. Specify the passphrase on the commandline.
|
||||
|
||||
=item B<-v> I<value>
|
||||
|
||||
Use I<value> as the value associated with some key. Use B<-v> in conjunction
|
||||
with B<-i>, B<-u> or B<-r>.
|
||||
|
||||
=item B<-V>
|
||||
|
||||
Print out the version of B<dbtool>.
|
||||
|
||||
=item B<-w>
|
||||
|
||||
Print search results together with the associated keys separated by whitespace
|
||||
or the parameter of B<-F>.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
|
||||
=head1 EXPRESSIONS
|
||||
|
||||
Regular expressions are provided using the B<PCRE Library>. It supports most of
|
||||
the features which perl provides. See the section <20>DIFFERENCES FROM PERL<52> in the PCRE
|
||||
manpage. You can also take a look to the perl regular expression man page with
|
||||
the following command:
|
||||
|
||||
perldoc perlre
|
||||
|
||||
(which requires perl to be installed).
|
||||
|
||||
|
||||
=head1 ENCRYPTION
|
||||
|
||||
As of version 1.4 B<dbtool> supports encrypted databases. See the descriptions
|
||||
of the options B<-p> and B<-P>. The algorithm used for encryption is B<Rijndael>
|
||||
block cipher encryption.
|
||||
|
||||
B<dbtool> does not use the passphrase which the user supplies. It uses instead
|
||||
the MD5 digest of the passphrase as the encryption key.
|
||||
|
||||
Please note, that B<dbtool> itself does not distinguish between encrypted or
|
||||
unencrypted databases. That means, you will get strange results if you try
|
||||
to access an encrypted database without the options B<-p> or B<-P> being set.
|
||||
|
||||
B<dbtool> by default will only encrypt the values of a database, not the keys.
|
||||
This might change in future versions.
|
||||
|
||||
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
=over
|
||||
|
||||
=item
|
||||
|
||||
dbtool -d test.db -i -k "test" -v "blah blah blah"
|
||||
|
||||
Insert the key "test" which is associated to the value
|
||||
"blah blah blah" into test.db.
|
||||
|
||||
|
||||
=item
|
||||
|
||||
dbtool -d test.db -u -f -k "test" -v "blubber"
|
||||
|
||||
Update the key "test" even if it does not exist with "blubber".
|
||||
|
||||
|
||||
=item
|
||||
|
||||
dbtool -d test.db -r -k "test"
|
||||
|
||||
Remove the entry to which the key "test" points.
|
||||
|
||||
|
||||
=item
|
||||
|
||||
dbtool -d test.db -S -k "^\d\d"
|
||||
|
||||
Search for all keys which start at least with two digits.
|
||||
|
||||
|
||||
=item
|
||||
|
||||
dbtool -d test.db -D | grep -i "tom"
|
||||
|
||||
Dump out the whole database test.db and search for "tom". This
|
||||
method allows you to search for values.
|
||||
|
||||
|
||||
=item
|
||||
|
||||
cat /etc/passwd | dbtool -d test.db -i -f -t "^(.+?):.*:(\d+?):$"
|
||||
|
||||
In this example we store the contents of the file passwd in
|
||||
a hash database. The username will be the key of an entry and
|
||||
the userid will be the associated value. The key must be any character
|
||||
from the beginning of a line until the first appearance of a colon.
|
||||
The value must be one or more digits after the 2nd colon until the next
|
||||
colon:
|
||||
|
||||
apache:x:48:48:Apache:/var/www:/bin/false
|
||||
^^^^^^ ^^
|
||||
| |
|
||||
| o--- value
|
||||
|
|
||||
o------------ key
|
||||
|
||||
|
||||
=item
|
||||
|
||||
find /home -ls | dbtool -d catalog.dbm -i -f -R -t "^(.+?) (\/.*)$"
|
||||
|
||||
In this example the output of the unix command 'find /home -ls' will
|
||||
be used as input for B<dbtool>. The key for an entry will begin on the
|
||||
first appearance of a slash character until the end of the line. Everything
|
||||
in front of it will be the value (because of the B<-R>):
|
||||
|
||||
302 12 -rw------- 1 scip scip 9734 Feb 11 2000 /home/scip/D/lrk5/README
|
||||
(---------------[ value ]--------------------------) (--------[ key ]-------)
|
||||
|
||||
I use this command in my backup script for creating a catalog of all saved files
|
||||
and it's attributes.
|
||||
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head1 REPORTING BUGS
|
||||
|
||||
Report bugs to <tlinden@cpan.org>.
|
||||
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright (c) 2000-2001 T.v. Dein.
|
||||
This is free software; see the source for copying conditions. There is NO warranty;
|
||||
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
=over
|
||||
|
||||
=item B<perldoc perlre>
|
||||
|
||||
Perl regular expressions.
|
||||
|
||||
=item B<http://www.pcre.org>
|
||||
|
||||
The homepage of the B<PCRE> library.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=head1 AVAILABILITY
|
||||
|
||||
B<dbtool> can be downloaded from B<http://www.daemon.de/dbtool>.
|
||||
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
I<T.v. Dein <tlinden@cpan.org>>
|
||||
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
312
digest.cc
Normal file
312
digest.cc
Normal file
@@ -0,0 +1,312 @@
|
||||
// Copyright (C) 1999-2001 Open Source Telecom Corporation.
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// As a special exception to the GNU General Public License, permission is
|
||||
// granted for additional uses of the text contained in its release
|
||||
// of Common C++.
|
||||
//
|
||||
// The exception is that, if you link the Common C++ library with other files
|
||||
// to produce an executable, this does not by itself cause the
|
||||
// resulting executable to be covered by the GNU General Public License.
|
||||
// Your use of that executable is in no way restricted on account of
|
||||
// linking the Common C++ library code into it.
|
||||
//
|
||||
// This exception does not however invalidate any other reasons why
|
||||
// the executable file might be covered by the GNU General Public License.
|
||||
//
|
||||
// This exception applies only to the code released under the
|
||||
// name Common C++. If you copy code from other releases into a copy of
|
||||
// Common C++, as the General Public License permits, the exception does
|
||||
// not apply to the code that you add in this way. To avoid misleading
|
||||
// anyone as to the status of such modified files, you must delete
|
||||
// this exception notice from them.
|
||||
//
|
||||
// If you write modifications of your own for Common C++, it is your choice
|
||||
// whether to permit this exception to apply to your modifications.
|
||||
// If you do not wish that, delete this exception notice.
|
||||
|
||||
#include "digest.h"
|
||||
|
||||
|
||||
|
||||
#define S11 7
|
||||
#define S12 12
|
||||
#define S13 17
|
||||
#define S14 22
|
||||
#define S21 5
|
||||
#define S22 9
|
||||
#define S23 14
|
||||
#define S24 20
|
||||
#define S31 4
|
||||
#define S32 11
|
||||
#define S33 16
|
||||
#define S34 23
|
||||
#define S41 6
|
||||
#define S42 10
|
||||
#define S43 15
|
||||
#define S44 21
|
||||
|
||||
inline unsigned long rotate_left(unsigned long x, unsigned long n)
|
||||
{
|
||||
return (x << n) | (x >> (32-n));
|
||||
}
|
||||
|
||||
inline unsigned long F(unsigned long x, unsigned long y, unsigned long z)
|
||||
{
|
||||
return (x & y) | (~x & z);
|
||||
}
|
||||
|
||||
inline unsigned long G(unsigned long x, unsigned long y, unsigned long z)
|
||||
{
|
||||
return (x & z) | (y & ~z);
|
||||
}
|
||||
|
||||
inline unsigned long H(unsigned long x, unsigned long y, unsigned long z)
|
||||
{
|
||||
return x ^ y ^ z;
|
||||
}
|
||||
|
||||
inline unsigned long I(unsigned long x, unsigned long y, unsigned long z)
|
||||
{
|
||||
return y ^ (x | ~z);
|
||||
}
|
||||
|
||||
|
||||
static void FF(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac)
|
||||
{
|
||||
a += F(b, c, d) + x + ac;
|
||||
a = rotate_left(a, s) + b;
|
||||
}
|
||||
|
||||
static void GG(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac)
|
||||
{
|
||||
a += G(b, c, d) + x + ac;
|
||||
a = rotate_left(a, s) + b;
|
||||
}
|
||||
|
||||
static void HH(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac)
|
||||
{
|
||||
a += H(b, c, d) + x + ac;
|
||||
a = rotate_left(a, s) + b;
|
||||
}
|
||||
|
||||
static void II(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac)
|
||||
{
|
||||
a += I(b, c, d) + x + ac;
|
||||
a = rotate_left(a, s) + b;
|
||||
}
|
||||
|
||||
MD5Digest::MD5Digest() :
|
||||
Digest()
|
||||
{
|
||||
initDigest();
|
||||
updated = true;
|
||||
}
|
||||
|
||||
void MD5Digest::initDigest(void)
|
||||
{
|
||||
count[0] = count[1] = 0;
|
||||
state[0] = 0x67452301;
|
||||
state[1] = 0xefcdab89;
|
||||
state[2] = 0x98badcfe;
|
||||
state[3] = 0x10325476;
|
||||
bpos = 0;
|
||||
updated = false;
|
||||
}
|
||||
|
||||
int MD5Digest::overflow(int c)
|
||||
{
|
||||
updated = true;
|
||||
buf[bpos++] = (unsigned char)c;
|
||||
if(bpos >= 64)
|
||||
Update();
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void MD5Digest::Update(void)
|
||||
{
|
||||
unsigned long x[16], a, b, c, d;
|
||||
int i;
|
||||
|
||||
if(!bpos)
|
||||
return;
|
||||
|
||||
while(bpos < 64)
|
||||
buf[bpos++] = 0;
|
||||
|
||||
if((count[0] += 512) < 512)
|
||||
++count[1];
|
||||
|
||||
a = state[0];
|
||||
b = state[1];
|
||||
c = state[2];
|
||||
d = state[3];
|
||||
|
||||
for(i = 0; i < 16; ++i)
|
||||
x[i] = (unsigned long)(buf[i * 4]) |
|
||||
(unsigned long)(buf[i * 4 + 1] << 8) |
|
||||
(unsigned long)(buf[i * 4 + 2] << 16) |
|
||||
(unsigned long)(buf[i * 4 + 3] << 24);
|
||||
|
||||
FF(a, b, c, d, x[ 0], S11, 0xd76aa478);
|
||||
FF(d, a, b, c, x[ 1], S12, 0xe8c7b756);
|
||||
FF(c, d, a, b, x[ 2], S13, 0x242070db);
|
||||
FF(b, c, d, a, x[ 3], S14, 0xc1bdceee);
|
||||
FF(a, b, c, d, x[ 4], S11, 0xf57c0faf);
|
||||
FF(d, a, b, c, x[ 5], S12, 0x4787c62a);
|
||||
FF(c, d, a, b, x[ 6], S13, 0xa8304613);
|
||||
FF(b, c, d, a, x[ 7], S14, 0xfd469501);
|
||||
FF(a, b, c, d, x[ 8], S11, 0x698098d8);
|
||||
FF(d, a, b, c, x[ 9], S12, 0x8b44f7af);
|
||||
FF(c, d, a, b, x[10], S13, 0xffff5bb1);
|
||||
FF(b, c, d, a, x[11], S14, 0x895cd7be);
|
||||
FF(a, b, c, d, x[12], S11, 0x6b901122);
|
||||
FF(d, a, b, c, x[13], S12, 0xfd987193);
|
||||
FF(c, d, a, b, x[14], S13, 0xa679438e);
|
||||
FF(b, c, d, a, x[15], S14, 0x49b40821);
|
||||
|
||||
GG(a, b, c, d, x[ 1], S21, 0xf61e2562);
|
||||
GG(d, a, b, c, x[ 6], S22, 0xc040b340);
|
||||
GG(c, d, a, b, x[11], S23, 0x265e5a51);
|
||||
GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa);
|
||||
GG(a, b, c, d, x[ 5], S21, 0xd62f105d);
|
||||
GG(d, a, b, c, x[10], S22, 0x2441453);
|
||||
GG(c, d, a, b, x[15], S23, 0xd8a1e681);
|
||||
GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8);
|
||||
GG(a, b, c, d, x[ 9], S21, 0x21e1cde6);
|
||||
GG(d, a, b, c, x[14], S22, 0xc33707d6);
|
||||
GG(c, d, a, b, x[ 3], S23, 0xf4d50d87);
|
||||
GG(b, c, d, a, x[ 8], S24, 0x455a14ed);
|
||||
GG(a, b, c, d, x[13], S21, 0xa9e3e905);
|
||||
GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8);
|
||||
GG(c, d, a, b, x[ 7], S23, 0x676f02d9);
|
||||
GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);
|
||||
|
||||
HH(a, b, c, d, x[ 5], S31, 0xfffa3942);
|
||||
HH(d, a, b, c, x[ 8], S32, 0x8771f681);
|
||||
HH(c, d, a, b, x[11], S33, 0x6d9d6122);
|
||||
HH(b, c, d, a, x[14], S34, 0xfde5380c);
|
||||
HH(a, b, c, d, x[ 1], S31, 0xa4beea44);
|
||||
HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9);
|
||||
HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60);
|
||||
HH(b, c, d, a, x[10], S34, 0xbebfbc70);
|
||||
HH(a, b, c, d, x[13], S31, 0x289b7ec6);
|
||||
HH(d, a, b, c, x[ 0], S32, 0xeaa127fa);
|
||||
HH(c, d, a, b, x[ 3], S33, 0xd4ef3085);
|
||||
HH(b, c, d, a, x[ 6], S34, 0x4881d05);
|
||||
HH(a, b, c, d, x[ 9], S31, 0xd9d4d039);
|
||||
HH(d, a, b, c, x[12], S32, 0xe6db99e5);
|
||||
HH(c, d, a, b, x[15], S33, 0x1fa27cf8);
|
||||
HH(b, c, d, a, x[ 2], S34, 0xc4ac5665);
|
||||
|
||||
II(a, b, c, d, x[ 0], S41, 0xf4292244);
|
||||
II(d, a, b, c, x[ 7], S42, 0x432aff97);
|
||||
II(c, d, a, b, x[14], S43, 0xab9423a7);
|
||||
II(b, c, d, a, x[ 5], S44, 0xfc93a039);
|
||||
II(a, b, c, d, x[12], S41, 0x655b59c3);
|
||||
II(d, a, b, c, x[ 3], S42, 0x8f0ccc92);
|
||||
II(c, d, a, b, x[10], S43, 0xffeff47d);
|
||||
II(b, c, d, a, x[ 1], S44, 0x85845dd1);
|
||||
II(a, b, c, d, x[ 8], S41, 0x6fa87e4f);
|
||||
II(d, a, b, c, x[15], S42, 0xfe2ce6e0);
|
||||
II(c, d, a, b, x[ 6], S43, 0xa3014314);
|
||||
II(b, c, d, a, x[13], S44, 0x4e0811a1);
|
||||
II(a, b, c, d, x[ 4], S41, 0xf7537e82);
|
||||
II(d, a, b, c, x[11], S42, 0xbd3af235);
|
||||
II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb);
|
||||
II(b, c, d, a, x[ 9], S44, 0xeb86d391);
|
||||
|
||||
state[0] += a;
|
||||
state[1] += b;
|
||||
state[2] += c;
|
||||
state[3] += d;
|
||||
updated = true;
|
||||
}
|
||||
|
||||
void MD5Digest::Commit(void)
|
||||
{
|
||||
unsigned char cbuf[8];
|
||||
unsigned long i, len;
|
||||
|
||||
static unsigned char pad[64]={
|
||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
if(!updated && !bpos)
|
||||
return;
|
||||
|
||||
count[0] += (unsigned long)(bpos << 3);
|
||||
if(count[0] < (unsigned long)(bpos << 3))
|
||||
++count[1];
|
||||
|
||||
for(i = 0; i < 2; ++i)
|
||||
{
|
||||
cbuf[i * 4] = (unsigned char)count[i] & 0xff;
|
||||
cbuf[i * 4 + 1] = (unsigned char)((count[i] >> 8) & 0xff);
|
||||
cbuf[i * 4 + 2] = (unsigned char)((count[i] >> 16) & 0xff);
|
||||
cbuf[i * 4 + 3] = (unsigned char)((count[i] >> 24) & 0xff);
|
||||
}
|
||||
|
||||
i = (unsigned) ((count[0] >> 3) & 0x3f);
|
||||
len = (i < 56) ? (56 - i) : (120 - i);
|
||||
if(len)
|
||||
putDigest(pad, len);
|
||||
|
||||
putDigest(cbuf, 8);
|
||||
|
||||
for(i = 0; i < 4; ++i)
|
||||
{
|
||||
md5[i * 4] = (unsigned char)state[i] & 0xff;
|
||||
md5[i * 4 + 1] = (unsigned char)((state[i] >> 8) & 0xff);
|
||||
md5[i * 4 + 2] = (unsigned char)((state[i] >> 16) & 0xff);
|
||||
md5[i * 4 + 3] = (unsigned char)((state[i] >> 24) & 0xff);
|
||||
}
|
||||
initDigest();
|
||||
}
|
||||
|
||||
unsigned MD5Digest::getDigest(unsigned char *buffer)
|
||||
{
|
||||
Commit();
|
||||
|
||||
memcpy(buffer, md5, 16);
|
||||
return 16;
|
||||
}
|
||||
|
||||
void MD5Digest::putDigest(unsigned char *buffer, unsigned len)
|
||||
{
|
||||
while(len--)
|
||||
{
|
||||
buf[bpos++] = *(buffer++);
|
||||
if(bpos >= 64)
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
char* MD5Digest::stringDigest() {
|
||||
char *buf;
|
||||
buf = new char[33];
|
||||
int i;
|
||||
|
||||
Commit();
|
||||
|
||||
for(i = 0; i < 16; ++i)
|
||||
sprintf(buf + 2 * i, "%02x", md5[i]);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
134
digest.h
Normal file
134
digest.h
Normal file
@@ -0,0 +1,134 @@
|
||||
// Copyright (C) 1999-2001 Open Source Telecom Corporation.
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// As a special exception to the GNU General Public License, permission is
|
||||
// granted for additional uses of the text contained in its release
|
||||
// of Common C++.
|
||||
//
|
||||
// The exception is that, if you link the Common C++ library with other
|
||||
// files to produce an executable, this does not by itself cause the
|
||||
// resulting executable to be covered by the GNU General Public License.
|
||||
// Your use of that executable is in no way restricted on account of
|
||||
// linking the Common C++ library code into it.
|
||||
//
|
||||
// This exception does not however invalidate any other reasons why
|
||||
// the executable file might be covered by the GNU General Public License.
|
||||
//
|
||||
// This exception applies only to the code released under the
|
||||
// name Common C++. If you copy code from other releases into a copy of
|
||||
// Common C++, as the General Public License permits, the exception does
|
||||
// not apply to the code that you add in this way. To avoid misleading
|
||||
// anyone as to the status of such modified files, you must delete
|
||||
// this exception notice from them.
|
||||
//
|
||||
// If you write modifications of your own for Common C++, it is your choice
|
||||
// whether to permit this exception to apply to your modifications.
|
||||
// If you do not wish that, delete this exception notice.
|
||||
|
||||
#ifndef DIGEST_H
|
||||
#define DIGEST_H
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
extern "C" {
|
||||
#include <string.h>
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The digest base class is used for implementing and deriving one way
|
||||
* hashing functions.
|
||||
*
|
||||
* @author David Sugar <dyfet@ostel.com>
|
||||
* @short base class for hashing services.
|
||||
*/
|
||||
class Digest {
|
||||
protected:
|
||||
Digest() {};
|
||||
|
||||
/**
|
||||
* Reset the digest table to an initial default value.
|
||||
*/
|
||||
virtual void initDigest(void) = 0;
|
||||
|
||||
/**
|
||||
* Get the size of a digest in octets.
|
||||
*
|
||||
* @return number of bytes in digest.
|
||||
*/
|
||||
virtual unsigned getSize(void) = 0;
|
||||
|
||||
/**
|
||||
* Copy the binary digest buffer to user memory.
|
||||
*
|
||||
* @return number of bytes in digest.
|
||||
* @param buffer to write into.
|
||||
*/
|
||||
virtual unsigned getDigest(unsigned char *buffer) = 0;
|
||||
|
||||
/**
|
||||
* Put data into the digest bypassing the stream subsystem.
|
||||
*
|
||||
* @param buffer to read from.
|
||||
* @param length of data.
|
||||
*/
|
||||
virtual void putDigest(unsigned char *buffer, unsigned length) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A md5 collection/computation accululator class.
|
||||
*
|
||||
* @author David Sugar <dyfet@ostel.com>
|
||||
* @short md5 hash accumulation.
|
||||
*/
|
||||
class MD5Digest : public Digest
|
||||
{
|
||||
private:
|
||||
unsigned long state[4];
|
||||
unsigned long count[2];
|
||||
unsigned char buf[64];
|
||||
unsigned bpos;
|
||||
unsigned char md5[16];
|
||||
bool updated;
|
||||
|
||||
protected:
|
||||
int overflow(int c);
|
||||
|
||||
void Update(void);
|
||||
|
||||
void Commit(void);
|
||||
|
||||
public:
|
||||
MD5Digest();
|
||||
|
||||
void initDigest(void);
|
||||
|
||||
inline unsigned getSize(void)
|
||||
{return 16;};
|
||||
|
||||
unsigned getDigest(unsigned char *buffer);
|
||||
|
||||
void putDigest(unsigned char *buffer, unsigned len);
|
||||
|
||||
char* stringDigest();
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
607
engine.cc
Normal file
607
engine.cc
Normal file
@@ -0,0 +1,607 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include "dbtool.h"
|
||||
#include "engine.h"
|
||||
#include "platform.h"
|
||||
/*
|
||||
* Initialize the database and get a new Db instance pointer
|
||||
*/
|
||||
void Engine::init() {
|
||||
pkg = PACKAGE;
|
||||
int mode;
|
||||
#ifdef HAVE_BERKELEY
|
||||
int err;
|
||||
#endif
|
||||
if(config.filename == "") {
|
||||
cerr << pkg << ": no database file specified!" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#ifdef HAVE_BERKELEY
|
||||
db = new Db(NULL,0);
|
||||
db->set_error_stream(&cerr);
|
||||
db->set_errpfx(pkg.c_str());
|
||||
if(config.readonly == 1)
|
||||
mode = DB_RDONLY;
|
||||
else
|
||||
mode = DB_CREATE;
|
||||
#else
|
||||
if(config.readonly == 1)
|
||||
mode = GDBM_READER;
|
||||
else
|
||||
mode = GDBM_WRCREAT;
|
||||
#endif
|
||||
|
||||
|
||||
if(config.force == 1) {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if ((err = db->open(NULL, config.filename.c_str(), NULL, DB_HASH, mode, FILEMODE)) != 0) {
|
||||
cerr << "Failed to open " + config.filename << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
|
||||
db = gdbm_open(
|
||||
(char *)config.filename.c_str(),
|
||||
BLOCKSIZE,
|
||||
mode,
|
||||
FILEMODE,
|
||||
0
|
||||
);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if ((err = db->open(NULL, config.filename.c_str(), NULL, DB_HASH, mode, FILEMODE)) != 0) {
|
||||
cerr << "Failed to open " + config.filename << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
db = gdbm_open(
|
||||
(char *)config.filename.c_str(),
|
||||
BLOCKSIZE,
|
||||
mode,
|
||||
FILEMODE,
|
||||
0
|
||||
);
|
||||
#endif
|
||||
}
|
||||
#ifndef HAVE_BERKELEY
|
||||
if(!db) {
|
||||
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ok, at this point everything is ok, usage is correct,
|
||||
* database is open, now check the passphrase, if encrypted
|
||||
* database requested.
|
||||
*/
|
||||
if(config.encrypted) {
|
||||
if(config.phrase == "") {
|
||||
config.phrase = readpass();
|
||||
}
|
||||
rijn.init(config.phrase); /* this might fail */
|
||||
config.phrase = " ";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* dump out all data in db
|
||||
*/
|
||||
void Engine::dump() {
|
||||
init();
|
||||
#ifdef HAVE_BERKELEY
|
||||
try {
|
||||
Dbc *dbcp;
|
||||
db->cursor(NULL, &dbcp, 0);
|
||||
Dbt key;
|
||||
Dbt data;
|
||||
while (dbcp->get(&key, &data, DB_NEXT) == 0) {
|
||||
/* iterate over every tuple and dump it out */
|
||||
string K((char *)key.get_data(), key.get_size());
|
||||
string V((char *)data.get_data(), data.get_size());
|
||||
if(config.reverse == 1) {
|
||||
cout << decode(V) << config.separator << K << endl;
|
||||
}
|
||||
else {
|
||||
cout << K << config.separator << decode(V) << endl;
|
||||
}
|
||||
}
|
||||
dbcp->close();
|
||||
}
|
||||
catch (DbException &dbe) {
|
||||
cerr << pkg << ": " << dbe.what() << "\n";
|
||||
}
|
||||
db->close(0);
|
||||
#else
|
||||
datum key;
|
||||
datum value;
|
||||
key = gdbm_firstkey(db);
|
||||
while ( key.dptr != NULL ) {
|
||||
/* iterate over every tuple and dump it out */
|
||||
value = gdbm_fetch(db, key);
|
||||
string K(key.dptr, key.dsize);
|
||||
string V(value.dptr, value.dsize);
|
||||
if(config.reverse == 1) {
|
||||
cout << decode(V) << config.separator << K << endl;
|
||||
}
|
||||
else {
|
||||
cout << K << config.separator << decode(V) << endl;
|
||||
}
|
||||
key = gdbm_nextkey(db,key);
|
||||
}
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* search for regexp given in config.key
|
||||
*/
|
||||
void Engine::regexp() {
|
||||
init();
|
||||
int num;
|
||||
pcre *p_pcre;
|
||||
pcre_extra *p_pcre_extra;
|
||||
char *err_str;
|
||||
int sub_len = 9;
|
||||
int *sub_vec;
|
||||
int erroffset;
|
||||
p_pcre_extra = NULL;
|
||||
p_pcre = pcre_compile((char *)config.key.c_str(), 0,
|
||||
(const char **)(&err_str), &erroffset, NULL);
|
||||
#ifdef HAVE_BERKELEY
|
||||
Dbc *dbcp;
|
||||
db->cursor(NULL, &dbcp, 0);
|
||||
Dbt key;
|
||||
Dbt data;
|
||||
while (dbcp->get(&key, &data, DB_NEXT) == 0) {
|
||||
string K((char *)key.get_data(), key.get_size());
|
||||
string V((char *)data.get_data(), data.get_size());
|
||||
#else
|
||||
datum key;
|
||||
datum value;
|
||||
key = gdbm_firstkey(db);
|
||||
while ( key.dptr != NULL ) {
|
||||
value = gdbm_fetch(db, key);
|
||||
string K(key.dptr, key.dsize);
|
||||
string V(value.dptr, value.dsize);
|
||||
#endif
|
||||
sub_vec = new int(sub_len);
|
||||
num = pcre_exec(p_pcre, p_pcre_extra, (char *)K.c_str(),
|
||||
(int)K.length(), 0, 0, (int *)sub_vec, sub_len);
|
||||
if(num == 1){
|
||||
if(config.reverse == 1) {
|
||||
cout << decode(V);
|
||||
if(config.with == 1) {
|
||||
cout << config.separator << K;
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
else {
|
||||
if(config.with == 1) {
|
||||
cout << K << config.separator;
|
||||
}
|
||||
cout << decode(V) << endl;
|
||||
}
|
||||
}
|
||||
K = "";
|
||||
V = "";
|
||||
delete(sub_vec);
|
||||
#ifndef HAVE_BERKELEY
|
||||
key = gdbm_nextkey(db,key);
|
||||
#endif
|
||||
}
|
||||
pcre_free(p_pcre);
|
||||
#ifdef HAVE_BERKELEY
|
||||
dbcp->close();
|
||||
db->close(0);
|
||||
#else
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Insert data into the db
|
||||
*/
|
||||
void Engine::from_stdin() {
|
||||
init();
|
||||
#ifdef HAVE_BERKELEY
|
||||
int err;
|
||||
#else
|
||||
int ret;
|
||||
#endif
|
||||
|
||||
FILE *stream;
|
||||
stream = fdopen(0, "r");
|
||||
char c;
|
||||
string mode = "key";
|
||||
string key = "";
|
||||
string value = "";
|
||||
string line = "";
|
||||
|
||||
int num, match;
|
||||
pcre *p_pcre;
|
||||
pcre_extra *p_pcre_extra;
|
||||
char *err_str;
|
||||
int sub_len = 9;
|
||||
int *sub_vec;
|
||||
char *v1;
|
||||
char *v2;
|
||||
int erroffset;
|
||||
p_pcre_extra = NULL;
|
||||
p_pcre = pcre_compile((char *)config.token.c_str(), 0,
|
||||
(const char **)(&err_str), &erroffset, NULL);
|
||||
while((c = fgetc(stream)) != EOF) {
|
||||
if(c == '\n') {
|
||||
// record end
|
||||
mode = "key";
|
||||
if(config.token != "") {
|
||||
v1 = new char[line.length()];
|
||||
v2 = new char[line.length()];
|
||||
sub_vec = new int[sub_len];
|
||||
num = pcre_exec(p_pcre, p_pcre_extra, (char *)line.c_str(),
|
||||
(int)line.length(), 0, 0, (int *)sub_vec, sub_len);
|
||||
if(num < 0)
|
||||
cerr << "Token \"" << config.token << "\" did not match on \"" << line << "\"!\n";
|
||||
else if(num == 1)
|
||||
cerr << "Token " << config.token << " did not produce sub strings!\n";
|
||||
else {
|
||||
match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 1, v1, line.length());
|
||||
match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 2, v2, line.length());
|
||||
if(config.reverse) {
|
||||
value = v1;
|
||||
key = v2;
|
||||
}
|
||||
else {
|
||||
value = v2;
|
||||
key = v1;
|
||||
}
|
||||
}
|
||||
delete(sub_vec);
|
||||
pcre_free((void *)v1);
|
||||
pcre_free((void *)v2);
|
||||
line = "";
|
||||
}
|
||||
value = encode(value);
|
||||
#ifdef HAVE_BERKELEY
|
||||
Dbt d_key((char *)key.c_str(), key.length());
|
||||
Dbt d_value((char *)value.c_str(), value.length());
|
||||
#else
|
||||
datum d_key = {(char *)key.c_str(), key.length()};
|
||||
datum d_value = {(char *)value.c_str(), value.length()};
|
||||
#endif
|
||||
if(config.force == 1) {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if((err = db->put(0, &d_key, &d_value, 0)) != 0) {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
ret = gdbm_store(db, d_key, d_value, GDBM_REPLACE);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if((err = db->put(NULL, &d_key, &d_value, DB_NOOVERWRITE)) != 0) {
|
||||
if(err == DB_KEYEXIST) {
|
||||
cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
ret = gdbm_store(db, d_key, d_value, GDBM_INSERT);
|
||||
#endif
|
||||
}
|
||||
#ifndef HAVE_BERKELEY
|
||||
if(ret != 0) {
|
||||
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
key = "";
|
||||
value = "";
|
||||
continue;
|
||||
}
|
||||
else if(c == config.separator && mode != "value" && config.token == "") {
|
||||
// key ready, the following stuff is the data!
|
||||
mode = "value";
|
||||
continue;
|
||||
}
|
||||
if(config.token != "") {
|
||||
/* we have a split token */
|
||||
line += char(c);
|
||||
}
|
||||
else {
|
||||
if(mode == "key")
|
||||
key += char(c);
|
||||
else
|
||||
value += char(c);
|
||||
}
|
||||
}
|
||||
pcre_free(p_pcre);
|
||||
#ifdef HAVE_BERKELEY
|
||||
db->close(0);
|
||||
#else
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Insert data into the db
|
||||
*/
|
||||
void Engine::insert() {
|
||||
init();
|
||||
string __value;
|
||||
__value = encode(config.value);
|
||||
#ifdef HAVE_BERKELEY
|
||||
int err;
|
||||
char *k;
|
||||
char *v;
|
||||
k = (char *)config.key.c_str();
|
||||
v = (char *)__value.c_str();
|
||||
Dbt key(k, strlen(k));
|
||||
Dbt value(v, strlen(v));
|
||||
#else
|
||||
int ret;
|
||||
datum key = {(char *)config.key.c_str(), config.key.length()};
|
||||
datum value = {(char *)__value.c_str(), __value.length()};
|
||||
#endif
|
||||
|
||||
if(config.force == 1) {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if((err = db->put(0, &key, &value, 0)) != 0) {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
ret = gdbm_store(db, key, value, GDBM_REPLACE);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if((err = db->put(NULL, &key, &value, DB_NOOVERWRITE)) != 0) {
|
||||
if(err == DB_KEYEXIST) {
|
||||
cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#else
|
||||
ret = gdbm_store(db, key, value, GDBM_INSERT);
|
||||
#endif
|
||||
}
|
||||
#ifdef HAVE_BERKELEY
|
||||
db->close(0);
|
||||
#else
|
||||
if(ret != 0) {
|
||||
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
|
||||
exit(1);
|
||||
}
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* update a database
|
||||
*/
|
||||
void Engine::update() {
|
||||
init();
|
||||
string __value;
|
||||
__value = encode(config.value);
|
||||
#ifdef HAVE_BERKELEY
|
||||
int err;
|
||||
char *k;
|
||||
char *v;
|
||||
k = (char *)config.key.c_str();
|
||||
v = (char *)__value.c_str();
|
||||
Dbt key(k, strlen(k));
|
||||
Dbt value(v, strlen(v));
|
||||
#else
|
||||
int ret;
|
||||
datum key = {(char *)config.key.c_str(), config.key.length()};
|
||||
datum value = {(char *)__value.c_str(), __value.length()};
|
||||
#endif
|
||||
|
||||
if(config.force == 1) {
|
||||
#ifdef HAVE_BERKELEY
|
||||
if((err = db->put(0, &key, &value, 0)) != 0) {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
ret = gdbm_store(db, key, value, GDBM_REPLACE);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef HAVE_BERKELEY
|
||||
Dbt val;
|
||||
err = db->get(0, &key, &val, 0);
|
||||
if(err == 0) {
|
||||
/* key exists, do the update */
|
||||
if((err = db->put(0, &key, &value, 0)) != 0) {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else if(err == DB_NOTFOUND) {
|
||||
cerr << "Key " << config.key << " does not exist\n";
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
#else
|
||||
ret = gdbm_exists(db, key);
|
||||
if(ret) {
|
||||
ret = gdbm_store(db, key, value, GDBM_REPLACE);
|
||||
}
|
||||
else {
|
||||
cerr << "Key " << config.key << " does not exist\n";
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef HAVE_BERKELEY
|
||||
db->close(0);
|
||||
#else
|
||||
if(ret != 0) {
|
||||
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
|
||||
exit(1);
|
||||
}
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* remove an entry
|
||||
*/
|
||||
void Engine::remove() {
|
||||
init();
|
||||
int ret;
|
||||
#ifdef HAVE_BERKELEY
|
||||
Dbt key((char *)config.key.c_str(), config.key.length() + 1);
|
||||
if((ret = db->del(NULL, &key, 0)) != 0) {
|
||||
cerr << "Database error" << "(" << strerror(ret) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
db->close(0);
|
||||
#else
|
||||
datum key = {(char *)config.key.c_str(), config.key.length()};
|
||||
ret = gdbm_delete(db, key);
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* search for specific data
|
||||
*/
|
||||
void Engine::select() {
|
||||
init();
|
||||
#ifdef HAVE_BERKELEY
|
||||
int err;
|
||||
char *k;
|
||||
k = (char *)config.key.c_str();
|
||||
Dbt key(k, strlen(k));
|
||||
Dbt value;
|
||||
err = db->get(0, &key, &value, 0);
|
||||
if(err == 0) {
|
||||
string gotvalue((char *)value.get_data(), value.get_size());
|
||||
if(config.reverse == 1) {
|
||||
cout << decode(gotvalue);
|
||||
if(config.with == 1) {
|
||||
cout << config.separator << config.key;
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
else {
|
||||
if(config.with == 1) {
|
||||
cout << config.key << config.separator;
|
||||
}
|
||||
cout << decode(gotvalue) << endl;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cerr << "Database error" << "(" << strerror(err) << ")" << endl;
|
||||
exit(1);
|
||||
}
|
||||
db->close(0);
|
||||
#else
|
||||
datum content;
|
||||
datum key = {(char *)config.key.c_str(), config.key.length()};
|
||||
content = gdbm_fetch(db, key);
|
||||
string V(content.dptr, content.dsize);
|
||||
if(config.with == 1)
|
||||
cout << config.key << config.separator;
|
||||
cout << decode(V) << endl;
|
||||
gdbm_close(db);
|
||||
#endif
|
||||
}
|
||||
|
||||
string Engine::encode(const string& data) {
|
||||
if(config.encrypted) {
|
||||
return rijn.encrypt(data);
|
||||
}
|
||||
else
|
||||
return data;
|
||||
}
|
||||
|
||||
string Engine::decode(const string& data) {
|
||||
if(config.encrypted) {
|
||||
return rijn.decrypt(data);
|
||||
}
|
||||
else
|
||||
return data;
|
||||
}
|
||||
|
||||
126
engine.h
Normal file
126
engine.h
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* 'dbtool' is a simple but powerful commandline interface to the
|
||||
* GNU gdbm system (or, alternatively the Berkeley DB), useful for
|
||||
* shellscripts which needs a database for data storage.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* This file is part of the DBTOOL program.
|
||||
*
|
||||
* By accessing this software, DBTOOL, you are duly informed
|
||||
* of and agree to be bound by the conditions described below
|
||||
* in this notice:
|
||||
*
|
||||
* This software product, DBTOOL, is developed by T.v. Dein
|
||||
* and copyrighted (C) 2001-2015 by T.v. Dein, with all
|
||||
* rights reserved.
|
||||
*
|
||||
* There is no charge for DBTOOL software. You can redistribute
|
||||
* it and/or modify it under the terms of the GNU General Public
|
||||
* License, which is incorporated by reference herein.
|
||||
*
|
||||
* DBTOOL is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS,
|
||||
* OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that
|
||||
* the use of it will not infringe on any third party's intellec-
|
||||
* tual property rights.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with DBTOOL. Copies can also be obtained from:
|
||||
*
|
||||
* http://www.gnu.org/licenses/gpl.txt
|
||||
*
|
||||
* or by writing to:
|
||||
*
|
||||
* Free Software Foundation, Inc.
|
||||
* 59 Temple Place, Suite 330
|
||||
* Boston, MA 02111-1307
|
||||
* USA
|
||||
*
|
||||
* Or contact:
|
||||
*
|
||||
* "T.v. Dein" <tlinden@cpan.org>
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ENGINE_H
|
||||
#define ENGINE_H
|
||||
|
||||
/* the default initial blocksize for the gdbm database, see gdbm(3) */
|
||||
#define BLOCKSIZE 1024
|
||||
|
||||
/* the default filemode for file creation, will be xored to the users umask */
|
||||
#define FILEMODE 0644
|
||||
|
||||
|
||||
#include <string>
|
||||
|
||||
extern "C" {
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pcre.h>
|
||||
}
|
||||
|
||||
#ifdef HAVE_BERKELEY
|
||||
|
||||
#ifndef NO_SYSTEM_INCLUDES
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "platform.h"
|
||||
#include DB_CXX_HEADER
|
||||
|
||||
#else
|
||||
|
||||
# include <gdbm.h>
|
||||
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
#include "cipher.h"
|
||||
|
||||
extern Config config; /* instanced in ::main() */
|
||||
extern cipher rijn; /* instanced in ::main() */
|
||||
|
||||
/*
|
||||
* The Engine class will do all gdbm related stuff, i.e.
|
||||
* insert, search, create, remove and so on.
|
||||
* methods defined in engine.cc
|
||||
*/
|
||||
class Engine {
|
||||
private:
|
||||
void init(); /* init() will be called from every method once */
|
||||
string encode(const string& data);
|
||||
string decode(const string& data);
|
||||
|
||||
/*
|
||||
* the db object has the same name for both backends
|
||||
*/
|
||||
#ifdef HAVE_BERKELEY
|
||||
Db *db;
|
||||
#else
|
||||
GDBM_FILE db;
|
||||
#endif
|
||||
|
||||
string pkg;
|
||||
|
||||
public:
|
||||
Engine() {};
|
||||
void insert();
|
||||
void update();
|
||||
void remove();
|
||||
void select();
|
||||
void from_stdin();
|
||||
void dump();
|
||||
void regexp();
|
||||
};
|
||||
|
||||
|
||||
#endif // ENGINE_H
|
||||
92
platform.h.in
Normal file
92
platform.h.in
Normal file
@@ -0,0 +1,92 @@
|
||||
/* platform.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* "Berkeley DB C++ Header File" */
|
||||
#undef DB_CXX_HEADER
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define to 1 if you have the `fdopen' function. */
|
||||
#undef HAVE_FDOPEN
|
||||
|
||||
/* Define to 1 if you have the `fgetc' function. */
|
||||
#undef HAVE_FGETC
|
||||
|
||||
/* Define to 1 if you have the `getenv' function. */
|
||||
#undef HAVE_GETENV
|
||||
|
||||
/* Define to 1 if you have the `getopt' function. */
|
||||
#undef HAVE_GETOPT
|
||||
|
||||
/* Define to 1 if you have the `getpass' function. */
|
||||
#undef HAVE_GETPASS
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the `gdbm' library (-lgdbm). */
|
||||
#undef HAVE_LIBGDBM
|
||||
|
||||
/* Define to 1 if you have the `pcre' library (-lpcre). */
|
||||
#undef HAVE_LIBPCRE
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#undef HAVE_STDIO_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#undef LT_OBJDIR
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
1600
rijndael.cc
Normal file
1600
rijndael.cc
Normal file
File diff suppressed because it is too large
Load Diff
163
rijndael.h
Normal file
163
rijndael.h
Normal file
@@ -0,0 +1,163 @@
|
||||
#ifndef _RIJNDAEL_H_
|
||||
#define _RIJNDAEL_H_
|
||||
|
||||
//
|
||||
// File : rijndael.h
|
||||
// Creation date : Sun Nov 5 2000 03:21:05 CEST
|
||||
// Author : Szymon Stefanek (stefanek@tin.it)
|
||||
//
|
||||
// Another implementation of the Rijndael cipher.
|
||||
// This is intended to be an easily usable library file.
|
||||
// This code is public domain.
|
||||
// Based on the Vincent Rijmen and K.U.Leuven implementation 2.4.
|
||||
//
|
||||
|
||||
//
|
||||
// Original Copyright notice:
|
||||
//
|
||||
// rijndael-alg-fst.c v2.4 April '2000
|
||||
// rijndael-alg-fst.h
|
||||
// rijndael-api-fst.c
|
||||
// rijndael-api-fst.h
|
||||
//
|
||||
// Optimised ANSI C code
|
||||
//
|
||||
// authors: v1.0: Antoon Bosselaers
|
||||
// v2.0: Vincent Rijmen, K.U.Leuven
|
||||
// v2.3: Paulo Barreto
|
||||
// v2.4: Vincent Rijmen, K.U.Leuven
|
||||
//
|
||||
// This code is placed in the public domain.
|
||||
//
|
||||
|
||||
//
|
||||
// This implementation works on 128 , 192 , 256 bit keys
|
||||
// and on 128 bit blocks
|
||||
//
|
||||
|
||||
//
|
||||
// Example of usage:
|
||||
//
|
||||
// // Input data
|
||||
// unsigned char key[32]; // The key
|
||||
// initializeYour256BitKey(); // Obviously initialized with sth
|
||||
// const unsigned char * plainText = getYourPlainText(); // Your plain text
|
||||
// int plainTextLen = strlen(plainText); // Plain text length
|
||||
//
|
||||
// // Encrypting
|
||||
// Rijndael rin;
|
||||
// unsigned char output[plainTextLen + 16];
|
||||
//
|
||||
// rin.init(Rijndael::CBC,Rijndael::Encrypt,key,Rijndael::Key32Bytes);
|
||||
// // It is a good idea to check the error code
|
||||
// int len = rin.padEncrypt(plainText,len,output);
|
||||
// if(len >= 0)useYourEncryptedText();
|
||||
// else encryptError(len);
|
||||
//
|
||||
// // Decrypting: we can reuse the same object
|
||||
// unsigned char output2[len];
|
||||
// rin.init(Rijndael::CBC,Rijndael::Decrypt,key,Rijndael::Key32Bytes));
|
||||
// len = rin.padDecrypt(output,len,output2);
|
||||
// if(len >= 0)useYourDecryptedText();
|
||||
// else decryptError(len);
|
||||
//
|
||||
|
||||
extern "C" {
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
}
|
||||
|
||||
#define _MAX_KEY_COLUMNS (256/32)
|
||||
#define _MAX_ROUNDS 14
|
||||
#define MAX_IV_SIZE 16
|
||||
|
||||
// We assume that unsigned int is 32 bits long....
|
||||
typedef unsigned char UINT8;
|
||||
typedef unsigned int UINT32;
|
||||
typedef unsigned short UINT16;
|
||||
|
||||
// Error codes
|
||||
#define RIJNDAEL_SUCCESS 0
|
||||
#define RIJNDAEL_UNSUPPORTED_MODE -1
|
||||
#define RIJNDAEL_UNSUPPORTED_DIRECTION -2
|
||||
#define RIJNDAEL_UNSUPPORTED_KEY_LENGTH -3
|
||||
#define RIJNDAEL_BAD_KEY -4
|
||||
#define RIJNDAEL_NOT_INITIALIZED -5
|
||||
#define RIJNDAEL_BAD_DIRECTION -6
|
||||
#define RIJNDAEL_CORRUPTED_DATA -7
|
||||
|
||||
class Rijndael
|
||||
{
|
||||
public:
|
||||
enum Direction { Encrypt , Decrypt };
|
||||
enum Mode { ECB , CBC , CFB1 };
|
||||
enum KeyLength { Key16Bytes , Key24Bytes , Key32Bytes };
|
||||
//
|
||||
// Creates a Rijndael cipher object
|
||||
// You have to call init() before you can encrypt or decrypt stuff
|
||||
//
|
||||
Rijndael();
|
||||
~Rijndael();
|
||||
protected:
|
||||
// Internal stuff
|
||||
enum State { Valid , Invalid };
|
||||
|
||||
State m_state;
|
||||
Mode m_mode;
|
||||
Direction m_direction;
|
||||
UINT8 m_initVector[MAX_IV_SIZE];
|
||||
UINT32 m_uRounds;
|
||||
UINT8 m_expandedKey[_MAX_ROUNDS+1][4][4];
|
||||
public:
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// API
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// init(): Initializes the crypt session
|
||||
// Returns RIJNDAEL_SUCCESS or an error code
|
||||
// mode : Rijndael::ECB, Rijndael::CBC or Rijndael::CFB1
|
||||
// You have to use the same mode for encrypting and decrypting
|
||||
// dir : Rijndael::Encrypt or Rijndael::Decrypt
|
||||
// A cipher instance works only in one direction
|
||||
// (Well , it could be easily modified to work in both
|
||||
// directions with a single init() call, but it looks
|
||||
// useless to me...anyway , it is a matter of generating
|
||||
// two expanded keys)
|
||||
// key : array of unsigned octets , it can be 16 , 24 or 32 bytes long
|
||||
// this CAN be binary data (it is not expected to be null terminated)
|
||||
// keyLen : Rijndael::Key16Bytes , Rijndael::Key24Bytes or Rijndael::Key32Bytes
|
||||
// initVector: initialization vector, you will usually use 0 here
|
||||
int init(Mode mode,Direction dir,const UINT8 *key,KeyLength keyLen,UINT8 * initVector = 0);
|
||||
// Encrypts the input array (can be binary data)
|
||||
// The input array length must be a multiple of 16 bytes, the remaining part
|
||||
// is DISCARDED.
|
||||
// so it actually encrypts inputLen / 128 blocks of input and puts it in outBuffer
|
||||
// Input len is in BITS!
|
||||
// outBuffer must be at least inputLen / 8 bytes long.
|
||||
// Returns the encrypted buffer length in BITS or an error code < 0 in case of error
|
||||
int blockEncrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer);
|
||||
// Encrypts the input array (can be binary data)
|
||||
// The input array can be any length , it is automatically padded on a 16 byte boundary.
|
||||
// Input len is in BYTES!
|
||||
// outBuffer must be at least (inputLen + 16) bytes long
|
||||
// Returns the encrypted buffer length in BYTES or an error code < 0 in case of error
|
||||
int padEncrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer);
|
||||
// Decrypts the input vector
|
||||
// Input len is in BITS!
|
||||
// outBuffer must be at least inputLen / 8 bytes long
|
||||
// Returns the decrypted buffer length in BITS and an error code < 0 in case of error
|
||||
int blockDecrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer);
|
||||
// Decrypts the input vector
|
||||
// Input len is in BYTES!
|
||||
// outBuffer must be at least inputLen bytes long
|
||||
// Returns the decrypted buffer length in BYTES and an error code < 0 in case of error
|
||||
int padDecrypt(const UINT8 *input, int inputOctets, UINT8 *outBuffer);
|
||||
protected:
|
||||
void keySched(UINT8 key[_MAX_KEY_COLUMNS][4]);
|
||||
void keyEncToDec();
|
||||
void encrypt(const UINT8 a[16], UINT8 b[16]);
|
||||
void decrypt(const UINT8 a[16], UINT8 b[16]);
|
||||
};
|
||||
|
||||
#endif // _RIJNDAEL_H_
|
||||
1
samples/README
Normal file
1
samples/README
Normal file
@@ -0,0 +1 @@
|
||||
This directory contains examples how to use dbtool.
|
||||
12
samples/account-db/README
Normal file
12
samples/account-db/README
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
This is an example of how to use the new
|
||||
encryption support of dbtool.
|
||||
|
||||
accdb is a account database tool, which
|
||||
you can use (really :-) to maintain all
|
||||
your accounts in one database file.
|
||||
|
||||
Never forget a password!
|
||||
|
||||
|
||||
T.v. Dein <tlinden@cpan.org>
|
||||
112
samples/account-db/accdb
Executable file
112
samples/account-db/accdb
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# This is a little interactive tool which helps you
|
||||
# to maintain your accounts on one place.
|
||||
#
|
||||
# It uses an encrypted database for protecting the
|
||||
# account list. The tool does not work with temporary
|
||||
# files for security reasons.
|
||||
#
|
||||
# Just execute it. It will show you a little menu of
|
||||
# all available commands. That's really easy :-)
|
||||
#
|
||||
# T.v. Dein <tlinden@cpan.org>
|
||||
|
||||
|
||||
#
|
||||
# the account database
|
||||
db=~/.accdb
|
||||
|
||||
#
|
||||
# check if dbtool version is 1.4 or higher
|
||||
version=`dbtool -V 2>&1 | sed 's/[a-zA-Z .]*//g'`
|
||||
if [ "x$version" != "x" ]; then
|
||||
let res="$version < 14"
|
||||
if [ "x$res" = "x1" ]; then
|
||||
echo "This version of dbtool does not support encryption!"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "dbtool is not installed!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#
|
||||
# get the passphrase
|
||||
echo -n "Enter passphrase: "
|
||||
read PW
|
||||
|
||||
if [ "x$PW" = "x" ]; then
|
||||
echo "empty passphrase!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
#
|
||||
# store it in a local environment variable,
|
||||
# so it will not appear in the process list and
|
||||
# dbtool itself will not ask for it
|
||||
export DB_PASSPHRASE=$PW
|
||||
|
||||
|
||||
#
|
||||
# the silly menu
|
||||
function menu {
|
||||
echo
|
||||
echo -n "[L]ist [N]ew [S]earch [Q]uit> "
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# go
|
||||
echo
|
||||
menu
|
||||
|
||||
while :
|
||||
do
|
||||
read command
|
||||
|
||||
if [ "x$command" = "xL" -o "x$command" = "xl" ]; then
|
||||
echo
|
||||
if [ -e $db ]; then
|
||||
#
|
||||
# just dump all entries out. Use a custom output
|
||||
# separator for better formatting with sed :-)
|
||||
dbtool -d $db -p -D -F "<22>" | sed 's/<2F>/ => /'
|
||||
fi
|
||||
elif [ "x$command" = "xN" -o "x$command" = "xn" ]; then
|
||||
echo
|
||||
echo -n "Enter entry name: "
|
||||
read name
|
||||
if [ "x$name" = "x" ]; then
|
||||
echo "empty name!"
|
||||
else
|
||||
echo -n "Enter username: "
|
||||
read user
|
||||
echo -n "Enter password: "
|
||||
read pass
|
||||
#
|
||||
# create a new entry, separate the key and the value
|
||||
# using the pipe character, overwrite existing entry
|
||||
echo "$name| Username: $user, Password: $pass" \
|
||||
| dbtool -p -i -f -d $db -F "|"
|
||||
echo "entry $name inserted."
|
||||
fi
|
||||
elif [ "x$command" = "xS" -o "x$command" = "xs" ]; then
|
||||
echo -n "Enter search string: "
|
||||
read string
|
||||
#
|
||||
# search for the given key
|
||||
dbtool -p -d $db -s -k $string
|
||||
elif [ "x$command" = "xQ" -o "x$command" = "xq" ]; then
|
||||
echo
|
||||
echo "Thanks for the fish."
|
||||
echo
|
||||
exit 0
|
||||
fi
|
||||
|
||||
menu
|
||||
done
|
||||
|
||||
#
|
||||
# clear the environment variable. just in case...
|
||||
unset DB_PASSPHRASE
|
||||
19
samples/locate/README
Normal file
19
samples/locate/README
Normal file
@@ -0,0 +1,19 @@
|
||||
just an example showing what's possible
|
||||
with dbtool. These two shell scripts
|
||||
are doing the same job as GNU locate.
|
||||
|
||||
updatedb
|
||||
creates a database which contains
|
||||
every file (with path) of a system
|
||||
along with all it's attributes.
|
||||
|
||||
locate
|
||||
searches in this database using
|
||||
user supplied regular expressions
|
||||
|
||||
You need to edit both scripts to suit
|
||||
your system.
|
||||
|
||||
|
||||
|
||||
T.v. Dein <tlinden@cpan.org>
|
||||
24
samples/locate/locate
Executable file
24
samples/locate/locate
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# simple locate alike
|
||||
# written as an example how to
|
||||
# use dbtool.
|
||||
#
|
||||
# locate searches the database
|
||||
# for a file which matches a
|
||||
# certain string. The parameter
|
||||
# to locate can be a fully perl-
|
||||
# compliant regular expression.
|
||||
#
|
||||
|
||||
dbtool="/usr/bin/dbtool";
|
||||
find="/usr/bin/find";
|
||||
db="/var/local/locate.db";
|
||||
sort="/bin/sort";
|
||||
regex=$1;
|
||||
|
||||
if [ "x$regex" != "x" ]; then
|
||||
$dbtool -d $db -S -k $regex -w -R;
|
||||
else
|
||||
echo "Usage: locate <expression>";
|
||||
fi
|
||||
25
samples/locate/locate~
Executable file
25
samples/locate/locate~
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# simple locate alike
|
||||
# written as an example how to
|
||||
# use dbtool.
|
||||
#
|
||||
# locate searches the database
|
||||
# for a file which matches a
|
||||
# certain string. The parameter
|
||||
# to locate can be a fully perl-
|
||||
# compliant regular expression.
|
||||
#
|
||||
# $Id: locate,v 1.3 2001/06/26 23:00:02 scip Exp $
|
||||
|
||||
dbtool="/usr/bin/dbtool";
|
||||
find="/usr/bin/find";
|
||||
db="/var/local/locate.db";
|
||||
sort="/bin/sort";
|
||||
regex=$1;
|
||||
|
||||
if [ "x$regex" != "x" ]; then
|
||||
$dbtool -d $db -S -k $regex -w -R;
|
||||
else
|
||||
echo "Usage: locate <expression>";
|
||||
fi
|
||||
19
samples/locate/updatedb
Executable file
19
samples/locate/updatedb
Executable file
@@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# simple locate alike
|
||||
# written as an example how to
|
||||
# use dbtool.
|
||||
#
|
||||
# updatedb creates the database
|
||||
# which is then used by locate
|
||||
# to search for a certain string.
|
||||
#
|
||||
|
||||
dbtool="/usr/bin/dbtool";
|
||||
find="/usr/bin/find";
|
||||
db="/var/local/locate.db";
|
||||
egrep="/bin/egrep";
|
||||
cp="/bin/cp"
|
||||
|
||||
$cp /dev/null $db;
|
||||
$find / -ls | $egrep -v "^\/proc|dev|tmp" | $dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$";
|
||||
21
samples/locate/updatedb~
Executable file
21
samples/locate/updatedb~
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# simple locate alike
|
||||
# written as an example how to
|
||||
# use dbtool.
|
||||
#
|
||||
# updatedb creates the database
|
||||
# which is then used by locate
|
||||
# to search for a certain string.
|
||||
#
|
||||
# $Id: updatedb,v 1.2 2001/06/26 23:00:02 scip Exp $
|
||||
#
|
||||
|
||||
dbtool="/usr/bin/dbtool";
|
||||
find="/usr/bin/find";
|
||||
db="/var/local/locate.db";
|
||||
egrep="/bin/egrep";
|
||||
cp="/bin/cp"
|
||||
|
||||
$cp /dev/null $db;
|
||||
$find / -ls | $egrep -v "^\/proc|dev|tmp" | $dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$";
|
||||
11
samples/uback/README
Normal file
11
samples/uback/README
Normal file
@@ -0,0 +1,11 @@
|
||||
uback is a backup script which uses dbtool to
|
||||
maintain catalog databases of the files which
|
||||
have backed up.
|
||||
|
||||
Download uback from the following location:
|
||||
|
||||
ftp://www.0x49.org/scip/Scripts/uback-1.2.tar.gz
|
||||
|
||||
|
||||
|
||||
T.v. Dein <tlinden@cpan.org>
|
||||
Reference in New Issue
Block a user