summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorNick Wellnhofer <wellnhofer@aevum.de>2022-08-29 23:53:40 +0200
committerNick Wellnhofer <wellnhofer@aevum.de>2022-08-30 00:10:05 +0200
commitce8f3d11957f44bc9bf901a3d7809cd5919caa7a (patch)
tree1de44716bcb9293e72266703f0529296650a3dac /python
parentb1a0961858cc5b26950697dc97b7fe8befd22932 (diff)
downloadlibxml2-ce8f3d11957f44bc9bf901a3d7809cd5919caa7a.tar.gz
Fix libxml_PyFileGet with stdout on macOS
macOS returns O_RDWR for standard file descriptors, but fails to write to stdout or stderr when opened with fdopen(dup_fd, "rw").
Diffstat (limited to 'python')
-rw-r--r--python/types.c60
1 files changed, 37 insertions, 23 deletions
diff --git a/python/types.c b/python/types.c
index 27ad5008..8d690472 100644
--- a/python/types.c
+++ b/python/types.c
@@ -155,30 +155,44 @@ libxml_PyFileGet(PyObject *f) {
return(NULL);
#else
/*
- * Get the flags on the fd to understand how it was opened
+ * macOS returns O_RDWR for standard streams, but fails to write to
+ * stdout or stderr when opened with fdopen(dup_fd, "rw").
*/
- flags = fcntl(fd, F_GETFL, 0);
- switch (flags & O_ACCMODE) {
- case O_RDWR:
- if (flags & O_APPEND)
- mode = "a+";
- else
- mode = "rw";
- break;
- case O_RDONLY:
- if (flags & O_APPEND)
- mode = "r+";
- else
- mode = "r";
- break;
- case O_WRONLY:
- if (flags & O_APPEND)
- mode = "a";
- else
- mode = "w";
- break;
- default:
- return(NULL);
+ switch (fd) {
+ case STDIN_FILENO:
+ mode = "r";
+ break;
+ case STDOUT_FILENO:
+ case STDERR_FILENO:
+ mode = "w";
+ break;
+ default:
+ /*
+ * Get the flags on the fd to understand how it was opened
+ */
+ flags = fcntl(fd, F_GETFL, 0);
+ switch (flags & O_ACCMODE) {
+ case O_RDWR:
+ if (flags & O_APPEND)
+ mode = "a+";
+ else
+ mode = "rw";
+ break;
+ case O_RDONLY:
+ if (flags & O_APPEND)
+ mode = "r+";
+ else
+ mode = "r";
+ break;
+ case O_WRONLY:
+ if (flags & O_APPEND)
+ mode = "a";
+ else
+ mode = "w";
+ break;
+ default:
+ return(NULL);
+ }
}
#endif