diff --git a/oclvanitygen.c b/oclvanitygen.c index de0c4ab..9755ef6 100644 --- a/oclvanitygen.c +++ b/oclvanitygen.c @@ -39,7 +39,7 @@ usage(const char *name) { fprintf(stderr, "oclVanitygen %s (" OPENSSL_VERSION_TEXT ")\n" -"Usage: %s [-vqrikNTS] [-d ] [-f |-] [...]\n" +"Usage: %s [-vqrik1NTS] [-d ] [-f |-] [...]\n" "Generates a bitcoin receiving address matching , and outputs the\n" "address and associated private key. The private key may be stored in a safe\n" "location or imported into a bitcoin client to spend any balance received on\n" @@ -56,6 +56,7 @@ usage(const char *name) "-q Quiet output\n" "-i Case-insensitive prefix search\n" "-k Keep pattern and continue search after finding a match\n" +"-1 Stop after first match\n" "-N Generate namecoin address\n" "-T Generate bitcoin testnet address\n" "-X Generate address with the given version\n" @@ -102,6 +103,7 @@ main(int argc, char **argv) int nrows = 0, ncols = 0; int invsize = 0; int remove_on_match = 1; + int only_one = 0; int verify_mode = 0; int safe_mode = 0; vg_context_t *vcp = NULL; @@ -121,7 +123,7 @@ main(int argc, char **argv) int i; while ((opt = getopt(argc, argv, - "vqikNTX:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) { + "vqik1NTX:eE:p:P:d:w:t:g:b:VSh?f:o:s:D:")) != -1) { switch (opt) { case 'v': verbose = 2; @@ -135,6 +137,9 @@ main(int argc, char **argv) case 'k': remove_on_match = 0; break; + case '1': + only_one = 1; + break; case 'N': addrtype = 52; privtype = 180; @@ -328,6 +333,7 @@ main(int argc, char **argv) vcp->vc_verbose = verbose; vcp->vc_result_file = result_file; vcp->vc_remove_on_match = remove_on_match; + vcp->vc_only_one = only_one; vcp->vc_pubkeytype = addrtype; vcp->vc_pubkey_base = pubkey_base; diff --git a/pattern.c b/pattern.c index eace21f..79e2091 100644 --- a/pattern.c +++ b/pattern.c @@ -1489,6 +1489,10 @@ research: vcpp->base.vc_found++; + if (vcpp->base.vc_only_one) { + return 2; + } + if (vcpp->base.vc_remove_on_match) { /* Subtract the range from the difficulty */ vg_prefix_range_sum(vp, @@ -1784,6 +1788,11 @@ restart_loop: vcrp->vcr_regex_pat[i]); vcrp->base.vc_found++; + if (vcrp->base.vc_only_one) { + res = 2; + goto out; + } + if (vcrp->base.vc_remove_on_match) { pcre_free(vcrp->vcr_regex[i]); if (vcrp->vcr_regex_extra[i]) diff --git a/pattern.h b/pattern.h index d443510..4dce658 100644 --- a/pattern.h +++ b/pattern.h @@ -98,6 +98,7 @@ struct _vg_context_s { const char *vc_result_file; const char *vc_key_protect_pass; int vc_remove_on_match; + int vc_only_one; int vc_verbose; enum vg_format vc_format; int vc_pubkeytype; diff --git a/vanitygen.c b/vanitygen.c index ebd020d..9d88121 100644 --- a/vanitygen.c +++ b/vanitygen.c @@ -295,7 +295,7 @@ usage(const char *name) { fprintf(stderr, "Vanitygen %s (" OPENSSL_VERSION_TEXT ")\n" -"Usage: %s [-vqrikNT] [-t ] [-f |-] [...]\n" +"Usage: %s [-vqnrik1NT] [-t ] [-f |-] [...]\n" "Generates a bitcoin receiving address matching , and outputs the\n" "address and associated private key. The private key may be stored in a safe\n" "location or imported into a bitcoin client to spend any balance received on\n" @@ -305,10 +305,12 @@ usage(const char *name) "Options:\n" "-v Verbose output\n" "-q Quiet output\n" +"-n Simulate\n" "-r Use regular expression match instead of prefix\n" " (Feasibility of expression is not checked)\n" "-i Case-insensitive prefix search\n" "-k Keep pattern and continue search after finding a match\n" +"-1 Stop after first match\n" "-N Generate namecoin address\n" "-T Generate bitcoin testnet address\n" "-X Generate address with the given version\n" @@ -337,7 +339,9 @@ main(int argc, char **argv) int regex = 0; int caseinsensitive = 0; int verbose = 1; + int simulate = 0; int remove_on_match = 1; + int only_one = 0; int prompt_password = 0; int opt; char *seedfile = NULL; @@ -357,7 +361,7 @@ main(int argc, char **argv) int i; - while ((opt = getopt(argc, argv, "vqrikeE:P:NTX:F:t:h?f:o:s:")) != -1) { + while ((opt = getopt(argc, argv, "vqnrik1eE:P:NTX:F:t:h?f:o:s:")) != -1) { switch (opt) { case 'v': verbose = 2; @@ -365,6 +369,9 @@ main(int argc, char **argv) case 'q': verbose = 0; break; + case 'n': + simulate = 1; + break; case 'r': regex = 1; break; @@ -374,6 +381,9 @@ main(int argc, char **argv) case 'k': remove_on_match = 0; break; + case '1': + only_one = 1; + break; case 'N': addrtype = 52; privtype = 180; @@ -537,6 +547,7 @@ main(int argc, char **argv) vcp->vc_verbose = verbose; vcp->vc_result_file = result_file; vcp->vc_remove_on_match = remove_on_match; + vcp->vc_only_one = only_one; vcp->vc_format = format; vcp->vc_pubkeytype = pubkeytype; vcp->vc_pubkey_base = pubkey_base; @@ -598,6 +609,9 @@ main(int argc, char **argv) fprintf(stderr, "Regular expressions: %ld\n", vcp->vc_npatterns); + if (simulate) + return 0; + if (!start_threads(vcp, nthreads)) return 1; return 0;