aboutsummaryrefslogtreecommitdiffstats
path: root/community/postgresql-pglogical/001-fix-stdin-handling.patch
diff options
context:
space:
mode:
authorJakub Jirutka <jakub@jirutka.cz>2017-11-23 23:58:19 +0100
committerJakub Jirutka <jakub@jirutka.cz>2017-11-23 23:58:19 +0100
commit1f9a4d8ea73e2ffa2cf4df87c0d57b4c312c0c80 (patch)
tree67a278d47a59824e5220d31e704869a033c83eb0 /community/postgresql-pglogical/001-fix-stdin-handling.patch
parent5518842d8e238fae34429ada5b438c5cecd93297 (diff)
downloadaports-1f9a4d8ea73e2ffa2cf4df87c0d57b4c312c0c80.tar.bz2
aports-1f9a4d8ea73e2ffa2cf4df87c0d57b4c312c0c80.tar.xz
community/postgresql-pglogical: move from testing
Diffstat (limited to 'community/postgresql-pglogical/001-fix-stdin-handling.patch')
-rw-r--r--community/postgresql-pglogical/001-fix-stdin-handling.patch51
1 files changed, 51 insertions, 0 deletions
diff --git a/community/postgresql-pglogical/001-fix-stdin-handling.patch b/community/postgresql-pglogical/001-fix-stdin-handling.patch
new file mode 100644
index 0000000000..8ba3f6c958
--- /dev/null
+++ b/community/postgresql-pglogical/001-fix-stdin-handling.patch
@@ -0,0 +1,51 @@
+diff --git a/pglogical_apply_spi.c b/pglogical_apply_spi.c
+index 3eaccc4..111a4eb 100644
+--- a/pglogical_apply_spi.c
++++ b/pglogical_apply_spi.c
+@@ -454,7 +454,7 @@ static void
+ pglogical_proccess_copy(pglogical_copyState *pglcstate)
+ {
+ uint64 processed;
+- FILE *save_stdin;
++ int save_stdin;
+
+ if (!pglcstate->copy_parsetree || !pglcstate->copy_buffered_tuples)
+ return;
+@@ -489,8 +489,16 @@ pglogical_proccess_copy(pglogical_copyState *pglcstate)
+ * for this relation. Before that we save the current 'stdin' stream and
+ * restore it back when the COPY is done
+ */
+- save_stdin = stdin;
+- stdin = pglcstate->copy_read_file;
++ save_stdin = dup(fileno(stdin));
++ if (save_stdin < 0)
++ ereport(FATAL,
++ (errcode_for_file_access(),
++ errmsg("could not save stdin: %m")));
++
++ if (dup2(fileno(pglcstate->copy_read_file), fileno(stdin)) < 0)
++ ereport(FATAL,
++ (errcode_for_file_access(),
++ errmsg("could not redirect stdin: %m")));
+
+ /* COPY may call into SPI (triggers, ...) and we already are in SPI. */
+ SPI_push();
+@@ -501,10 +509,17 @@ pglogical_proccess_copy(pglogical_copyState *pglcstate)
+
+ /* Clean up SPI state */
+ SPI_pop();
++ /*
++ * Also close the read end of the pipe and restore 'stdin' to its original
++ * value
++ */
++ if (dup2(save_stdin, fileno(stdin)) < 0)
++ ereport(FATAL,
++ (errcode_for_file_access(),
++ errmsg("could not restore stdin: %m")));
+
+ fclose(pglcstate->copy_read_file);
+ pglcstate->copy_read_file = NULL;
+- stdin = save_stdin;
+
+ /* Ensure we processed correct number of tuples */
+ Assert(processed == pglcstate->copy_buffered_tuples);