20 Commits

Author SHA1 Message Date
c3555ac775 clean up file before running 2025-11-21 00:31:31 +01:00
22a822e259 rm debug code 2025-11-21 00:30:18 +01:00
eeaddab5b0 use bool 2025-11-21 00:29:21 +01:00
e6b8985090 add error if no db lib found, add better ci build and test 2025-11-21 00:21:26 +01:00
b3cf8df094 add berkeley db 2025-11-21 00:08:16 +01:00
806bf69eae fix prec2 apk name 2025-11-21 00:05:40 +01:00
4a433ae438 updated ci to use meson/ninja 2025-11-21 00:02:00 +01:00
cc147e7cae completed meson/ninja build 2025-11-20 23:46:08 +01:00
c5953d152b fixed compiler warnings and errors 2025-11-20 23:45:47 +01:00
7b697a5e97 try meson+ninja 2025-11-18 21:18:18 +01:00
4a23ca80f2 fix pcre 2025-11-16 21:23:24 +01:00
2066113885 fix pkgconfig 2025-11-16 21:21:08 +01:00
9fba1e1967 fix gdbm pkg name 2025-11-16 21:19:50 +01:00
fda32b6105 +pkg-config 2025-11-16 21:18:37 +01:00
f491714658 dbg 2025-11-16 21:00:26 +01:00
72f53966fc +configure 2025-11-16 20:56:23 +01:00
be73ecbf9c got to codeberg 2025-11-16 20:55:18 +01:00
git@daemon.de
4b6bca7b0d berkeley makro still had bugs 2015-05-16 09:50:43 +02:00
git@daemon.de
0a153bfdb4 fixed configure flags, bump version 2015-05-16 00:15:14 +02:00
git@daemon.de
ad8681f0d1 rm bashisms, applied port patch 2015-05-16 00:14:14 +02:00
21 changed files with 741 additions and 501 deletions

33
.woodpecker/build.yaml Normal file
View File

@@ -0,0 +1,33 @@
matrix:
platform:
- linux/amd64
labels:
platform: ${platform}
steps:
build-berkeley:
when:
event: [push]
image: alpine:latest
commands:
- apk update
- apk add --no-cache bash build-base words-en gdb perl pcre2 pcre2-dev db db-dev pkgconfig meson ninja
- meson setup --reconfigure build
- ninja -C build
- rm -f test.db
- build/dbtool -d test.db -i -k "test" -v "blah blah blah"
- build/dbtool -d test.db -D | grep blah
build-gdbm:
when:
event: [push]
image: alpine:latest
commands:
- apk update
- apk add --no-cache bash build-base words-en gdb perl pcre2 pcre2-dev gdbm gdbm-dev pkgconfig meson ninja
- meson setup --reconfigure build
- ninja -C build
- rm -f test.db
- build/dbtool -d test.db -i -k "test" -v "blah blah blah"
- build/dbtool -d test.db -D | grep blah

54
.woodpecker/release.sh Executable file
View File

@@ -0,0 +1,54 @@
#!/bin/bash
# This is my own simple codeberg generic releaser. It takes to
# binaries to be uploaded as arguments and takes every other args from
# env. Works on tags or normal commits (push), tags must start with v.
set -e
die() {
echo $*
exit 1
}
if test -z "$DEPLOY_TOKEN"; then
die "token DEPLOY_TOKEN not set"
fi
git fetch --all
# determine current tag or commit hash
version="$CI_COMMIT_TAG"
previous=""
log=""
if test -z "$version"; then
version="${CI_COMMIT_SHA:0:6}"
log=$(git log -1 --oneline)
else
previous=$(git tag -l | grep -E "^v" | tac | grep -A1 "$version" | tail -1)
log=$(git log -1 --oneline "${previous}..${version}" | sed 's|^|- |g')
fi
# release body
printf "# Changes\n\n %s\n" "$log" > body.txt
# create the release
https --ignore-stdin --check-status -b -A bearer -a "$DEPLOY_TOKEN" POST \
"https://codeberg.org/api/v1/repos/${CI_REPO_OWNER}/${CI_REPO_NAME}/releases" \
tag_name="$version" name="Release $version" body=@body.txt > release.json
# we need the id to upload files
ID=$(jq -r .id < release.json)
if test -z "$ID"; then
cat release.json
die "failed to create release"
fi
# actually upload
for file in "$@"; do
https --ignore-stdin --check-status -A bearer -a "$DEPLOY_TOKEN" -f POST \
"https://codeberg.org/api/v1/repos/${CI_REPO_OWNER}/${CI_REPO_NAME}/releases/$ID/assets" \
"name=${file}-${version}" "attachment@${file}"
done

29
.woodpecker/release.yaml Normal file
View File

