summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmil Engler <me@emilengler.com>2020-09-02 20:11:20 +0200
committerDaniel Stenberg <daniel@haxx.se>2020-09-04 15:38:20 +0200
commitaa8777f63febca6a13f6b86e141a832232560037 (patch)
tree792a9f77d2482422aa25b4c676963f6ae3e441cd
parent5dddc1dc7e39bd9b54fd219c1b2e318f1f6c49b2 (diff)
downloadcurl-aa8777f63febca6a13f6b86e141a832232560037.tar.gz
tool: update --help with categories
This commit is a part of "--help me if you can" Closes #5680
-rw-r--r--src/tool_cfgable.h1
-rw-r--r--src/tool_getparam.c1
-rw-r--r--src/tool_help.c842
-rw-r--r--src/tool_help.h2
-rw-r--r--src/tool_operate.c2
5 files changed, 602 insertions, 246 deletions
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index a3b8dd51b..489f9ca0e 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -312,6 +312,7 @@ struct GlobalConfig {
bool parallel;
long parallel_max;
bool parallel_connect;
+ char *help_category; /* The help category, if set */
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 64c988122..a884f4b38 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -1777,6 +1777,7 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */
case 'h': /* h for help */
if(toggle) {
+ global->help_category = nextarg;
return PARAM_HELP_REQUESTED;
}
/* we now actually support --no-help too! */
diff --git a/src/tool_help.c b/src/tool_help.c
index c8b2f52c9..54a37e6b2 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -36,6 +36,76 @@
#endif
/*
+ * The bitmask output is generated with the following command
+ ------------------------------------------------------------
+ cd $srcroot/docs/cmdline-opts
+ ./gen.pl listcats *.d
+ */
+
+#define CURLHELP_HIDDEN 1u << 0u
+#define CURLHELP_AUTH 1u << 1u
+#define CURLHELP_CONNECTION 1u << 2u
+#define CURLHELP_CURL 1u << 3u
+#define CURLHELP_DNS 1u << 4u
+#define CURLHELP_FILE 1u << 5u
+#define CURLHELP_FTP 1u << 6u
+#define CURLHELP_HTTP 1u << 7u
+#define CURLHELP_IMAP 1u << 8u
+#define CURLHELP_IMPORTANT 1u << 9u
+#define CURLHELP_MISC 1u << 10u
+#define CURLHELP_OUTPUT 1u << 11u
+#define CURLHELP_POP3 1u << 12u
+#define CURLHELP_POST 1u << 13u
+#define CURLHELP_PROXY 1u << 14u
+#define CURLHELP_SCP 1u << 15u
+#define CURLHELP_SFTP 1u << 16u
+#define CURLHELP_SMTP 1u << 17u
+#define CURLHELP_SSH 1u << 18u
+#define CURLHELP_TELNET 1u << 19u
+#define CURLHELP_TFTP 1u << 20u
+#define CURLHELP_TLS 1u << 21u
+#define CURLHELP_UPLOAD 1u << 22u
+#define CURLHELP_VERBOSE 1u << 23u
+
+typedef unsigned int curlhelp_t;
+
+struct category_descriptors {
+ const char *opt;
+ const char *desc;
+ curlhelp_t category;
+};
+
+static const struct category_descriptors categories[] = {
+ {"auth", "Different types of authentication methods", CURLHELP_AUTH},
+ {"connection", "Low level networking operations",
+ CURLHELP_CONNECTION},
+ {"curl", "The command line tool itself", CURLHELP_CURL},
+ {"dns", "General DNS options", CURLHELP_DNS},
+ {"file", "FILE protocol options", CURLHELP_FILE},
+ {"ftp", "FTP protocol options", CURLHELP_FTP},
+ {"http", "HTTP and HTTPS protocol options", CURLHELP_HTTP},
+ {"imap", "IMAP protocol options", CURLHELP_IMAP},
+ /* important is left out because it is the default help page */
+ {"misc", "Options that don't fit into any other category", CURLHELP_MISC},
+ {"output", "The output of curl", CURLHELP_OUTPUT},
+ {"pop3", "POP3 protocol options", CURLHELP_POP3},
+ {"post", "HTTP Post specific options", CURLHELP_POST},
+ {"proxy", "All options related to proxies", CURLHELP_PROXY},
+ {"scp", "SCP protocol options", CURLHELP_SCP},
+ {"sftp", "SFTP protocol options", CURLHELP_SFTP},
+ {"smtp", "SMTP protocol options", CURLHELP_SMTP},
+ {"ssh", "SSH protocol options", CURLHELP_SSH},
+ {"telnet", "TELNET protocol options", CURLHELP_TELNET},
+ {"tftp", "TFTP protocol options", CURLHELP_TFTP},
+ {"tls", "All TLS/SSL related options", CURLHELP_TLS},
+ {"upload", "All options for uploads",
+ CURLHELP_UPLOAD},
+ {"verbose", "Options related to any kind of command line output of curl",
+ CURLHELP_VERBOSE},
+ {NULL, NULL, CURLHELP_HIDDEN}
+};
+
+/*
* The help output is generated with the following command
---------------------------------------------------------
@@ -46,479 +116,714 @@
struct helptxt {
const char *opt;
const char *desc;
+ curlhelp_t categories;
};
static const struct helptxt helptext[] = {
{" --abstract-unix-socket <path>",
- "Connect via abstract Unix domain socket"},
+ "Connect via abstract Unix domain socket",
+ CURLHELP_CONNECTION},
{" --alt-svc <file name>",
- "Enable alt-svc with this cache file"},
+ "Enable alt-svc with this cache file",
+ CURLHELP_HTTP},
{" --anyauth",
- "Pick any authentication method"},
+ "Pick any authentication method",
+ CURLHELP_HTTP | CURLHELP_PROXY | CURLHELP_AUTH},
{"-a, --append",
- "Append to target file when uploading"},
+ "Append to target file when uploading",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --basic",
- "Use HTTP Basic Authentication"},
+ "Use HTTP Basic Authentication",
+ CURLHELP_AUTH},
{" --cacert <file>",
- "CA certificate to verify peer against"},
+ "CA certificate to verify peer against",
+ CURLHELP_TLS},
{" --capath <dir>",
- "CA directory to verify peer against"},
+ "CA directory to verify peer against",
+ CURLHELP_TLS},
{"-E, --cert <certificate[:password]>",
- "Client certificate file and password"},
+ "Client certificate file and password",
+ CURLHELP_TLS},
{" --cert-status",
- "Verify the status of the server certificate"},
+ "Verify the status of the server certificate",
+ CURLHELP_TLS},
{" --cert-type <type>",
- "Certificate type (DER/PEM/ENG)"},
+ "Certificate type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --ciphers <list of ciphers>",
- "SSL ciphers to use"},
+ "SSL ciphers to use",
+ CURLHELP_TLS},
{" --compressed",
- "Request compressed response"},
+ "Request compressed response",
+ CURLHELP_HTTP},
{" --compressed-ssh",
- "Enable SSH compression"},
+ "Enable SSH compression",
+ CURLHELP_SCP | CURLHELP_SSH},
{"-K, --config <file>",
- "Read config from a file"},
+ "Read config from a file",
+ CURLHELP_CURL},
{" --connect-timeout <seconds>",
- "Maximum time allowed for connection"},
+ "Maximum time allowed for connection",
+ CURLHELP_CONNECTION},
{" --connect-to <HOST1:PORT1:HOST2:PORT2>",
- "Connect to host"},
+ "Connect to host",
+ CURLHELP_CONNECTION},
{"-C, --continue-at <offset>",
- "Resumed transfer offset"},
+ "Resumed transfer offset",
+ CURLHELP_CONNECTION},
{"-b, --cookie <data|filename>",
- "Send cookies from string/file"},
+ "Send cookies from string/file",
+ CURLHELP_HTTP},
{"-c, --cookie-jar <filename>",
- "Write cookies to <filename> after operation"},
+ "Write cookies to <filename> after operation",
+ CURLHELP_HTTP},
{" --create-dirs",
- "Create necessary local directory hierarchy"},
+ "Create necessary local directory hierarchy",
+ CURLHELP_CURL},
{" --crlf",
- "Convert LF to CRLF in upload"},
+ "Convert LF to CRLF in upload",
+ CURLHELP_FTP | CURLHELP_SMTP},
{" --crlfile <file>",
- "Get a CRL list in PEM format from the given file"},
+ "Get a CRL list in PEM format from the given file",
+ CURLHELP_TLS},
{" --curves <algorithm list>",
- "(EC) TLS key exchange algorithm(s) to request "},
+ "(EC) TLS key exchange algorithm(s) to request",
+ CURLHELP_TLS},
{"-d, --data <data>",
- "HTTP POST data"},
+ "HTTP POST data",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-ascii <data>",
- "HTTP POST ASCII data"},
+ "HTTP POST ASCII data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-binary <data>",
- "HTTP POST binary data"},
+ "HTTP POST binary data",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-raw <data>",
- "HTTP POST data, '@' allowed"},
+ "HTTP POST data, '@' allowed",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --data-urlencode <data>",
- "HTTP POST data url encoded"},
+ "HTTP POST data url encoded",
+ CURLHELP_HTTP | CURLHELP_POST | CURLHELP_UPLOAD},
{" --delegation <LEVEL>",
- "GSS-API delegation permission"},
+ "GSS-API delegation permission",
+ CURLHELP_MISC},
{" --digest",
- "Use HTTP Digest Authentication"},
+ "Use HTTP Digest Authentication",
+ CURLHELP_PROXY | CURLHELP_AUTH | CURLHELP_HTTP},
{"-q, --disable",
- "Disable .curlrc"},
+ "Disable .curlrc",
+ CURLHELP_CURL},
{" --disable-eprt",
- "Inhibit using EPRT or LPRT"},
+ "Inhibit using EPRT or LPRT",
+ CURLHELP_FTP},
{" --disable-epsv",
- "Inhibit using EPSV"},
+ "Inhibit using EPSV",
+ CURLHELP_FTP},
{" --disallow-username-in-url",
- "Disallow username in url"},
+ "Disallow username in url",
+ CURLHELP_CURL | CURLHELP_HTTP},
{" --dns-interface <interface>",
- "Interface to use for DNS requests"},
+ "Interface to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv4-addr <address>",
- "IPv4 address to use for DNS requests"},
+ "IPv4 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-ipv6-addr <address>",
- "IPv6 address to use for DNS requests"},
+ "IPv6 address to use for DNS requests",
+ CURLHELP_DNS},
{" --dns-servers <addresses>",
- "DNS server addrs to use"},
+ "DNS server addrs to use",
+ CURLHELP_DNS},
{" --doh-url <URL>",
- "Resolve host names over DOH"},
+ "Resolve host names over DOH",
+ CURLHELP_DNS},
{"-D, --dump-header <filename>",
- "Write the received headers to <filename>"},
+ "Write the received headers to <filename>",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --egd-file <file>",
- "EGD socket path for random data"},
+ "EGD socket path for random data",
+ CURLHELP_TLS},
{" --engine <name>",
- "Crypto engine to use"},
+ "Crypto engine to use",
+ CURLHELP_TLS},
{" --etag-compare <file>",
- "Pass an ETag from a file as a custom header"},
+ "Pass an ETag from a file as a custom header",
+ CURLHELP_HTTP},
{" --etag-save <file>",
- "Parse ETag from a request and save it to a file"},
+ "Parse ETag from a request and save it to a file",
+ CURLHELP_HTTP},
{" --expect100-timeout <seconds>",
- "How long to wait for 100-continue"},
+ "How long to wait for 100-continue",
+ CURLHELP_HTTP},
{"-f, --fail",
- "Fail silently (no output at all) on HTTP errors"},
+ "Fail silently (no output at all) on HTTP errors",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{" --fail-early",
- "Fail on first transfer error, do not continue"},
+ "Fail on first transfer error, do not continue",
+ CURLHELP_CURL},
{" --false-start",
- "Enable TLS False Start"},
+ "Enable TLS False Start",
+ CURLHELP_TLS},
{"-F, --form <name=content>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --form-string <name=string>",
- "Specify multipart MIME data"},
+ "Specify multipart MIME data",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{" --ftp-account <data>",
- "Account data string"},
+ "Account data string",
+ CURLHELP_FTP | CURLHELP_AUTH},
{" --ftp-alternative-to-user <command>",
- "String to replace USER [name]"},
+ "String to replace USER [name]",
+ CURLHELP_FTP},
{" --ftp-create-dirs",
- "Create the remote dirs if not present"},
+ "Create the remote dirs if not present",
+ CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_CURL},
{" --ftp-method <method>",
- "Control CWD usage"},
+ "Control CWD usage",
+ CURLHELP_FTP},
{" --ftp-pasv",
- "Use PASV/EPSV instead of PORT"},
+ "Use PASV/EPSV instead of PORT",
+ CURLHELP_FTP},
{"-P, --ftp-port <address>",
- "Use PORT instead of PASV"},
+ "Use PORT instead of PASV",
+ CURLHELP_FTP},
{" --ftp-pret",
- "Send PRET before PASV"},
+ "Send PRET before PASV",
+ CURLHELP_FTP},
{" --ftp-skip-pasv-ip",
- "Skip the IP address for PASV"},
+ "Skip the IP address for PASV",
+ CURLHELP_FTP},
{" --ftp-ssl-ccc",
- "Send CCC after authenticating"},
+ "Send CCC after authenticating",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-ccc-mode <active/passive>",
- "Set CCC mode"},
+ "Set CCC mode",
+ CURLHELP_FTP | CURLHELP_TLS},
{" --ftp-ssl-control",
- "Require SSL/TLS for FTP login, clear for transfer"},
+ "Require SSL/TLS for FTP login, clear for transfer",
+ CURLHELP_FTP | CURLHELP_TLS},
{"-G, --get",
- "Put the post data in the URL and use GET"},
+ "Put the post data in the URL and use GET",
+ CURLHELP_HTTP | CURLHELP_UPLOAD},
{"-g, --globoff",
- "Disable URL sequences and ranges using {} and []"},
+ "Disable URL sequences and ranges using {} and []",
+ CURLHELP_CURL},
{" --happy-eyeballs-timeout-ms <milliseconds>",
- "Time for IPv6 before trying IPv4"},
+ "Time for IPv6 before trying IPv4",
+ CURLHELP_CONNECTION},
{" --haproxy-protocol",
- "Send HAProxy PROXY protocol v1 header"},
+ "Send HAProxy PROXY protocol v1 header",
+ CURLHELP_HTTP | CURLHELP_PROXY},
{"-I, --head",
- "Show document info only"},
+ "Show document info only",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_FILE},
{"-H, --header <header/@file>",
- "Pass custom header(s) to server"},
- {"-h, --help",
- "This help text"},
+ "Pass custom header(s) to server",
+ CURLHELP_HTTP},
+ {"-h, --help <category>",
+ "Get help for commands",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{" --hostpubmd5 <md5>",
- "Acceptable MD5 hash of the host public key"},
+ "Acceptable MD5 hash of the host public key",
+ CURLHELP_SFTP | CURLHELP_SCP},
{" --http0.9",
- "Allow HTTP 0.9 responses"},
+ "Allow HTTP 0.9 responses",
+ CURLHELP_HTTP},
{"-0, --http1.0",
- "Use HTTP 1.0"},
+ "Use HTTP 1.0",
+ CURLHELP_HTTP},
{" --http1.1",
- "Use HTTP 1.1"},
+ "Use HTTP 1.1",
+ CURLHELP_HTTP},
{" --http2",
- "Use HTTP 2"},
+ "Use HTTP 2",
+ CURLHELP_HTTP},
{" --http2-prior-knowledge",
- "Use HTTP 2 without HTTP/1.1 Upgrade"},
+ "Use HTTP 2 without HTTP/1.1 Upgrade",
+ CURLHELP_HTTP},
{" --http3",
- "Use HTTP v3"},
+ "Use HTTP v3",
+ CURLHELP_HTTP},
{" --ignore-content-length",
- "Ignore the size of the remote resource"},
+ "Ignore the size of the remote resource",
+ CURLHELP_HTTP | CURLHELP_FTP},
{"-i, --include",
- "Include protocol response headers in the output"},
+ "Include protocol response headers in the output",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-k, --insecure",
- "Allow insecure server connections when using SSL"},
+ "Allow insecure server connections when using SSL",
+ CURLHELP_TLS},
{" --interface <name>",
- "Use network INTERFACE (or address)"},
+ "Use network INTERFACE (or address)",
+ CURLHELP_CONNECTION},
{"-4, --ipv4",
- "Resolve names to IPv4 addresses"},
+ "Resolve names to IPv4 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-6, --ipv6",
- "Resolve names to IPv6 addresses"},
+ "Resolve names to IPv6 addresses",
+ CURLHELP_CONNECTION | CURLHELP_DNS},
{"-j, --junk-session-cookies",
- "Ignore session cookies read from file"},
+ "Ignore session cookies read from file",
+ CURLHELP_HTTP},
{" --keepalive-time <seconds>",
- "Interval time for keepalive probes"},
+ "Interval time for keepalive probes",
+ CURLHELP_CONNECTION},
{" --key <key>",
- "Private key file name"},
+ "Private key file name",
+ CURLHELP_TLS | CURLHELP_SSH},
{" --key-type <type>",
- "Private key file type (DER/PEM/ENG)"},
+ "Private key file type (DER/PEM/ENG)",
+ CURLHELP_TLS},
{" --krb <level>",
- "Enable Kerberos with security <level>"},
+ "Enable Kerberos with security <level>",
+ CURLHELP_FTP},
{" --libcurl <file>",
- "Dump libcurl equivalent code of this command line"},
+ "Dump libcurl equivalent code of this command line",
+ CURLHELP_CURL},
{" --limit-rate <speed>",
- "Limit transfer speed to RATE"},
+ "Limit transfer speed to RATE",
+ CURLHELP_CONNECTION},
{"-l, --list-only",
- "List only mode"},
+ "List only mode",
+ CURLHELP_FTP | CURLHELP_POP3},
{" --local-port <num/range>",
- "Force use of RANGE for local port numbers"},
+ "Force use of RANGE for local port numbers",
+ CURLHELP_CONNECTION},
{"-L, --location",
- "Follow redirects"},
+ "Follow redirects",
+ CURLHELP_HTTP},
{" --location-trusted",
- "Like --location, and send auth to other hosts"},
+ "Like --location, and send auth to other hosts",
+ CURLHELP_HTTP | CURLHELP_AUTH},
{" --login-options <options>",
- "Server login options"},
+ "Server login options",
+ CURLHELP_IMAP | CURLHELP_POP3 | CURLHELP_SMTP | CURLHELP_AUTH},
{" --mail-auth <address>",
- "Originator address of the original email"},
+ "Originator address of the original email",
+ CURLHELP_SMTP},
{" --mail-from <address>",
- "Mail from this address"},
+ "Mail from this address",
+ CURLHELP_SMTP},
{" --mail-rcpt <address>",
- "Mail to this address"},
+ "Mail to this address",
+ CURLHELP_SMTP},
{" --mail-rcpt-allowfails",
- "Allow RCPT TO command to fail for some recipients"},
+ "Allow RCPT TO command to fail for some recipients",
+ CURLHELP_SMTP},
{"-M, --manual",
- "Display the full manual"},
+ "Display the full manual",
+ CURLHELP_CURL},
{" --max-filesize <bytes>",
- "Maximum file size to download"},
+ "Maximum file size to download",
+ CURLHELP_CONNECTION},
{" --max-redirs <num>",
- "Maximum number of redirects allowed"},
+ "Maximum number of redirects allowed",
+ CURLHELP_HTTP},
{"-m, --max-time <seconds>",
- "Maximum time allowed for the transfer"},
+ "Maximum time allowed for the transfer",
+ CURLHELP_CONNECTION},
{" --metalink",
- "Process given URLs as metalink XML file"},
+ "Process given URLs as metalink XML file",
+ CURLHELP_MISC},
{" --negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication"},
+ "Use HTTP Negotiate (SPNEGO) authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{"-n, --netrc",
- "Must read .netrc for user name and password"},
+ "Must read .netrc for user name and password",
+ CURLHELP_CURL},
{" --netrc-file <filename>",
- "Specify FILE for netrc"},
+ "Specify FILE for netrc",
+ CURLHELP_CURL},
{" --netrc-optional",
- "Use either .netrc or URL"},
+ "Use either .netrc or URL",
+ CURLHELP_CURL},
{"-:, --next",
- "Make next URL use its separate set of options"},
+ "Make next URL use its separate set of options",
+ CURLHELP_CURL},
{" --no-alpn",
- "Disable the ALPN TLS extension"},
+ "Disable the ALPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{"-N, --no-buffer",
- "Disable buffering of the output stream"},
+ "Disable buffering of the output stream",
+ CURLHELP_CURL},
{" --no-keepalive",
- "Disable TCP keepalive on the connection"},
+ "Disable TCP keepalive on the connection",
+ CURLHELP_CONNECTION},
{" --no-npn",
- "Disable the NPN TLS extension"},
+ "Disable the NPN TLS extension",
+ CURLHELP_TLS | CURLHELP_HTTP},
{" --no-progress-meter",
- "Do not show the progress meter"},
+ "Do not show the progress meter",
+ CURLHELP_VERBOSE},
{" --no-sessionid",
- "Disable SSL session-ID reusing"},
+ "Disable SSL session-ID reusing",
+ CURLHELP_TLS},
{" --noproxy <no-proxy-list>",
- "List of hosts which do not use proxy"},
+ "List of hosts which do not use proxy",
+ CURLHELP_PROXY},
{" --ntlm",
- "Use HTTP NTLM authentication"},
+ "Use HTTP NTLM authentication",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --ntlm-wb",
- "Use HTTP NTLM authentication with winbind"},
+ "Use HTTP NTLM authentication with winbind",
+ CURLHELP_AUTH | CURLHELP_HTTP},
{" --oauth2-bearer <token>",
- "OAuth 2 Bearer Token"},
+ "OAuth 2 Bearer Token",
+ CURLHELP_AUTH},
{"-o, --output <file>",
- "Write to file instead of stdout"},
+ "Write to file instead of stdout",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{" --output-dir <dir>",
- "Directory to save files in"},
+ "Directory to save files in",
+ CURLHELP_CURL},
{"-Z, --parallel",
- "Perform transfers in parallel"},
+ "Perform transfers in parallel",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --parallel-immediate",
- "Do not wait for multiplexing (with --parallel)"},
+ "Do not wait for multiplexing (with --parallel)",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --parallel-max",
- "Maximum concurrency for parallel transfers"},
+ "Maximum concurrency for parallel transfers",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --pass <phrase>",
- "Pass phrase for the private key"},
+ "Pass phrase for the private key",
+ CURLHELP_SSH | CURLHELP_TLS | CURLHELP_AUTH},
{" --path-as-is",
- "Do not squash .. sequences in URL path"},
+ "Do not squash .. sequences in URL path",
+ CURLHELP_CURL},
{" --pinnedpubkey <hashes>",
- "FILE/HASHES Public key to verify peer against"},
+ "FILE/HASHES Public key to verify peer against",
+ CURLHELP_TLS},
{" --post301",
- "Do not switch to GET after following a 301"},
+ "Do not switch to GET after following a 301",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post302",
- "Do not switch to GET after following a 302"},
+ "Do not switch to GET after following a 302",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --post303",
- "Do not switch to GET after following a 303"},
+ "Do not switch to GET after following a 303",
+ CURLHELP_HTTP | CURLHELP_POST},
{" --preproxy [protocol://]host[:port]",
- "Use this proxy first"},
+ "Use this proxy first",
+ CURLHELP_PROXY},
{"-#, --progress-bar",
- "Display transfer progress as a bar"},
+ "Display transfer progress as a bar",
+ CURLHELP_VERBOSE},
{" --proto <protocols>",
- "Enable/disable PROTOCOLS"},
+ "Enable/disable PROTOCOLS",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-default <protocol>",
- "Use PROTOCOL for any URL missing a scheme"},
+ "Use PROTOCOL for any URL missing a scheme",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{" --proto-redir <protocols>",
- "Enable/disable PROTOCOLS on redirect"},
+ "Enable/disable PROTOCOLS on redirect",
+ CURLHELP_CONNECTION | CURLHELP_CURL},
{"-x, --proxy [protocol://]host[:port]",
- "Use this proxy"},
+ "Use this proxy",
+ CURLHELP_PROXY},
{" --proxy-anyauth",
- "Pick any proxy authentication method"},
+ "Pick any proxy authentication method",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-basic",
- "Use Basic authentication on the proxy"},
+ "Use Basic authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-cacert <file>",
- "CA certificate to verify peer against for proxy"},
+ "CA certificate to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-capath <dir>",
- "CA directory to verify peer against for proxy"},
+ "CA directory to verify peer against for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert <cert[:passwd]>",
- "Set client certificate for proxy"},
+ "Set client certificate for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-cert-type <type>",
- "Client certificate type for HTTPS proxy"},
+ "Client certificate type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ciphers <list>",
- "SSL ciphers to use for proxy"},
+ "SSL ciphers to use for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-crlfile <file>",
- "Set a CRL list for proxy"},
+ "Set a CRL list for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-digest",
- "Use Digest authentication on the proxy"},
+ "Use Digest authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-header <header/@file>",
- "Pass custom header(s) to proxy"},
+ "Pass custom header(s) to proxy",
+ CURLHELP_PROXY},
{" --proxy-insecure",
- "Do HTTPS proxy connections without verifying the proxy"},
+ "Do HTTPS proxy connections without verifying the proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key <key>",
- "Private key for HTTPS proxy"},
+ "Private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-key-type <type>",
- "Private key file type for proxy"},
+ "Private key file type for proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-negotiate",
- "Use HTTP Negotiate (SPNEGO) authentication on the proxy"},
+ "Use HTTP Negotiate (SPNEGO) authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-ntlm",
- "Use NTLM authentication on the proxy"},
+ "Use NTLM authentication on the proxy",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy-pass <phrase>",
- "Pass phrase for the private key for HTTPS proxy"},
+ "Pass phrase for the private key for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-pinnedpubkey <hashes>",
- "FILE/HASHES public key to verify proxy with"},
+ "FILE/HASHES public key to verify proxy with",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-service-name <name>",
- "SPNEGO proxy service name"},
+ "SPNEGO proxy service name",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-ssl-allow-beast",
- "Allow security flaw for interop for HTTPS proxy"},
+ "Allow security flaw for interop for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-tls13-ciphers <ciphersuite list>",
- "TLS 1.3 proxy cipher suites"},
+ "TLS 1.3 proxy cipher suites",
+ CURLHELP_PROXY | CURLHELP_TLS},
{" --proxy-tlsauthtype <type>",
- "TLS authentication type for HTTPS proxy"},
+ "TLS authentication type for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlspassword <string>",
- "TLS password for HTTPS proxy"},
+ "TLS password for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsuser <name>",
- "TLS username for HTTPS proxy"},
+ "TLS username for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{" --proxy-tlsv1",
- "Use TLSv1 for HTTPS proxy"},
+ "Use TLSv1 for HTTPS proxy",
+ CURLHELP_PROXY | CURLHELP_TLS | CURLHELP_AUTH},
{"-U, --proxy-user <user:password>",
- "Proxy user and password"},
+ "Proxy user and password",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --proxy1.0 <host[:port]>",
- "Use HTTP/1.0 proxy on given port"},
+ "Use HTTP/1.0 proxy on given port",
+ CURLHELP_PROXY},
{"-p, --proxytunnel",
- "Operate through an HTTP proxy tunnel (using CONNECT)"},
+ "Operate through an HTTP proxy tunnel (using CONNECT)",
+ CURLHELP_PROXY},
{" --pubkey <key>",
- "SSH Public key file name"},
+ "SSH Public key file name",
+ CURLHELP_SFTP | CURLHELP_SCP | CURLHELP_AUTH},
{"-Q, --quote",
- "Send command(s) to server before transfer"},
+ "Send command(s) to server before transfer",
+ CURLHELP_FTP | CURLHELP_SFTP},
{" --random-file <file>",
- "File for reading random data from"},
+ "File for reading random data from",
+ CURLHELP_MISC},
{"-r, --range <range>",
- "Retrieve only the bytes within RANGE"},
+ "Retrieve only the bytes within RANGE",
+ CURLHELP_HTTP | CURLHELP_FTP | CURLHELP_SFTP | CURLHELP_FILE},
{" --raw",
- "Do HTTP \"raw\"; no transfer decoding"},
+ "Do HTTP \"raw\"; no transfer decoding",
+ CURLHELP_HTTP},
{"-e, --referer <URL>",
- "Referrer URL"},
+ "Referrer URL",
+ CURLHELP_HTTP},
{"-J, --remote-header-name",
- "Use the header-provided filename"},
+ "Use the header-provided filename",
+ CURLHELP_OUTPUT},
{"-O, --remote-name",
- "Write output to a file named as the remote file"},
+ "Write output to a file named as the remote file",
+ CURLHELP_IMPORTANT | CURLHELP_OUTPUT},
{" --remote-name-all",
- "Use the remote file name for all URLs"},
+ "Use the remote file name for all URLs",
+ CURLHELP_OUTPUT},
{"-R, --remote-time",
- "Set the remote file's time on the local output"},
+ "Set the remote file's time on the local output",
+ CURLHELP_OUTPUT},
{"-X, --request <command>",
- "Specify request command to use"},
+ "Specify request command to use",
+ CURLHELP_CONNECTION},
{" --request-target",
- "Specify the target for this request"},
+ "Specify the target for this request",
+ CURLHELP_HTTP},
{" --resolve <host:port:addr[,addr]...>",
- "Resolve the host+port to this address"},
+ "Resolve the host+port to this address",
+ CURLHELP_CONNECTION},
{" --retry <num>",
- "Retry request if transient problems occur"},
+ "Retry request if transient problems occur",
+ CURLHELP_CURL},
{" --retry-all-errors",
- "Retry all errors (use with --retry)"},
+ "Retry all errors (use with --retry)",
+ CURLHELP_CURL},
{" --retry-connrefused",
- "Retry on connection refused (use with --retry)"},
+ "Retry on connection refused (use with --retry)",
+ CURLHELP_CURL},
{" --retry-delay <seconds>",
- "Wait time between retries"},
+ "Wait time between retries",
+ CURLHELP_CURL},
{" --retry-max-time <seconds>",
- "Retry only within this period"},
+ "Retry only within this period",
+ CURLHELP_CURL},
{" --sasl-authzid <identity>",
- "Identity for SASL PLAIN authentication"},
+ "Identity for SASL PLAIN authentication",
+ CURLHELP_AUTH},
{" --sasl-ir",
- "Enable initial response in SASL authentication"},
+ "Enable initial response in SASL authentication",
+ CURLHELP_AUTH},
{" --service-name <name>",
- "SPNEGO service name"},
+ "SPNEGO service name",
+ CURLHELP_MISC},
{"-S, --show-error",
- "Show error even when -s is used"},
+ "Show error even when -s is used",
+ CURLHELP_CURL},
{"-s, --silent",
- "Silent mode"},
+ "Silent mode",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{" --socks4 <host[:port]>",
- "SOCKS4 proxy on given host + port"},
+ "SOCKS4 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks4a <host[:port]>",
- "SOCKS4a proxy on given host + port"},
+ "SOCKS4a proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5 <host[:port]>",
- "SOCKS5 proxy on given host + port"},
+ "SOCKS5 proxy on given host + port",
+ CURLHELP_PROXY},
{" --socks5-basic",
- "Enable username/password auth for SOCKS5 proxies"},
+ "Enable username/password auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi",
- "Enable GSS-API auth for SOCKS5 proxies"},
+ "Enable GSS-API auth for SOCKS5 proxies",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-nec",
- "Compatibility with NEC SOCKS5 server"},
+ "Compatibility with NEC SOCKS5 server",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-gssapi-service <name>",
- "SOCKS5 proxy service name for GSS-API"},
+ "SOCKS5 proxy service name for GSS-API",
+ CURLHELP_PROXY | CURLHELP_AUTH},
{" --socks5-hostname <host[:port]>",
- "SOCKS5 proxy, pass host name to proxy"},
+ "SOCKS5 proxy, pass host name to proxy",
+ CURLHELP_PROXY},
{"-Y, --speed-limit <speed>",
- "Stop transfers slower than this"},
+ "Stop transfers slower than this",
+ CURLHELP_CONNECTION},
{"-y, --speed-time <seconds>",
- "Trigger 'speed-limit' abort after this time"},
+ "Trigger 'speed-limit' abort after this time",
+ CURLHELP_CONNECTION},
{" --ssl",
- "Try SSL/TLS"},
+ "Try SSL/TLS",
+ CURLHELP_TLS},
{" --ssl-allow-beast",
- "Allow security flaw to improve interop"},
+ "Allow security flaw to improve interop",
+ CURLHELP_TLS},
{" --ssl-no-revoke",
- "Disable cert revocation checks (Schannel)"},
+ "Disable cert revocation checks (Schannel)",
+ CURLHELP_TLS},
{" --ssl-reqd",
- "Require SSL/TLS"},
+ "Require SSL/TLS",
+ CURLHELP_TLS},
{" --ssl-revoke-best-effort",
- "Ignore missing/offline cert CRL dist points"},
+ "Ignore missing/offline cert CRL dist points",
+ CURLHELP_TLS},
{"-2, --sslv2",
- "Use SSLv2"},
+ "Use SSLv2",
+ CURLHELP_TLS},
{"-3, --sslv3",
- "Use SSLv3"},
+ "Use SSLv3",
+ CURLHELP_TLS},
{" --stderr",
- "Where to redirect stderr"},
+ "Where to redirect stderr",
+ CURLHELP_VERBOSE},
{" --styled-output",
- "Enable styled output for HTTP headers"},
+ "Enable styled output for HTTP headers",
+ CURLHELP_VERBOSE},
{" --suppress-connect-headers",
- "Suppress proxy CONNECT response headers"},
+ "Suppress proxy CONNECT response headers",
+ CURLHELP_MISC},
{" --tcp-fastopen",
- "Use TCP Fast Open"},
+ "Use TCP Fast Open",
+ CURLHELP_CONNECTION},
{" --tcp-nodelay",
- "Use the TCP_NODELAY option"},
+ "Use the TCP_NODELAY option",
+ CURLHELP_CONNECTION},
{"-t, --telnet-option <opt=val>",
- "Set telnet option"},
+ "Set telnet option",
+ CURLHELP_TELNET},
{" --tftp-blksize <value>",
- "Set TFTP BLKSIZE option"},
+ "Set TFTP BLKSIZE option",
+ CURLHELP_TFTP},
{" --tftp-no-options",
- "Do not send any TFTP options"},
+ "Do not send any TFTP options",
+ CURLHELP_TFTP},
{"-z, --time-cond <time>",
- "Transfer based on a time condition"},
+ "Transfer based on a time condition",
+ CURLHELP_HTTP | CURLHELP_FTP},
{" --tls-max <VERSION>",
- "Set maximum allowed TLS version"},
+ "Set maximum allowed TLS version",
+ CURLHELP_TLS},
{" --tls13-ciphers <ciphersuite list>",
- "TLS 1.3 cipher suites to use"},
+ "TLS 1.3 cipher suites to use",
+ CURLHELP_TLS},
{" --tlsauthtype <type>",
- "TLS authentication type"},
+ "TLS authentication type",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlspassword",
- "TLS password"},
+ "TLS password",
+ CURLHELP_TLS | CURLHELP_AUTH},
{" --tlsuser <name>",
- "TLS user name"},
+ "TLS user name",
+ CURLHELP_TLS | CURLHELP_AUTH},
{"-1, --tlsv1",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.0",
- "Use TLSv1.0 or greater"},
+ "Use TLSv1.0 or greater",
+ CURLHELP_TLS},
{" --tlsv1.1",
- "Use TLSv1.1 or greater"},
+ "Use TLSv1.1 or greater",
+ CURLHELP_TLS},
{" --tlsv1.2",
- "Use TLSv1.2 or greater"},
+ "Use TLSv1.2 or greater",
+ CURLHELP_TLS},
{" --tlsv1.3",
- "Use TLSv1.3 or greater"},
+ "Use TLSv1.3 or greater",
+ CURLHELP_TLS},
{" --tr-encoding",
- "Request compressed transfer encoding"},
+ "Request compressed transfer encoding",
+ CURLHELP_HTTP},
{" --trace <file>",
- "Write a debug trace to FILE"},
+ "Write a debug trace to FILE",
+ CURLHELP_VERBOSE},
{" --trace-ascii <file>",
- "Like --trace, but without hex output"},
+ "Like --trace, but without hex output",
+ CURLHELP_VERBOSE},
{" --trace-time",
- "Add time stamps to trace/verbose output"},
+ "Add time stamps to trace/verbose output",
+ CURLHELP_VERBOSE},
{" --unix-socket <path>",
- "Connect through this Unix domain socket"},
+ "Connect through this Unix domain socket",
+ CURLHELP_CONNECTION},
{"-T, --upload-file <file>",
- "Transfer local FILE to destination"},
+ "Transfer local FILE to destination",
+ CURLHELP_IMPORTANT | CURLHELP_UPLOAD},
{" --url <url>",
- "URL to work with"},
+ "URL to work with",
+ CURLHELP_CURL},
{"-B, --use-ascii",
- "Use ASCII/text transfer"},
+ "Use ASCII/text transfer",
+ CURLHELP_MISC},
{"-u, --user <user:password>",
- "Server user and password"},
+ "Server user and password",
+ CURLHELP_IMPORTANT | CURLHELP_AUTH},
{"-A, --user-agent <name>",
- "Send User-Agent <name> to server"},
+ "Send User-Agent <name> to server",
+ CURLHELP_IMPORTANT | CURLHELP_HTTP},
{"-v, --verbose",
- "Make the operation more talkative"},
+ "Make the operation more talkative",
+ CURLHELP_IMPORTANT | CURLHELP_VERBOSE},
{"-V, --version",
- "Show version number and quit"},
+ "Show version number and quit",
+ CURLHELP_IMPORTANT | CURLHELP_CURL},
{"-w, --write-out <format>",
- "Use output FORMAT after completion"},
+ "Use output FORMAT after completion",
+ CURLHELP_VERBOSE},
{" --xattr",
- "Store metadata in extended file attributes"},
- { NULL, NULL }
+ "Store metadata in extended file attributes",
+ CURLHELP_MISC},
+ { NULL, NULL, CURLHELP_HIDDEN }
};
#ifdef NETWARE
@@ -563,16 +868,65 @@ static const struct feat feats[] = {
{"alt-svc", CURL_VERSION_ALTSVC},
};
-void tool_help(void)
+static void print_category(curlhelp_t category)
+{
+ unsigned int i;
+ for(i = 0; helptext[i].opt; ++i)
+ if(helptext[i].categories & category) {
+ printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
+ }
+}
+
+/* Prints category if found. If not, it returns 1 */
+static int get_category_content(const char *category)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ if(curl_strequal(categories[i].opt, category)) {
+ printf("%s: %s\n", categories[i].opt, categories[i].desc);
+ print_category(categories[i].category);
+ return 0;
+ }
+ return 1;
+}
+
+/* Prints all categories and their description */
+static void get_categories(void)
+{
+ unsigned int i;
+ for(i = 0; categories[i].opt; ++i)
+ printf(" %-11s %s\n", categories[i].opt, categories[i].desc);
+}
+
+
+void tool_help(const char *category)
{
- int i;
puts("Usage: curl [options...] <url>");
- for(i = 0; helptext[i].opt; i++) {
- printf(" %-19s %s\n", helptext[i].opt, helptext[i].desc);
-#ifdef PRINT_LINES_PAUSE
- if(i && ((i % PRINT_LINES_PAUSE) == 0))
- tool_pressanykey();
-#endif
+ /* If no category was provided */
+ if(!category) {
+ const char *category_note = "\nThis is not the full help, this "
+ "menu is stripped into categories.\nUse \"--help category\" to get "
+ "an overview of all categories.\nFor all options use the manual"
+ " or \"--help all\".";
+ print_category(CURLHELP_IMPORTANT);
+ puts(category_note);
+ return;
+ }
+ /* Lets print everything if "all" was provided */
+ if(curl_strequal(category, "all")) {
+ /* Print everything except hidden */
+ print_category(~(CURLHELP_HIDDEN));
+ return;
+ }
+ /* Lets handle the string "category" differently to not print an errormsg */
+ if(curl_strequal(category, "category")) {
+ get_categories();
+ return;
+ }
+ /* Otherwise print category and handle the case if the cat was not found */
+ if(get_category_content(category)) {
+ puts("Invalid category provided, here is a list of all categories:\n");
+ get_categories();
}
}
diff --git a/src/tool_help.h b/src/tool_help.h
index bfb5dcdf3..6c507d4cc 100644
--- a/src/tool_help.h
+++ b/src/tool_help.h
@@ -23,7 +23,7 @@
***************************************************************************/
#include "tool_setup.h"
-void tool_help(void);
+void tool_help(const char *category);
void tool_list_engines(void);
void tool_version_info(void);
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 1fe7637d2..517ad1f62 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -2536,7 +2536,7 @@ CURLcode operate(struct GlobalConfig *global, int argc, argv_item_t argv[])
/* Check if we were asked for the help */
if(res == PARAM_HELP_REQUESTED)
- tool_help();
+ tool_help(global->help_category);
/* Check if we were asked for the manual */
else if(res == PARAM_MANUAL_REQUESTED)
hugehelp();