diff --git a/src/gmnlm.c b/src/gmnlm.c
index bf18d69514d3406b726264200178ead9ee5def45..700448e8c87510ab371c8c6f8438f2e088376475 100644
--- a/src/gmnlm.c
+++ b/src/gmnlm.c
@@ -102,9 +102,8 @@ "s\t\tSearch via geminispace.info\n"
"l\t\tSearch backlinks to current URI via geminispace.info\n"
"/<text>\t\tSearch for text (POSIX regular expression)\n"
"n\t\tJump to next search match\n"
- "d [path>\tDownload page to path, uses pwd & filename if path is omitted\n"
- "|<prog>\t\tPipe page into program\n"
- "[N]|<prog>\tPipe content of Nth link into program\n"
+ "d[N] [path]\tDownload page, or Nth link, to path\n"
+ "[N]|<prog>\tPipe page, or Nth link, into program\n"
"a\t\tToggle usage of alt text instead of preformatted text\n"
"q\t\tQuit\n"
"\n"
@@ -804,22 +803,42 @@ ? strchr(browser->meta, ';') : NULL);
result = PROMPT_AGAIN;
goto exit;
case 'd':
- if (in[1] != '\0' && !isspace(in[1])) break;
- struct gemini_response resp;
- strncpy(&url[0], browser->plain_url, sizeof(url)-1);
- // XXX: may affect history, do we care?
- enum gemini_result res = do_requests(browser, &resp);
- if (res != GEMINI_OK) {
- fprintf(stderr, "Error: %s\n",
- gemini_strerr(res, &resp));
- result = PROMPT_AGAIN;
- goto exit;
+ endptr = &in[1];
+ char *d_url = browser->plain_url;
+ if (in[1] != '\0' && !isspace(in[1])) {
+ struct link *link = browser->links;
+ int linksel = (int)strtol(in+1, &endptr, 10);
+ while (linksel > 0 && link) {
+ link = link->next;
+ --linksel;
+ }
+
+ if (!link) {
+ fprintf(stderr, "Error: no such link.\n");
+ break;
+ } else {
+ d_url = link->url;
+ }
}
+ struct gemini_response resp;
+ char url[1024] = {0}, old_url[1024] = {0};
+ strncpy(&old_url[0], browser->plain_url, sizeof(url)-1);
+ strncpy(&url[0], d_url, sizeof(url)-1);
+ // XXX: may affect history, do we care?
set_url(browser, url, NULL);
- download_resp(browser->tty, resp, trim_ws(&in[1]), url);
- gemini_response_finish(&resp);
- result = PROMPT_AGAIN;
- goto exit;
+ enum gemini_result res = do_requests(browser, &resp);
+ if (res != GEMINI_OK) {
+ fprintf(stderr, "Error: %s\n",
+ gemini_strerr(res, &resp));
+ result = PROMPT_AGAIN;
+ set_url(browser, old_url, NULL);
+ goto exit;
+ }
+ download_resp(browser->tty, resp, trim_ws(endptr), url);
+ gemini_response_finish(&resp);
+ result = PROMPT_AGAIN;
+ set_url(browser, old_url, NULL);
+ goto exit;
case '|':
strncpy(&url[0], browser->plain_url, sizeof(url)-1);
res = do_requests(browser, &resp);