summaryrefslogtreecommitdiff
path: root/src/include/common/string.h
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-11-17 19:09:54 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-11-17 19:09:54 -0500
commit5f1148224bd78bcf3bf7d916b8fe85dd820c52c6 (patch)
tree334f4635e481d7c07b91d8a26bf4d64b8f687b25 /src/include/common/string.h
parenta148f8bc04b9980f019ea0d4b89311cf0bdc22b7 (diff)
Provide a variant of simple_prompt() that can be interrupted by ^C.
Up to now, you couldn't escape out of psql's \password command by typing control-C (or other local spelling of SIGINT). This is pretty user-unfriendly, so improve it. To do so, we have to modify the functions provided by pg_get_line.c; but we don't want to mess with psql's SIGINT handler setup, so provide an API that lets that handler cause the cancel to occur. This relies on the assumption that we won't do any major harm by longjmp'ing out of fgets(). While that's obviously a little shaky, we've long had the same assumption in the main input loop, and few issues have been reported. psql has some other simple_prompt() calls that could usefully be improved the same way; for now, just deal with \password. Nathan Bossart, minor tweaks by me Discussion: https://postgr.es/m/747443.1635536754@sss.pgh.pa.us
Diffstat (limited to 'src/include/common/string.h')
-rw-r--r--src/include/common/string.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/include/common/string.h b/src/include/common/string.h
index 686c158efe7..8eb5271ec86 100644
--- a/src/include/common/string.h
+++ b/src/include/common/string.h
@@ -12,6 +12,14 @@
struct StringInfoData; /* avoid including stringinfo.h here */
+typedef struct PromptInterruptContext
+{
+ /* To avoid including <setjmp.h> here, jmpbuf is declared "void *" */
+ void *jmpbuf; /* existing longjmp buffer */
+ volatile bool *enabled; /* flag that enables longjmp-on-interrupt */
+ bool canceled; /* indicates whether cancellation occurred */
+} PromptInterruptContext;
+
/* functions in src/common/string.c */
extern bool pg_str_endswith(const char *str, const char *end);
extern int strtoint(const char *pg_restrict str, char **pg_restrict endptr,
@@ -21,11 +29,14 @@ extern int pg_strip_crlf(char *str);
extern bool pg_is_ascii(const char *str);
/* functions in src/common/pg_get_line.c */
-extern char *pg_get_line(FILE *stream);
+extern char *pg_get_line(FILE *stream, PromptInterruptContext *prompt_ctx);
extern bool pg_get_line_buf(FILE *stream, struct StringInfoData *buf);
-extern bool pg_get_line_append(FILE *stream, struct StringInfoData *buf);
+extern bool pg_get_line_append(FILE *stream, struct StringInfoData *buf,
+ PromptInterruptContext *prompt_ctx);
/* functions in src/common/sprompt.c */
extern char *simple_prompt(const char *prompt, bool echo);
+extern char *simple_prompt_extended(const char *prompt, bool echo,
+ PromptInterruptContext *prompt_ctx);
#endif /* COMMON_STRING_H */