diff options
author | Emil Engler <me@emilengler.com> | 2020-09-02 20:11:20 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-09-04 15:38:20 +0200 |
commit | aa8777f63febca6a13f6b86e141a832232560037 (patch) | |
tree | 792a9f77d2482422aa25b4c676963f6ae3e441cd | |
parent | 5dddc1dc7e39bd9b54fd219c1b2e318f1f6c49b2 (diff) | |
download | curl-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.h | 1 | ||||
-rw-r--r-- | src/tool_getparam.c | 1 | ||||
-rw-r--r-- | src/tool_help.c | 842 | ||||
-rw-r--r-- | src/tool_help.h | 2 | ||||
-rw-r--r-- | src/tool_operate.c | 2 |
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(); |