]> git.sesse.net Git - plocate/blobdiff - plocate.cpp
Write new --help text from scratch, so that we have nothing from mlocate except some...
[plocate] / plocate.cpp
index 371fb533e2fba8d3fe98455dcc15cb28077529fe..5b9db1807b6d1862b4520eddd961677103e782ff 100644 (file)
@@ -1,6 +1,7 @@
 #include "db.h"
 #include "io_uring_engine.h"
 #include "parse_trigrams.h"
+#include "turbopfor.h"
 #include "unique_sort.h"
 
 #include <algorithm>
 using namespace std;
 using namespace std::chrono;
 
-#define dprintf(...)
-//#define dprintf(...) fprintf(stderr, __VA_ARGS__);
+#define dprintf(...) \
+       do { \
+               if (use_debug) { \
+                       fprintf(stderr, __VA_ARGS__); \
+               } \
+       } while (false)
 
-#include "turbopfor.h"
+#define DEFAULT_DBPATH "/var/lib/mlocate/plocate.db"
 
-const char *dbpath = "/var/lib/mlocate/plocate.db";
+const char *dbpath = DEFAULT_DBPATH;
 bool ignore_case = false;
 bool only_count = false;
 bool print_nul = false;
+bool use_debug = false;
 int64_t limit_matches = numeric_limits<int64_t>::max();
 
 class Serializer {
@@ -569,16 +575,27 @@ string unescape_glob_to_plain_string(const string &needle)
 
 void usage()
 {
-       // The help text comes from mlocate.
-       printf("Usage: plocate [OPTION]... PATTERN...\n");
-       printf("\n");
-       printf("  -c, --count            only print number of found entries\n");
-       printf("  -d, --database DBPATH  use DBPATH instead of default database (which is\n");
-       printf("                         %s)\n", dbpath);
-       printf("  -h, --help             print this help\n");
-       printf("  -i, --ignore-case      ignore case distinctions when matching patterns\n");
-       printf("  -l, --limit, -n LIMIT  limit output (or counting) to LIMIT entries\n");
-       printf("  -0, --null             separate entries with NUL on output\n");
+       printf(
+               "Usage: plocate [OPTION]... PATTERN...\n"
+               "\n"
+               "  -c, --count            print number of matches instead of the matches\n"
+               "  -d, --database DBPATH  search for files in DBPATH\n"
+               "                         (default is " DEFAULT_DBPATH ")\n"
+               "  -i, --ignore-case      search case-insensitively\n"
+               "  -l, --limit LIMIT      stop after LIMIT matches\n"
+               "  -0, --null             delimit matches by NUL instead of newline\n"
+               "      --help             print this help\n"
+               "      --version          print version information\n");
+}
+
+void version()
+{
+       printf("plocate %s\n", PLOCATE_VERSION);
+       printf("Copyright 2020 Steinar H. Gunderson\n");
+       printf("License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>.\n");
+       printf("This is free software: you are free to change and redistribute it.\n");
+       printf("There is NO WARRANTY, to the extent permitted by law.\n");
+       exit(0);
 }
 
 int main(int argc, char **argv)
@@ -590,13 +607,15 @@ int main(int argc, char **argv)
                { "ignore-case", no_argument, 0, 'i' },
                { "limit", required_argument, 0, 'l' },
                { "null", no_argument, 0, '0' },
+               { "version", no_argument, 0, 'V' },
+               { "debug", no_argument, 0, 'D' },  // Not documented.
                { 0, 0, 0, 0 }
        };
 
        setlocale(LC_ALL, "");
        for (;;) {
                int option_index = 0;
-               int c = getopt_long(argc, argv, "cd:hil:n:0", long_options, &option_index);
+               int c = getopt_long(argc, argv, "cd:hil:n:0VD", long_options, &option_index);
                if (c == -1) {
                        break;
                }
@@ -620,11 +639,27 @@ int main(int argc, char **argv)
                case '0':
                        print_nul = true;
                        break;
+               case 'D':
+                       use_debug = true;
+                       break;
+               case 'V':
+                       version();
+                       break;
                default:
                        exit(1);
                }
        }
 
+       if (use_debug) {
+               // Debug information would leak information about which files exist,
+               // so drop setgid before we open the file; one would either need to run
+               // as root, or use a locally-built file.
+               if (setgid(getgid()) != 0) {
+                       perror("setgid");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
        vector<Needle> needles;
        for (int i = optind; i < argc; ++i) {
                Needle needle;