@@ -0,0 +1,29 @@
# build release
labels:
platform: linux/amd64
steps:
compile:
when:
event: [manual]
image: alpine:latest
commands:
- apk update
- apk add --no-cache bash build-base words-en gdb perl pcre2 pcre2-dev gdbm gdbm-dev pkgconfig meson ninja
- meson setup --reconfigure --prefer-static build
- ninja -C build
- file build/dbtool
- mv build/dbtool dbtool-linux-amd64
release:
image: alpine:latest
when:
event: [manual]
environment:
DEPLOY_TOKEN:
from_secret: DEPLOY_TOKEN
commands:
- apk update
- apk add --no-cache bash httpie jq git
- .woodpecker/release.sh dbtool-linux-amd64

View File

@@ -1,3 +1,9 @@
1.9.1:
- fixed messed up configure flags, backward, be compatible again
- fixed berkeley m4 makro, again
- removed bashisms in samples
- applied patch of freebsd port
1.9: 1.9:
- rewrote configure, it better finds berkeley - rewrote configure, it better finds berkeley
db or gdbm. db or gdbm.

5
README
View File

@@ -20,9 +20,12 @@ And the berkeley library at: http://www.sleepycat.com.
Installation Installation from source
============================================================ ============================================================
If you build directly from the git repo, you'll need to generate the
configure script first with 'autogen.sh'.
For installation run: For installation run:
% ./configure % ./configure

View File

@@ -1 +1 @@
1.9 1.9.1

View File

