annotate liboctave/wrappers/octave-popen2.c @ 31191:bb9d776eafac stable

Fix wrong color in PDF printout of some latex strings (bug #62884) * octave-svgconvert (draw): For "rect" elements only set brush color if necessary and eventually restore to previous color.
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Sun, 14 Aug 2022 18:24:07 +0200
parents 796f54d4ddbf
children 597f3ee61a48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29538
diff changeset
3 // Copyright (C) 2016-2022 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
26 // It makes more sense to define octave_popen2 with the wrapper
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
27 // functions than it does to try to provide wrappers for all the
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 // individual functions and macros that it uses and that may be provided
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29 // by gnulib. We don't include gnulib headers directly in Octave's C++
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 // source files to avoid problems that may be caused by the way that
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
31 // gnulib overrides standard library functions.
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
32
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
33 #if defined (HAVE_CONFIG_H)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 # include "config.h"
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #endif
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
36
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 #include <stdbool.h>
21933
efe9df9a1071 * octave-popen2.c: Include stdio.h for perror decl and fcnt.h for fcntl decl.
John W. Eaton <jwe@octave.org>
parents: 21911
diff changeset
38 #include <stdio.h>
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39 #include <stdlib.h>
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
40 #include <string.h>
21933
efe9df9a1071 * octave-popen2.c: Include stdio.h for perror decl and fcnt.h for fcntl decl.
John W. Eaton <jwe@octave.org>
parents: 21911
diff changeset
41
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
42 #if defined (__WIN32__) && ! defined (__CYGWIN__)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
43 # include <fcntl.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
44 # include <io.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
45 # define WIN32_LEAN_AND_MEAN 1
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
46 # include <windows.h>
29538
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
47
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
48 # include "uniconv-wrappers.h"
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
49 #else
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
50 # include <errno.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
51 # include <fcntl.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
52 # include <sys/types.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
53 # include <unistd.h>
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
54 #endif
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
55
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
56 #include "octave-popen2.h"
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
57
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
58 #if defined (__WIN32__) && ! defined (__CYGWIN__)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
59
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
60 static char *
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
61 make_command_string (const char *cmd, char *const *args)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
62 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
63 char *const *argp;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
64 size_t cmd_len;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
65 char *command;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
66
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
67 // Count Command length, quotes, and terminating NUL character.
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
68 cmd_len = strlen (cmd) + 3;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
69
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
70 // Count argument length, space, and quotes.
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
71 // Ignore first arg as it is the command.
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
72 argp = args;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
73 while (*++argp)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
74 cmd_len += strlen (*argp) + 3;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
75
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
76 command = (char *) malloc (cmd_len);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
77
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
78 sprintf (command, "\"%s\"", cmd);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
79
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
80 argp = args;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
81 while (*++argp)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
82 sprintf (command, "%s \"%s\"", command, *argp);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
83
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
84 return command;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
85 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
86
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
87 pid_t
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
88 octave_popen2 (const char *cmd, char *const *args, bool sync_mode,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
89 int *fildes, const char **errmsg)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
90 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
91 pid_t pid;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
92
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
93 char *command;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
94 bool status;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
95
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
96 PROCESS_INFORMATION pi;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
97 STARTUPINFO si;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
98
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
99 HANDLE hProcess = GetCurrentProcess ();
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
100 HANDLE childRead, childWrite, parentRead, parentWrite;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
101 DWORD pipeMode;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
102
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
103 ZeroMemory (&pi, sizeof (pi));
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
104 ZeroMemory (&si, sizeof (si));
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
105 si.cb = sizeof (si);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
106
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
107 if (! CreatePipe (&childRead, &parentWrite, 0, 0)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
108 || ! DuplicateHandle (hProcess, childRead, hProcess, &childRead,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
109 0, TRUE,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
110 DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
111 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
112 *errmsg = "popen2: pipe creation failed";
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
113 return -1;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
114 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
115
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
116 if (! CreatePipe (&parentRead, &childWrite, 0, 0)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
117 || ! DuplicateHandle (hProcess, childWrite, hProcess, &childWrite,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
118 0, TRUE,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
119 DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
120 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
121 *errmsg = "popen2: pipe creation failed";
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
122 return -1;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
123 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
124
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
125 if (! sync_mode)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
126 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
127 pipeMode = PIPE_NOWAIT;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
128 SetNamedPipeHandleState (parentRead, &pipeMode, 0, 0);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
129 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
130
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
131 fildes[1] = _open_osfhandle ((intptr_t) parentRead, _O_RDONLY | _O_BINARY);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
132 fildes[0] = _open_osfhandle ((intptr_t) parentWrite, _O_WRONLY | _O_BINARY);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
133
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
134 si.dwFlags |= STARTF_USESTDHANDLES;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
135
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
136 si.hStdInput = childRead;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
137 si.hStdOutput = childWrite;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
138 si.hStdError = GetStdHandle (STD_ERROR_HANDLE);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
139
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
140 command = make_command_string (cmd, args);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
141
29538
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
142 wchar_t *wcmd = u8_to_wchar (command);
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
143
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
144 free (command);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
145
29538
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
146 status = CreateProcessW (NULL, wcmd, NULL, NULL, TRUE, CREATE_NO_WINDOW,
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
147 NULL, NULL, &si, &pi);
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
148
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
149 free (wcmd);
d1cb1b0e9c05 Windows: Support opening pipe with non-ASCII characters in command.
Markus Mützel <markus.muetzel@gmx.de>
parents: 29358
diff changeset
150
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
151 if (! status)
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
152 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
153 *errmsg = "popen2: process creation failed";
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
154 return -1;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
155 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
156
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
157 pid = pi.dwProcessId;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
158
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
159 CloseHandle (childRead);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
160 CloseHandle (childWrite);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
161
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
162 CloseHandle (pi.hProcess);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
163 CloseHandle (pi.hThread);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
164
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
165 return pid;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
166 }
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
167
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
168 #else
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
169
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
170 pid_t
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
171 octave_popen2 (const char *cmd, char *const *args, bool sync_mode,
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
172 int *fildes, const char **errmsg)
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
173 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
174 pid_t pid;
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
175
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
176 int child_stdin[2], child_stdout[2];
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
177
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
178 if (pipe (child_stdin) < 0)
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
179 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
180 *errmsg = strerror (errno);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
181 return -1;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
182 }
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
183
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
184 if (pipe (child_stdout) < 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
185 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
186 close (child_stdin[0]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
187 close (child_stdin[1]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
188
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
189 *errmsg = strerror (errno);
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
190 return -1;
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
191 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
192
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
193 pid = fork ();
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
194
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
195 if (pid == 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
196 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
197 // Child process
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
198
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
199 close (child_stdin[1]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
200 close (child_stdout[0]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
201
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
202 if (dup2 (child_stdin[0], STDIN_FILENO) >= 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
203 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
204 close (child_stdin[0]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
205
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
206 if (dup2 (child_stdout[1], STDOUT_FILENO) >= 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
207 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
208 close (child_stdout[1]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
209
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
210 if (execvp (cmd, args) < 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
211 perror ("popen2 (child)");
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
212 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
213 else
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
214 perror ("popen2 (child)");
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
215 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
216 else
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
217 perror ("popen2 (child)");
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
218
22730
838d52a3283e Stop segfault when popen2 called with invalid command (bug #49525).
Mike Miller <mtmiller@octave.org>
parents: 22402
diff changeset
219 _exit (127);
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
220 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
221 else if (pid > 0)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
222 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
223 // Parent process
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
224
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
225 close (child_stdin[0]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
226 close (child_stdout[1]);
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
227
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
228 #if defined (F_SETFL) && defined (O_NONBLOCK)
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
229 if (! sync_mode && fcntl (child_stdout[0], F_SETFL, O_NONBLOCK) < 0)
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
230 {
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
231 *errmsg = strerror (errno);
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
232 return -1;
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
233 }
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
234 else
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
235 #endif
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
236 {
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
237 fildes[0] = child_stdin[1];
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
238 fildes[1] = child_stdout[0];
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
239
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
240 return pid;
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
241 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
242 }
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
243
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
244 *errmsg = "foobar!";
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
245 *errmsg = strerror (errno);
21911
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
246 return pid;
c66c156e1d1d hide fcntl.h header
John W. Eaton <jwe@octave.org>
parents:
diff changeset
247 }
21949
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
248
baeffde5c87d fix build for Windows systems
John W. Eaton <jwe@octave.org>
parents: 21933
diff changeset
249 #endif