summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--djgpp/djgpp.c19
-rw-r--r--dosish.h6
-rwxr-xr-xt/io/open.t4
3 files changed, 26 insertions, 3 deletions
diff --git a/djgpp/djgpp.c b/djgpp/djgpp.c
index c928851b76..80a627e518 100644
--- a/djgpp/djgpp.c
+++ b/djgpp/djgpp.c
@@ -433,3 +433,22 @@ Perl_DJGPP_init (int *argcp,char ***argvp)
strcpy (perlprefix,"..");
}
+int
+djgpp_fflush (FILE *fp)
+{
+ int res;
+
+ if ((res = fflush(fp)) == 0 && fp) {
+ Stat_t s;
+ if (Fstat(fileno(fp), &s) == 0 && !S_ISSOCK(s.st_mode))
+ res = fsync(fileno(fp));
+ }
+/*
+ * If the flush succeeded but set end-of-file, we need to clear
+ * the error because our caller may check ferror(). BTW, this
+ * probably means we just flushed an empty file.
+ */
+ if (res == 0 && fp && ferror(fp) == EOF) clearerr(fp);
+
+ return res;
+}
diff --git a/dosish.h b/dosish.h
index 08b48fa0fe..5f12b9d1b2 100644
--- a/dosish.h
+++ b/dosish.h
@@ -100,7 +100,11 @@
#define fwrite1 fwrite
#define Fstat(fd,bufptr) fstat((fd),(bufptr))
-#define Fflush(fp) fflush(fp)
+#ifdef DJGPP
+# define Fflush(fp) djgpp_fflush(fp)
+#else
+# define Fflush(fp) fflush(fp)
+#endif
#define Mkdir(path,mode) mkdir((path),(mode))
#ifndef WIN32
diff --git a/t/io/open.t b/t/io/open.t
index b224cceb77..01902812e2 100755
--- a/t/io/open.t
+++ b/t/io/open.t
@@ -268,13 +268,13 @@ ok;
{
local *F;
for (1..2) {
- open(F, "echo #foo|") or print "not ";
+ open(F, "echo \\#foo|") or print "not ";
print <F>;
close F;
}
ok;
for (1..2) {
- open(F, "-|", "echo #foo") or print "not ";
+ open(F, "-|", "echo \\#foo") or print "not ";
print <F>;
close F;
}