mirror of
https://github.com/rkd77/elinks.git
synced 2025-01-03 14:57:44 -05:00
MIME: When there is no % in the handler string (no %s in the mailcap entry)
the handler reads data from stdin. I think it only works with copiousoutput. read_from_popen delayed because of internal errors.
This commit is contained in:
parent
469481b272
commit
4a7b9415e1
@ -315,6 +315,7 @@ read_from_popen(struct session *ses, unsigned char *handler, unsigned char *file
|
|||||||
unsigned char buf[48];
|
unsigned char buf[48];
|
||||||
|
|
||||||
struct popen_data *data = mem_calloc(1, sizeof(*data));
|
struct popen_data *data = mem_calloc(1, sizeof(*data));
|
||||||
|
struct delayed_open *deo;
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
@ -324,8 +325,13 @@ read_from_popen(struct session *ses, unsigned char *handler, unsigned char *file
|
|||||||
data->stream = stream;
|
data->stream = stream;
|
||||||
if (filename) data->filename = stracpy(filename);
|
if (filename) data->filename = stracpy(filename);
|
||||||
add_to_list(copiousoutput_data, data);
|
add_to_list(copiousoutput_data, data);
|
||||||
|
|
||||||
|
deo = mem_calloc(1, sizeof(*deo));
|
||||||
|
if (!deo) return;
|
||||||
snprintf(buf, 48, "file:///dev/fd/%d", fd);
|
snprintf(buf, 48, "file:///dev/fd/%d", fd);
|
||||||
goto_url(ses, buf);
|
deo->uri = get_uri(buf, 0);
|
||||||
|
deo->ses = ses;
|
||||||
|
register_bottom_half(delayed_goto_uri, deo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -778,6 +784,9 @@ static unsigned char *
|
|||||||
subst_file(unsigned char *prog, unsigned char *file)
|
subst_file(unsigned char *prog, unsigned char *file)
|
||||||
{
|
{
|
||||||
struct string name;
|
struct string name;
|
||||||
|
/* When there is no %s in the mailcap entry, the handler program reads
|
||||||
|
* data from stdin instead of a file. */
|
||||||
|
int input = 1;
|
||||||
|
|
||||||
if (!init_string(&name)) return NULL;
|
if (!init_string(&name)) return NULL;
|
||||||
|
|
||||||
@ -790,6 +799,7 @@ subst_file(unsigned char *prog, unsigned char *file)
|
|||||||
prog += p;
|
prog += p;
|
||||||
|
|
||||||
if (*prog == '%') {
|
if (*prog == '%') {
|
||||||
|
input = 0;
|
||||||
#if defined(HAVE_CYGWIN_CONV_TO_FULL_WIN32_PATH)
|
#if defined(HAVE_CYGWIN_CONV_TO_FULL_WIN32_PATH)
|
||||||
#ifdef MAX_PATH
|
#ifdef MAX_PATH
|
||||||
unsigned char new_path[MAX_PATH];
|
unsigned char new_path[MAX_PATH];
|
||||||
@ -808,6 +818,19 @@ subst_file(unsigned char *prog, unsigned char *file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (input) {
|
||||||
|
struct string s;
|
||||||
|
|
||||||
|
if (init_string(&s)) {
|
||||||
|
add_to_string(&s, "/bin/cat ");
|
||||||
|
add_char_to_string(&s, '"');
|
||||||
|
add_to_string(&s, file);
|
||||||
|
add_to_string(&s, "\" | ");
|
||||||
|
add_string_to_string(&s, &name);
|
||||||
|
done_string(&name);
|
||||||
|
return s.source;
|
||||||
|
}
|
||||||
|
}
|
||||||
return name.source;
|
return name.source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,6 +682,17 @@ delayed_goto_uri_frame(void *data)
|
|||||||
mem_free(deo);
|
mem_free(deo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
delayed_goto_uri(void *data)
|
||||||
|
{
|
||||||
|
struct delayed_open *deo = data;
|
||||||
|
|
||||||
|
assert(deo);
|
||||||
|
goto_uri(deo->ses, deo->uri);
|
||||||
|
done_uri(deo->uri);
|
||||||
|
mem_free(deo);
|
||||||
|
}
|
||||||
|
|
||||||
/* menu_func_T */
|
/* menu_func_T */
|
||||||
void
|
void
|
||||||
map_selected(struct terminal *term, void *ld_, void *ses_)
|
map_selected(struct terminal *term, void *ld_, void *ses_)
|
||||||
|
@ -28,6 +28,7 @@ struct uri *get_hooked_uri(unsigned char *uristring, struct session *ses, unsign
|
|||||||
void goto_uri(struct session *ses, struct uri *uri);
|
void goto_uri(struct session *ses, struct uri *uri);
|
||||||
void goto_uri_frame(struct session *, struct uri *, unsigned char *, enum cache_mode);
|
void goto_uri_frame(struct session *, struct uri *, unsigned char *, enum cache_mode);
|
||||||
void delayed_goto_uri_frame(void *);
|
void delayed_goto_uri_frame(void *);
|
||||||
|
void delayed_goto_uri(void *);
|
||||||
void goto_url(struct session *, unsigned char *);
|
void goto_url(struct session *, unsigned char *);
|
||||||
void goto_url_with_hook(struct session *, unsigned char *);
|
void goto_url_with_hook(struct session *, unsigned char *);
|
||||||
int goto_url_home(struct session *ses);
|
int goto_url_home(struct session *ses);
|
||||||
|
Loading…
Reference in New Issue
Block a user