47#include "magick/studio.h"
48#include "magick/blob.h"
49#include "magick/blob-private.h"
50#include "magick/cache.h"
51#include "magick/client.h"
52#include "magick/constitute.h"
53#include "magick/delegate.h"
54#include "magick/exception.h"
55#include "magick/exception-private.h"
56#include "magick/geometry.h"
57#include "magick/image-private.h"
58#include "magick/list.h"
59#include "magick/locale_.h"
60#include "magick/log.h"
61#include "magick/magick.h"
62#include "magick/memory_.h"
63#include "magick/nt-base-private.h"
64#include "magick/option.h"
65#include "magick/policy.h"
66#include "magick/resource_.h"
67#include "magick/semaphore.h"
68#include "magick/string_.h"
69#include "magick/string-private.h"
70#include "magick/timer-private.h"
71#include "magick/token.h"
72#include "magick/utility.h"
73#include "magick/utility-private.h"
74#if defined(MAGICKCORE_ZLIB_DELEGATE)
77#if defined(MAGICKCORE_BZLIB_DELEGATE)
84#define MagickMaxBlobExtent (8*8192)
85#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
86# define MAP_ANONYMOUS MAP_ANON
88#if !defined(MAP_FAILED)
89#define MAP_FAILED ((void *) -1)
93#define _O_BINARY O_BINARY
104#if defined(MAGICKCORE_ZLIB_DELEGATE)
109#if defined(MAGICKCORE_BZLIB_DELEGATE)
206MagickExport
void AttachBlob(
BlobInfo *blob_info,
const void *blob,
209 assert(blob_info != (
BlobInfo *) NULL);
210 if (IsEventLogging() != MagickFalse)
211 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
212 blob_info->length=length;
213 blob_info->extent=length;
214 blob_info->quantum=(size_t) MagickMaxBlobExtent;
216 blob_info->type=BlobStream;
217 blob_info->file_info.file=(FILE *) NULL;
218 blob_info->data=(
unsigned char *) blob;
219 blob_info->mapped=MagickFalse;
252MagickExport MagickBooleanType BlobToFile(
char *filename,
const void *blob,
264 assert(filename != (
const char *) NULL);
265 assert(blob != (
const void *) NULL);
266 if (IsEventLogging() != MagickFalse)
267 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
268 if (*filename ==
'\0')
269 file=AcquireUniqueFileResource(filename);
271 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
274 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
277 for (i=0; i < length; i+=(size_t) count)
279 count=write(file,(
const char *) blob+i,MagickMin(length-i,(
size_t)
289 if ((file == -1) || (i < length))
291 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
328MagickExport
Image *BlobToImage(
const ImageInfo *image_info,
const void *blob,
344 assert(image_info != (
ImageInfo *) NULL);
345 assert(image_info->signature == MagickCoreSignature);
347 if (IsEventLogging() != MagickFalse)
348 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
349 image_info->filename);
350 if ((blob == (
const void *) NULL) || (length == 0))
352 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
353 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
354 return((
Image *) NULL);
356 blob_info=CloneImageInfo(image_info);
357 blob_info->blob=(
void *) blob;
358 blob_info->length=length;
359 if (*blob_info->magick ==
'\0')
360 (void) SetImageInfo(blob_info,0,exception);
361 magick_info=GetMagickInfo(blob_info->magick,exception);
364 (void) ThrowMagickException(exception,GetMagickModule(),
365 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
367 blob_info=DestroyImageInfo(blob_info);
368 return((
Image *) NULL);
370 if (GetMagickBlobSupport(magick_info) != MagickFalse)
373 filename[MagickPathExtent];
378 (void) CopyMagickString(filename,blob_info->filename,MagickPathExtent);
379 (void) FormatLocaleString(blob_info->filename,MagickPathExtent,
"%s:%s",
380 blob_info->magick,filename);
381 image=ReadImage(blob_info,exception);
382 if (image != (
Image *) NULL)
383 (void) DetachBlob(image->blob);
384 blob_info=DestroyImageInfo(blob_info);
390 blob_info->blob=(
void *) NULL;
392 *blob_info->filename=
'\0';
393 status=BlobToFile(blob_info->filename,blob,length,exception);
394 if (status == MagickFalse)
396 (void) RelinquishUniqueFileResource(blob_info->filename);
397 blob_info=DestroyImageInfo(blob_info);
398 return((
Image *) NULL);
400 clone_info=CloneImageInfo(blob_info);
401 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
402 blob_info->magick,blob_info->filename);
403 image=ReadImage(clone_info,exception);
404 if (image != (
Image *) NULL)
412 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
414 (void) CopyMagickString(images->filename,image_info->filename,
416 (void) CopyMagickString(images->magick_filename,image_info->filename,
418 (void) CopyMagickString(images->magick,magick_info->name,
420 images=GetNextImageInList(images);
423 clone_info=DestroyImageInfo(clone_info);
424 (void) RelinquishUniqueFileResource(blob_info->filename);
425 blob_info=DestroyImageInfo(blob_info);
460 clone_info=(
BlobInfo *) AcquireCriticalMemory(
sizeof(*clone_info));
461 GetBlobInfo(clone_info);
464 semaphore=clone_info->semaphore;
465 (void) memcpy(clone_info,blob_info,
sizeof(*clone_info));
466 if (blob_info->mapped != MagickFalse)
467 (void) AcquireMagickResource(MapResource,blob_info->length);
468 clone_info->semaphore=semaphore;
469 LockSemaphoreInfo(clone_info->semaphore);
470 clone_info->reference_count=1;
471 UnlockSemaphoreInfo(clone_info->semaphore);
498static inline void ThrowBlobException(
BlobInfo *blob_info)
500 if ((blob_info->status == MagickFalse) && (errno != 0))
501 blob_info->error_number=errno;
502 blob_info->status=MagickTrue;
505MagickExport MagickBooleanType CloseBlob(
Image *image)
508 *magick_restrict blob_info;
516 assert(image != (
Image *) NULL);
517 assert(image->signature == MagickCoreSignature);
518 if (IsEventLogging() != MagickFalse)
519 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
520 blob_info=image->blob;
521 if ((blob_info == (
BlobInfo *) NULL) || (blob_info->type == UndefinedStream))
523 status=SyncBlob(image);
524 switch (blob_info->type)
526 case UndefinedStream:
532 if (blob_info->synchronize != MagickFalse)
534 status=fflush(blob_info->file_info.file);
536 ThrowBlobException(blob_info);
537 status=fsync(fileno(blob_info->file_info.file));
539 ThrowBlobException(blob_info);
541 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
542 ThrowBlobException(blob_info);
547#if defined(MAGICKCORE_ZLIB_DELEGATE)
549 (void) gzerror(blob_info->file_info.gzfile,&status);
551 ThrowBlobException(blob_info);
557#if defined(MAGICKCORE_BZLIB_DELEGATE)
559 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
561 ThrowBlobException(blob_info);
569 if (blob_info->file_info.file != (FILE *) NULL)
571 if (blob_info->synchronize != MagickFalse)
573 status=fflush(blob_info->file_info.file);
575 ThrowBlobException(blob_info);
576 status=fsync(fileno(blob_info->file_info.file));
578 ThrowBlobException(blob_info);
580 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
581 ThrowBlobException(blob_info);
586 blob_info->size=GetBlobSize(image);
587 image->extent=blob_info->size;
588 blob_info->eof=MagickFalse;
590 blob_info->mode=UndefinedBlobMode;
591 if (blob_info->exempt != MagickFalse)
593 blob_info->type=UndefinedStream;
594 return(blob_info->status);
596 switch (blob_info->type)
598 case UndefinedStream:
603 if (blob_info->file_info.file != (FILE *) NULL)
605 status=fclose(blob_info->file_info.file);
607 ThrowBlobException(blob_info);
613#if defined(MAGICKCORE_HAVE_PCLOSE)
614 status=pclose(blob_info->file_info.file);
616 ThrowBlobException(blob_info);
622#if defined(MAGICKCORE_ZLIB_DELEGATE)
623 status=gzclose(blob_info->file_info.gzfile);
625 ThrowBlobException(blob_info);
631#if defined(MAGICKCORE_BZLIB_DELEGATE)
632 BZ2_bzclose(blob_info->file_info.bzfile);
640 if (blob_info->file_info.file != (FILE *) NULL)
642 status=fclose(blob_info->file_info.file);
644 ThrowBlobException(blob_info);
649 (void) DetachBlob(blob_info);
650 return(blob_info->status);
675MagickExport
void DestroyBlob(
Image *image)
678 *magick_restrict blob_info;
683 assert(image != (
Image *) NULL);
684 assert(image->signature == MagickCoreSignature);
685 assert(image->blob != (
BlobInfo *) NULL);
686 assert(image->blob->signature == MagickCoreSignature);
687 if (IsEventLogging() != MagickFalse)
688 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
689 blob_info=image->blob;
691 LockSemaphoreInfo(blob_info->semaphore);
692 blob_info->reference_count--;
693 assert(blob_info->reference_count >= 0);
694 if (blob_info->reference_count == 0)
696 UnlockSemaphoreInfo(blob_info->semaphore);
697 if (destroy == MagickFalse)
702 (void) CloseBlob(image);
703 if (blob_info->mapped != MagickFalse)
705 (void) UnmapBlob(blob_info->data,blob_info->length);
706 RelinquishMagickResource(MapResource,blob_info->length);
709 DestroySemaphoreInfo(&blob_info->semaphore);
710 blob_info->signature=(~MagickCoreSignature);
711 image->blob=(
BlobInfo *) RelinquishMagickMemory(blob_info);
736MagickExport
unsigned char *DetachBlob(
BlobInfo *blob_info)
741 assert(blob_info != (
BlobInfo *) NULL);
742 if (IsEventLogging() != MagickFalse)
743 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
744 if (blob_info->mapped != MagickFalse)
746 (void) UnmapBlob(blob_info->data,blob_info->length);
747 blob_info->data=NULL;
748 RelinquishMagickResource(MapResource,blob_info->length);
750 blob_info->mapped=MagickFalse;
753 blob_info->eof=MagickFalse;
755 blob_info->exempt=MagickFalse;
756 blob_info->type=UndefinedStream;
757 blob_info->file_info.file=(FILE *) NULL;
758 data=blob_info->data;
759 blob_info->data=(
unsigned char *) NULL;
760 blob_info->stream=(StreamHandler) NULL;
788MagickPrivate
void DisassociateBlob(
Image *image)
791 *magick_restrict blob_info,
797 assert(image != (
Image *) NULL);
798 assert(image->signature == MagickCoreSignature);
799 assert(image->blob != (
BlobInfo *) NULL);
800 assert(image->blob->signature == MagickCoreSignature);
801 if (IsEventLogging() != MagickFalse)
802 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
803 blob_info=image->blob;
805 LockSemaphoreInfo(blob_info->semaphore);
806 assert(blob_info->reference_count >= 0);
807 if (blob_info->reference_count > 1)
809 UnlockSemaphoreInfo(blob_info->semaphore);
810 if (clone == MagickFalse)
812 clone_info=CloneBlobInfo(blob_info);
814 image->blob=clone_info;
842MagickExport MagickBooleanType DiscardBlobBytes(
Image *image,
843 const MagickSizeType length)
855 buffer[MagickMinBufferExtent >> 1];
857 assert(image != (
Image *) NULL);
858 assert(image->signature == MagickCoreSignature);
859 if (length != (MagickSizeType) ((MagickOffsetType) length))
862 for (i=0; i < (MagickOffsetType) length; i+=count)
864 quantum=(size_t) MagickMin(length-i,
sizeof(buffer));
865 (void) ReadBlobStream(image,quantum,buffer,&count);
873 return(i < (MagickOffsetType) length ? MagickFalse : MagickTrue);
900MagickExport
void DuplicateBlob(
Image *image,
const Image *duplicate)
902 assert(image != (
Image *) NULL);
903 assert(image->signature == MagickCoreSignature);
904 assert(duplicate != (
Image *) NULL);
905 assert(duplicate->signature == MagickCoreSignature);
906 if (IsEventLogging() != MagickFalse)
907 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
909 image->blob=ReferenceBlob(duplicate->blob);
935MagickExport
int EOFBlob(
const Image *image)
938 *magick_restrict blob_info;
940 assert(image != (
Image *) NULL);
941 assert(image->signature == MagickCoreSignature);
942 assert(image->blob != (
BlobInfo *) NULL);
943 assert(image->blob->type != UndefinedStream);
944 if (IsEventLogging() != MagickFalse)
945 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
946 blob_info=image->blob;
947 switch (blob_info->type)
949 case UndefinedStream:
955 blob_info->eof=feof(blob_info->file_info.file) != 0 ? MagickTrue :
961#if defined(MAGICKCORE_ZLIB_DELEGATE)
962 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
969#if defined(MAGICKCORE_BZLIB_DELEGATE)
974 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
975 blob_info->eof=status == BZ_UNEXPECTED_EOF ? MagickTrue : MagickFalse;
981 blob_info->eof=MagickFalse;
987 return((
int) blob_info->eof);
1013MagickExport
int ErrorBlob(
const Image *image)
1016 *magick_restrict blob_info;
1018 assert(image != (
Image *) NULL);
1019 assert(image->signature == MagickCoreSignature);
1020 assert(image->blob != (
BlobInfo *) NULL);
1021 assert(image->blob->type != UndefinedStream);
1022 if (IsEventLogging() != MagickFalse)
1023 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1024 blob_info=image->blob;
1025 switch (blob_info->type)
1027 case UndefinedStream:
1028 case StandardStream:
1033 blob_info->error=ferror(blob_info->file_info.file);
1038#if defined(MAGICKCORE_ZLIB_DELEGATE)
1039 (void) gzerror(blob_info->file_info.gzfile,&blob_info->error);
1045#if defined(MAGICKCORE_BZLIB_DELEGATE)
1046 (void) BZ2_bzerror(blob_info->file_info.bzfile,&blob_info->error);
1058 return(blob_info->error);
1096MagickExport
unsigned char *FileToBlob(
const char *filename,
const size_t extent,
1123 assert(filename != (
const char *) NULL);
1125 assert(exception->signature == MagickCoreSignature);
1126 if (IsEventLogging() != MagickFalse)
1127 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1129 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
1130 if (status == MagickFalse)
1133 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
1134 "NotAuthorized",
"`%s'",filename);
1138 if (LocaleCompare(filename,
"-") != 0)
1140 status=GetPathAttributes(filename,&attributes);
1141 if ((status == MagickFalse) || (S_ISDIR(attributes.st_mode) != 0))
1143 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1146 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1150 ThrowFileException(exception,BlobError,
"UnableToOpenFile",filename);
1151 return((
unsigned char *) NULL);
1153 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
1155 if ((file == fileno(stdin)) || (offset < 0) ||
1156 (offset != (MagickOffsetType) ((ssize_t) offset)))
1167 offset=(MagickOffsetType) lseek(file,0,SEEK_SET);
1168 quantum=(size_t) MagickMaxBufferExtent;
1169 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1170 quantum=(
size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1171 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1172 for (i=0; blob != (
unsigned char *) NULL; i+=count)
1174 count=read(file,blob+i,quantum);
1181 if (~((
size_t) i) < (count+quantum+1))
1183 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1186 blob=(
unsigned char *) ResizeQuantumMemory(blob,i+count+quantum+1,
1188 if ((
size_t) (i+count) >= extent)
1191 if (LocaleCompare(filename,
"-") != 0)
1193 if (blob == (
unsigned char *) NULL)
1195 (void) ThrowMagickException(exception,GetMagickModule(),
1196 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1197 return((
unsigned char *) NULL);
1201 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1202 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1203 return((
unsigned char *) NULL);
1205 *length=(size_t) MagickMin(i+count,extent);
1209 *length=(size_t) MagickMin(offset,(MagickOffsetType)
1210 MagickMin(extent,(
size_t) MAGICK_SSIZE_MAX));
1211 blob=(
unsigned char *) NULL;
1212 if (~(*length) >= (MagickPathExtent-1))
1213 blob=(
unsigned char *) AcquireQuantumMemory(*length+MagickPathExtent,
1215 if (blob == (
unsigned char *) NULL)
1218 (void) ThrowMagickException(exception,GetMagickModule(),
1219 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1220 return((
unsigned char *) NULL);
1222 map=MapBlob(file,ReadMode,0,*length);
1223 if (map != (
unsigned char *) NULL)
1225 (void) memcpy(blob,map,*length);
1226 (void) UnmapBlob(map,*length);
1230 (void) lseek(file,0,SEEK_SET);
1231 for (i=0; i < *length; i+=count)
1233 count=read(file,blob+i,(
size_t) MagickMin(*length-i,(
size_t)
1245 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1246 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1247 return((
unsigned char *) NULL);
1251 if (LocaleCompare(filename,
"-") != 0)
1255 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1256 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1286static inline ssize_t WriteBlobStream(
Image *image,
const size_t length,
1287 const unsigned char *magick_restrict data)
1290 *magick_restrict blob_info;
1298 assert(image->blob != (
BlobInfo *) NULL);
1299 assert(image->blob->type != UndefinedStream);
1300 assert(data != (
void *) NULL);
1301 blob_info=image->blob;
1302 if (blob_info->type != BlobStream)
1303 return(WriteBlob(image,length,data));
1304 extent=(MagickSizeType) (blob_info->offset+(MagickOffsetType) length);
1305 if (extent >= blob_info->extent)
1307 extent+=blob_info->quantum+length;
1308 blob_info->quantum<<=1;
1309 if (SetBlobExtent(image,extent) == MagickFalse)
1312 q=blob_info->data+blob_info->offset;
1313 (void) memcpy(q,data,length);
1314 blob_info->offset+=length;
1315 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
1316 blob_info->length=(
size_t) blob_info->offset;
1317 return((ssize_t) length);
1320MagickExport MagickBooleanType FileToImage(
Image *image,
const char *filename)
1341 assert(image != (
const Image *) NULL);
1342 assert(image->signature == MagickCoreSignature);
1343 assert(filename != (
const char *) NULL);
1344 if (IsEventLogging() != MagickFalse)
1345 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1346 status=IsRightsAuthorized(PathPolicyDomain,WritePolicyRights,filename);
1347 if (status == MagickFalse)
1350 (void) ThrowMagickException(&image->exception,GetMagickModule(),
1351 PolicyError,
"NotAuthorized",
"`%s'",filename);
1352 return(MagickFalse);
1355 if (LocaleCompare(filename,
"-") != 0)
1356 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1359 ThrowFileException(&image->exception,BlobError,
"UnableToOpenBlob",
1361 return(MagickFalse);
1363 quantum=(size_t) MagickMaxBufferExtent;
1364 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1365 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1366 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1367 if (blob == (
unsigned char *) NULL)
1370 ThrowFileException(&image->exception,ResourceLimitError,
1371 "MemoryAllocationFailed",filename);
1372 return(MagickFalse);
1376 count=read(file,blob,quantum);
1383 length=(size_t) count;
1384 count=WriteBlobStream(image,length,blob);
1385 if (count != (ssize_t) length)
1387 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1394 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1396 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1423MagickExport MagickBooleanType GetBlobError(
const Image *image)
1425 assert(image != (
const Image *) NULL);
1426 assert(image->signature == MagickCoreSignature);
1427 if (IsEventLogging() != MagickFalse)
1428 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1429 if ((image->blob->status != MagickFalse) && (image->blob->error_number != 0))
1430 errno=image->blob->error_number;
1431 return(image->blob->status);
1456MagickExport FILE *GetBlobFileHandle(
const Image *image)
1458 assert(image != (
const Image *) NULL);
1459 assert(image->signature == MagickCoreSignature);
1460 return(image->blob->file_info.file);
1485MagickExport
void GetBlobInfo(
BlobInfo *blob_info)
1487 assert(blob_info != (
BlobInfo *) NULL);
1488 (void) memset(blob_info,0,
sizeof(*blob_info));
1489 blob_info->type=UndefinedStream;
1490 blob_info->quantum=(size_t) MagickMaxBlobExtent;
1491 blob_info->properties.st_mtime=GetMagickTime();
1492 blob_info->properties.st_ctime=blob_info->properties.st_mtime;
1493 blob_info->debug=GetLogEventMask() & BlobEvent ? MagickTrue : MagickFalse;
1494 blob_info->reference_count=1;
1495 blob_info->semaphore=AllocateSemaphoreInfo();
1496 blob_info->signature=MagickCoreSignature;
1521MagickExport
const struct stat *GetBlobProperties(
const Image *image)
1523 assert(image != (
Image *) NULL);
1524 assert(image->signature == MagickCoreSignature);
1525 if (IsEventLogging() != MagickFalse)
1526 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1527 return(&image->blob->properties);
1553MagickExport MagickSizeType GetBlobSize(
const Image *image)
1556 *magick_restrict blob_info;
1561 assert(image != (
Image *) NULL);
1562 assert(image->signature == MagickCoreSignature);
1563 assert(image->blob != (
BlobInfo *) NULL);
1564 if (IsEventLogging() != MagickFalse)
1565 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1566 blob_info=image->blob;
1568 switch (blob_info->type)
1570 case UndefinedStream:
1571 case StandardStream:
1573 extent=blob_info->size;
1581 extent=(MagickSizeType) blob_info->properties.st_size;
1583 extent=blob_info->size;
1584 file_descriptor=fileno(blob_info->file_info.file);
1585 if (file_descriptor == -1)
1587 if (fstat(file_descriptor,&blob_info->properties) == 0)
1588 extent=(MagickSizeType) blob_info->properties.st_size;
1593 extent=blob_info->size;
1602 status=GetPathAttributes(image->filename,&blob_info->properties);
1603 if (status != MagickFalse)
1604 extent=(MagickSizeType) blob_info->properties.st_size;
1611 extent=(MagickSizeType) blob_info->length;
1640MagickExport
unsigned char *GetBlobStreamData(
const Image *image)
1642 assert(image != (
const Image *) NULL);
1643 assert(image->signature == MagickCoreSignature);
1644 return(image->blob->data);
1669MagickExport StreamHandler GetBlobStreamHandler(
const Image *image)
1671 assert(image != (
const Image *) NULL);
1672 assert(image->signature == MagickCoreSignature);
1673 if (IsEventLogging() != MagickFalse)
1674 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1675 return(image->blob->stream);
1711MagickExport
unsigned char *ImageToBlob(
const ImageInfo *image_info,
1726 assert(image_info != (
const ImageInfo *) NULL);
1727 assert(image_info->signature == MagickCoreSignature);
1728 assert(image != (
Image *) NULL);
1729 assert(image->signature == MagickCoreSignature);
1731 assert(exception->signature == MagickCoreSignature);
1732 if (IsEventLogging() != MagickFalse)
1733 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1734 image_info->filename);
1736 blob=(
unsigned char *) NULL;
1737 blob_info=CloneImageInfo(image_info);
1738 blob_info->adjoin=MagickFalse;
1739 (void) SetImageInfo(blob_info,1,exception);
1740 if (*blob_info->magick !=
'\0')
1741 (void) CopyMagickString(image->magick,blob_info->magick,MagickPathExtent);
1742 magick_info=GetMagickInfo(image->magick,exception);
1743 if (magick_info == (
const MagickInfo *) NULL)
1745 (void) ThrowMagickException(exception,GetMagickModule(),
1746 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
1748 blob_info=DestroyImageInfo(blob_info);
1751 (void) CopyMagickString(blob_info->magick,image->magick,MagickPathExtent);
1752 if (GetMagickBlobSupport(magick_info) != MagickFalse)
1757 blob_info->length=0;
1758 blob_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent,
1759 sizeof(
unsigned char));
1760 if (blob_info->blob == NULL)
1761 (void) ThrowMagickException(exception,GetMagickModule(),
1762 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",image->filename);
1765 (void) CloseBlob(image);
1766 image->blob->exempt=MagickTrue;
1767 *image->filename=
'\0';
1768 status=WriteImage(blob_info,image);
1769 SyncBlobStream(blob_info,image,image);
1770 InheritException(exception,&image->exception);
1771 *length=image->blob->length;
1772 blob=DetachBlob(image->blob);
1773 if (blob != (
void *) NULL)
1775 if (status == MagickFalse)
1776 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1778 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
1779 sizeof(
unsigned char));
1781 else if (status == MagickFalse)
1782 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
1788 unique[MagickPathExtent];
1796 file=AcquireUniqueFileResource(unique);
1799 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",
1800 image_info->filename);
1804 blob_info->file=fdopen(file,
"wb");
1805 if (blob_info->file != (FILE *) NULL)
1807 (void) FormatLocaleString(image->filename,MagickPathExtent,
1808 "%s:%s",image->magick,unique);
1809 status=WriteImage(blob_info,image);
1810 (void) CloseBlob(image);
1811 (void) fclose(blob_info->file);
1812 if (status == MagickFalse)
1813 InheritException(exception,&image->exception);
1815 blob=FileToBlob(unique,SIZE_MAX,length,exception);
1817 (void) RelinquishUniqueFileResource(unique);
1820 blob_info=DestroyImageInfo(blob_info);
1852MagickExport MagickBooleanType ImageToFile(
Image *image,
char *filename,
1877 assert(image != (
Image *) NULL);
1878 assert(image->signature == MagickCoreSignature);
1879 assert(image->blob != (
BlobInfo *) NULL);
1880 assert(image->blob->type != UndefinedStream);
1881 assert(filename != (
const char *) NULL);
1882 if (IsEventLogging() != MagickFalse)
1883 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1884 if (*filename ==
'\0')
1885 file=AcquireUniqueFileResource(filename);
1887 if (LocaleCompare(filename,
"-") == 0)
1888 file=fileno(stdout);
1890 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
1893 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1894 return(MagickFalse);
1896 quantum=(size_t) MagickMaxBufferExtent;
1897 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1898 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1899 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
1900 if (buffer == (
unsigned char *) NULL)
1903 (void) ThrowMagickException(exception,GetMagickModule(),
1904 ResourceLimitError,
"MemoryAllocationError",
"`%s'",filename);
1905 return(MagickFalse);
1908 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1909 for (i=0; count > 0; )
1911 length=(size_t) count;
1912 for (i=0; i < length; i+=count)
1914 count=write(file,p+i,(
size_t) (length-i));
1924 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1926 if (LocaleCompare(filename,
"-") != 0)
1928 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
1929 if ((file == -1) || (i < length))
1933 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1934 return(MagickFalse);
1974MagickExport
unsigned char *ImagesToBlob(
const ImageInfo *image_info,
1989 assert(image_info != (
const ImageInfo *) NULL);
1990 assert(image_info->signature == MagickCoreSignature);
1991 assert(images != (
Image *) NULL);
1992 assert(images->signature == MagickCoreSignature);
1994 if (IsEventLogging() != MagickFalse)
1995 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1996 image_info->filename);
1998 blob=(
unsigned char *) NULL;
1999 blob_info=CloneImageInfo(image_info);
2000 (void) SetImageInfo(blob_info,(
unsigned int) GetImageListLength(images),
2002 if (*blob_info->magick !=
'\0')
2003 (void) CopyMagickString(images->magick,blob_info->magick,MagickPathExtent);
2004 magick_info=GetMagickInfo(images->magick,exception);
2005 if (magick_info == (
const MagickInfo *) NULL)
2007 (void) ThrowMagickException(exception,GetMagickModule(),
2008 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
2010 blob_info=DestroyImageInfo(blob_info);
2013 if (GetMagickAdjoin(magick_info) == MagickFalse)
2015 blob_info=DestroyImageInfo(blob_info);
2016 return(ImageToBlob(image_info,images,length,exception));
2018 (void) CopyMagickString(blob_info->magick,images->magick,MagickPathExtent);
2019 if (GetMagickBlobSupport(magick_info) != MagickFalse)
2024 blob_info->length=0;
2025 blob_info->blob=(
void *) AcquireQuantumMemory(MagickMaxBlobExtent,
2026 sizeof(
unsigned char));
2027 if (blob_info->blob == (
void *) NULL)
2028 (
void) ThrowMagickException(exception,GetMagickModule(),
2029 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",images->filename);
2032 (void) CloseBlob(images);
2033 images->blob->exempt=MagickTrue;
2034 *images->filename=
'\0';
2035 status=WriteImages(blob_info,images,images->filename,exception);
2036 SyncBlobStream(blob_info,images,images);
2037 *length=images->blob->length;
2038 blob=DetachBlob(images->blob);
2039 if (blob != (
void *) NULL)
2041 if (status == MagickFalse)
2042 blob=(
unsigned char *) RelinquishMagickMemory(blob);
2044 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
2045 sizeof(
unsigned char));
2047 else if (status == MagickFalse)
2048 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
2054 filename[MagickPathExtent],
2055 unique[MagickPathExtent];
2063 file=AcquireUniqueFileResource(unique);
2066 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",
2067 image_info->filename);
2071 blob_info->file=fdopen(file,
"wb");
2072 if (blob_info->file != (FILE *) NULL)
2074 (void) FormatLocaleString(filename,MagickPathExtent,
"%s:%s",
2075 images->magick,unique);
2076 status=WriteImages(blob_info,images,filename,exception);
2077 (void) CloseBlob(images);
2078 (void) fclose(blob_info->file);
2079 if (status == MagickFalse)
2080 InheritException(exception,&images->exception);
2082 blob=FileToBlob(unique,SIZE_MAX,length,exception);
2084 (void) RelinquishUniqueFileResource(unique);
2087 blob_info=DestroyImageInfo(blob_info);
2123MagickExport MagickBooleanType InjectImageBlob(
const ImageInfo *image_info,
2127 filename[MagickPathExtent];
2156 assert(image_info != (
ImageInfo *) NULL);
2157 assert(image_info->signature == MagickCoreSignature);
2158 assert(image != (
Image *) NULL);
2159 assert(image->signature == MagickCoreSignature);
2160 assert(inject_image != (
Image *) NULL);
2161 assert(inject_image->signature == MagickCoreSignature);
2163 if (IsEventLogging() != MagickFalse)
2164 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2165 unique_file=(FILE *) NULL;
2166 file=AcquireUniqueFileResource(filename);
2168 unique_file=fdopen(file,
"wb");
2169 if ((file == -1) || (unique_file == (FILE *) NULL))
2171 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2172 ThrowFileException(exception,FileOpenError,
"UnableToCreateTemporaryFile",
2174 return(MagickFalse);
2176 byte_image=CloneImage(inject_image,0,0,MagickFalse,exception);
2177 if (byte_image == (
Image *) NULL)
2179 (void) fclose(unique_file);
2180 (void) RelinquishUniqueFileResource(filename);
2181 return(MagickFalse);
2183 (void) FormatLocaleString(byte_image->filename,MagickPathExtent,
"%s:%s",
2185 DestroyBlob(byte_image);
2186 byte_image->blob=CloneBlobInfo((
BlobInfo *) NULL);
2187 write_info=CloneImageInfo(image_info);
2188 SetImageInfoFile(write_info,unique_file);
2189 status=WriteImage(write_info,byte_image);
2190 write_info=DestroyImageInfo(write_info);
2191 byte_image=DestroyImage(byte_image);
2192 (void) fclose(unique_file);
2193 if (status == MagickFalse)
2195 (void) RelinquishUniqueFileResource(filename);
2196 return(MagickFalse);
2201 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
2204 (void) RelinquishUniqueFileResource(filename);
2205 ThrowFileException(exception,FileOpenError,
"UnableToOpenFile",
2206 image_info->filename);
2207 return(MagickFalse);
2209 quantum=(size_t) MagickMaxBufferExtent;
2210 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
2211 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
2212 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
2213 if (buffer == (
unsigned char *) NULL)
2215 (void) RelinquishUniqueFileResource(filename);
2217 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2222 ssize_t count = read(file,buffer,quantum);
2229 status=WriteBlobStream(image,(
size_t) count,buffer) == count ? MagickTrue :
2234 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",filename);
2235 (void) RelinquishUniqueFileResource(filename);
2236 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
2262MagickExport MagickBooleanType IsBlobExempt(
const Image *image)
2264 assert(image != (
const Image *) NULL);
2265 assert(image->signature == MagickCoreSignature);
2266 if (IsEventLogging() != MagickFalse)
2267 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2268 return(image->blob->exempt);
2293MagickExport MagickBooleanType IsBlobSeekable(
const Image *image)
2296 *magick_restrict blob_info;
2298 assert(image != (
const Image *) NULL);
2299 assert(image->signature == MagickCoreSignature);
2300 if (IsEventLogging() != MagickFalse)
2301 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2302 blob_info=image->blob;
2303 switch (blob_info->type)
2312 if (blob_info->file_info.file == (FILE *) NULL)
2313 return(MagickFalse);
2314 status=fseek(blob_info->file_info.file,0,SEEK_CUR);
2315 return(status == -1 ? MagickFalse : MagickTrue);
2319#if defined(MAGICKCORE_ZLIB_DELEGATE)
2323 if (blob_info->file_info.gzfile == (gzFile) NULL)
2324 return(MagickFalse);
2325 offset=gzseek(blob_info->file_info.gzfile,0,SEEK_CUR);
2326 return(offset < 0 ? MagickFalse : MagickTrue);
2331 case UndefinedStream:
2335 case StandardStream:
2340 return(MagickFalse);
2365MagickExport MagickBooleanType IsBlobTemporary(
const Image *image)
2367 assert(image != (
const Image *) NULL);
2368 assert(image->signature == MagickCoreSignature);
2369 if (IsEventLogging() != MagickFalse)
2370 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2371 return(image->blob->temporary);
2403MagickExport
unsigned char *MapBlob(
int file,
const MapMode mode,
2404 const MagickOffsetType offset,
const size_t length)
2406#if defined(MAGICKCORE_HAVE_MMAP)
2419#if defined(MAP_ANONYMOUS)
2420 flags|=MAP_ANONYMOUS;
2422 return((
unsigned char *) NULL);
2429 protection=PROT_READ;
2435 protection=PROT_WRITE;
2441 protection=PROT_READ | PROT_WRITE;
2446#if !defined(MAGICKCORE_HAVE_HUGEPAGES) || !defined(MAP_HUGETLB)
2447 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,offset);
2449 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags |
2450 MAP_HUGETLB,file,offset);
2451 if (map == (
unsigned char *) MAP_FAILED)
2452 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,
2455 if (map == (
unsigned char *) MAP_FAILED)
2456 return((
unsigned char *) NULL);
2463 return((
unsigned char *) NULL);
2492MagickExport
void MSBOrderLong(
unsigned char *buffer,
const size_t length)
2501 assert(buffer != (
unsigned char *) NULL);
2508 *buffer++=(
unsigned char) c;
2512 *buffer++=(
unsigned char) c;
2542MagickExport
void MSBOrderShort(
unsigned char *p,
const size_t length)
2550 assert(p != (
unsigned char *) NULL);
2557 *p++=(
unsigned char) c;
2593static inline MagickBooleanType SetStreamBuffering(
const ImageInfo *image_info,
2605 size=MagickMinBufferExtent;
2606 option=GetImageOption(image_info,
"stream:buffer-size");
2607 if (option != (
const char *) NULL)
2608 size=StringToUnsignedLong(option);
2609 status=setvbuf(image->blob->file_info.file,(
char *) NULL,size == 0 ?
2610 _IONBF : _IOFBF,size);
2611 return(status == 0 ? MagickTrue : MagickFalse);
2614#if defined(MAGICKCORE_ZLIB_DELEGATE)
2615static inline gzFile gzopen_utf8(
const char *path,
const char *mode)
2617#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
2618 return(gzopen(path,mode));
2626 path_wide=create_wchar_path(path);
2627 if (path_wide == (
wchar_t *) NULL)
2628 return((gzFile) NULL);
2629 file=gzopen_w(path_wide,mode);
2630 path_wide=(
wchar_t *) RelinquishMagickMemory(path_wide);
2636MagickExport MagickBooleanType OpenBlob(
const ImageInfo *image_info,
2640 *magick_restrict blob_info;
2643 extension[MagickPathExtent],
2644 filename[MagickPathExtent];
2655 assert(image_info != (
ImageInfo *) NULL);
2656 assert(image_info->signature == MagickCoreSignature);
2657 assert(image != (
Image *) NULL);
2658 assert(image->signature == MagickCoreSignature);
2659 if (IsEventLogging() != MagickFalse)
2660 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2661 image_info->filename);
2662 blob_info=image->blob;
2663 if (image_info->blob != (
void *) NULL)
2665 if (image_info->stream != (StreamHandler) NULL)
2666 blob_info->stream=(StreamHandler) image_info->stream;
2667 AttachBlob(blob_info,image_info->blob,image_info->length);
2670 (void) DetachBlob(blob_info);
2671 blob_info->mode=mode;
2674 default: type=
"r";
break;
2675 case ReadBlobMode: type=
"r";
break;
2676 case ReadBinaryBlobMode: type=
"rb";
break;
2677 case WriteBlobMode: type=
"w";
break;
2678 case WriteBinaryBlobMode: type=
"w+b";
break;
2679 case AppendBlobMode: type=
"a";
break;
2680 case AppendBinaryBlobMode: type=
"a+b";
break;
2683 blob_info->synchronize=image_info->synchronize;
2684 if (image_info->stream != (StreamHandler) NULL)
2686 blob_info->stream=(StreamHandler) image_info->stream;
2689 blob_info->type=FifoStream;
2697 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2698 rights=ReadPolicyRights;
2700 rights=WritePolicyRights;
2701 if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse)
2704 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
2705 "NotAuthorized",
"`%s'",filename);
2706 return(MagickFalse);
2708 if ((LocaleCompare(filename,
"-") == 0) ||
2709 ((*filename ==
'\0') && (image_info->file == (FILE *) NULL)))
2711 blob_info->file_info.file=(*type ==
'r') ? stdin : stdout;
2712#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2713 if (strchr(type,
'b') != (
char *) NULL)
2714 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2716 blob_info->type=StandardStream;
2717 blob_info->exempt=MagickTrue;
2718 return(SetStreamBuffering(image_info,image));
2720 if ((LocaleNCompare(filename,
"fd:",3) == 0) &&
2721 (IsGeometry(filename+3) != MagickFalse))
2724 fileMode[MagickPathExtent];
2728 blob_info->file_info.file=fdopen(StringToLong(filename+3),fileMode);
2729 if (blob_info->file_info.file == (FILE *) NULL)
2731 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2732 return(MagickFalse);
2734#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2735 if (strchr(type,
'b') != (
char *) NULL)
2736 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2738 blob_info->type=FileStream;
2739 blob_info->exempt=MagickTrue;
2740 return(SetStreamBuffering(image_info,image));
2742#if defined(MAGICKCORE_HAVE_POPEN) && defined(MAGICKCORE_PIPES_SUPPORT)
2743 if (*filename ==
'|')
2746 fileMode[MagickPathExtent],
2754 (void) signal(SIGPIPE,SIG_IGN);
2758 sanitize_command=SanitizeString(filename+1);
2759 blob_info->file_info.file=(FILE *) popen_utf8(sanitize_command,
2761 sanitize_command=DestroyString(sanitize_command);
2762 if (blob_info->file_info.file == (FILE *) NULL)
2764 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2765 return(MagickFalse);
2767 blob_info->type=PipeStream;
2768 blob_info->exempt=MagickTrue;
2769 return(SetStreamBuffering(image_info,image));
2772 status=GetPathAttributes(filename,&blob_info->properties);
2773#if defined(S_ISFIFO)
2774 if ((status != MagickFalse) && S_ISFIFO(blob_info->properties.st_mode))
2776 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2777 if (blob_info->file_info.file == (FILE *) NULL)
2779 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2780 return(MagickFalse);
2782 blob_info->type=FileStream;
2783 blob_info->exempt=MagickTrue;
2784 return(SetStreamBuffering(image_info,image));
2787 GetPathComponent(image->filename,ExtensionPath,extension);
2790 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2791 if ((image_info->adjoin == MagickFalse) ||
2792 (strchr(filename,
'%') != (
char *) NULL))
2797 (void) InterpretImageFilename(image_info,image,image->filename,(
int)
2798 image->scene,filename);
2799 if ((LocaleCompare(filename,image->filename) == 0) &&
2800 ((GetPreviousImageInList(image) != (
Image *) NULL) ||
2801 (GetNextImageInList(image) != (
Image *) NULL)))
2804 path[MagickPathExtent];
2806 GetPathComponent(image->filename,RootPath,path);
2807 if (*extension ==
'\0')
2808 (void) FormatLocaleString(filename,MagickPathExtent,
"%s-%.20g",
2809 path,(
double) image->scene);
2811 (
void) FormatLocaleString(filename,MagickPathExtent,
2812 "%s-%.20g.%s",path,(
double) image->scene,extension);
2814 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2815#if defined(macintosh)
2816 SetApplicationType(filename,image_info->magick,
'8BIM');
2820 if (image_info->file != (FILE *) NULL)
2822 blob_info->file_info.file=image_info->file;
2823 blob_info->type=FileStream;
2824 blob_info->exempt=MagickTrue;
2829 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2830 if (blob_info->file_info.file != (FILE *) NULL)
2838 blob_info->type=FileStream;
2839 (void) fstat(fileno(blob_info->file_info.file),
2840 &blob_info->properties);
2841 (void) SetStreamBuffering(image_info,image);
2842 (void) memset(magick,0,
sizeof(magick));
2843 count=fread(magick,1,
sizeof(magick),blob_info->file_info.file);
2844 (void) fseek(blob_info->file_info.file,-((off_t) count),SEEK_CUR);
2845#if defined(MAGICKCORE_POSIX_SUPPORT)
2846 (void) fflush(blob_info->file_info.file);
2848 (void) LogMagickEvent(BlobEvent,GetMagickModule(),
2849 " read %.20g magic header bytes",(double) count);
2850#if defined(MAGICKCORE_ZLIB_DELEGATE)
2851 if (((
int) magick[0] == 0x1F) && ((
int) magick[1] == 0x8B) &&
2852 ((
int) magick[2] == 0x08))
2855 gzfile = gzopen_utf8(filename,
"rb");
2857 if (gzfile != (gzFile) NULL)
2859 if (blob_info->file_info.file != (FILE *) NULL)
2860 (void) fclose(blob_info->file_info.file);
2861 blob_info->file_info.file=(FILE *) NULL;
2862 blob_info->file_info.gzfile=gzfile;
2863 blob_info->type=ZipStream;
2867#if defined(MAGICKCORE_BZLIB_DELEGATE)
2868 if (strncmp((
char *) magick,
"BZh",3) == 0)
2871 *bzfile = BZ2_bzopen(filename,
"r");
2873 if (bzfile != (BZFILE *) NULL)
2875 if (blob_info->file_info.file != (FILE *) NULL)
2876 (void) fclose(blob_info->file_info.file);
2877 blob_info->file_info.file=(FILE *) NULL;
2878 blob_info->file_info.bzfile=bzfile;
2879 blob_info->type=BZipStream;
2883 if (blob_info->type == FileStream)
2894 sans_exception=AcquireExceptionInfo();
2895 magick_info=GetMagickInfo(image_info->magick,sans_exception);
2896 sans_exception=DestroyExceptionInfo(sans_exception);
2897 length=(size_t) blob_info->properties.st_size;
2898 if ((magick_info != (
const MagickInfo *) NULL) &&
2899 (GetMagickBlobSupport(magick_info) != MagickFalse) &&
2900 (length > MagickMaxBufferExtent) &&
2901 (AcquireMagickResource(MapResource,length) != MagickFalse))
2906 blob=MapBlob(fileno(blob_info->file_info.file),ReadMode,0,
2908 if (blob == (
void *) NULL)
2909 RelinquishMagickResource(MapResource,length);
2915 if (image_info->file != (FILE *) NULL)
2916 blob_info->exempt=MagickFalse;
2919 (void) fclose(blob_info->file_info.file);
2920 blob_info->file_info.file=(FILE *) NULL;
2922 AttachBlob(blob_info,blob,length);
2923 blob_info->mapped=MagickTrue;
2930#if defined(MAGICKCORE_ZLIB_DELEGATE)
2931 if ((LocaleCompare(extension,
"gz") == 0) ||
2932 (LocaleCompare(extension,
"wmz") == 0) ||
2933 (LocaleCompare(extension,
"svgz") == 0))
2935 blob_info->file_info.gzfile=gzopen_utf8(filename,
"wb");
2936 if (blob_info->file_info.gzfile != (gzFile) NULL)
2937 blob_info->type=ZipStream;
2941#if defined(MAGICKCORE_BZLIB_DELEGATE)
2942 if (LocaleCompare(extension,
"bz2") == 0)
2944 if (mode == WriteBinaryBlobMode)
2946 blob_info->file_info.bzfile=BZ2_bzopen(filename,
"w");
2947 if (blob_info->file_info.bzfile != (BZFILE *) NULL)
2948 blob_info->type=BZipStream;
2953 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2954 if (blob_info->file_info.file != (FILE *) NULL)
2956 blob_info->type=FileStream;
2957 (void) SetStreamBuffering(image_info,image);
2960 blob_info->status=MagickFalse;
2961 blob_info->error_number=0;
2962 if (blob_info->type != UndefinedStream)
2963 blob_info->size=GetBlobSize(image);
2966 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2967 return(MagickFalse);
3006#if defined(__cplusplus) || defined(c_plusplus)
3010static size_t PingStream(
const Image *magick_unused(image),
3011 const void *magick_unused(pixels),
const size_t columns)
3013 magick_unreferenced(image);
3014 magick_unreferenced(pixels);
3019#if defined(__cplusplus) || defined(c_plusplus)
3023MagickExport
Image *PingBlob(
const ImageInfo *image_info,
const void *blob,
3039 assert(image_info != (
ImageInfo *) NULL);
3040 assert(image_info->signature == MagickCoreSignature);
3042 if (IsEventLogging() != MagickFalse)
3043 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
3044 image_info->filename);
3045 if ((blob == (
const void *) NULL) || (length == 0))
3047 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
3048 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
3049 return((
Image *) NULL);
3051 ping_info=CloneImageInfo(image_info);
3052 ping_info->blob=(
void *) blob;
3053 ping_info->length=length;
3054 ping_info->ping=MagickTrue;
3055 if (*ping_info->magick ==
'\0')
3056 (void) SetImageInfo(ping_info,0,exception);
3057 magick_info=GetMagickInfo(ping_info->magick,exception);
3058 if (magick_info == (
const MagickInfo *) NULL)
3060 (void) ThrowMagickException(exception,GetMagickModule(),
3061 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
3063 ping_info=DestroyImageInfo(ping_info);
3064 return((
Image *) NULL);
3066 if (GetMagickBlobSupport(magick_info) != MagickFalse)
3069 filename[MagickPathExtent];
3074 (void) CopyMagickString(filename,ping_info->filename,MagickPathExtent);
3075 (void) FormatLocaleString(ping_info->filename,MagickPathExtent,
"%s:%s",
3076 ping_info->magick,filename);
3077 image=ReadStream(ping_info,&PingStream,exception);
3078 if (image != (
Image *) NULL)
3079 (void) DetachBlob(image->blob);
3080 ping_info=DestroyImageInfo(ping_info);
3086 ping_info->blob=(
void *) NULL;
3087 ping_info->length=0;
3088 *ping_info->filename=
'\0';
3089 status=BlobToFile(ping_info->filename,blob,length,exception);
3090 if (status == MagickFalse)
3092 (void) RelinquishUniqueFileResource(ping_info->filename);
3093 ping_info=DestroyImageInfo(ping_info);
3094 return((
Image *) NULL);
3096 clone_info=CloneImageInfo(ping_info);
3097 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
3098 ping_info->magick,ping_info->filename);
3099 image=ReadStream(clone_info,&PingStream,exception);
3100 if (image != (
Image *) NULL)
3108 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
3110 (void) CopyMagickString(images->filename,image_info->filename,
3112 (void) CopyMagickString(images->magick_filename,image_info->filename,
3114 (void) CopyMagickString(images->magick,magick_info->name,
3116 images=GetNextImageInList(images);
3119 clone_info=DestroyImageInfo(clone_info);
3120 (void) RelinquishUniqueFileResource(ping_info->filename);
3121 ping_info=DestroyImageInfo(ping_info);
3156MagickExport ssize_t ReadBlob(
Image *image,
const size_t length,
3157 unsigned char *data)
3160 *magick_restrict blob_info;
3171 assert(image != (
Image *) NULL);
3172 assert(image->signature == MagickCoreSignature);
3173 assert(image->blob != (
BlobInfo *) NULL);
3174 assert(image->blob->type != UndefinedStream);
3177 assert(data != (
void *) NULL);
3178 blob_info=image->blob;
3181 switch (blob_info->type)
3183 case UndefinedStream:
3185 case StandardStream:
3193 count=(ssize_t) fread(q,1,length,blob_info->file_info.file);
3198 c=getc(blob_info->file_info.file);
3201 *q++=(
unsigned char) c;
3207 c=getc(blob_info->file_info.file);
3210 *q++=(
unsigned char) c;
3216 c=getc(blob_info->file_info.file);
3219 *q++=(
unsigned char) c;
3225 c=getc(blob_info->file_info.file);
3228 *q++=(
unsigned char) c;
3235 if ((count != (ssize_t) length) &&
3236 (ferror(blob_info->file_info.file) != 0))
3237 ThrowBlobException(blob_info);
3242#if defined(MAGICKCORE_ZLIB_DELEGATE)
3253 for (i=0; i < (ssize_t) length; i+=count)
3255 count=(ssize_t) gzread(blob_info->file_info.gzfile,q+i,
3256 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3269 c=gzgetc(blob_info->file_info.gzfile);
3272 *q++=(
unsigned char) c;
3278 c=gzgetc(blob_info->file_info.gzfile);
3281 *q++=(
unsigned char) c;
3287 c=gzgetc(blob_info->file_info.gzfile);
3290 *q++=(
unsigned char) c;
3296 c=gzgetc(blob_info->file_info.gzfile);
3299 *q++=(
unsigned char) c;
3307 (void) gzerror(blob_info->file_info.gzfile,&status);
3308 if ((count != (ssize_t) length) && (status != Z_OK))
3309 ThrowBlobException(blob_info);
3310 if (blob_info->eof == MagickFalse)
3311 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
3318#if defined(MAGICKCORE_BZLIB_DELEGATE)
3325 for (i=0; i < (ssize_t) length; i+=count)
3327 count=(ssize_t) BZ2_bzread(blob_info->file_info.bzfile,q+i,
3328 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3338 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
3339 if ((count != (ssize_t) length) && (status != BZ_OK))
3340 ThrowBlobException(blob_info);
3351 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3353 blob_info->eof=MagickTrue;
3356 p=blob_info->data+blob_info->offset;
3357 count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
3358 blob_info->length-blob_info->offset);
3359 blob_info->offset+=count;
3360 if (count != (ssize_t) length)
3361 blob_info->eof=MagickTrue;
3362 (void) memcpy(q,p,(
size_t) count);
3391MagickExport
int ReadBlobByte(
Image *image)
3394 *magick_restrict blob_info;
3399 assert(image != (
Image *) NULL);
3400 assert(image->signature == MagickCoreSignature);
3401 assert(image->blob != (
BlobInfo *) NULL);
3402 assert(image->blob->type != UndefinedStream);
3403 blob_info=image->blob;
3404 switch (blob_info->type)
3406 case StandardStream:
3410 c=getc(blob_info->file_info.file);
3413 if (ferror(blob_info->file_info.file) != 0)
3414 ThrowBlobException(blob_info);
3421 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3423 blob_info->eof=MagickTrue;
3426 c=(int) (*((
unsigned char *) blob_info->data+blob_info->offset));
3427 blob_info->offset++;
3438 count=ReadBlob(image,1,buffer);
3471MagickExport
double ReadBlobDouble(
Image *image)
3482 quantum.double_value=0.0;
3483 quantum.unsigned_value=ReadBlobLongLong(image);
3484 return(quantum.double_value);
3510MagickExport
float ReadBlobFloat(
Image *image)
3521 quantum.float_value=0.0;
3522 quantum.unsigned_value=ReadBlobLong(image);
3523 return(quantum.float_value);
3549MagickExport
unsigned int ReadBlobLong(
Image *image)
3563 assert(image != (
Image *) NULL);
3564 assert(image->signature == MagickCoreSignature);
3566 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3569 if (image->endian == LSBEndian)
3571 value=(
unsigned int) (*p++);
3572 value|=(
unsigned int) (*p++) << 8;
3573 value|=(
unsigned int) (*p++) << 16;
3574 value|=(
unsigned int) (*p++) << 24;
3577 value=(
unsigned int) (*p++) << 24;
3578 value|=(
unsigned int) (*p++) << 16;
3579 value|=(
unsigned int) (*p++) << 8;
3580 value|=(
unsigned int) (*p++);
3607MagickExport MagickSizeType ReadBlobLongLong(
Image *image)
3621 assert(image != (
Image *) NULL);
3622 assert(image->signature == MagickCoreSignature);
3624 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3626 return(MagickULLConstant(0));
3627 if (image->endian == LSBEndian)
3629 value=(MagickSizeType) (*p++);
3630 value|=(MagickSizeType) (*p++) << 8;
3631 value|=(MagickSizeType) (*p++) << 16;
3632 value|=(MagickSizeType) (*p++) << 24;
3633 value|=(MagickSizeType) (*p++) << 32;
3634 value|=(MagickSizeType) (*p++) << 40;
3635 value|=(MagickSizeType) (*p++) << 48;
3636 value|=(MagickSizeType) (*p++) << 56;
3639 value=(MagickSizeType) (*p++) << 56;
3640 value|=(MagickSizeType) (*p++) << 48;
3641 value|=(MagickSizeType) (*p++) << 40;
3642 value|=(MagickSizeType) (*p++) << 32;
3643 value|=(MagickSizeType) (*p++) << 24;
3644 value|=(MagickSizeType) (*p++) << 16;
3645 value|=(MagickSizeType) (*p++) << 8;
3646 value|=(MagickSizeType) (*p++);
3673MagickExport
unsigned short ReadBlobShort(
Image *image)
3687 assert(image != (
Image *) NULL);
3688 assert(image->signature == MagickCoreSignature);
3690 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3692 return((
unsigned short) 0U);
3693 if (image->endian == LSBEndian)
3695 value=(
unsigned short) (*p++);
3696 value|=(
unsigned short) (*p++) << 8;
3699 value=(
unsigned short) ((
unsigned short) (*p++) << 8);
3700 value|=(
unsigned short) (*p++);
3727MagickExport
unsigned int ReadBlobLSBLong(
Image *image)
3741 assert(image != (
Image *) NULL);
3742 assert(image->signature == MagickCoreSignature);
3744 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3747 value=(
unsigned int) (*p++);
3748 value|=(
unsigned int) (*p++) << 8;
3749 value|=(
unsigned int) (*p++) << 16;
3750 value|=(
unsigned int) (*p++) << 24;
3777MagickExport
signed int ReadBlobLSBSignedLong(
Image *image)
3788 quantum.unsigned_value=ReadBlobLSBLong(image);
3789 return(quantum.signed_value);
3815MagickExport
unsigned short ReadBlobLSBShort(
Image *image)
3829 assert(image != (
Image *) NULL);
3830 assert(image->signature == MagickCoreSignature);
3832 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3834 return((
unsigned short) 0U);
3835 value=(
unsigned short) (*p++);
3836 value|=(
unsigned short) (*p++) << 8;
3863MagickExport
signed short ReadBlobLSBSignedShort(
Image *image)
3874 quantum.unsigned_value=ReadBlobLSBShort(image);
3875 return(quantum.signed_value);
3901MagickExport
unsigned int ReadBlobMSBLong(
Image *image)
3915 assert(image != (
Image *) NULL);
3916 assert(image->signature == MagickCoreSignature);
3918 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3921 value=(
unsigned int) (*p++) << 24;
3922 value|=(
unsigned int) (*p++) << 16;
3923 value|=(
unsigned int) (*p++) << 8;
3924 value|=(
unsigned int) (*p++);
3951MagickExport MagickSizeType ReadBlobMSBLongLong(
Image *image)
3965 assert(image != (
Image *) NULL);
3966 assert(image->signature == MagickCoreSignature);
3968 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3970 return(MagickULLConstant(0));
3971 value=(MagickSizeType) (*p++) << 56;
3972 value|=(MagickSizeType) (*p++) << 48;
3973 value|=(MagickSizeType) (*p++) << 40;
3974 value|=(MagickSizeType) (*p++) << 32;
3975 value|=(MagickSizeType) (*p++) << 24;
3976 value|=(MagickSizeType) (*p++) << 16;
3977 value|=(MagickSizeType) (*p++) << 8;
3978 value|=(MagickSizeType) (*p++);
4005MagickExport
unsigned short ReadBlobMSBShort(
Image *image)
4019 assert(image != (
Image *) NULL);
4020 assert(image->signature == MagickCoreSignature);
4022 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
4024 return((
unsigned short) 0U);
4025 value=(
unsigned short) ((*p++) << 8);
4026 value|=(
unsigned short) (*p++);
4053MagickExport
signed int ReadBlobMSBSignedLong(
Image *image)
4064 quantum.unsigned_value=ReadBlobMSBLong(image);
4065 return(quantum.signed_value);
4091MagickExport
signed short ReadBlobMSBSignedShort(
Image *image)
4102 quantum.unsigned_value=ReadBlobMSBShort(image);
4103 return(quantum.signed_value);
4129MagickExport
signed int ReadBlobSignedLong(
Image *image)
4140 quantum.unsigned_value=ReadBlobLong(image);
4141 return(quantum.signed_value);
4167MagickExport
signed short ReadBlobSignedShort(
Image *image)
4178 quantum.unsigned_value=ReadBlobShort(image);
4179 return(quantum.signed_value);
4217MagickExport magick_hot_spot
const void *ReadBlobStream(
Image *image,
4218 const size_t length,
void *magick_restrict data,ssize_t *count)
4221 *magick_restrict blob_info;
4223 assert(image != (
Image *) NULL);
4224 assert(image->signature == MagickCoreSignature);
4225 assert(image->blob != (
BlobInfo *) NULL);
4226 assert(image->blob->type != UndefinedStream);
4227 assert(count != (ssize_t *) NULL);
4228 blob_info=image->blob;
4229 if (blob_info->type != BlobStream)
4231 assert(data != NULL);
4232 *count=ReadBlob(image,length,(
unsigned char *) data);
4235 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
4238 blob_info->eof=MagickTrue;
4241 data=blob_info->data+blob_info->offset;
4242 *count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
4243 blob_info->length-blob_info->offset);
4244 blob_info->offset+=(*count);
4245 if (*count != (ssize_t) length)
4246 blob_info->eof=MagickTrue;
4275MagickExport
char *ReadBlobString(
Image *image,
char *
string)
4278 *magick_restrict blob_info;
4286 assert(image != (
Image *) NULL);
4287 assert(image->signature == MagickCoreSignature);
4288 assert(image->blob != (
BlobInfo *) NULL);
4289 assert(image->blob->type != UndefinedStream);
4290 if (IsEventLogging() != MagickFalse)
4291 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4293 blob_info=image->blob;
4294 switch (blob_info->type)
4296 case UndefinedStream:
4298 case StandardStream:
4301 char *p = fgets(
string,MagickPathExtent,blob_info->file_info.file);
4302 if (p == (
char *) NULL)
4304 if (ferror(blob_info->file_info.file) != 0)
4305 ThrowBlobException(blob_info);
4306 return((
char *) NULL);
4313#if defined(MAGICKCORE_ZLIB_DELEGATE)
4314 char *p = gzgets(blob_info->file_info.gzfile,
string,MagickPathExtent);
4315 if (p == (
char *) NULL)
4318 (void) gzerror(blob_info->file_info.gzfile,&status);
4320 ThrowBlobException(blob_info);
4321 return((
char *) NULL);
4331 c=ReadBlobByte(image);
4334 blob_info->eof=MagickTrue;
4340 }
while (i < (MaxTextExtent-2));
4348 if ((
string[i] ==
'\r') || (
string[i] ==
'\n'))
4351 if ((
string[i-1] ==
'\r') || (
string[i-1] ==
'\n'))
4353 if ((*
string ==
'\0') && (blob_info->eof != MagickFalse))
4354 return((
char *) NULL);
4384 assert(blob->signature == MagickCoreSignature);
4385 if (IsEventLogging() != MagickFalse)
4386 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4387 LockSemaphoreInfo(blob->semaphore);
4388 blob->reference_count++;
4389 UnlockSemaphoreInfo(blob->semaphore);
4426MagickExport MagickOffsetType SeekBlob(
Image *image,
4427 const MagickOffsetType offset,
const int whence)
4430 *magick_restrict blob_info;
4432 assert(image != (
Image *) NULL);
4433 assert(image->signature == MagickCoreSignature);
4434 assert(image->blob != (
BlobInfo *) NULL);
4435 assert(image->blob->type != UndefinedStream);
4436 if (IsEventLogging() != MagickFalse)
4437 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4438 blob_info=image->blob;
4439 switch (blob_info->type)
4441 case UndefinedStream:
4443 case StandardStream:
4448 if ((offset < 0) && (whence == SEEK_SET))
4450 if (fseek(blob_info->file_info.file,offset,whence) < 0)
4452 blob_info->offset=TellBlob(image);
4457#if defined(MAGICKCORE_ZLIB_DELEGATE)
4458 if (gzseek(blob_info->file_info.gzfile,offset,whence) < 0)
4461 blob_info->offset=TellBlob(image);
4477 blob_info->offset=offset;
4482 if (((offset > 0) && (blob_info->offset > (MAGICK_SSIZE_MAX-offset))) ||
4483 ((offset < 0) && (blob_info->offset < (MAGICK_SSIZE_MIN-offset))))
4488 if ((blob_info->offset+offset) < 0)
4490 blob_info->offset+=offset;
4495 if (((MagickOffsetType) blob_info->length+offset) < 0)
4497 blob_info->offset=blob_info->length+offset;
4501 if (blob_info->offset < (MagickOffsetType) ((off_t) blob_info->length))
4503 blob_info->eof=MagickFalse;
4506 if (blob_info->offset >= (MagickOffsetType) ((off_t) blob_info->extent))
4511 return(blob_info->offset);
4539MagickExport
void SetBlobExempt(
Image *image,
const MagickBooleanType exempt)
4541 assert(image != (
const Image *) NULL);
4542 assert(image->signature == MagickCoreSignature);
4543 if (IsEventLogging() != MagickFalse)
4544 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4545 image->blob->exempt=exempt;
4574MagickExport MagickBooleanType SetBlobExtent(
Image *image,
4575 const MagickSizeType extent)
4578 *magick_restrict blob_info;
4580 assert(image != (
Image *) NULL);
4581 assert(image->signature == MagickCoreSignature);
4582 assert(image->blob != (
BlobInfo *) NULL);
4583 assert(image->blob->type != UndefinedStream);
4584 if (IsEventLogging() != MagickFalse)
4585 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4586 blob_info=image->blob;
4587 switch (blob_info->type)
4589 case UndefinedStream:
4591 case StandardStream:
4592 return(MagickFalse);
4601 if (extent != (MagickSizeType) ((off_t) extent))
4602 return(MagickFalse);
4603 offset=SeekBlob(image,0,SEEK_END);
4605 return(MagickFalse);
4606 if ((MagickSizeType) offset >= extent)
4608 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4611 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4612 blob_info->file_info.file);
4613#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4614 if (blob_info->synchronize != MagickFalse)
4619 file=fileno(blob_info->file_info.file);
4620 if ((file == -1) || (offset < 0))
4621 return(MagickFalse);
4622 (void) posix_fallocate(file,offset,extent-offset);
4625 offset=SeekBlob(image,offset,SEEK_SET);
4627 return(MagickFalse);
4632 return(MagickFalse);
4634 return(MagickFalse);
4636 return(MagickFalse);
4639 if (extent != (MagickSizeType) ((
size_t) extent))
4640 return(MagickFalse);
4641 if (blob_info->mapped != MagickFalse)
4649 (void) UnmapBlob(blob_info->data,blob_info->length);
4650 RelinquishMagickResource(MapResource,blob_info->length);
4651 if (extent != (MagickSizeType) ((off_t) extent))
4652 return(MagickFalse);
4653 offset=SeekBlob(image,0,SEEK_END);
4655 return(MagickFalse);
4656 if ((MagickSizeType) offset >= extent)
4658 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4659 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4660 blob_info->file_info.file);
4661#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4662 if (blob_info->synchronize != MagickFalse)
4667 file=fileno(blob_info->file_info.file);
4668 if ((file == -1) || (offset < 0))
4669 return(MagickFalse);
4670 (void) posix_fallocate(file,offset,extent-offset);
4673 offset=SeekBlob(image,offset,SEEK_SET);
4675 return(MagickFalse);
4676 (void) AcquireMagickResource(MapResource,extent);
4677 blob_info->data=(
unsigned char*) MapBlob(fileno(
4678 blob_info->file_info.file),WriteMode,0,(size_t) extent);
4679 blob_info->extent=(size_t) extent;
4680 blob_info->length=(size_t) extent;
4681 (void) SyncBlob(image);
4684 blob_info->extent=(size_t) extent;
4685 blob_info->data=(
unsigned char *) ResizeQuantumMemory(blob_info->data,
4686 blob_info->extent+1,
sizeof(*blob_info->data));
4687 (void) SyncBlob(image);
4688 if (blob_info->data == (
unsigned char *) NULL)
4690 (void) DetachBlob(blob_info);
4691 return(MagickFalse);
4722static int SyncBlob(
Image *image)
4725 *magick_restrict blob_info;
4730 assert(image != (
Image *) NULL);
4731 assert(image->signature == MagickCoreSignature);
4732 assert(image->blob != (
BlobInfo *) NULL);
4733 assert(image->blob->type != UndefinedStream);
4734 if (IsEventLogging() != MagickFalse)
4735 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4736 blob_info=image->blob;
4738 switch (blob_info->type)
4740 case UndefinedStream:
4741 case StandardStream:
4746 status=fflush(blob_info->file_info.file);
4751#if defined(MAGICKCORE_ZLIB_DELEGATE)
4752 status=gzflush(blob_info->file_info.gzfile,Z_SYNC_FLUSH);
4758#if defined(MAGICKCORE_BZLIB_DELEGATE)
4759 status=BZ2_bzflush(blob_info->file_info.bzfile);
4802MagickPrivate
void SyncBlobStream(
ImageInfo *image_info,
Image *image,
4805 assert(owner != (
Image *) NULL);
4806 assert(image != (
Image *) NULL);
4807 assert(image->signature == MagickCoreSignature);
4808 if (image->blob == (
BlobInfo *) NULL)
4810 if (image->blob->data == (
unsigned char *) NULL)
4814 image_info->blob=(
void *) image->blob->data;
4815 image_info->length=image->blob->length;
4817 if ((image == owner) || (owner->blob == (
BlobInfo *) NULL))
4819 if (owner->blob == (
BlobInfo *) NULL)
4825 owner->blob->data=image->blob->data;
4826 owner->blob->extent=image->blob->extent;
4827 owner->blob->length=image->blob->length;
4828 owner->blob->offset=image->blob->offset;
4829 owner->blob->quantum=image->blob->quantum;
4830 owner->blob->type=BlobStream;
4831 owner->blob->exempt=MagickTrue;
4832 (void) DetachBlob(image->blob);
4857MagickExport MagickOffsetType TellBlob(
const Image *image)
4860 *magick_restrict blob_info;
4865 assert(image != (
Image *) NULL);
4866 assert(image->signature == MagickCoreSignature);
4867 assert(image->blob != (
BlobInfo *) NULL);
4868 assert(image->blob->type != UndefinedStream);
4869 if (IsEventLogging() != MagickFalse)
4870 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4871 blob_info=image->blob;
4873 switch (blob_info->type)
4875 case UndefinedStream:
4876 case StandardStream:
4880 offset=ftell(blob_info->file_info.file);
4887#if defined(MAGICKCORE_ZLIB_DELEGATE)
4888 offset=(MagickOffsetType) gztell(blob_info->file_info.gzfile);
4898 offset=blob_info->offset;
4930MagickExport MagickBooleanType UnmapBlob(
void *map,
const size_t length)
4932#if defined(MAGICKCORE_HAVE_MMAP)
4936 status=munmap(map,length);
4937 return(status == -1 ? MagickFalse : MagickTrue);
4941 return(MagickFalse);
4974MagickExport ssize_t WriteBlob(
Image *image,
const size_t length,
4975 const unsigned char *data)
4978 *magick_restrict blob_info;
4992 assert(image != (
Image *) NULL);
4993 assert(image->signature == MagickCoreSignature);
4994 assert(image->blob != (
BlobInfo *) NULL);
4995 assert(image->blob->type != UndefinedStream);
4998 assert(data != (
const unsigned char *) NULL);
4999 blob_info=image->blob;
5001 p=(
const unsigned char *) data;
5002 q=(
unsigned char *) data;
5003 switch (blob_info->type)
5005 case UndefinedStream:
5007 case StandardStream:
5015 count=(ssize_t) fwrite((
const char *) data,1,length,
5016 blob_info->file_info.file);
5021 c=putc((
int) *p++,blob_info->file_info.file);
5029 c=putc((
int) *p++,blob_info->file_info.file);
5037 c=putc((
int) *p++,blob_info->file_info.file);
5045 c=putc((
int) *p++,blob_info->file_info.file);
5054 if ((count != (ssize_t) length) &&
5055 (ferror(blob_info->file_info.file) != 0))
5056 ThrowBlobException(blob_info);
5061#if defined(MAGICKCORE_ZLIB_DELEGATE)
5072 for (i=0; i < (ssize_t) length; i+=count)
5074 count=(ssize_t) gzwrite(blob_info->file_info.gzfile,q+i,
5075 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
5088 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5096 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5104 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5112 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5122 (void) gzerror(blob_info->file_info.gzfile,&status);
5123 if ((count != (ssize_t) length) && (status != Z_OK))
5124 ThrowBlobException(blob_info);
5130#if defined(MAGICKCORE_BZLIB_DELEGATE)
5137 for (i=0; i < (ssize_t) length; i+=count)
5139 count=(ssize_t) BZ2_bzwrite(blob_info->file_info.bzfile,q+i,
5140 (
int) MagickMin(length-i,MagickMaxBufferExtent));
5150 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
5151 if ((count != (ssize_t) length) && (status != BZ_OK))
5152 ThrowBlobException(blob_info);
5158 count=(ssize_t) blob_info->stream(image,data,length);
5166 extent=(MagickSizeType) (blob_info->offset+(MagickOffsetType) length);
5167 if (extent >= blob_info->extent)
5169 if (blob_info->mapped != MagickFalse)
5171 blob_info->extent=extent+blob_info->quantum+length;
5172 blob_info->quantum<<=1;
5173 blob_info->data=(
unsigned char *) ResizeQuantumMemory(
5174 blob_info->data,blob_info->extent+1,
sizeof(*blob_info->data));
5175 (void) SyncBlob(image);
5176 if (blob_info->data == (
unsigned char *) NULL)
5178 (void) DetachBlob(blob_info);
5182 q=blob_info->data+blob_info->offset;
5183 (void) memcpy(q,p,length);
5184 blob_info->offset+=length;
5185 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
5186 blob_info->length=(
size_t) blob_info->offset;
5187 count=(ssize_t) length;
5190 if (count != (ssize_t) length)
5191 ThrowBlobException(blob_info);
5220MagickExport ssize_t WriteBlobByte(
Image *image,
const unsigned char value)
5223 *magick_restrict blob_info;
5228 assert(image != (
Image *) NULL);
5229 assert(image->signature == MagickCoreSignature);
5230 assert(image->blob != (
BlobInfo *) NULL);
5231 assert(image->blob->type != UndefinedStream);
5232 blob_info=image->blob;
5234 switch (blob_info->type)
5236 case StandardStream:
5243 c=putc((
int) value,blob_info->file_info.file);
5246 if (ferror(blob_info->file_info.file) != 0)
5247 ThrowBlobException(blob_info);
5255 count=WriteBlobStream(image,1,&value);
5287MagickExport ssize_t WriteBlobFloat(
Image *image,
const float value)
5298 quantum.unsigned_value=0U;
5299 quantum.float_value=value;
5300 return(WriteBlobLong(image,quantum.unsigned_value));
5328MagickExport ssize_t WriteBlobLong(
Image *image,
const unsigned int value)
5333 assert(image != (
Image *) NULL);
5334 assert(image->signature == MagickCoreSignature);
5335 if (image->endian == LSBEndian)
5337 buffer[0]=(
unsigned char) value;
5338 buffer[1]=(
unsigned char) (value >> 8);
5339 buffer[2]=(
unsigned char) (value >> 16);
5340 buffer[3]=(
unsigned char) (value >> 24);
5341 return(WriteBlobStream(image,4,buffer));
5343 buffer[0]=(
unsigned char) (value >> 24);
5344 buffer[1]=(
unsigned char) (value >> 16);
5345 buffer[2]=(
unsigned char) (value >> 8);
5346 buffer[3]=(
unsigned char) value;
5347 return(WriteBlobStream(image,4,buffer));
5375MagickExport ssize_t WriteBlobShort(
Image *image,
const unsigned short value)
5380 assert(image != (
Image *) NULL);
5381 assert(image->signature == MagickCoreSignature);
5382 if (image->endian == LSBEndian)
5384 buffer[0]=(
unsigned char) value;
5385 buffer[1]=(
unsigned char) (value >> 8);
5386 return(WriteBlobStream(image,2,buffer));
5388 buffer[0]=(
unsigned char) (value >> 8);
5389 buffer[1]=(
unsigned char) value;
5390 return(WriteBlobStream(image,2,buffer));
5418MagickExport ssize_t WriteBlobLSBLong(
Image *image,
const unsigned int value)
5423 assert(image != (
Image *) NULL);
5424 assert(image->signature == MagickCoreSignature);
5425 buffer[0]=(
unsigned char) value;
5426 buffer[1]=(
unsigned char) (value >> 8);
5427 buffer[2]=(
unsigned char) (value >> 16);
5428 buffer[3]=(
unsigned char) (value >> 24);
5429 return(WriteBlobStream(image,4,buffer));
5457MagickExport ssize_t WriteBlobLSBShort(
Image *image,
const unsigned short value)
5462 assert(image != (
Image *) NULL);
5463 assert(image->signature == MagickCoreSignature);
5464 buffer[0]=(
unsigned char) value;
5465 buffer[1]=(
unsigned char) (value >> 8);
5466 return(WriteBlobStream(image,2,buffer));
5494MagickExport ssize_t WriteBlobLSBSignedLong(
Image *image,
const signed int value)
5508 assert(image != (
Image *) NULL);
5509 assert(image->signature == MagickCoreSignature);
5510 quantum.signed_value=value;
5511 buffer[0]=(
unsigned char) quantum.unsigned_value;
5512 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5513 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 16);
5514 buffer[3]=(
unsigned char) (quantum.unsigned_value >> 24);
5515 return(WriteBlobStream(image,4,buffer));
5543MagickExport ssize_t WriteBlobLSBSignedShort(
Image *image,
5544 const signed short value)
5558 assert(image != (
Image *) NULL);
5559 assert(image->signature == MagickCoreSignature);
5560 quantum.signed_value=value;
5561 buffer[0]=(
unsigned char) quantum.unsigned_value;
5562 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5563 return(WriteBlobStream(image,2,buffer));
5591MagickExport ssize_t WriteBlobMSBLong(
Image *image,
const unsigned int value)
5596 assert(image != (
Image *) NULL);
5597 assert(image->signature == MagickCoreSignature);
5598 buffer[0]=(
unsigned char) (value >> 24);
5599 buffer[1]=(
unsigned char) (value >> 16);
5600 buffer[2]=(
unsigned char) (value >> 8);
5601 buffer[3]=(
unsigned char) value;
5602 return(WriteBlobStream(image,4,buffer));
5630MagickExport ssize_t WriteBlobMSBLongLong(
Image *image,
5631 const MagickSizeType value)
5636 assert(image != (
Image *) NULL);
5637 assert(image->signature == MagickCoreSignature);
5638 buffer[0]=(
unsigned char) (value >> 56);
5639 buffer[1]=(
unsigned char) (value >> 48);
5640 buffer[2]=(
unsigned char) (value >> 40);
5641 buffer[3]=(
unsigned char) (value >> 32);
5642 buffer[4]=(
unsigned char) (value >> 24);
5643 buffer[5]=(
unsigned char) (value >> 16);
5644 buffer[6]=(
unsigned char) (value >> 8);
5645 buffer[7]=(
unsigned char) value;
5646 return(WriteBlobStream(image,8,buffer));
5674MagickExport ssize_t WriteBlobMSBShort(
Image *image,
const unsigned short value)
5679 assert(image != (
Image *) NULL);
5680 assert(image->signature == MagickCoreSignature);
5681 buffer[0]=(
unsigned char) (value >> 8);
5682 buffer[1]=(
unsigned char) value;
5683 return(WriteBlobStream(image,2,buffer));
5711MagickExport ssize_t WriteBlobMSBSignedLong(
Image *image,
const signed int value)
5725 assert(image != (
Image *) NULL);
5726 assert(image->signature == MagickCoreSignature);
5727 quantum.signed_value=value;
5728 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 24);
5729 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 16);
5730 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 8);
5731 buffer[3]=(
unsigned char) quantum.unsigned_value;
5732 return(WriteBlobStream(image,4,buffer));
5760MagickExport ssize_t WriteBlobMSBSignedShort(
Image *image,
5761 const signed short value)
5775 assert(image != (
Image *) NULL);
5776 assert(image->signature == MagickCoreSignature);
5777 quantum.signed_value=value;
5778 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 8);
5779 buffer[1]=(
unsigned char) quantum.unsigned_value;
5780 return(WriteBlobStream(image,2,buffer));
5808MagickExport ssize_t WriteBlobString(
Image *image,
const char *
string)
5810 assert(image != (
Image *) NULL);
5811 assert(image->signature == MagickCoreSignature);
5812 assert(
string != (
const char *) NULL);
5813 return(WriteBlobStream(image,strlen(
string),(
const unsigned char *)
string));