int is_url; /* so that PG(allow_url_fopen) can be respected */
};
-#define PHP_STREAM_FLAG_NO_SEEK 1
-#define PHP_STREAM_FLAG_NO_BUFFER 2
+#define PHP_STREAM_FLAG_NO_SEEK 0x1
+#define PHP_STREAM_FLAG_NO_BUFFER 0x2
-#define PHP_STREAM_FLAG_EOL_UNIX 0 /* also includes DOS */
-#define PHP_STREAM_FLAG_DETECT_EOL 4
-#define PHP_STREAM_FLAG_EOL_MAC 8
+#define PHP_STREAM_FLAG_EOL_UNIX 0x0 /* also includes DOS */
+#define PHP_STREAM_FLAG_DETECT_EOL 0x4
+#define PHP_STREAM_FLAG_EOL_MAC 0x8
/* set this when the stream might represent "interactive" data.
* When set, the read buffer will avoid certain operations that
* might otherwise cause the read to block for much longer than
* is strictly required. */
-#define PHP_STREAM_FLAG_AVOID_BLOCKING 16
+#define PHP_STREAM_FLAG_AVOID_BLOCKING 0x10
-#define PHP_STREAM_FLAG_NO_CLOSE 32
+#define PHP_STREAM_FLAG_NO_CLOSE 0x20
-#define PHP_STREAM_FLAG_IS_DIR 64
+#define PHP_STREAM_FLAG_IS_DIR 0x40
-#define PHP_STREAM_FLAG_NO_FCLOSE 128
+#define PHP_STREAM_FLAG_NO_FCLOSE 0x80
+
+#define PHP_STREAM_FLAG_WAS_WRITTEN 0x80000000
struct _php_stream {
php_stream_ops *ops;
(close_options & PHP_STREAM_FREE_RSRC_DTOR) == 0);
#endif
- /* make sure everything is saved */
- _php_stream_flush(stream, 1);
+ if (stream->flags & PHP_STREAM_FLAG_WAS_WRITTEN) {
+ /* make sure everything is saved */
+ _php_stream_flush(stream, 1);
+ }
/* If not called from the resource dtor, remove the stream from the resource list. */
if ((close_options & PHP_STREAM_FREE_RSRC_DTOR) == 0 && stream->res) {
_php_stream_write_filtered(stream, NULL, 0, closing ? PSFS_FLAG_FLUSH_CLOSE : PSFS_FLAG_FLUSH_INC );
}
+ stream->flags &= ~PHP_STREAM_FLAG_WAS_WRITTEN;
+
if (stream->ops->flush) {
ret = stream->ops->flush(stream);
}
PHPAPI size_t _php_stream_write(php_stream *stream, const char *buf, size_t count)
{
+ size_t bytes;
+
if (buf == NULL || count == 0 || stream->ops->write == NULL) {
return 0;
}
if (stream->writefilters.head) {
- return _php_stream_write_filtered(stream, buf, count, PSFS_FLAG_NORMAL);
+ bytes = _php_stream_write_filtered(stream, buf, count, PSFS_FLAG_NORMAL);
} else {
- return _php_stream_write_buffer(stream, buf, count);
+ bytes = _php_stream_write_buffer(stream, buf, count);
}
+
+ if (bytes) {
+ stream->flags |= PHP_STREAM_FLAG_WAS_WRITTEN;
+ }
+
+ return bytes;
}
PHPAPI size_t _php_stream_printf(php_stream *stream, const char *fmt, ...)