diff --git a/Build.sh b/Build.sh
index 9c25c38..b2394ad 100644
--- a/Build.sh
+++ b/Build.sh
@@ -1668,6 +1668,7 @@ ac_header sys/select.h sys/types.h
 ac_header sys/sysmacros.h
 ac_header bstring.h
 ac_header grp.h sys/types.h
+ac_header io.h
 ac_header libgen.h
 ac_header libutil.h sys/types.h
 ac_header paths.h
diff --git a/exec.c b/exec.c
index efda5d5..7b98f8c 100644
--- a/exec.c
+++ b/exec.c
@@ -901,6 +901,9 @@ scriptexec(struct op *tp, const char **ap)
 		unsigned short m;
 		ssize_t n;
 
+#ifdef __OS2__
+		setmode(fd, O_TEXT);
+#endif
 		/* read first couple of octets from file */
 		n = read(fd, buf, sizeof(buf) - 1);
 		close(fd);
diff --git a/main.c b/main.c
index 8519b01..038fc89 100644
--- a/main.c
+++ b/main.c
@@ -1438,6 +1438,10 @@ openpipe(int *pv)
 	pv[1] = savefd(lpv[1]);
 	if (pv[1] != lpv[1])
 		close(lpv[1]);
+#ifdef __OS2__
+	setmode(pv[0], O_TEXT);
+	setmode(pv[1], O_BINARY);
+#endif
 }
 
 void
diff --git a/misc.c b/misc.c
index 6d48e05..e337b4b 100644
--- a/misc.c
+++ b/misc.c
@@ -1329,6 +1329,10 @@ blocking_read(int fd, char *buf, size_t nbytes)
 	ssize_t ret;
 	bool tried_reset = false;
 
+#ifdef __OS2__
+	int saved_mode = setmode(fd, O_TEXT);
+	int saved_errno;
+#endif
 	while ((ret = read(fd, buf, nbytes)) < 0) {
 		if (!tried_reset && errno == EAGAIN) {
 			if (reset_nonblock(fd) > 0) {
@@ -1339,6 +1343,11 @@ blocking_read(int fd, char *buf, size_t nbytes)
 		}
 		break;
 	}
+#ifdef __OS2__
+	saved_errno = errno;
+	setmode(fd, saved_mode);
+	errno = saved_errno;
+#endif
 	return (ret);
 }
 
diff --git a/sh.h b/sh.h
index d4a13dc..068b6cd 100644
--- a/sh.h
+++ b/sh.h
@@ -64,6 +64,9 @@
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
+#if HAVE_IO_H
+#include <io.h>
+#endif
 #if HAVE_LIBGEN_H
 #include <libgen.h>
 #endif