@@ -79,18 +79,22 @@ string cipher::encrypt(const string& source) {
rijn.init(Rijndael::CBC, Rijndael::Encrypt, key, Rijndael::Key32Bytes); rijn.init(Rijndael::CBC, Rijndael::Encrypt, key, Rijndael::Key32Bytes);
/* encrypt the source */ /* encrypt the source */
unsigned char output[size + 16]; unsigned char *output = (unsigned char *)malloc(size + 16);
int res = rijn.padEncrypt(plainText, (int)size, output); int res = rijn.padEncrypt(plainText, (int)size, output);
/* convert the result back to char[] */ /* convert the result back to char[] */
char outText[res]; char *outText = (char *)malloc(res);
for(int y=0; y<(res); y++) { for(int y=0; y<(res); y++) {
outText[y] = output[y]; outText[y] = output[y];
} }
free(output);
/* return the crypted string */ /* return the crypted string */
if (res >= 0) { if(res >= 0) {
return string(outText, res); string text = string(outText, res);
free(outText);
return text;
} }
else { else {
cerr << "Failed to encrypt: " << error(res) << "!" << endl; cerr << "Failed to encrypt: " << error(res) << "!" << endl;
@@ -113,18 +117,23 @@ string cipher::decrypt(const string& source) {
rijn.init(Rijndael::CBC, Rijndael::Decrypt, key, Rijndael::Key32Bytes); rijn.init(Rijndael::CBC, Rijndael::Decrypt, key, Rijndael::Key32Bytes);
/* decrypt the source */ /* decrypt the source */
unsigned char output[size]; unsigned char *output = (unsigned char *)malloc(size);
int res = rijn.padDecrypt(cryptedText, (int)size, output); int res = rijn.padDecrypt(cryptedText, (int)size, output);
/* convert the result back to char[] */ /* convert the result back to char[] */
char outText[res]; char *outText = (char *)malloc(res);
for(int y=0; y<(res); y++) { for(int y=0; y<(res); y++) {
outText[y] = output[y]; outText[y] = output[y];
} }
free(output);
/* return the decrypted string */ /* return the decrypted string */
if (res >= 0) if (res >= 0) {
return string(outText, res); string text = string(outText, res);
free(outText);
return text;
}
else { else {
cerr << "Failed to decrypt: " << error(res) << " (passphrase invalid?) !" << endl; cerr << "Failed to decrypt: " << error(res) << " (passphrase invalid?) !" << endl;
exit(1); exit(1);

View File

@@ -75,11 +75,11 @@ AC_DEFUN([AX_BERKELEY_DB_CXX],
AC_MSG_CHECKING([for Berkeley DB (C++)]) AC_MSG_CHECKING([for Berkeley DB (C++)])
else else
minvermajor=`echo $minversion | cut -d. -f1` minvermajor=`echo $minversion | cut -d. -f1`
minverminor=`echo $minversion | cut -d. -f2` minverminor=`echo $minversion | cut -d. -f2 -s`
minverpatch=`echo $minversion | cut -d. -f3` minverpatch=`echo $minversion | cut -d. -f3 -s`
minvermajor=${minvermajor:-0} if test -z "$minvermajor"; then minvermajor=0; fi
minverminor=${minverminor:-0} if test -z "$minverminor"; then minverminor=0; fi
minverpatch=${minverpatch:-0} if test -z "$minverpatch"; then minverpatch=0; fi
AC_MSG_CHECKING([for Berkeley DB (C++) >= $minvermajor.$minverminor.$minverpatch]) AC_MSG_CHECKING([for Berkeley DB (C++) >= $minvermajor.$minverminor.$minverpatch])
fi fi
@@ -95,12 +95,12 @@ AC_DEFUN([AX_BERKELEY_DB_CXX],
for version in "${major}.${minor}" "${major}${minor}"; do for version in "${major}.${minor}" "${major}${minor}"; do
try_libs="-ldb_cxx-${version}%-ldb-${version} -ldb${version}_cxx%-ldb${version}" 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" try_headers="db${major}.${minor}/db_cxx.h db${major}${minor}/db_cxx.h db${major}/db_cxx.h"
for db_cxx_hdr in $try_headers ; do for db_cxx_hdr in $try_headers ; do
for db_cxx_lib in $try_libs; do for db_cxx_lib in $try_libs; do
db_cxx_lib="$libdbdir `echo "$db_cxx_lib" | sed 's/%/ /g'`" db_cxx_lib="$libdbdir `echo "$db_cxx_lib" | sed 's/%/ /g'`"
LIBS="$old_LIBS $db_cxx_lib" LIBS="$old_LIBS $db_cxx_lib"
#echo "Trying <$db_cxx_lib> <$db_cxx_hdr>"
if test -z $DB_CXX_HEADER ; then if test -z $DB_CXX_HEADER ; then
AC_LINK_IFELSE( AC_LINK_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(

View File

@@ -2,7 +2,7 @@
AC_PREREQ(2.61) AC_PREREQ(2.61)
define([dbtoolversion], esyscmd([sh -c "cat VERSION|head -1"])) define([dbtoolversion], esyscmd([sh -c "cat VERSION"]))dnl
# what we are compiling # what we are compiling
AC_INIT([dbtool], [dbtoolversion], [tlinden@cpan.org]) AC_INIT([dbtool], [dbtoolversion], [tlinden@cpan.org])
@@ -104,8 +104,31 @@ PCRE="no"
# configure args # configure args
AC_ARG_WITH([berkeley],
[AS_HELP_STRING([--with-berkeley],
[Use berkeley library ])])
if test "x$with_berkeley" = "xno"; then
BERKELEY=no
GDBM=yes
elif test "x$with_berkeley" = "xyes"; then
BERKELEY=yes
GDBM=no
fi
AC_ARG_WITH([gdbm], AC_ARG_WITH([gdbm],
[AS_HELP_STRING([--with-gdbm=DIR], [AS_HELP_STRING([--with-gdbm],
[Use GNU gdbm library ])])
if test "x$with_gdbm" = "xno"; then
GDBM=no
elif test "x$with_gdbm" = "xyes"; then
GDBM=yes
fi
AC_ARG_WITH([gdbm-dir],
[AS_HELP_STRING([--with-gdbm-dir=DIR],
[Use GNU gdbm library in DIR])], [Use GNU gdbm library in DIR])],
[ [
AC_MSG_CHECKING([checking $with_gdbm_dir/include/gdbm.h presence]) AC_MSG_CHECKING([checking $with_gdbm_dir/include/gdbm.h presence])
@@ -114,14 +137,16 @@ AC_ARG_WITH([gdbm],
CFLAGS="$CXXFLAGS" CFLAGS="$CXXFLAGS"
LDFLAGS="-L$with_gdbm_dir/lib $LDFLAGS" LDFLAGS="-L$with_gdbm_dir/lib $LDFLAGS"
LIBS="-lgdbm" LIBS="-lgdbm"
GDBM=yes
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
else else
GDBM=no
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
]) ])
AC_ARG_WITH([pcre], AC_ARG_WITH([pcre-dir],
[AS_HELP_STRING([--with-pcre=DIR], [AS_HELP_STRING([--with-pcre-dir=DIR],
[Use GNU pcre library in DIR])], [Use GNU pcre library in DIR])],
[ [
AC_MSG_CHECKING([checking $with_pcre_dir/include/pcre.h presence]) AC_MSG_CHECKING([checking $with_pcre_dir/include/pcre.h presence])
@@ -186,7 +211,7 @@ if test "$GDBM" = "no"; then
export LDFLAGS export LDFLAGS
export LIBS export LIBS
export CXXFLAGS export CXXFLAGS
AX_BERKELEY_DB_CXX([4.0.0],[ AX_BERKELEY_DB_CXX([4],[
LDFLAGS="$DB_CXX_LIBS $LDFLAGS" LDFLAGS="$DB_CXX_LIBS $LDFLAGS"
BERKELEY="yes" BERKELEY="yes"
],[BERKELEY="no"]) ],[BERKELEY="no"])

View File

@@ -77,7 +77,7 @@ int main(int argc, char *argv[]) {
engine.dump(); engine.dump();
break; break;
case 'I': case 'I':
engine.from_stdin(); engine.from_input();
break; break;
case 's': case 's':
/* select */ /* select */
@@ -127,7 +127,6 @@ int main(int argc, char *argv[]) {
string readpass() { string readpass() {
char *pass;
char *envpass; char *envpass;
envpass = getenv(PW_VARNAME); envpass = getenv(PW_VARNAME);
if(envpass != NULL) { if(envpass != NULL) {
@@ -136,7 +135,7 @@ string readpass() {
} }
else { else {
#ifdef HAVE_GETPASS #ifdef HAVE_GETPASS
pass = getpass("passphrase: "); char *pass = getpass("passphrase: ");
string password = pass; string password = pass;
free(pass); free(pass);
#else #else

View File

@@ -139,7 +139,7 @@ or the parameter of B<-F>.
=head1 EXPRESSIONS =head1 EXPRESSIONS
Regular expressions are provided using the B<PCRE Library>. It supports most of Regular expressions are provided using the B<PCRE Library>. It supports most of
the features which perl provides. See the section <EFBFBD>DIFFERENCES FROM PERL<EFBFBD> in the PCRE the features which perl provides. See the section "DIFFERENCES FROM PERL" in the PCRE
manpage. You can also take a look to the perl regular expression man page with manpage. You can also take a look to the perl regular expression man page with
the following command: the following command:
@@ -247,7 +247,7 @@ and it's attributes.
=head1 REPORTING BUGS =head1 REPORTING BUGS
Report bugs on L<https://github.com/tlinden/dbtool/issues> or mail to <tlinden@cpan.org>. Report bugs on L<https://codeberg.org/scip/dbtool/issues> or mail to <tlinden@cpan.org>.
=head1 COPYRIGHT =head1 COPYRIGHT

754
engine.cc
View File

@@ -45,8 +45,6 @@
*/ */
#include "dbtool.h" #include "dbtool.h"
#include "engine.h" #include "engine.h"
#include "platform.h" #include "platform.h"
@@ -88,12 +86,12 @@ void Engine::init() {
#else #else
db = gdbm_open( db = gdbm_open(
(char *)config.filename.c_str(), (char *)config.filename.c_str(),
BLOCKSIZE, BLOCKSIZE,
mode, mode,
FILEMODE, FILEMODE,
0 0
); );
#endif #endif
} }
else { else {
@@ -104,12 +102,12 @@ void Engine::init() {
} }
#else #else
db = gdbm_open( db = gdbm_open(
(char *)config.filename.c_str(), (char *)config.filename.c_str(),
BLOCKSIZE, BLOCKSIZE,
mode, mode,
FILEMODE, FILEMODE,
0 0
); );
#endif #endif
} }
#ifndef HAVE_BERKELEY #ifndef HAVE_BERKELEY
@@ -150,10 +148,10 @@ void Engine::dump() {
string K((char *)key.get_data(), key.get_size()); string K((char *)key.get_data(), key.get_size());
string V((char *)data.get_data(), data.get_size()); string V((char *)data.get_data(), data.get_size());
if(config.reverse == 1) { if(config.reverse == 1) {
cout << decode(V) << config.separator << K << endl; cout << decode(V) << config.separator << K << endl;
} }
else { else {
cout << K << config.separator << decode(V) << endl; cout << K << config.separator << decode(V) << endl;
} }
} }
dbcp->close(); dbcp->close();
@@ -173,7 +171,7 @@ void Engine::dump() {
string V(value.dptr, value.dsize); string V(value.dptr, value.dsize);
if(config.reverse == 1) { if(config.reverse == 1) {
cout << decode(V) << config.separator << K << endl; cout << decode(V) << config.separator << K << endl;
} }
else { else {
cout << K << config.separator << decode(V) << endl; cout << K << config.separator << decode(V) << endl;
} }
@@ -184,31 +182,43 @@ void Engine::dump() {
} }
/* /*
* search for regexp given in config.key * search for regexp given in config.key
*/ */
void Engine::regexp() { void Engine::regexp() {
init(); init();
int num; int num;
pcre *p_pcre;
pcre_extra *p_pcre_extra;
char *err_str;
int sub_len = 9; int sub_len = 9;
int *sub_vec; int *sub_vec;
int erroffset; int errnumber;
p_pcre_extra = NULL; PCRE2_SIZE erroffset;
p_pcre = pcre_compile((char *)config.key.c_str(), 0, pcre2_match_data *match_data;
(const char **)(&err_str), &erroffset, NULL);
pcre2_code *p_pcre = pcre2_compile(
(PCRE2_SPTR)config.key.c_str(), /* the pattern */
PCRE2_ZERO_TERMINATED, /* indicates pattern is zero-terminated */
0, /* default options */
&errnumber, /* for error number */
&erroffset, /* for error offset */
NULL); /* use default compile context */
if (p_pcre == NULL) {
PCRE2_UCHAR buffer[256];
pcre2_get_error_message(errnumber, buffer, sizeof(buffer));
cerr << "PCRE2 compilation failed at offset: " << erroffset << " with: " << buffer << endl;
exit(1);
}
match_data = pcre2_match_data_create_from_pattern(p_pcre, NULL);
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
Dbc *dbcp; Dbc *dbcp;
db->cursor(NULL, &dbcp, 0); db->cursor(NULL, &dbcp, 0);
Dbt key; Dbt key;
Dbt data; Dbt data;
while (dbcp->get(&key, &data, DB_NEXT) == 0) { while (dbcp->get(&key, &data, DB_NEXT) == 0) {
string K((char *)key.get_data(), key.get_size()); string K((char *)key.get_data(), key.get_size());
string V((char *)data.get_data(), data.get_size()); string V((char *)data.get_data(), data.get_size());
#else #else
datum key; datum key;
datum value; datum value;
@@ -218,23 +228,24 @@ void Engine::regexp() {
string K(key.dptr, key.dsize); string K(key.dptr, key.dsize);
string V(value.dptr, value.dsize); string V(value.dptr, value.dsize);
#endif #endif
sub_vec = new int(sub_len); sub_vec = new int(sub_len);
num = pcre_exec(p_pcre, p_pcre_extra, (char *)K.c_str(), num = pcre2_match(p_pcre, (PCRE2_SPTR)K.c_str(), (PCRE2_SIZE)K.length(), 0, 0, match_data, NULL);
(int)K.length(), 0, 0, (int *)sub_vec, sub_len);
if(num == 1){ if(num == 1){
if(config.reverse == 1) { if(config.reverse == 1) {
cout << decode(V); cout << decode(V);
if(config.with == 1) { if(config.with == 1) {
cout << config.separator << K; cout << config.separator << K;
} }
cout << endl; cout << endl;
} }
else { else {
if(config.with == 1) { if(config.with == 1) {
cout << K << config.separator; cout << K << config.separator;
} }
cout << decode(V) << endl; cout << decode(V) << endl;
} }
} }
K = ""; K = "";
V = ""; V = "";
@@ -243,365 +254,392 @@ void Engine::regexp() {
key = gdbm_nextkey(db,key); key = gdbm_nextkey(db,key);
#endif #endif
} }
pcre_free(p_pcre);
pcre2_match_data_free(match_data);
pcre2_code_free(p_pcre);
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
dbcp->close(); dbcp->close();
db->close(0); db->close(0);
#else #else
gdbm_close(db); gdbm_close(db);
#endif #endif
} }
/*
* Insert data into the db
*/
void Engine::from_input() {
/* init();
* Insert data into the db
*/
void Engine::from_stdin() {
init();
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
int err; int err;
#else #else
int ret; int ret;
#endif #endif
FILE *stream; FILE *stream;
stream = fdopen(0, "r"); stream = fdopen(0, "r");
char c; char c;
string mode = "key"; string mode = "key";
string key = ""; string key = "";
string value = ""; string value = "";
string line = ""; string line = "";
int num;
int errnumber;
PCRE2_SIZE erroffset;
pcre2_match_data *match_data;
PCRE2_SIZE *ovector;
pcre2_code *p_pcre = pcre2_compile(
(PCRE2_SPTR)config.token.c_str(),
PCRE2_ZERO_TERMINATED,
0,
&errnumber,
&erroffset,
NULL);
if (p_pcre == NULL) {
PCRE2_UCHAR buffer[256];
pcre2_get_error_message(errnumber, buffer, sizeof(buffer));
cerr << "PCRE2 compilation failed at offset: " << erroffset << " with: " << buffer << endl;
exit(1);
}
match_data = pcre2_match_data_create_from_pattern(p_pcre, NULL);
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) { while((c = fgetc(stream)) != EOF) {
if(c == '\n') { if(c == '\n') {
// record end // record end
mode = "key"; mode = "key";
if(config.token != "") { if(config.token != "") {
v1 = new char[line.length()]; //char **subs = new char*[2];
v2 = new char[line.length()]; char *subs[2];
sub_vec = new int[sub_len];
num = pcre_exec(p_pcre, p_pcre_extra, (char *)line.c_str(), num = pcre2_match(p_pcre, (PCRE2_SPTR)line.c_str(), (PCRE2_SIZE)line.length(), 0, 0, match_data, NULL);
(int)line.length(), 0, 0, (int *)sub_vec, sub_len);
if(num < 0) if(num < 0)
cerr << "Token \"" << config.token << "\" did not match on \"" << line << "\"!\n"; cerr << "Token \"" << config.token << "\" did not match on \"" << line << "\"!\n";
else if(num == 1) else if(num == 1)
cerr << "Token " << config.token << " did not produce sub strings!\n"; cerr << "Token " << config.token << " did not produce sub strings!\n";
else { else {
match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 1, v1, line.length()); ovector = pcre2_get_ovector_pointer(match_data);
match = pcre_copy_substring((char *)line.c_str(), sub_vec, num, 2, v2, line.length());
if(config.reverse) { for (int i = 0; i < num; i++) {
value = v1; char * substring_start = const_cast<char*>(line.c_str()) + ovector[2*i];
key = v2;
} if (i == 2) {
else { break;
value = v2; }
key = v1;
} subs[i] = substring_start;
} }
delete(sub_vec);
pcre_free((void *)v1); free(ovector);
pcre_free((void *)v2);
line = ""; if(config.reverse) {
} value = subs[0];
value = encode(value); key = subs[1];
}
else {
value = subs[1];
key = subs[0];
}
}
//delete(subs);
line = "";
}
value = encode(value);
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
Dbt d_key((char *)key.c_str(), key.length()); Dbt d_key((char *)key.c_str(), key.length());
Dbt d_value((char *)value.c_str(), value.length()); Dbt d_value((char *)value.c_str(), value.length());
#else #else
datum d_key = {(char *)key.c_str(), key.length()}; datum d_key = {(char *)key.c_str(), key.length()};
datum d_value = {(char *)value.c_str(), value.length()}; datum d_value = {(char *)value.c_str(), value.length()};
#endif #endif
if(config.force == 1) { if(config.force == 1) {
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
if((err = db->put(0, &d_key, &d_value, 0)) != 0) { if((err = db->put(0, &d_key, &d_value, 0)) != 0) {
cerr << "Database error" << "(" << strerror(err) << ")" << endl; cerr << "Database error" << "(" << strerror(err) << ")" << endl;
exit(1); exit(1);
} }
#else #else
ret = gdbm_store(db, d_key, d_value, GDBM_REPLACE); ret = gdbm_store(db, d_key, d_value, GDBM_REPLACE);
#endif #endif
} }
else { else {
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
if((err = db->put(NULL, &d_key, &d_value, DB_NOOVERWRITE)) != 0) { if((err = db->put(NULL, &d_key, &d_value, DB_NOOVERWRITE)) != 0) {
if(err == DB_KEYEXIST) { if(err == DB_KEYEXIST) {
cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl; cerr << "Key " + config.key + " already exists" << "(" << strerror(err) << ")" << endl;
exit(1); exit(1);
} }
else { else {
cerr << "Database error" << "(" << strerror(err) << ")" << endl; cerr << "Database error" << "(" << strerror(err) << ")" << endl;
exit(1); exit(1);
} }
} }
#else #else
ret = gdbm_store(db, d_key, d_value, GDBM_INSERT); ret = gdbm_store(db, d_key, d_value, GDBM_INSERT);
#endif #endif
} }
#ifndef HAVE_BERKELEY #ifndef HAVE_BERKELEY
if(ret != 0) { if(ret != 0) {
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
exit(1); exit(1);
}
#endif
key = "";
value = "";
continue;
} }
#endif else if(c == config.separator && mode != "value" && config.token == "") {
key = ""; // key ready, the following stuff is the data!
value = ""; mode = "value";
continue; continue;
} }
else if(c == config.separator && mode != "value" && config.token == "") { if(config.token != "") {
// key ready, the following stuff is the data! /* we have a split token */
mode = "value"; line += char(c);
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 { else {
cerr << "Database error" << "(" << strerror(err) << ")" << endl; if(mode == "key")
exit(1); key += char(c);
else
value += char(c);
} }
} }
pcre2_match_data_free(match_data);
pcre2_code_free(p_pcre);
#ifdef HAVE_BERKELEY
db->close(0);
#else #else
ret = gdbm_store(db, key, value, GDBM_INSERT); gdbm_close(db);
#endif #endif
} }
/*
* Insert data into the db
*/
void Engine::insert() {
init();
string __value;
__value = encode(config.value);
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
db->close(0); 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 #else
if(ret != 0) { int ret;
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl; datum key = {(char *)config.key.c_str(), config.key.length()};
exit(1); datum value = {(char *)__value.c_str(), __value.length()};
}
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 #endif
if(config.force == 1) { if(config.force == 1) {
#ifdef HAVE_BERKELEY #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) { if((err = db->put(0, &key, &value, 0)) != 0) {
cerr << "Database error" << "(" << strerror(err) << ")" << endl; cerr << "Database error" << "(" << strerror(err) << ")" << endl;
exit(1); exit(1);
} }
#else
ret = gdbm_store(db, key, value, GDBM_REPLACE);
#endif
} }
else if(err == DB_NOTFOUND) { else {
cerr << "Key " << config.key << " does not exist\n"; #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); 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();
#ifdef HAVE_BERKELEY
Dbt key((char *)config.key.c_str(), config.key.length() + 1);
int ret;
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()};
int ret;
if((ret = gdbm_delete(db, key)) != 0) {
cerr << "Database error" << "(" << strerror(ret) << ")" << endl;
exit(1);
}
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 { else {
cerr << "Database error" << "(" << strerror(err) << ")" << endl; cerr << "Database error" << "(" << strerror(err) << ")" << endl;
exit(1); exit(1);
} }
db->close(0);
#else #else
ret = gdbm_exists(db, key); datum content;
if(ret) { datum key = {(char *)config.key.c_str(), config.key.length()};
ret = gdbm_store(db, key, value, GDBM_REPLACE); content = gdbm_fetch(db, key);
} string V(content.dptr, content.dsize);
else { if(config.with == 1)
cerr << "Key " << config.key << " does not exist\n"; cout << config.key << config.separator;
exit(1); cout << decode(V) << endl;
} gdbm_close(db);
#endif #endif
} }
#ifdef HAVE_BERKELEY
db->close(0);
#else
if(ret != 0) {
cerr << pkg << ": " << gdbm_strerror(gdbm_errno) << endl;
exit(1);
}
gdbm_close(db);
#endif
}
string Engine::encode(const string& data) {
if(config.encrypted) {
/* return rijn.encrypt(data);
* 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 { else
if(config.with == 1) { return data;
cout << config.key << config.separator; }
}
cout << decode(gotvalue) << endl; string Engine::decode(const string& data) {
if(config.encrypted) {
return rijn.decrypt(data);
} }
else
return data;
} }
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;
}

View File

@@ -58,9 +58,10 @@
#include <string> #include <string>
extern "C" { extern "C" {
#include "platform.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <pcre.h> #include <pcre2.h>
} }
#ifdef HAVE_BERKELEY #ifdef HAVE_BERKELEY
@@ -74,8 +75,7 @@ extern "C" {
#endif #endif
#endif #endif
#include "platform.h" #include <db_cxx.h>
#include DB_CXX_HEADER
#else #else
@@ -117,7 +117,7 @@ class Engine {
void update(); void update();
void remove(); void remove();
void select(); void select();
void from_stdin(); void from_input();
void dump(); void dump();
void regexp(); void regexp();
}; };

120
meson.build Normal file
View File

@@ -0,0 +1,120 @@
project(
'dbtool',
'cpp',
license: 'GPL',
version: '1.9.1',
meson_version: '>=1.3',
default_options: [
'warning_level=2',
'werror=true',
],
)
add_project_arguments(
[
'-Wno-unused-parameter',
'-Wno-unused-result',
'-Wno-missing-braces',
'-Wno-format-zero-length',
'-Wvla',
'-Wno-sign-compare',
'-Wno-narrowing'
],
language: 'cpp',
)
cpp = meson.get_compiler('cpp')
conf = configuration_data()
dbtool_inc = include_directories('.')
if host_machine.system().startswith('freebsd')
dbtool_inc = include_directories('.', '/usr/local/include')
add_project_link_arguments('LDFLAGS=/usr/local/lib')
endif
# check for funcs.
foreach func : ['getopt', 'fdopen', 'fgetc', 'getenv', 'getpass']
conf.set('HAVE_'+func.to_upper(), cpp.has_function(func, prefix : '#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>'))
endforeach
# check for libraries with CMAKE or pkg-config
pcre2 = dependency('libpcre2-8')
# manually check for libraries
lib_berkeley = cpp.find_library('db_cxx', required: false,
dirs : ['/usr', '/usr/local'])
inc_berkeley = include_directories('/usr', '/usr/local')
lib_gdbm = cpp.find_library('gdbm', required: false,
dirs : ['/usr', '/usr/local'])
inc_gdbm = include_directories('/usr', '/usr/local')
if not lib_gdbm.found() and not lib_berkeley.found()
error('neither GDBM nor BerkeleyDB are installed')
endif
# check commandline options
prefix = get_option('prefix')
if get_option('buildtype') == 'debug'
conf.set('DEBUG', '1')
endif
# setup conf map
version = '@0@'.format(meson.project_version())
conf.set('HAVE_LIBPCRE', pcre2.found())
conf.set('HAVE_BERKELEY', lib_berkeley.found())
conf.set('HAVE_GDBM', lib_gdbm.found())
conf.set('prefix', prefix)
conf.set('VERSION', version)
# write out the config header
m = configure_file(
input : 'platform.h.in',
output : 'platform.h',
configuration : conf,
)
# code
dbtool_sources = files(
'cipher.cc',
'config.cc',
'dbtool.cc',
'digest.cc',
'engine.cc',
'rijndael.cc'
)
# add dependencies, manual libs are added directly below
dbtool_deps = [
pcre2
]
executable(
'dbtool',
[dbtool_sources],
include_directories: [dbtool_inc, inc_berkeley, inc_gdbm],
dependencies: [dbtool_deps, lib_berkeley, lib_gdbm],
install: true
)
# build manual page
pod2man = find_program('pod2man', native: true)
if pod2man.found()
res = run_command(pod2man.full_path(), 'dbtool.pod', 'dbtool.1', check:true)
if res.returncode() == 0
install_man('dbtool.1')
endif
endif

1
meson_options.txt Normal file
View File

@@ -0,0 +1 @@
# custom build options

View File

@@ -1,92 +1,19 @@
/* platform.h.in. Generated from configure.ac by autoheader. */ /* platform.h.in. Generated from configure.ac by autoheader. */
/* "Berkeley DB C++ Header File" */ #mesondefine HAVE_BERKELEY
#undef DB_CXX_HEADER #mesondefine HAVE_GDBM
#mesondefine HAVE_LIBPCRE
#mesondefine HAVE_GETPASS
#mesondefine HAVE_GETOPT
#mesondefine HAVE_FDOPEN
#mesondefine HAVE_FGETC
#mesondefine HAVE_GETENV
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the `fdopen' function. */ #define PCRE2_CODE_UNIT_WIDTH 8
#undef HAVE_FDOPEN #define PACKAGE "dbtool"
/* Define to 1 if you have the `fgetc' function. */ #define VERSION "@VERSION@"
#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. */ /* Define to empty if `const' does not conform to ANSI C. */
#undef const #undef const

3
platform.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
echo "$@"> platform.h

View File

@@ -1108,7 +1108,7 @@ int Rijndael::blockEncrypt(const UINT8 *input,int inputLen,UINT8 *outBuffer)
iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7); iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7); iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7); iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
iv[3][3] = (iv[3][3] << 1) | (outBuffer[k/8] >> (7-(k&7))) & 1; iv[3][3] = (iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1);
} }
} }
break; break;
@@ -1262,7 +1262,7 @@ int Rijndael::blockDecrypt(const UINT8 *input, int inputLen, UINT8 *outBuffer)
iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7); iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7); iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7); iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
iv[3][3] = (iv[3][3] << 1) | (input[k/8] >> (7-(k&7))) & 1; iv[3][3] = (iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);
outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7); outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
} }
} }

View File

@@ -20,9 +20,8 @@ db=~/.accdb
# #
# check if dbtool version is 1.4 or higher # check if dbtool version is 1.4 or higher
version=`dbtool -V 2>&1 | sed 's/[a-zA-Z .]*//g'` version=`dbtool -V 2>&1 | sed 's/[a-zA-Z .]*//g'`
if [ "x$version" != "x" ]; then if test -n "$version"; then
let res="$version < 14" if test $version -lt 14; then
if [ "x$res" = "x1" ]; then
echo "This version of dbtool does not support encryption!" echo "This version of dbtool does not support encryption!"
exit 1 exit 1
fi fi
@@ -36,7 +35,7 @@ fi
echo -n "Enter passphrase: " echo -n "Enter passphrase: "
read PW read PW
if [ "x$PW" = "x" ]; then if test -z "$PW"; then
echo "empty passphrase!" echo "empty passphrase!"
exit -1 exit -1
fi fi
@@ -65,7 +64,8 @@ while :
do do
read command read command
if [ "x$command" = "xL" -o "x$command" = "xl" ]; then case $command in
l|L)
echo echo
if [ -e $db ]; then if [ -e $db ]; then
# #
@@ -73,7 +73,7 @@ do
# separator for better formatting with sed :-) # separator for better formatting with sed :-)
dbtool -d $db -p -D -F "<22>" | sed 's/<2F>/ => /' dbtool -d $db -p -D -F "<22>" | sed 's/<2F>/ => /'
fi fi
elif [ "x$command" = "xN" -o "x$command" = "xn" ]; then n|N)
echo echo
echo -n "Enter entry name: " echo -n "Enter entry name: "
read name read name
@@ -91,18 +91,18 @@ do
| dbtool -p -i -f -d $db -F "|" | dbtool -p -i -f -d $db -F "|"
echo "entry $name inserted." echo "entry $name inserted."
fi fi
elif [ "x$command" = "xS" -o "x$command" = "xs" ]; then s|S)
echo -n "Enter search string: " echo -n "Enter search string: "
read string read string
# #
# search for the given key # search for the given key
dbtool -p -d $db -s -k $string dbtool -p -d $db -s -k $string
elif [ "x$command" = "xQ" -o "x$command" = "xq" ]; then q|Q)
echo echo
echo "Thanks for the fish." echo "Thanks for the fish."
echo echo
exit 0 exit 0
fi esac
menu menu
done done

View File

@@ -11,14 +11,11 @@
# compliant regular expression. # compliant regular expression.
# #
dbtool="/usr/bin/dbtool"; db="/var/db/locate.db"
find="/usr/bin/find"; regex=$1
db="/var/local/locate.db";
sort="/bin/sort";
regex=$1;
if [ "x$regex" != "x" ]; then if test -n "$regex"; then
$dbtool -d $db -S -k $regex -w -R; dbtool -d $db -S -k $regex -w -R
else else
echo "Usage: locate <expression>"; echo "Usage: locate <expression>"
fi fi

View File

@@ -9,11 +9,7 @@
# to search for a certain string. # to search for a certain string.
# #
dbtool="/usr/bin/dbtool"; db="/var/db/locate.db";
find="/usr/bin/find";
db="/var/local/locate.db";
egrep="/bin/egrep";
cp="/bin/cp"
$cp /dev/null $db; echo -n > $db
$find / -ls | $egrep -v "^\/proc|dev|tmp" | $dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$"; find / -ls | egrep -v "^\/proc|dev|tmp" | dbtool -d $db -i -f -R -t "^(.+?) (\/.*)$";