Changeset: 5130afcf32a8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5130afcf32a8
Modified Files:
clients/mapiclient/ReadlineTools.c
Branch: Oct2020
Log Message:
mclient/EDITOR integration should handle more than 1024 bytes
diffs (99 lines):
diff --git a/clients/mapiclient/ReadlineTools.c
b/clients/mapiclient/ReadlineTools.c
--- a/clients/mapiclient/ReadlineTools.c
+++ b/clients/mapiclient/ReadlineTools.c
@@ -291,10 +291,6 @@ continue_completion(rl_completion_func_t
rl_attempted_completion_function = func;
}
-#ifndef BUFSIZ
-#define BUFSIZ 1024
-#endif
-
static void
readline_show_error(const char *msg) {
rl_save_prompt();
@@ -303,13 +299,19 @@ readline_show_error(const char *msg) {
rl_clear_message();
}
+#ifndef BUFFER_SIZE
+#define BUFFER_SIZE 1024
+#endif
+
static int
invoke_editor(int cnt, int key) {
char template[] = "/tmp/mclient_temp_XXXXXX";
- char cmd[BUFSIZ];
- char *editor;
+ char editor_command[BUFFER_SIZE];
+ char *read_buff = NULL;
+ char *editor = NULL;
FILE *fp;
- size_t cmd_len;
+ size_t content_len;
+ size_t read_bytes;
(void) cnt;
(void) key;
@@ -324,35 +326,50 @@ invoke_editor(int cnt, int key) {
fflush(fp);
editor = getenv("VISUAL");
- if (!editor) {
+ if (editor == NULL) {
editor = getenv("EDITOR");
- if (!editor) {
+ if (editor == NULL) {
readline_show_error("invoke_editor: EDITOR/VISUAL env
variable not set\n");
goto bailout;
}
}
- snprintf(cmd, BUFSIZ, "%s %s", editor, template);
- if (system(cmd) != 0) {
+ snprintf(editor_command, BUFFER_SIZE, "%s %s", editor, template);
+ if (system(editor_command) != 0) {
readline_show_error("invoke_editor: Starting editor failed\n");
goto bailout;
}
- fseek(fp, 0, SEEK_SET);
- cmd_len = fread(cmd, sizeof(char), BUFSIZ, fp);
- fclose(fp);
+ fseek(fp, 0L, SEEK_END);
+ content_len = ftell(fp);
+ rewind(fp);
+
+ read_buff = (char *)malloc(content_len*sizeof(char));
+ if (read_buff == NULL) {
+ readline_show_error("invoke_editor: Cannot allocate memory\n");
+ goto bailout;
+ }
- *(cmd + cmd_len) = 0;
+ read_bytes = fread(read_buff, sizeof(char), content_len, fp);
+ fclose(fp);
+ unlink(template);
+ if (read_bytes != content_len) {
+ readline_show_error("invoke_editor: Did not read from file
correctly\n");
+ goto bailout;
+ }
- rl_replace_line(cmd, 0);
- rl_point = cmd_len - 1;
+ *(read_buff + read_bytes - 1) = 0;
+ rl_replace_line(read_buff, 0);
+ rl_point = read_bytes;
- unlink(template);
+ free(read_buff);
return 0;
bailout:
fclose(fp);
+ free(read_buff);
+ unlink(template);
return 1;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list