#endif
#include "php.h"
+#include "ext/standard/file.h"
#if HAVE_EXIF
#define max(a,b) ((a)>(b) ? (a) : (b))
#endif
-#ifdef HAVE_PHP_STREAM
-#define auto_ftell(f) php_stream_tell(f)
-#define auto_fseek(f,o,w) php_stream_seek(f,o,w)
-#define auto_fread(b,s,n,f) php_stream_read(f,b,(s)*(n))
-#define auto_fgetc(f) php_stream_getc(f)
-#define auto_fclose(f) php_stream_free(f,0)
-#else
-#define auto_ftell(f) ftell(f)
-#define auto_fseek(f,o,w) fseek(f,o,w)
-#define auto_fread(b,s,n,f) fread(b,s,n,f)
-#define auto_fgetc(f) fgetc(f)
-#define auto_fclose(f) fclose(f)
-#endif
-
/* {{{ exif_functions[]
*/
function_entry exif_functions[] = {
/* EXIF standard defines Copyright as "<Photographer> [ '\0' <Editor> ] ['\0']" */
/* This structure is used to store a section of a Jpeg file. */
typedef struct {
- #ifdef HAVE_PHP_STREAM
php_stream *infile;
- #else
- FILE *infile;
- #endif
char *FileName;
time_t FileDateTime;
size_t FileSize;
value_ptr = cbuf;
}
- fpos = auto_ftell(ImageInfo->infile);
- auto_fseek(ImageInfo->infile, offset_val, SEEK_SET);
- fgot = auto_ftell(ImageInfo->infile);
+ fpos = php_stream_tell(ImageInfo->infile);
+ php_stream_seek(ImageInfo->infile, offset_val, SEEK_SET);
+ fgot = php_stream_tell(ImageInfo->infile);
if ( fgot!=offset_val) {
if ( outside) efree( outside);
php_error(E_WARNING,"Wrong file pointer: 0x%08X != 0x08X", fgot, offset_val);
return FALSE;
}
- fgot = auto_fread(value_ptr, 1, byte_count, ImageInfo->infile);
- auto_fseek(ImageInfo->infile, fpos, SEEK_SET);
+ fgot = php_stream_read(ImageInfo->infile, value_ptr, byte_count);
+ php_stream_seek(ImageInfo->infile, fpos, SEEK_SET);
if ( fgot<byte_count) {
if ( outside) efree( outside);
EXIF_ERRLOG_FILEEOF
if ((DirStart+2+NumDirEntries*12) > (OffsetBase+IFDlength)) {
php_error(E_WARNING, "Illegal directory size: x%04X + 2 + x%04X*12 = x%04X > x%04X", (int)DirStart+2-(int)OffsetBase, NumDirEntries, (int)DirStart+2+NumDirEntries*12-(int)OffsetBase, IFDlength);
- return;
+ return FALSE;
}
for (de=0;de<NumDirEntries;de++) {
for(section=0;;section++)
{
#ifdef EXIF_DEBUG
- fpos = auto_ftell(ImageInfo->infile);
+ fpos = php_stream_tell(ImageInfo->infile);
php_error(E_NOTICE,"needing section %d @ 0x%08X", ImageInfo->file.count, fpos);
#endif
/* one company doing so is very much envolved in JPEG... so we accept too */
if ( last_marker==M_COM && comment_correction) comment_correction = 2;
do {
- if ((marker = auto_fgetc(ImageInfo->infile)) == EOF)
+ if ((marker = php_stream_getc(ImageInfo->infile)) == EOF)
{
EXIF_ERRLOG_CORRUPT
return FALSE;
return M_EOI; /* ah illegal: char after COM section not 0xFF */
#ifdef EXIF_DEBUG
- fpos = auto_ftell(ImageInfo->infile);
+ fpos = php_stream_tell(ImageInfo->infile);
#endif
if (marker == 0xff) {
/* 0xff is legal padding, but if we get that many, something's wrong. */
}
/* Read the length of the section. */
- lh = auto_fgetc(ImageInfo->infile);
- ll = auto_fgetc(ImageInfo->infile);
+ lh = php_stream_getc(ImageInfo->infile);
+ ll = php_stream_getc(ImageInfo->infile);
itemlen = (lh << 8) | ll;
Data[0] = (uchar)lh;
Data[1] = (uchar)ll;
- got = auto_fread(Data+2, 1, itemlen-2, ImageInfo->infile); /* Read the whole section. */
+ got = php_stream_read(ImageInfo->infile, Data+2, itemlen-2); /* Read the whole section. */
if (got != itemlen-2) {
php_error(E_WARNING, "error reading from file: got=x%04X(=%d) != itemlen-2=x%04X(=%d)",got, got, itemlen-2, itemlen-2);
return FALSE;
/* If reading entire image is requested, read the rest of the data. */
if (ImageInfo->read_all) {
/* Determine how much file is left. */
- fpos = auto_ftell(ImageInfo->infile);
+ fpos = php_stream_tell(ImageInfo->infile);
size = ImageInfo->FileSize - fpos;
if ( (sn=exif_file_sections_add(ImageInfo, M_PSEUDO, size, NULL))==-1)
{
return FALSE;
}
Data = ImageInfo->file.list[sn].data;
- got = auto_fread(Data, 1, size, ImageInfo->infile);
+ got = php_stream_read(ImageInfo->infile, Data, size);
if (got != size) {
EXIF_ERRLOG_FILEEOF
return FALSE;
#ifdef EXIF_DEBUG
php_error(E_NOTICE,"Read from TIFF: filesize(x%04X), IFD dir(x%04X + x%04X)", ImageInfo->FileSize, dir_offset, 2);
#endif
- auto_fseek(ImageInfo->infile,dir_offset,SEEK_SET); /* we do not know the order of sections */
- auto_fread(ImageInfo->file.list[sn].data, 1, 2, ImageInfo->infile);
+ php_stream_seek(ImageInfo->infile,dir_offset,SEEK_SET); /* we do not know the order of sections */
+ php_stream_read(ImageInfo->infile, ImageInfo->file.list[sn].data, 2);
num_entries = php_ifd_get16u(ImageInfo->file.list[sn].data, ImageInfo->motorola_intel);
dir_size = 2/*num dir entries*/ +12/*length of entry*/*num_entries +4/* offset to next ifd (points to thumbnail or NULL)*/;
if ( ImageInfo->FileSize >= dir_offset+dir_size) {
return FALSE;
}
ImageInfo->file.list[sn].data = tmp;
- auto_fread(ImageInfo->file.list[sn].data+2, 1, dir_size-2, ImageInfo->infile);
+ php_stream_read(ImageInfo->infile, ImageInfo->file.list[sn].data+2, dir_size-2);
/*php_error(E_NOTICE,"Dump: %s", exif_char_dump(ImageInfo->file.list[sn].data, dir_size, 1));*/
next_offset = php_ifd_get32u(ImageInfo->file.list[sn].data + dir_size - 4, ImageInfo->motorola_intel);
#ifdef EXIF_DEBUG
#ifdef EXIF_DEBUG
php_error(E_NOTICE,"Read from TIFF: filesize(x%04X), IFD(x%04X + x%04X)", ImageInfo->FileSize, dir_offset, ifd_size);
#endif
- auto_fread(ImageInfo->file.list[sn].data+dir_size, 1, ifd_size-dir_size, ImageInfo->infile);
+ php_stream_read(ImageInfo->infile, ImageInfo->file.list[sn].data+dir_size, ifd_size-dir_size);
#ifdef EXIF_DEBUG
php_error(E_NOTICE,"Read from TIFF, done");
#endif
if (!ImageInfo->Thumbnail.data) {
EXIF_ERRLOG_EALLOC
} else {
- auto_fseek(ImageInfo->infile,ImageInfo->Thumbnail.offset,SEEK_SET);
- fgot = auto_fread(ImageInfo->Thumbnail.data, 1, ImageInfo->Thumbnail.size, ImageInfo->infile);
+ php_stream_seek(ImageInfo->infile,ImageInfo->Thumbnail.offset,SEEK_SET);
+ fgot = php_stream_read(ImageInfo->infile, ImageInfo->Thumbnail.data, ImageInfo->Thumbnail.size);
if ( fgot < ImageInfo->Thumbnail.size)
{
EXIF_ERRLOG_THUMBEOF
ImageInfo->FileType = IMAGE_FILETYPE_UNKNOWN;
if ( ImageInfo->FileSize >= 2) {
- auto_fseek(ImageInfo->infile, 0, SEEK_SET);
- auto_fread(file_header, 1, 2, ImageInfo->infile);
+ php_stream_seek(ImageInfo->infile, 0, SEEK_SET);
+ php_stream_read(ImageInfo->infile, file_header, 2);
if ( (file_header[0]==0xff) && (file_header[1]==M_SOI)) {
ImageInfo->FileType = IMAGE_FILETYPE_JPEG;
if (exif_scan_JPEG_header(ImageInfo)) {
php_error(E_WARNING, "Invalid JPEG file: '%s'", ImageInfo->FileName);
}
} else if ( ImageInfo->FileSize >= 8) {
- auto_fread(file_header+2, 1, 6, ImageInfo->infile);
+ php_stream_read(ImageInfo->infile, file_header+2, 6);
if ( !memcmp(file_header,"II\x2A\x00", 4))
{
ImageInfo->FileType = IMAGE_FILETYPE_TIFF_II;
{
int ret;
struct stat st;
- php_stream *mem_stream;
/* Start with an empty image information structure. */
memset(ImageInfo, 0, sizeof(*ImageInfo));
ImageInfo->motorola_intel = 0;
- #ifdef HAVE_PHP_STREAM
- ImageInfo->infile = php_stream_open_wrapper(FileName, "rb", IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
- #else
- ImageInfo->infile = VCWD_FOPEN(FileName, "rb"); /* Unix ignores 'b', windows needs it. */
- #endif
+ ImageInfo->infile = php_stream_open_wrapper(FileName, "rb", STREAM_MUST_SEEK|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
if (!ImageInfo->infile) {
php_error(E_WARNING, "Unable to open '%s'", FileName);
return FALSE;
ImageInfo->read_all = read_all;
ImageInfo->Thumbnail.filetype = IMAGE_FILETYPE_UNKNOWN;
- #ifdef HAVE_PHP_STREAM
if ( php_stream_is(ImageInfo->infile, PHP_STREAM_IS_STDIO)) {
- #endif
if (VCWD_STAT(FileName, &st) >= 0) {
/* Store file date/time. */
ImageInfo->FileDateTime = st.st_mtime;
ImageInfo->FileSize = st.st_size;
+ php_error(E_NOTICE,"open stream is file: %d", ImageInfo->FileSize);
}
- #ifdef HAVE_PHP_STREAM
} else {
-/*
- mem_stream = php_stream_temp_create(TEMP_STREAM_DEFAULT,20000000);
+
+/* *
+ php_stream *mem_stream;
+ mem_stream = php_stream_temp_create(TEMP_STREAM_DEFAULT, 20000000);
ImageInfo->FileSize = php_stream_copy_to_stream(ImageInfo->infile, mem_stream, PHP_STREAM_COPY_ALL);
- auto_fclose(ImageInfo->infile);
+ php_stream_close(ImageInfo->infile);
+ ImageInfo->infile = mem_stream;
+*
+* Use one of these two versions if not using STREAM_MUST_SEEK in php_stream_open_wrapper
+*
+ php_stream *mem_stream;
+ switch(php_stream_make_seekable( ImageInfo->infile, &mem_stream))
+ {
+ default:
+ case PHP_STREAM_FAILED:
+ case PHP_STREAM_CRITICAL:
+ php_stream_close(ImageInfo->infile);
+ return FALSE;
+ case PHP_STREAM_UNCHANGED:
+ case PHP_STREAM_RELEASED:
+ ImageInfo->infile = mem_stream;
+ break;
+ }
*/
- php_stream_make_seekable( ImageInfo->infile, &mem_stream);
+/* end of second */
if ( !ImageInfo->FileSize) {
- php_stream_seek(mem_stream,0,SEEK_END);
- ImageInfo->FileSize = php_stream_tell(mem_stream);
- php_stream_seek(mem_stream,0,SEEK_SET);
+ php_stream_seek(ImageInfo->infile,0,SEEK_END);
+ ImageInfo->FileSize = php_stream_tell(ImageInfo->infile);
+ php_stream_seek(ImageInfo->infile,0,SEEK_SET);
}
- ImageInfo->infile = mem_stream;
}
- #endif
/* Scan the JPEG headers. */
ret = exif_scan_FILE_header(ImageInfo);
- auto_fclose(ImageInfo->infile);
+ php_stream_close(ImageInfo->infile);
return ret;
}
/* }}} */