1 /* Command line processing */
10 #ifdef HAVE_SYS_SOCKET_H
11 #include <sys/socket.h> /* OS/2 needs this after sys/types.h */
13 #include <sys/stat.h> /* OS/2 needs this after sys/types.h */
18 /* We need to have it here. Stupid BSD. */
19 #ifdef HAVE_NETINET_IN_H
20 #include <netinet/in.h>
22 #ifdef HAVE_ARPA_INET_H
23 #include <arpa/inet.h>
28 #include "config/cmdline.h"
29 #include "config/conf.h"
30 #include "config/options.h"
31 #include "config/opttypes.h"
32 #include "intl/gettext/libintl.h"
33 #include "network/dns.h"
34 #include "protocol/uri.h"
35 #include "session/session.h"
36 #include "util/error.h"
37 #include "util/file.h"
38 #include "util/lists.h"
39 #include "util/memory.h"
40 #include "util/string.h"
43 /* Hack to handle URL extraction for -remote commands */
44 static unsigned char *remote_url
;
47 parse_options_(int argc
, unsigned char *argv
[], struct option
*opt
,
48 LIST_OF(struct string_list_item
) *url_list
)
53 if (argv
[-1][0] == '-' && argv
[-1][1]) {
54 struct option
*option
;
55 unsigned char *argname
= &argv
[-1][1];
56 unsigned char *oname
= stracpy(argname
);
61 /* Treat --foo same as -foo. */
62 if (argname
[0] == '-') argname
++;
64 option
= get_opt_rec(opt
, argname
);
65 if (!option
) option
= get_opt_rec(opt
, oname
);
69 oname
++; /* the '-' */
70 /* Substitute '-' by '_'. This helps
71 * compatibility with that very wicked browser
73 for (pos
= strchr(oname
, '_'); pos
;
74 pos
= strchr(pos
, '_'))
76 option
= get_opt_rec(opt
, oname
);
82 if (!option
) goto unknown_option
;
84 if (!option_types
[option
->type
].cmdline
)
87 err
= option_types
[option
->type
].cmdline(option
, &argv
, &argc
);
91 usrerror(gettext("Cannot parse option %s: %s"), argv
[-1], err
);
96 /* XXX: Empty strings means all is well and have
97 * a cup of shut the fsck up. */
100 } else if (remote_url
) {
101 if (url_list
) add_to_string_list(url_list
, remote_url
, -1);
102 mem_free(remote_url
);
106 } else if (url_list
) {
107 add_to_string_list(url_list
, argv
[-1], -1);
114 usrerror(gettext("Unknown option %s"), argv
[-1]);
119 parse_options(int argc
, unsigned char *argv
[],
120 LIST_OF(struct string_list_item
) *url_list
)
122 return parse_options_(argc
, argv
, cmdline_options
, url_list
);
126 /**********************************************************************
128 **********************************************************************/
130 static unsigned char *
131 eval_cmd(struct option
*o
, unsigned char ***argv
, int *argc
)
133 if (*argc
< 1) return gettext("Parameter expected");
135 (*argv
)++; (*argc
)--; /* Consume next argument */
137 parse_config_file(config_options
, "-eval", *(*argv
- 1), NULL
, 0);
144 static unsigned char *
145 forcehtml_cmd(struct option
*o
, unsigned char ***argv
, int *argc
)
147 safe_strncpy(get_opt_str("mime.default_type"), "text/html", MAX_STR_LEN
);
151 static unsigned char *
152 lookup_cmd(struct option
*o
, unsigned char ***argv
, int *argc
)
154 struct sockaddr_storage
*addrs
= NULL
;
157 if (!*argc
) return gettext("Parameter expected");
158 if (*argc
> 1) return gettext("Too many parameters");
160 (*argv
)++; (*argc
)--;
161 if (do_real_lookup(*(*argv
- 1), &addrs
, &addrno
, 0) == DNS_ERROR
) {
163 herror(gettext("error"));
165 usrerror(gettext("Host not found"));
170 for (i
= 0; i
< addrno
; i
++) {
172 struct sockaddr_in6 addr
= *((struct sockaddr_in6
*) &(addrs
)[i
]);
173 unsigned char p
[INET6_ADDRSTRLEN
];
175 if (! inet_ntop(addr
.sin6_family
,
176 (addr
.sin6_family
== AF_INET6
? (void *) &addr
.sin6_addr
177 : (void *) &((struct sockaddr_in
*) &addr
)->sin_addr
),
178 p
, INET6_ADDRSTRLEN
))
179 ERROR(gettext("Resolver error"));
183 struct sockaddr_in addr
= *((struct sockaddr_in
*) &(addrs
)[i
]);
184 unsigned char *p
= (unsigned char *) &addr
.sin_addr
.s_addr
;
186 printf("%d.%d.%d.%d\n", (int) p
[0], (int) p
[1],
187 (int) p
[2], (int) p
[3]);
198 #define skipback_whitespace(start, S) \
199 while ((start) < (S) && isspace((S)[-1])) (S)--;
201 static unsigned char *
202 remote_cmd(struct option
*o
, unsigned char ***argv
, int *argc
)
207 REMOTE_METHOD_OPENURL
,
209 REMOTE_METHOD_XFEDOCOMMAND
,
210 REMOTE_METHOD_ADDBOOKMARK
,
211 REMOTE_METHOD_INFOBOX
,
212 REMOTE_METHOD_NOT_SUPPORTED
,
214 } remote_methods
[] = {
215 { "openURL", REMOTE_METHOD_OPENURL
},
216 { "ping", REMOTE_METHOD_PING
},
217 { "addBookmark", REMOTE_METHOD_ADDBOOKMARK
},
218 { "infoBox", REMOTE_METHOD_INFOBOX
},
219 { "xfeDoCommand", REMOTE_METHOD_XFEDOCOMMAND
},
220 { NULL
, REMOTE_METHOD_NOT_SUPPORTED
},
222 unsigned char *command
, *arg
, *argend
, *argstring
;
224 unsigned char *remote_argv
[10];
227 if (*argc
< 1) return gettext("Parameter expected");
231 while (isasciialpha(command
[len
]))
234 /* Find the begining and end of the argument list. */
239 argend
= arg
+ strlen(arg
);
240 skipback_whitespace(arg
, argend
);
244 /* Decide whether to use the "extended" --remote format where
245 * all URLs following should be opened in tabs. */
246 if (len
== 0 || *arg
!= '(' || *argend
!= ')') {
247 /* Just open any passed URLs in new tabs */
248 remote_session_flags
|= SES_REMOTE_NEW_TAB
;
254 arg
= argstring
= memacpy(arg
, argend
- arg
);
256 return gettext("Out of memory");
260 unsigned char *start
, *end
;
262 if (remote_argc
> sizeof_array(remote_argv
)) {
264 return gettext("Too many arguments");
267 /* Skip parenthesis, comma, and surrounding whitespace. */
273 while ((end
= strchr(end
, '"'))) {
274 /* Treat "" inside quoted arg as ". */
282 return gettext("Mismatched ending argument quoting");
286 if (*arg
&& *arg
!= ',')
287 return gettext("Garbage after quoted argument");
289 remote_argv
[remote_argc
++] = start
;
292 /* Unescape "" to ". */
293 for (end
= start
; *end
; start
++, end
++) {
301 end
= strchr(start
, ',');
303 end
= start
+ strlen(start
);
308 skipback_whitespace(start
, end
);
311 remote_argv
[remote_argc
++] = start
;
319 for (method
= 0; remote_methods
[method
].name
; method
++) {
320 unsigned char *name
= remote_methods
[method
].name
;
322 if (!strlcasecmp(command
, len
, name
, -1))
326 switch (remote_methods
[method
].type
) {
327 case REMOTE_METHOD_OPENURL
:
328 if (remote_argc
< 1) {
329 /* Prompt for a URL with a dialog box */
330 remote_session_flags
|= SES_REMOTE_PROMPT_URL
;
334 if (remote_argc
== 2) {
335 unsigned char *where
= remote_argv
[1];
337 if (strstr(where
, "new-window")) {
338 remote_session_flags
|= SES_REMOTE_NEW_WINDOW
;
340 } else if (strstr(where
, "new-tab")) {
341 remote_session_flags
|= SES_REMOTE_NEW_TAB
;
344 /* Bail out when getting unknown parameter */
345 /* TODO: new-screen */
350 remote_session_flags
|= SES_REMOTE_CURRENT_TAB
;
353 remote_url
= stracpy(remote_argv
[0]);
356 case REMOTE_METHOD_XFEDOCOMMAND
:
360 if (!strcasecmp(remote_argv
[0], "openBrowser")) {
361 remote_session_flags
= SES_REMOTE_NEW_WINDOW
;
365 case REMOTE_METHOD_PING
:
366 remote_session_flags
= SES_REMOTE_PING
;
369 case REMOTE_METHOD_ADDBOOKMARK
:
372 remote_url
= stracpy(remote_argv
[0]);
373 remote_session_flags
= SES_REMOTE_ADD_BOOKMARK
;
376 case REMOTE_METHOD_INFOBOX
:
379 remote_url
= stracpy(remote_argv
[0]);
381 insert_in_string(&remote_url
, 0, "about:", 6);
382 remote_session_flags
= SES_REMOTE_INFO_BOX
;
385 case REMOTE_METHOD_NOT_SUPPORTED
:
391 /* If no flags was applied it can only mean we are dealing with
393 if (!remote_session_flags
)
394 return gettext("Remote method not supported");
396 (*argv
)++; (*argc
)--; /* Consume next argument */
401 static unsigned char *
402 version_cmd(struct option
*o
, unsigned char ***argv
, int *argc
)
404 printf("%s\n", full_static_version
);
410 /* Below we handle help usage printing.
412 * We're trying to achieve several goals here:
414 * - Genericly define a function to print option trees iteratively.
415 * - Make output parsable for various doc tools (to make manpages).
416 * - Do some non generic fancy stuff like printing semi-aliased
417 * options (like: -?, -h and -help) on one line when printing
420 #define gettext_nonempty(x) (*(x) ? gettext(x) : (x))
422 static void print_full_help_outer(struct option
*tree
, unsigned char *path
);
425 print_full_help_inner(struct option
*tree
, unsigned char *path
,
428 struct option
*option
;
429 unsigned char saved
[MAX_STR_LEN
];
430 unsigned char *savedpos
= saved
;
434 foreach (option
, *tree
->value
.tree
) {
435 enum option_type type
= option
->type
;
437 unsigned char *capt
= option
->capt
;
438 unsigned char *desc
= (option
->desc
&& *option
->desc
)
439 ? (unsigned char *) gettext(option
->desc
)
440 : (unsigned char *) "N/A";
442 if (trees
!= (type
== OPT_TREE
))
445 /* Don't print deprecated aliases (if we don't walk command
446 * line options which use aliases for legitimate options). */
447 if ((type
== OPT_ALIAS
&& tree
!= cmdline_options
)
448 || (option
->flags
& OPT_HIDDEN
))
451 if (!capt
&& !strncasecmp(option
->name
, "_template_", 10))
452 capt
= (unsigned char *) N_("Template option folder");
455 int len
= strlen(option
->name
);
456 int max
= MAX_STR_LEN
- (savedpos
- saved
);
458 safe_strncpy(savedpos
, option
->name
, max
);
459 safe_strncpy(savedpos
+ len
, ", -", max
- len
);
464 help
= gettext_nonempty(option_types
[option
->type
].help_str
);
466 if (type
!= OPT_TREE
)
467 printf(" %s%s%s %s ",
468 path
, saved
, option
->name
, help
);
470 /* Print the 'title' of each option type. */
475 printf(gettext("(default: %ld)"),
477 ? option
->value
.big_number
478 : (long) option
->value
.number
);
482 printf(gettext("(default: \"%s\")"),
483 option
->value
.string
);
487 printf(gettext("(alias for %s)"),
488 option
->value
.string
);
492 printf(gettext("(default: %s)"),
493 get_cp_name(option
->value
.number
));
498 color_T color
= option
->value
.color
;
499 unsigned char hexcolor
[8];
501 printf(gettext("(default: %s)"),
502 get_color_string(color
, hexcolor
));
511 printf(gettext("(default: \"%s\")"),
512 language_to_name(option
->value
.number
));
518 int pathlen
= strlen(path
);
519 int namelen
= strlen(option
->name
);
521 if (pathlen
+ namelen
+ 2 > MAX_STR_LEN
)
524 /* Append option name to path */
526 memcpy(saved
, path
, pathlen
);
527 savedpos
= saved
+ pathlen
;
531 memcpy(savedpos
, option
->name
, namelen
+ 1);
534 capt
= gettext_nonempty(capt
);
535 printf(" %s: (%s)", capt
, saved
);
540 printf("\n %8s", "");
542 int l
= strlen(desc
);
545 for (i
= 0; i
< l
; i
++) {
554 if (option
->type
== OPT_TREE
) {
555 memcpy(savedpos
, ".", 2);
556 print_full_help_outer(option
, saved
);
565 print_full_help_outer(struct option
*tree
, unsigned char *path
)
567 print_full_help_inner(tree
, path
, 0);
568 print_full_help_inner(tree
, path
, 1);
572 print_short_help(void)
574 #define ALIGN_WIDTH 20
575 struct option
*option
;
576 struct string string
= NULL_STRING
;
577 struct string
*saved
= NULL
;
578 unsigned char align
[ALIGN_WIDTH
];
580 /* Initialize @space used to align captions. */
581 memset(align
, ' ', sizeof(align
) - 1);
582 align
[sizeof(align
) - 1] = 0;
584 foreach (option
, *cmdline_options
->value
.tree
) {
587 unsigned char *info
= saved
? saved
->source
588 : (unsigned char *) "";
589 int len
= strlen(option
->name
);
591 /* Avoid printing compatibility options */
592 if (option
->flags
& OPT_HIDDEN
)
595 /* When no caption is available the option name is 'stacked'
596 * and the caption is shared with next options that has one. */
599 if (!init_string(&string
))
605 add_to_string(saved
, option
->name
);
606 add_to_string(saved
, ", -");
610 capt
= gettext_nonempty(option
->capt
);
611 help
= gettext_nonempty(option_types
[option
->type
].help_str
);
613 /* When @help string is non empty align at least one space. */
614 len
= ALIGN_WIDTH
- len
- strlen(help
);
615 len
-= (saved
? saved
->length
: 0);
616 len
= (len
< 0) ? !!(*help
) : len
;
619 printf(" -%s%s %s%s%s\n",
620 info
, option
->name
, help
, align
, capt
);
630 #undef gettext_nonempty
632 static unsigned char *
633 printhelp_cmd(struct option
*option
, unsigned char ***argv
, int *argc
)
635 unsigned char *lineend
= strchr(full_static_version
, '\n');
637 if (lineend
) *lineend
= '\0';
639 printf("%s\n\n", full_static_version
);
641 if (!strcmp(option
->name
, "config-help")) {
642 printf("%s:\n", gettext("Configuration options"));
643 print_full_help_outer(config_options
, "");
645 printf("%s\n\n%s:\n",
646 gettext("Usage: elinks [OPTION]... [URL]..."),
648 if (!strcmp(option
->name
, "long-help")) {
649 print_full_help_outer(cmdline_options
, "-");
659 static unsigned char *
660 redir_cmd(struct option
*option
, unsigned char ***argv
, int *argc
)
662 unsigned char *target
;
664 /* I can't get any dirtier. --pasky */
666 if (!strcmp(option
->name
, "confdir")) {
667 target
= "config-dir";
668 } else if (!strcmp(option
->name
, "conffile")) {
669 target
= "config-file";
670 } else if (!strcmp(option
->name
, "stdin")) {
671 static int complained
;
677 /* Emulate bool option, possibly eating following 0/1. */
679 && ((*argv
)[0][0] == '0' || (*argv
)[0][0] == '1')
681 (*argv
)++, (*argc
)--;
682 fprintf(stderr
, "Warning: Deprecated option -stdin used!\n");
683 fprintf(stderr
, "ELinks now determines the -stdin option value automatically.\n");
684 fprintf(stderr
, "In the future versions ELinks will report error when you will\n");
685 fprintf(stderr
, "continue to use this option.\a\n");
689 return gettext("Internal consistency error");
692 option
= get_opt_rec(cmdline_options
, target
);
694 option_types
[option
->type
].cmdline(option
, argv
, argc
);
698 static unsigned char *
699 printconfigdump_cmd(struct option
*option
, unsigned char ***argv
, int *argc
)
701 unsigned char *config_string
;
704 get_opt_int("config.saving_style") = 2;
706 config_string
= create_config_string("", "", config_options
);
708 printf("%s", config_string
);
709 mem_free(config_string
);
717 /**********************************************************************
719 **********************************************************************/
721 /* Keep options in alphabetical order. */
723 struct option_info cmdline_options_info
[] = {
724 /* [gettext_accelerator_context(IGNORE)] */
725 INIT_OPT_BOOL("", N_("Restrict to anonymous mode"),
727 N_("Restricts ELinks so it can run on an anonymous account.\n"
728 "Local file browsing, downloads, and modification of options\n"
729 "will be disabled. Execution of viewers is allowed, but entries\n"
730 "in the association table can't be added or modified.")),
732 INIT_OPT_BOOL("", N_("Autosubmit first form"),
734 N_("Automatically submit the first form in the given URLs.")),
736 INIT_OPT_INT("", N_("Clone internal session with given ID"),
737 "base-session", 0, 0, INT_MAX
, 0,
738 N_("Used internally when opening ELinks instances in new windows.\n"
739 "The ID maps to information that will be used when creating the\n"
740 "new instance. You don't want to use it.")),
742 INIT_OPT_COMMAND("", NULL
, "confdir", OPT_HIDDEN
, redir_cmd
, NULL
),
744 INIT_OPT_STRING("", N_("Name of directory with configuration file"),
746 N_("Path of the directory ELinks will read and write its\n"
747 "config and runtime state files to instead of ~/.elinks.\n"
748 "If the path does not begin with a '/' it is assumed to be\n"
749 "relative to your HOME directory.")),
751 INIT_OPT_COMMAND("", N_("Print default configuration file to stdout"),
752 "config-dump", 0, printconfigdump_cmd
,
753 N_("Print a configuration file with options set to the built-in\n"
754 "defaults to stdout.")),
756 INIT_OPT_COMMAND("", NULL
, "conffile", OPT_HIDDEN
, redir_cmd
, NULL
),
758 INIT_OPT_STRING("", N_("Name of configuration file"),
759 "config-file", 0, "elinks.conf",
760 N_("Name of the configuration file that all configuration\n"
761 "options will be read from and written to. It should be\n"
762 "relative to config-dir.")),
764 INIT_OPT_COMMAND("", N_("Print help for configuration options"),
765 "config-help", 0, printhelp_cmd
,
766 N_("Print help for configuration options and exit.")),
768 INIT_OPT_CMDALIAS("", N_("MIME type assumed for unknown document types"),
769 "default-mime-type", 0, "mime.default_type",
770 N_("The default MIME type used for documents of unknown type.")),
772 INIT_OPT_BOOL("", N_("Ignore user-defined keybindings"),
773 "default-keys", 0, 0,
774 N_("When set, all keybindings from configuration files will be\n"
775 "ignored. It forces use of default keybindings and will reset\n"
776 "user-defined ones on save.")),
778 INIT_OPT_BOOL("", N_("Print formatted versions of given URLs to stdout"),
780 N_("Print formatted plain-text versions of given URLs to stdout.")),
782 INIT_OPT_CMDALIAS("", N_("Codepage to use with -dump"),
783 "dump-charset", 0, "document.dump.codepage",
784 N_("Codepage used when formatting dump output.")),
786 INIT_OPT_CMDALIAS("", N_("Color mode used with -dump"),
787 "dump-color-mode", 0, "document.dump.color_mode",
788 N_("Color mode used with -dump.")),
790 INIT_OPT_CMDALIAS("", N_("Width of document formatted with -dump"),
791 "dump-width", 0, "document.dump.width",
792 N_("Width of the dump output.")),
794 INIT_OPT_COMMAND("", N_("Evaluate configuration file directive"),
796 N_("Specify configuration file directives on the command-line\n"
797 "which will be evaluated after all configuration files has been\n"
798 "read. Example usage:\n"
799 "\t-eval 'set protocol.file.allow_special_files = 1'")),
801 /* lynx compatibility */
802 INIT_OPT_COMMAND("", N_("Interpret documents of unknown types as HTML"),
803 "force-html", 0, forcehtml_cmd
,
804 N_("Makes ELinks assume documents of unknown types are HTML.\n"
805 "Useful when using ELinks as an external viewer from MUAs.\n"
806 "This is equivalent to -default-mime-type text/html.")),
808 /* XXX: -?, -h and -help share the same caption and should be kept in
809 * the current order for usage help printing to be ok */
810 INIT_OPT_COMMAND("", NULL
, "?", 0, printhelp_cmd
, NULL
),
812 INIT_OPT_COMMAND("", NULL
, "h", 0, printhelp_cmd
, NULL
),
814 INIT_OPT_COMMAND("", N_("Print usage help and exit"),
815 "help", 0, printhelp_cmd
,
816 N_("Print usage help and exit.")),
818 INIT_OPT_BOOL("", N_("Only permit local connections"),
820 N_("Restricts ELinks to work offline and only connect to servers\n"
821 "with local addresses (ie. 127.0.0.1). No connections to remote\n"
822 "servers will be permitted.")),
824 INIT_OPT_COMMAND("", N_("Print detailed usage help and exit"),
825 "long-help", 0, printhelp_cmd
,
826 N_("Print detailed usage help and exit.")),
828 INIT_OPT_COMMAND("", N_("Look up specified host"),
829 "lookup", 0, lookup_cmd
,
830 N_("Look up specified host and print all DNS resolved IP addresses.")),
832 INIT_OPT_BOOL("", N_("Run as separate instance"),
834 N_("Run ELinks as a separate instance instead of connecting to an\n"
835 "existing instance. Note that normally no runtime state files\n"
836 "(bookmarks, history, etc.) are written to the disk when this\n"
837 "option is used. See also -touch-files.")),
839 INIT_OPT_BOOL("", N_("Disable use of files in ~/.elinks"),
841 N_("Disables creation and use of files in the user specific home\n"
842 "configuration directory (~/.elinks). It forces default configuration\n"
843 "values to be used and disables saving of runtime state files.")),
845 INIT_OPT_CMDALIAS("", N_("Disable link numbering in dump output"),
846 "no-numbering", OPT_ALIAS_NEGATE
, "document.dump.numbering",
847 N_("Prevents printing of link number in dump output.\n"
848 "Note that this really affects only -dump, nothing else.")),
850 INIT_OPT_CMDALIAS("", N_("Disable printing of link references in dump output"),
851 "no-references", OPT_ALIAS_NEGATE
, "document.dump.references",
852 N_("Prevents printing of references (URIs) of document links\n"
854 "Note that this really affects only -dump, nothing else.")),
856 INIT_OPT_COMMAND("", N_("Control an already running ELinks"),
857 "remote", 0, remote_cmd
,
858 N_("Control a remote ELinks instance by passing commands to it.\n"
859 "The option takes an additional argument containing the method\n"
860 "which should be invoked and any parameters that should be passed\n"
861 "to it. For ease of use, the additional method argument can be\n"
862 "omitted in which case any URL arguments will be opened in new\n"
863 "tabs in the remote instance.\n"
864 "Following is a list of the supported methods:\n"
865 "\tping() : look for a remote instance\n"
866 "\topenURL() : prompt URL in current tab\n"
867 "\topenURL(URL) : open URL in current tab\n"
868 "\topenURL(URL, new-tab) : open URL in new tab\n"
869 "\topenURL(URL, new-window) : open URL in new window\n"
870 "\taddBookmark(URL) : bookmark URL\n"
871 "\tinfoBox(text) : show text in a message box\n"
872 "\txfeDoCommand(openBrowser) : open new window")),
874 INIT_OPT_INT("", N_("Connect to session ring with given ID"),
875 "session-ring", 0, 0, INT_MAX
, 0,
876 N_("ID of session ring this ELinks session should connect to. ELinks\n"
877 "works in so-called session rings, whereby all instances of ELinks\n"
878 "are interconnected and share state (cache, bookmarks, cookies,\n"
879 "and so on). By default, all ELinks instances connect to session\n"
880 "ring 0. You can change that behaviour with this switch and form as\n"
881 "many session rings as you want. Obviously, if the session-ring with\n"
882 "this number doesn't exist yet, it's created and this ELinks instance\n"
883 "will become the master instance (that usually doesn't matter for you\n"
884 "as a user much). Note that you usually don't want to use this unless\n"
885 "you're a developer and you want to do some testing - if you want the\n"
886 "ELinks instances each running standalone, rather use the -no-connect\n"
887 "command-line option. Also note that normally no runtime state files\n"
888 "are written to the disk when this option is used. See also\n"
891 INIT_OPT_BOOL("", N_("Print the source of given URLs to stdout"),
893 N_("Print given URLs in source form to stdout.")),
895 INIT_OPT_COMMAND("", NULL
, "stdin", OPT_HIDDEN
, redir_cmd
, NULL
),
897 INIT_OPT_BOOL("", N_("Touch files in ~/.elinks when running with -no-connect/-session-ring"),
899 N_("When enabled, runtime state files (bookmarks, history, etc.) are\n"
900 "written to disk, even when -no-connect or -session-ring is used.\n"
901 "The option has no effect if not used in conjunction with any of\n"
904 INIT_OPT_INT("", N_("Verbose level"),
905 "verbose", 0, 0, VERBOSE_LEVELS
- 1, VERBOSE_WARNINGS
,
906 N_("The verbose level controls what messages are shown at\n"
907 "start up and while running:\n"
908 "\t0 means only show serious errors\n"
909 "\t1 means show serious errors and warnings\n"
910 "\t2 means show all messages")),
912 INIT_OPT_COMMAND("", N_("Print version information and exit"),
913 "version", 0, version_cmd
,
914 N_("Print ELinks version information and exit.")),