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)
206 MagickExport
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;
252 MagickExport 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+=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);
328 MagickExport
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);
498 static 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;
505 MagickExport 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);
675 MagickExport
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);
736 MagickExport
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;
788 MagickPrivate
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;
842 MagickExport 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);
900 MagickExport
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);
935 MagickExport
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);
1013 MagickExport
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);
1096 MagickExport
unsigned char *FileToBlob(
const char *filename,
const size_t extent,
1123 assert(filename != (
const char *) NULL);
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) < (quantum+1))
1183 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1186 blob=(
unsigned char *) ResizeQuantumMemory(blob,i+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);
1286 static 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->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);
1320 MagickExport 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);
1423 MagickExport 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);
1456 MagickExport FILE *GetBlobFileHandle(
const Image *image)
1458 assert(image != (
const Image *) NULL);
1459 assert(image->signature == MagickCoreSignature);
1460 return(image->blob->file_info.file);
1485 MagickExport
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;
1521 MagickExport
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);
1553 MagickExport 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;
1640 MagickExport
unsigned char *GetBlobStreamData(
const Image *image)
1642 assert(image != (
const Image *) NULL);
1643 assert(image->signature == MagickCoreSignature);
1644 return(image->blob->data);
1669 MagickExport 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);
1711 MagickExport
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 if (IsEventLogging() != MagickFalse)
1732 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1733 image_info->filename);
1735 blob=(
unsigned char *) NULL;
1736 blob_info=CloneImageInfo(image_info);
1737 blob_info->adjoin=MagickFalse;
1738 (void) SetImageInfo(blob_info,1,exception);
1739 if (*blob_info->magick !=
'\0')
1740 (void) CopyMagickString(image->magick,blob_info->magick,MagickPathExtent);
1741 magick_info=GetMagickInfo(image->magick,exception);
1742 if (magick_info == (
const MagickInfo *) NULL)
1744 (void) ThrowMagickException(exception,GetMagickModule(),
1745 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
1747 blob_info=DestroyImageInfo(blob_info);
1750 (void) CopyMagickString(blob_info->magick,image->magick,MagickPathExtent);
1751 if (GetMagickBlobSupport(magick_info) != MagickFalse)
1756 blob_info->length=0;
1757 blob_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent,
1758 sizeof(
unsigned char));
1759 if (blob_info->blob == NULL)
1760 (void) ThrowMagickException(exception,GetMagickModule(),
1761 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",image->filename);
1764 (void) CloseBlob(image);
1765 image->blob->exempt=MagickTrue;
1766 *image->filename=
'\0';
1767 status=WriteImage(blob_info,image);
1768 InheritException(exception,&image->exception);
1769 *length=image->blob->length;
1770 blob=DetachBlob(image->blob);
1771 if (blob != (
void *) NULL)
1773 if (status == MagickFalse)
1774 blob=RelinquishMagickMemory(blob);
1776 blob=ResizeQuantumMemory(blob,*length+1,
sizeof(
unsigned char));
1783 unique[MagickPathExtent];
1791 file=AcquireUniqueFileResource(unique);
1794 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",
1795 image_info->filename);
1799 blob_info->file=fdopen(file,
"wb");
1800 if (blob_info->file != (FILE *) NULL)
1802 (void) FormatLocaleString(image->filename,MagickPathExtent,
1803 "%s:%s",image->magick,unique);
1804 status=WriteImage(blob_info,image);
1805 (void) CloseBlob(image);
1806 (void) fclose(blob_info->file);
1807 if (status == MagickFalse)
1808 InheritException(exception,&image->exception);
1810 blob=FileToBlob(unique,~0UL,length,exception);
1812 (void) RelinquishUniqueFileResource(unique);
1815 blob_info=DestroyImageInfo(blob_info);
1847 MagickExport MagickBooleanType ImageToFile(
Image *image,
char *filename,
1872 assert(image != (
Image *) NULL);
1873 assert(image->signature == MagickCoreSignature);
1874 assert(image->blob != (
BlobInfo *) NULL);
1875 assert(image->blob->type != UndefinedStream);
1876 assert(filename != (
const char *) NULL);
1877 if (IsEventLogging() != MagickFalse)
1878 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1879 if (*filename ==
'\0')
1880 file=AcquireUniqueFileResource(filename);
1882 if (LocaleCompare(filename,
"-") == 0)
1883 file=fileno(stdout);
1885 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
1888 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1889 return(MagickFalse);
1891 quantum=(size_t) MagickMaxBufferExtent;
1892 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1893 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1894 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
1895 if (buffer == (
unsigned char *) NULL)
1898 (void) ThrowMagickException(exception,GetMagickModule(),
1899 ResourceLimitError,
"MemoryAllocationError",
"`%s'",filename);
1900 return(MagickFalse);
1903 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1904 for (i=0; count > 0; )
1906 length=(size_t) count;
1907 for (i=0; i < length; i+=count)
1909 count=write(file,p+i,(
size_t) (length-i));
1919 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1921 if (LocaleCompare(filename,
"-") != 0)
1923 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
1924 if ((file == -1) || (i < length))
1928 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1929 return(MagickFalse);
1969 MagickExport
unsigned char *ImagesToBlob(
const ImageInfo *image_info,
1984 assert(image_info != (
const ImageInfo *) NULL);
1985 assert(image_info->signature == MagickCoreSignature);
1986 assert(images != (
Image *) NULL);
1987 assert(images->signature == MagickCoreSignature);
1989 if (IsEventLogging() != MagickFalse)
1990 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1991 image_info->filename);
1993 blob=(
unsigned char *) NULL;
1994 blob_info=CloneImageInfo(image_info);
1995 (void) SetImageInfo(blob_info,(
unsigned int) GetImageListLength(images),
1997 if (*blob_info->magick !=
'\0')
1998 (void) CopyMagickString(images->magick,blob_info->magick,MagickPathExtent);
1999 magick_info=GetMagickInfo(images->magick,exception);
2000 if (magick_info == (
const MagickInfo *) NULL)
2002 (void) ThrowMagickException(exception,GetMagickModule(),
2003 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
2005 blob_info=DestroyImageInfo(blob_info);
2008 if (GetMagickAdjoin(magick_info) == MagickFalse)
2010 blob_info=DestroyImageInfo(blob_info);
2011 return(ImageToBlob(image_info,images,length,exception));
2013 (void) CopyMagickString(blob_info->magick,images->magick,MagickPathExtent);
2014 if (GetMagickBlobSupport(magick_info) != MagickFalse)
2019 blob_info->length=0;
2020 blob_info->blob=(
void *) AcquireQuantumMemory(MagickMaxBlobExtent,
2021 sizeof(
unsigned char));
2022 if (blob_info->blob == (
void *) NULL)
2023 (
void) ThrowMagickException(exception,GetMagickModule(),
2024 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",images->filename);
2027 (void) CloseBlob(images);
2028 images->blob->exempt=MagickTrue;
2029 *images->filename=
'\0';
2030 status=WriteImages(blob_info,images,images->filename,exception);
2031 *length=images->blob->length;
2032 blob=DetachBlob(images->blob);
2033 if (blob != (
void *) NULL)
2035 if (status == MagickFalse)
2036 blob=RelinquishMagickMemory(blob);
2038 blob=ResizeQuantumMemory(blob,*length+1,
sizeof(
unsigned char));
2045 filename[MagickPathExtent],
2046 unique[MagickPathExtent];
2054 file=AcquireUniqueFileResource(unique);
2057 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",
2058 image_info->filename);
2062 blob_info->file=fdopen(file,
"wb");
2063 if (blob_info->file != (FILE *) NULL)
2065 (void) FormatLocaleString(filename,MagickPathExtent,
"%s:%s",
2066 images->magick,unique);
2067 status=WriteImages(blob_info,images,filename,exception);
2068 (void) CloseBlob(images);
2069 (void) fclose(blob_info->file);
2070 if (status == MagickFalse)
2071 InheritException(exception,&images->exception);
2073 blob=FileToBlob(unique,~0UL,length,exception);
2075 (void) RelinquishUniqueFileResource(unique);
2078 blob_info=DestroyImageInfo(blob_info);
2114 MagickExport MagickBooleanType InjectImageBlob(
const ImageInfo *image_info,
2118 filename[MagickPathExtent];
2147 assert(image_info != (
ImageInfo *) NULL);
2148 assert(image_info->signature == MagickCoreSignature);
2149 assert(image != (
Image *) NULL);
2150 assert(image->signature == MagickCoreSignature);
2151 assert(inject_image != (
Image *) NULL);
2152 assert(inject_image->signature == MagickCoreSignature);
2154 if (IsEventLogging() != MagickFalse)
2155 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2156 unique_file=(FILE *) NULL;
2157 file=AcquireUniqueFileResource(filename);
2159 unique_file=fdopen(file,
"wb");
2160 if ((file == -1) || (unique_file == (FILE *) NULL))
2162 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2163 ThrowFileException(exception,FileOpenError,
"UnableToCreateTemporaryFile",
2165 return(MagickFalse);
2167 byte_image=CloneImage(inject_image,0,0,MagickFalse,exception);
2168 if (byte_image == (
Image *) NULL)
2170 (void) fclose(unique_file);
2171 (void) RelinquishUniqueFileResource(filename);
2172 return(MagickFalse);
2174 (void) FormatLocaleString(byte_image->filename,MagickPathExtent,
"%s:%s",
2176 DestroyBlob(byte_image);
2177 byte_image->blob=CloneBlobInfo((
BlobInfo *) NULL);
2178 write_info=CloneImageInfo(image_info);
2179 SetImageInfoFile(write_info,unique_file);
2180 status=WriteImage(write_info,byte_image);
2181 write_info=DestroyImageInfo(write_info);
2182 byte_image=DestroyImage(byte_image);
2183 (void) fclose(unique_file);
2184 if (status == MagickFalse)
2186 (void) RelinquishUniqueFileResource(filename);
2187 return(MagickFalse);
2192 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
2195 (void) RelinquishUniqueFileResource(filename);
2196 ThrowFileException(exception,FileOpenError,
"UnableToOpenFile",
2197 image_info->filename);
2198 return(MagickFalse);
2200 quantum=(size_t) MagickMaxBufferExtent;
2201 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
2202 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
2203 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
2204 if (buffer == (
unsigned char *) NULL)
2206 (void) RelinquishUniqueFileResource(filename);
2208 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2213 ssize_t count = read(file,buffer,quantum);
2220 status=WriteBlobStream(image,(
size_t) count,buffer) == count ? MagickTrue :
2225 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",filename);
2226 (void) RelinquishUniqueFileResource(filename);
2227 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
2253 MagickExport MagickBooleanType IsBlobExempt(
const Image *image)
2255 assert(image != (
const Image *) NULL);
2256 assert(image->signature == MagickCoreSignature);
2257 if (IsEventLogging() != MagickFalse)
2258 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2259 return(image->blob->exempt);
2284 MagickExport MagickBooleanType IsBlobSeekable(
const Image *image)
2287 *magick_restrict blob_info;
2289 assert(image != (
const Image *) NULL);
2290 assert(image->signature == MagickCoreSignature);
2291 if (IsEventLogging() != MagickFalse)
2292 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2293 blob_info=image->blob;
2294 switch (blob_info->type)
2303 if (blob_info->file_info.file == (FILE *) NULL)
2304 return(MagickFalse);
2305 status=fseek(blob_info->file_info.file,0,SEEK_CUR);
2306 return(status == -1 ? MagickFalse : MagickTrue);
2310 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2314 if (blob_info->file_info.gzfile == (gzFile) NULL)
2315 return(MagickFalse);
2316 offset=gzseek(blob_info->file_info.gzfile,0,SEEK_CUR);
2317 return(offset < 0 ? MagickFalse : MagickTrue);
2322 case UndefinedStream:
2326 case StandardStream:
2331 return(MagickFalse);
2356 MagickExport MagickBooleanType IsBlobTemporary(
const Image *image)
2358 assert(image != (
const Image *) NULL);
2359 assert(image->signature == MagickCoreSignature);
2360 if (IsEventLogging() != MagickFalse)
2361 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2362 return(image->blob->temporary);
2394 MagickExport
unsigned char *MapBlob(
int file,
const MapMode mode,
2395 const MagickOffsetType offset,
const size_t length)
2397 #if defined(MAGICKCORE_HAVE_MMAP)
2410 #if defined(MAP_ANONYMOUS)
2411 flags|=MAP_ANONYMOUS;
2413 return((
unsigned char *) NULL);
2420 protection=PROT_READ;
2426 protection=PROT_WRITE;
2432 protection=PROT_READ | PROT_WRITE;
2437 #if !defined(MAGICKCORE_HAVE_HUGEPAGES) || !defined(MAP_HUGETLB)
2438 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,offset);
2440 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags |
2441 MAP_HUGETLB,file,offset);
2442 if (map == (
unsigned char *) MAP_FAILED)
2443 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,
2446 if (map == (
unsigned char *) MAP_FAILED)
2447 return((
unsigned char *) NULL);
2454 return((
unsigned char *) NULL);
2483 MagickExport
void MSBOrderLong(
unsigned char *buffer,
const size_t length)
2492 assert(buffer != (
unsigned char *) NULL);
2499 *buffer++=(
unsigned char) c;
2503 *buffer++=(
unsigned char) c;
2533 MagickExport
void MSBOrderShort(
unsigned char *p,
const size_t length)
2541 assert(p != (
unsigned char *) NULL);
2548 *p++=(
unsigned char) c;
2584 static inline MagickBooleanType SetStreamBuffering(
const ImageInfo *image_info,
2596 size=MagickMinBufferExtent;
2597 option=GetImageOption(image_info,
"stream:buffer-size");
2598 if (option != (
const char *) NULL)
2599 size=StringToUnsignedLong(option);
2600 status=setvbuf(image->blob->file_info.file,(
char *) NULL,size == 0 ?
2601 _IONBF : _IOFBF,size);
2602 return(status == 0 ? MagickTrue : MagickFalse);
2605 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2606 static inline gzFile gzopen_utf8(
const char *path,
const char *mode)
2608 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
2609 return(gzopen(path,mode));
2617 path_wide=create_wchar_path(path);
2618 if (path_wide == (
wchar_t *) NULL)
2619 return((gzFile) NULL);
2620 file=gzopen_w(path_wide,mode);
2621 path_wide=(
wchar_t *) RelinquishMagickMemory(path_wide);
2627 MagickExport MagickBooleanType OpenBlob(
const ImageInfo *image_info,
2631 *magick_restrict blob_info;
2634 extension[MagickPathExtent],
2635 filename[MagickPathExtent];
2646 assert(image_info != (
ImageInfo *) NULL);
2647 assert(image_info->signature == MagickCoreSignature);
2648 assert(image != (
Image *) NULL);
2649 assert(image->signature == MagickCoreSignature);
2650 if (IsEventLogging() != MagickFalse)
2651 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2652 image_info->filename);
2653 blob_info=image->blob;
2654 if (image_info->blob != (
void *) NULL)
2656 if (image_info->stream != (StreamHandler) NULL)
2657 blob_info->stream=(StreamHandler) image_info->stream;
2658 AttachBlob(blob_info,image_info->blob,image_info->length);
2661 (void) DetachBlob(blob_info);
2662 blob_info->mode=mode;
2665 default: type=
"r";
break;
2666 case ReadBlobMode: type=
"r";
break;
2667 case ReadBinaryBlobMode: type=
"rb";
break;
2668 case WriteBlobMode: type=
"w";
break;
2669 case WriteBinaryBlobMode: type=
"w+b";
break;
2670 case AppendBlobMode: type=
"a";
break;
2671 case AppendBinaryBlobMode: type=
"a+b";
break;
2674 blob_info->synchronize=image_info->synchronize;
2675 if (image_info->stream != (StreamHandler) NULL)
2677 blob_info->stream=(StreamHandler) image_info->stream;
2680 blob_info->type=FifoStream;
2688 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2689 rights=ReadPolicyRights;
2691 rights=WritePolicyRights;
2692 if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse)
2695 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
2696 "NotAuthorized",
"`%s'",filename);
2697 return(MagickFalse);
2699 if ((LocaleCompare(filename,
"-") == 0) ||
2700 ((*filename ==
'\0') && (image_info->file == (FILE *) NULL)))
2702 blob_info->file_info.file=(*type ==
'r') ? stdin : stdout;
2703 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2704 if (strchr(type,
'b') != (
char *) NULL)
2705 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2707 blob_info->type=StandardStream;
2708 blob_info->exempt=MagickTrue;
2709 return(SetStreamBuffering(image_info,image));
2711 if ((LocaleNCompare(filename,
"fd:",3) == 0) &&
2712 (IsGeometry(filename+3) != MagickFalse))
2715 fileMode[MagickPathExtent];
2719 blob_info->file_info.file=fdopen(StringToLong(filename+3),fileMode);
2720 if (blob_info->file_info.file == (FILE *) NULL)
2722 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2723 return(MagickFalse);
2725 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2726 if (strchr(type,
'b') != (
char *) NULL)
2727 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2729 blob_info->type=FileStream;
2730 blob_info->exempt=MagickTrue;
2731 return(SetStreamBuffering(image_info,image));
2733 #if defined(MAGICKCORE_HAVE_POPEN) && defined(MAGICKCORE_PIPES_SUPPORT)
2734 if (*filename ==
'|')
2737 fileMode[MagickPathExtent],
2743 #if defined(SIGPIPE)
2745 (void) signal(SIGPIPE,SIG_IGN);
2749 sanitize_command=SanitizeString(filename+1);
2750 blob_info->file_info.file=(FILE *) popen_utf8(sanitize_command,
2752 sanitize_command=DestroyString(sanitize_command);
2753 if (blob_info->file_info.file == (FILE *) NULL)
2755 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2756 return(MagickFalse);
2758 blob_info->type=PipeStream;
2759 blob_info->exempt=MagickTrue;
2760 return(SetStreamBuffering(image_info,image));
2763 status=GetPathAttributes(filename,&blob_info->properties);
2764 #if defined(S_ISFIFO)
2765 if ((status != MagickFalse) && S_ISFIFO(blob_info->properties.st_mode))
2767 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2768 if (blob_info->file_info.file == (FILE *) NULL)
2770 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2771 return(MagickFalse);
2773 blob_info->type=FileStream;
2774 blob_info->exempt=MagickTrue;
2775 return(SetStreamBuffering(image_info,image));
2778 GetPathComponent(image->filename,ExtensionPath,extension);
2781 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2782 if ((image_info->adjoin == MagickFalse) ||
2783 (strchr(filename,
'%') != (
char *) NULL))
2788 (void) InterpretImageFilename(image_info,image,image->filename,(
int)
2789 image->scene,filename);
2790 if ((LocaleCompare(filename,image->filename) == 0) &&
2791 ((GetPreviousImageInList(image) != (
Image *) NULL) ||
2792 (GetNextImageInList(image) != (
Image *) NULL)))
2795 path[MagickPathExtent];
2797 GetPathComponent(image->filename,RootPath,path);
2798 if (*extension ==
'\0')
2799 (void) FormatLocaleString(filename,MagickPathExtent,
"%s-%.20g",
2800 path,(
double) image->scene);
2802 (
void) FormatLocaleString(filename,MagickPathExtent,
2803 "%s-%.20g.%s",path,(
double) image->scene,extension);
2805 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2806 #if defined(macintosh)
2807 SetApplicationType(filename,image_info->magick,
'8BIM');
2811 if (image_info->file != (FILE *) NULL)
2813 blob_info->file_info.file=image_info->file;
2814 blob_info->type=FileStream;
2815 blob_info->exempt=MagickTrue;
2820 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2821 if (blob_info->file_info.file != (FILE *) NULL)
2829 blob_info->type=FileStream;
2830 (void) fstat(fileno(blob_info->file_info.file),
2831 &blob_info->properties);
2832 (void) SetStreamBuffering(image_info,image);
2833 (void) memset(magick,0,
sizeof(magick));
2834 count=fread(magick,1,
sizeof(magick),blob_info->file_info.file);
2835 (void) fseek(blob_info->file_info.file,-((off_t) count),SEEK_CUR);
2836 #if defined(MAGICKCORE_POSIX_SUPPORT)
2837 (void) fflush(blob_info->file_info.file);
2839 (void) LogMagickEvent(BlobEvent,GetMagickModule(),
2840 " read %.20g magic header bytes",(double) count);
2841 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2842 if (((
int) magick[0] == 0x1F) && ((
int) magick[1] == 0x8B) &&
2843 ((
int) magick[2] == 0x08))
2846 gzfile = gzopen_utf8(filename,
"rb");
2848 if (gzfile != (gzFile) NULL)
2850 if (blob_info->file_info.file != (FILE *) NULL)
2851 (void) fclose(blob_info->file_info.file);
2852 blob_info->file_info.file=(FILE *) NULL;
2853 blob_info->file_info.gzfile=gzfile;
2854 blob_info->type=ZipStream;
2858 #if defined(MAGICKCORE_BZLIB_DELEGATE)
2859 if (strncmp((
char *) magick,
"BZh",3) == 0)
2862 *bzfile = BZ2_bzopen(filename,
"r");
2864 if (bzfile != (BZFILE *) NULL)
2866 if (blob_info->file_info.file != (FILE *) NULL)
2867 (void) fclose(blob_info->file_info.file);
2868 blob_info->file_info.file=(FILE *) NULL;
2869 blob_info->file_info.bzfile=bzfile;
2870 blob_info->type=BZipStream;
2874 if (blob_info->type == FileStream)
2885 sans_exception=AcquireExceptionInfo();
2886 magick_info=GetMagickInfo(image_info->magick,sans_exception);
2887 sans_exception=DestroyExceptionInfo(sans_exception);
2888 length=(size_t) blob_info->properties.st_size;
2889 if ((magick_info != (
const MagickInfo *) NULL) &&
2890 (GetMagickBlobSupport(magick_info) != MagickFalse) &&
2891 (length > MagickMaxBufferExtent) &&
2892 (AcquireMagickResource(MapResource,length) != MagickFalse))
2897 blob=MapBlob(fileno(blob_info->file_info.file),ReadMode,0,
2899 if (blob == (
void *) NULL)
2900 RelinquishMagickResource(MapResource,length);
2906 if (image_info->file != (FILE *) NULL)
2907 blob_info->exempt=MagickFalse;
2910 (void) fclose(blob_info->file_info.file);
2911 blob_info->file_info.file=(FILE *) NULL;
2913 AttachBlob(blob_info,blob,length);
2914 blob_info->mapped=MagickTrue;
2921 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2922 if ((LocaleCompare(extension,
"Z") == 0) ||
2923 (LocaleCompare(extension,
"gz") == 0) ||
2924 (LocaleCompare(extension,
"wmz") == 0) ||
2925 (LocaleCompare(extension,
"svgz") == 0))
2927 blob_info->file_info.gzfile=gzopen_utf8(filename,
"wb");
2928 if (blob_info->file_info.gzfile != (gzFile) NULL)
2929 blob_info->type=ZipStream;
2933 #if defined(MAGICKCORE_BZLIB_DELEGATE)
2934 if (LocaleCompare(extension,
"bz2") == 0)
2936 if (mode == WriteBinaryBlobMode)
2938 blob_info->file_info.bzfile=BZ2_bzopen(filename,
"w");
2939 if (blob_info->file_info.bzfile != (BZFILE *) NULL)
2940 blob_info->type=BZipStream;
2945 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2946 if (blob_info->file_info.file != (FILE *) NULL)
2948 blob_info->type=FileStream;
2949 (void) SetStreamBuffering(image_info,image);
2952 blob_info->status=MagickFalse;
2953 blob_info->error_number=0;
2954 if (blob_info->type != UndefinedStream)
2955 blob_info->size=GetBlobSize(image);
2958 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2959 return(MagickFalse);
2998 #if defined(__cplusplus) || defined(c_plusplus)
3002 static size_t PingStream(
const Image *magick_unused(image),
3003 const void *magick_unused(pixels),
const size_t columns)
3005 magick_unreferenced(image);
3006 magick_unreferenced(pixels);
3011 #if defined(__cplusplus) || defined(c_plusplus)
3015 MagickExport
Image *PingBlob(
const ImageInfo *image_info,
const void *blob,
3031 assert(image_info != (
ImageInfo *) NULL);
3032 assert(image_info->signature == MagickCoreSignature);
3034 if (IsEventLogging() != MagickFalse)
3035 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
3036 image_info->filename);
3037 if ((blob == (
const void *) NULL) || (length == 0))
3039 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
3040 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
3041 return((
Image *) NULL);
3043 ping_info=CloneImageInfo(image_info);
3044 ping_info->blob=(
void *) blob;
3045 ping_info->length=length;
3046 ping_info->ping=MagickTrue;
3047 if (*ping_info->magick ==
'\0')
3048 (void) SetImageInfo(ping_info,0,exception);
3049 magick_info=GetMagickInfo(ping_info->magick,exception);
3050 if (magick_info == (
const MagickInfo *) NULL)
3052 (void) ThrowMagickException(exception,GetMagickModule(),
3053 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
3055 ping_info=DestroyImageInfo(ping_info);
3056 return((
Image *) NULL);
3058 if (GetMagickBlobSupport(magick_info) != MagickFalse)
3061 filename[MagickPathExtent];
3066 (void) CopyMagickString(filename,ping_info->filename,MagickPathExtent);
3067 (void) FormatLocaleString(ping_info->filename,MagickPathExtent,
"%s:%s",
3068 ping_info->magick,filename);
3069 image=ReadStream(ping_info,&PingStream,exception);
3070 if (image != (
Image *) NULL)
3071 (void) DetachBlob(image->blob);
3072 ping_info=DestroyImageInfo(ping_info);
3078 ping_info->blob=(
void *) NULL;
3079 ping_info->length=0;
3080 *ping_info->filename=
'\0';
3081 status=BlobToFile(ping_info->filename,blob,length,exception);
3082 if (status == MagickFalse)
3084 (void) RelinquishUniqueFileResource(ping_info->filename);
3085 ping_info=DestroyImageInfo(ping_info);
3086 return((
Image *) NULL);
3088 clone_info=CloneImageInfo(ping_info);
3089 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
3090 ping_info->magick,ping_info->filename);
3091 image=ReadStream(clone_info,&PingStream,exception);
3092 if (image != (
Image *) NULL)
3100 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
3102 (void) CopyMagickString(images->filename,image_info->filename,
3104 (void) CopyMagickString(images->magick_filename,image_info->filename,
3106 (void) CopyMagickString(images->magick,magick_info->name,
3108 images=GetNextImageInList(images);
3111 clone_info=DestroyImageInfo(clone_info);
3112 (void) RelinquishUniqueFileResource(ping_info->filename);
3113 ping_info=DestroyImageInfo(ping_info);
3148 MagickExport ssize_t ReadBlob(
Image *image,
const size_t length,
3149 unsigned char *data)
3152 *magick_restrict blob_info;
3163 assert(image != (
Image *) NULL);
3164 assert(image->signature == MagickCoreSignature);
3165 assert(image->blob != (
BlobInfo *) NULL);
3166 assert(image->blob->type != UndefinedStream);
3169 assert(data != (
void *) NULL);
3170 blob_info=image->blob;
3173 switch (blob_info->type)
3175 case UndefinedStream:
3177 case StandardStream:
3185 count=(ssize_t) fread(q,1,length,blob_info->file_info.file);
3190 c=getc(blob_info->file_info.file);
3193 *q++=(
unsigned char) c;
3198 c=getc(blob_info->file_info.file);
3201 *q++=(
unsigned char) c;
3206 c=getc(blob_info->file_info.file);
3209 *q++=(
unsigned char) c;
3214 c=getc(blob_info->file_info.file);
3217 *q++=(
unsigned char) c;
3223 if ((count != (ssize_t) length) &&
3224 (ferror(blob_info->file_info.file) != 0))
3225 ThrowBlobException(blob_info);
3230 #if defined(MAGICKCORE_ZLIB_DELEGATE)
3241 for (i=0; i < (ssize_t) length; i+=count)
3243 count=(ssize_t) gzread(blob_info->file_info.gzfile,q+i,
3244 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3257 c=gzgetc(blob_info->file_info.gzfile);
3260 *q++=(
unsigned char) c;
3265 c=gzgetc(blob_info->file_info.gzfile);
3268 *q++=(
unsigned char) c;
3273 c=gzgetc(blob_info->file_info.gzfile);
3276 *q++=(
unsigned char) c;
3281 c=gzgetc(blob_info->file_info.gzfile);
3284 *q++=(
unsigned char) c;
3291 (void) gzerror(blob_info->file_info.gzfile,&status);
3292 if ((count != (ssize_t) length) && (status != Z_OK))
3293 ThrowBlobException(blob_info);
3294 if (blob_info->eof == MagickFalse)
3295 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
3302 #if defined(MAGICKCORE_BZLIB_DELEGATE)
3309 for (i=0; i < (ssize_t) length; i+=count)
3311 count=(ssize_t) BZ2_bzread(blob_info->file_info.bzfile,q+i,
3312 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3322 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
3323 if ((count != (ssize_t) length) && (status != BZ_OK))
3324 ThrowBlobException(blob_info);
3335 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3337 blob_info->eof=MagickTrue;
3340 p=blob_info->data+blob_info->offset;
3341 count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
3342 blob_info->length-blob_info->offset);
3343 blob_info->offset+=count;
3344 if (count != (ssize_t) length)
3345 blob_info->eof=MagickTrue;
3346 (
void) memcpy(q,p,(
size_t) count);
3375 MagickExport
int ReadBlobByte(
Image *image)
3378 *magick_restrict blob_info;
3386 assert(image != (
Image *) NULL);
3387 assert(image->signature == MagickCoreSignature);
3388 assert(image->blob != (
BlobInfo *) NULL);
3389 assert(image->blob->type != UndefinedStream);
3390 blob_info=image->blob;
3391 switch (blob_info->type)
3393 case StandardStream:
3400 p=(
const unsigned char *) buffer;
3401 c=getc(blob_info->file_info.file);
3404 *buffer=(
unsigned char) c;
3412 p=(
const unsigned char *) ReadBlobStream(image,1,buffer,&count);
3444 MagickExport
double ReadBlobDouble(
Image *image)
3455 quantum.double_value=0.0;
3456 quantum.unsigned_value=ReadBlobLongLong(image);
3457 return(quantum.double_value);
3483 MagickExport
float ReadBlobFloat(
Image *image)
3494 quantum.float_value=0.0;
3495 quantum.unsigned_value=ReadBlobLong(image);
3496 return(quantum.float_value);
3522 MagickExport
unsigned int ReadBlobLong(
Image *image)
3536 assert(image != (
Image *) NULL);
3537 assert(image->signature == MagickCoreSignature);
3539 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3542 if (image->endian == LSBEndian)
3544 value=(
unsigned int) (*p++);
3545 value|=(
unsigned int) (*p++) << 8;
3546 value|=(
unsigned int) (*p++) << 16;
3547 value|=(
unsigned int) (*p++) << 24;
3550 value=(
unsigned int) (*p++) << 24;
3551 value|=(
unsigned int) (*p++) << 16;
3552 value|=(
unsigned int) (*p++) << 8;
3553 value|=(
unsigned int) (*p++);
3580 MagickExport MagickSizeType ReadBlobLongLong(
Image *image)
3594 assert(image != (
Image *) NULL);
3595 assert(image->signature == MagickCoreSignature);
3597 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3599 return(MagickULLConstant(0));
3600 if (image->endian == LSBEndian)
3602 value=(MagickSizeType) (*p++);
3603 value|=(MagickSizeType) (*p++) << 8;
3604 value|=(MagickSizeType) (*p++) << 16;
3605 value|=(MagickSizeType) (*p++) << 24;
3606 value|=(MagickSizeType) (*p++) << 32;
3607 value|=(MagickSizeType) (*p++) << 40;
3608 value|=(MagickSizeType) (*p++) << 48;
3609 value|=(MagickSizeType) (*p++) << 56;
3612 value=(MagickSizeType) (*p++) << 56;
3613 value|=(MagickSizeType) (*p++) << 48;
3614 value|=(MagickSizeType) (*p++) << 40;
3615 value|=(MagickSizeType) (*p++) << 32;
3616 value|=(MagickSizeType) (*p++) << 24;
3617 value|=(MagickSizeType) (*p++) << 16;
3618 value|=(MagickSizeType) (*p++) << 8;
3619 value|=(MagickSizeType) (*p++);
3646 MagickExport
unsigned short ReadBlobShort(
Image *image)
3660 assert(image != (
Image *) NULL);
3661 assert(image->signature == MagickCoreSignature);
3663 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3665 return((
unsigned short) 0U);
3666 if (image->endian == LSBEndian)
3668 value=(
unsigned short) (*p++);
3669 value|=(
unsigned short) (*p++) << 8;
3672 value=(
unsigned short) ((
unsigned short) (*p++) << 8);
3673 value|=(
unsigned short) (*p++);
3700 MagickExport
unsigned int ReadBlobLSBLong(
Image *image)
3714 assert(image != (
Image *) NULL);
3715 assert(image->signature == MagickCoreSignature);
3717 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3720 value=(
unsigned int) (*p++);
3721 value|=(
unsigned int) (*p++) << 8;
3722 value|=(
unsigned int) (*p++) << 16;
3723 value|=(
unsigned int) (*p++) << 24;
3750 MagickExport
signed int ReadBlobLSBSignedLong(
Image *image)
3761 quantum.unsigned_value=ReadBlobLSBLong(image);
3762 return(quantum.signed_value);
3788 MagickExport
unsigned short ReadBlobLSBShort(
Image *image)
3802 assert(image != (
Image *) NULL);
3803 assert(image->signature == MagickCoreSignature);
3805 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3807 return((
unsigned short) 0U);
3808 value=(
unsigned short) (*p++);
3809 value|=(
unsigned short) (*p++) << 8;
3836 MagickExport
signed short ReadBlobLSBSignedShort(
Image *image)
3847 quantum.unsigned_value=ReadBlobLSBShort(image);
3848 return(quantum.signed_value);
3874 MagickExport
unsigned int ReadBlobMSBLong(
Image *image)
3888 assert(image != (
Image *) NULL);
3889 assert(image->signature == MagickCoreSignature);
3891 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3894 value=(
unsigned int) (*p++) << 24;
3895 value|=(
unsigned int) (*p++) << 16;
3896 value|=(
unsigned int) (*p++) << 8;
3897 value|=(
unsigned int) (*p++);
3924 MagickExport MagickSizeType ReadBlobMSBLongLong(
Image *image)
3938 assert(image != (
Image *) NULL);
3939 assert(image->signature == MagickCoreSignature);
3941 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3943 return(MagickULLConstant(0));
3944 value=(MagickSizeType) (*p++) << 56;
3945 value|=(MagickSizeType) (*p++) << 48;
3946 value|=(MagickSizeType) (*p++) << 40;
3947 value|=(MagickSizeType) (*p++) << 32;
3948 value|=(MagickSizeType) (*p++) << 24;
3949 value|=(MagickSizeType) (*p++) << 16;
3950 value|=(MagickSizeType) (*p++) << 8;
3951 value|=(MagickSizeType) (*p++);
3978 MagickExport
unsigned short ReadBlobMSBShort(
Image *image)
3992 assert(image != (
Image *) NULL);
3993 assert(image->signature == MagickCoreSignature);
3995 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3997 return((
unsigned short) 0U);
3998 value=(
unsigned short) ((*p++) << 8);
3999 value|=(
unsigned short) (*p++);
4026 MagickExport
signed int ReadBlobMSBSignedLong(
Image *image)
4037 quantum.unsigned_value=ReadBlobMSBLong(image);
4038 return(quantum.signed_value);
4064 MagickExport
signed short ReadBlobMSBSignedShort(
Image *image)
4075 quantum.unsigned_value=ReadBlobMSBShort(image);
4076 return(quantum.signed_value);
4102 MagickExport
signed int ReadBlobSignedLong(
Image *image)
4113 quantum.unsigned_value=ReadBlobLong(image);
4114 return(quantum.signed_value);
4140 MagickExport
signed short ReadBlobSignedShort(
Image *image)
4151 quantum.unsigned_value=ReadBlobShort(image);
4152 return(quantum.signed_value);
4190 MagickExport magick_hot_spot
const void *ReadBlobStream(
Image *image,
4191 const size_t length,
void *magick_restrict data,ssize_t *count)
4194 *magick_restrict blob_info;
4196 assert(image != (
Image *) NULL);
4197 assert(image->signature == MagickCoreSignature);
4198 assert(image->blob != (
BlobInfo *) NULL);
4199 assert(image->blob->type != UndefinedStream);
4200 assert(count != (ssize_t *) NULL);
4201 blob_info=image->blob;
4202 if (blob_info->type != BlobStream)
4204 assert(data != NULL);
4205 *count=ReadBlob(image,length,(
unsigned char *) data);
4208 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
4211 blob_info->eof=MagickTrue;
4214 data=blob_info->data+blob_info->offset;
4215 *count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
4216 blob_info->length-blob_info->offset);
4217 blob_info->offset+=(*count);
4218 if (*count != (ssize_t) length)
4219 blob_info->eof=MagickTrue;
4248 MagickExport
char *ReadBlobString(
Image *image,
char *
string)
4256 assert(image != (
Image *) NULL);
4257 assert(image->signature == MagickCoreSignature);
4258 for (i=0; i < (MagickPathExtent-1L); i++)
4260 c=ReadBlobByte(image);
4264 return((
char *) NULL);
4270 if ((i > 0) && (
string[i-1] ==
'\r'))
4305 assert(blob->signature == MagickCoreSignature);
4306 if (IsEventLogging() != MagickFalse)
4307 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4308 LockSemaphoreInfo(blob->semaphore);
4309 blob->reference_count++;
4310 UnlockSemaphoreInfo(blob->semaphore);
4347 MagickExport MagickOffsetType SeekBlob(
Image *image,
4348 const MagickOffsetType offset,
const int whence)
4351 *magick_restrict blob_info;
4353 assert(image != (
Image *) NULL);
4354 assert(image->signature == MagickCoreSignature);
4355 assert(image->blob != (
BlobInfo *) NULL);
4356 assert(image->blob->type != UndefinedStream);
4357 if (IsEventLogging() != MagickFalse)
4358 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4359 blob_info=image->blob;
4360 switch (blob_info->type)
4362 case UndefinedStream:
4364 case StandardStream:
4369 if ((offset < 0) && (whence == SEEK_SET))
4371 if (fseek(blob_info->file_info.file,offset,whence) < 0)
4373 blob_info->offset=TellBlob(image);
4378 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4379 if (gzseek(blob_info->file_info.gzfile,offset,whence) < 0)
4382 blob_info->offset=TellBlob(image);
4398 blob_info->offset=offset;
4403 if (((offset > 0) && (blob_info->offset > (MAGICK_SSIZE_MAX-offset))) ||
4404 ((offset < 0) && (blob_info->offset < (MAGICK_SSIZE_MIN-offset))))
4409 if ((blob_info->offset+offset) < 0)
4411 blob_info->offset+=offset;
4416 if (((MagickOffsetType) blob_info->length+offset) < 0)
4418 blob_info->offset=blob_info->length+offset;
4422 if (blob_info->offset < (MagickOffsetType) ((off_t) blob_info->length))
4424 blob_info->eof=MagickFalse;
4427 if (blob_info->offset >= (MagickOffsetType) ((off_t) blob_info->extent))
4432 return(blob_info->offset);
4460 MagickExport
void SetBlobExempt(
Image *image,
const MagickBooleanType exempt)
4462 assert(image != (
const Image *) NULL);
4463 assert(image->signature == MagickCoreSignature);
4464 if (IsEventLogging() != MagickFalse)
4465 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4466 image->blob->exempt=exempt;
4495 MagickExport MagickBooleanType SetBlobExtent(
Image *image,
4496 const MagickSizeType extent)
4499 *magick_restrict blob_info;
4501 assert(image != (
Image *) NULL);
4502 assert(image->signature == MagickCoreSignature);
4503 assert(image->blob != (
BlobInfo *) NULL);
4504 assert(image->blob->type != UndefinedStream);
4505 if (IsEventLogging() != MagickFalse)
4506 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4507 blob_info=image->blob;
4508 switch (blob_info->type)
4510 case UndefinedStream:
4512 case StandardStream:
4513 return(MagickFalse);
4522 if (extent != (MagickSizeType) ((off_t) extent))
4523 return(MagickFalse);
4524 offset=SeekBlob(image,0,SEEK_END);
4526 return(MagickFalse);
4527 if ((MagickSizeType) offset >= extent)
4529 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4532 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4533 blob_info->file_info.file);
4534 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4535 if (blob_info->synchronize != MagickFalse)
4540 file=fileno(blob_info->file_info.file);
4541 if ((file == -1) || (offset < 0))
4542 return(MagickFalse);
4543 (void) posix_fallocate(file,offset,extent-offset);
4546 offset=SeekBlob(image,offset,SEEK_SET);
4548 return(MagickFalse);
4553 return(MagickFalse);
4555 return(MagickFalse);
4557 return(MagickFalse);
4560 if (extent != (MagickSizeType) ((
size_t) extent))
4561 return(MagickFalse);
4562 if (blob_info->mapped != MagickFalse)
4570 (void) UnmapBlob(blob_info->data,blob_info->length);
4571 RelinquishMagickResource(MapResource,blob_info->length);
4572 if (extent != (MagickSizeType) ((off_t) extent))
4573 return(MagickFalse);
4574 offset=SeekBlob(image,0,SEEK_END);
4576 return(MagickFalse);
4577 if ((MagickSizeType) offset >= extent)
4579 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4580 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4581 blob_info->file_info.file);
4582 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4583 if (blob_info->synchronize != MagickFalse)
4588 file=fileno(blob_info->file_info.file);
4589 if ((file == -1) || (offset < 0))
4590 return(MagickFalse);
4591 (void) posix_fallocate(file,offset,extent-offset);
4594 offset=SeekBlob(image,offset,SEEK_SET);
4596 return(MagickFalse);
4597 (void) AcquireMagickResource(MapResource,extent);
4598 blob_info->data=(
unsigned char*) MapBlob(fileno(
4599 blob_info->file_info.file),WriteMode,0,(size_t) extent);
4600 blob_info->extent=(size_t) extent;
4601 blob_info->length=(size_t) extent;
4602 (void) SyncBlob(image);
4605 blob_info->extent=(size_t) extent;
4606 blob_info->data=(
unsigned char *) ResizeQuantumMemory(blob_info->data,
4607 blob_info->extent+1,
sizeof(*blob_info->data));
4608 (void) SyncBlob(image);
4609 if (blob_info->data == (
unsigned char *) NULL)
4611 (void) DetachBlob(blob_info);
4612 return(MagickFalse);
4643 static int SyncBlob(
Image *image)
4646 *magick_restrict blob_info;
4651 assert(image != (
Image *) NULL);
4652 assert(image->signature == MagickCoreSignature);
4653 assert(image->blob != (
BlobInfo *) NULL);
4654 assert(image->blob->type != UndefinedStream);
4655 if (IsEventLogging() != MagickFalse)
4656 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4657 blob_info=image->blob;
4659 switch (blob_info->type)
4661 case UndefinedStream:
4662 case StandardStream:
4667 status=fflush(blob_info->file_info.file);
4672 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4673 status=gzflush(blob_info->file_info.gzfile,Z_SYNC_FLUSH);
4679 #if defined(MAGICKCORE_BZLIB_DELEGATE)
4680 status=BZ2_bzflush(blob_info->file_info.bzfile);
4714 MagickExport MagickOffsetType TellBlob(
const Image *image)
4717 *magick_restrict blob_info;
4722 assert(image != (
Image *) NULL);
4723 assert(image->signature == MagickCoreSignature);
4724 assert(image->blob != (
BlobInfo *) NULL);
4725 assert(image->blob->type != UndefinedStream);
4726 if (IsEventLogging() != MagickFalse)
4727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4728 blob_info=image->blob;
4730 switch (blob_info->type)
4732 case UndefinedStream:
4733 case StandardStream:
4737 offset=ftell(blob_info->file_info.file);
4744 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4745 offset=(MagickOffsetType) gztell(blob_info->file_info.gzfile);
4755 offset=blob_info->offset;
4787 MagickExport MagickBooleanType UnmapBlob(
void *map,
const size_t length)
4789 #if defined(MAGICKCORE_HAVE_MMAP)
4793 status=munmap(map,length);
4794 return(status == -1 ? MagickFalse : MagickTrue);
4798 return(MagickFalse);
4831 MagickExport ssize_t WriteBlob(
Image *image,
const size_t length,
4832 const unsigned char *data)
4835 *magick_restrict blob_info;
4849 assert(image != (
Image *) NULL);
4850 assert(image->signature == MagickCoreSignature);
4851 assert(image->blob != (
BlobInfo *) NULL);
4852 assert(image->blob->type != UndefinedStream);
4855 assert(data != (
const unsigned char *) NULL);
4856 blob_info=image->blob;
4858 p=(
const unsigned char *) data;
4859 q=(
unsigned char *) data;
4860 switch (blob_info->type)
4862 case UndefinedStream:
4864 case StandardStream:
4872 count=(ssize_t) fwrite((
const char *) data,1,length,
4873 blob_info->file_info.file);
4878 c=putc((
int) *p++,blob_info->file_info.file);
4885 c=putc((
int) *p++,blob_info->file_info.file);
4892 c=putc((
int) *p++,blob_info->file_info.file);
4899 c=putc((
int) *p++,blob_info->file_info.file);
4907 if ((count != (ssize_t) length) &&
4908 (ferror(blob_info->file_info.file) != 0))
4909 ThrowBlobException(blob_info);
4914 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4925 for (i=0; i < (ssize_t) length; i+=count)
4927 count=(ssize_t) gzwrite(blob_info->file_info.gzfile,q+i,
4928 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
4941 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
4948 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
4955 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
4962 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
4971 (void) gzerror(blob_info->file_info.gzfile,&status);
4972 if ((count != (ssize_t) length) && (status != Z_OK))
4973 ThrowBlobException(blob_info);
4979 #if defined(MAGICKCORE_BZLIB_DELEGATE)
4986 for (i=0; i < (ssize_t) length; i+=count)
4988 count=(ssize_t) BZ2_bzwrite(blob_info->file_info.bzfile,q+i,
4989 (
int) MagickMin(length-i,MagickMaxBufferExtent));
4999 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
5000 if ((count != (ssize_t) length) && (status != BZ_OK))
5001 ThrowBlobException(blob_info);
5007 count=(ssize_t) blob_info->stream(image,data,length);
5012 if ((blob_info->offset+(MagickOffsetType) length) >=
5013 (MagickOffsetType) blob_info->extent)
5015 if (blob_info->mapped != MagickFalse)
5017 blob_info->extent+=length+blob_info->quantum;
5018 blob_info->quantum<<=1;
5019 blob_info->data=(
unsigned char *) ResizeQuantumMemory(
5020 blob_info->data,blob_info->extent+1,
sizeof(*blob_info->data));
5021 (void) SyncBlob(image);
5022 if (blob_info->data == (
unsigned char *) NULL)
5024 (void) DetachBlob(blob_info);
5028 q=blob_info->data+blob_info->offset;
5029 (void) memcpy(q,p,length);
5030 blob_info->offset+=length;
5031 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
5032 blob_info->length=(
size_t) blob_info->offset;
5033 count=(ssize_t) length;
5036 if (count != (ssize_t) length)
5037 ThrowBlobException(blob_info);
5066 MagickExport ssize_t WriteBlobByte(
Image *image,
const unsigned char value)
5069 *magick_restrict blob_info;
5074 assert(image != (
Image *) NULL);
5075 assert(image->signature == MagickCoreSignature);
5076 assert(image->blob != (
BlobInfo *) NULL);
5077 assert(image->blob->type != UndefinedStream);
5078 blob_info=image->blob;
5080 switch (blob_info->type)
5082 case StandardStream:
5089 c=putc((
int) value,blob_info->file_info.file);
5092 if (ferror(blob_info->file_info.file) != 0)
5093 ThrowBlobException(blob_info);
5101 count=WriteBlobStream(image,1,&value);
5133 MagickExport ssize_t WriteBlobFloat(
Image *image,
const float value)
5144 quantum.unsigned_value=0U;
5145 quantum.float_value=value;
5146 return(WriteBlobLong(image,quantum.unsigned_value));
5174 MagickExport ssize_t WriteBlobLong(
Image *image,
const unsigned int value)
5179 assert(image != (
Image *) NULL);
5180 assert(image->signature == MagickCoreSignature);
5181 if (image->endian == LSBEndian)
5183 buffer[0]=(
unsigned char) value;
5184 buffer[1]=(
unsigned char) (value >> 8);
5185 buffer[2]=(
unsigned char) (value >> 16);
5186 buffer[3]=(
unsigned char) (value >> 24);
5187 return(WriteBlobStream(image,4,buffer));
5189 buffer[0]=(
unsigned char) (value >> 24);
5190 buffer[1]=(
unsigned char) (value >> 16);
5191 buffer[2]=(
unsigned char) (value >> 8);
5192 buffer[3]=(
unsigned char) value;
5193 return(WriteBlobStream(image,4,buffer));
5221 MagickExport ssize_t WriteBlobShort(
Image *image,
const unsigned short value)
5226 assert(image != (
Image *) NULL);
5227 assert(image->signature == MagickCoreSignature);
5228 if (image->endian == LSBEndian)
5230 buffer[0]=(
unsigned char) value;
5231 buffer[1]=(
unsigned char) (value >> 8);
5232 return(WriteBlobStream(image,2,buffer));
5234 buffer[0]=(
unsigned char) (value >> 8);
5235 buffer[1]=(
unsigned char) value;
5236 return(WriteBlobStream(image,2,buffer));
5264 MagickExport ssize_t WriteBlobLSBLong(
Image *image,
const unsigned int value)
5269 assert(image != (
Image *) NULL);
5270 assert(image->signature == MagickCoreSignature);
5271 buffer[0]=(
unsigned char) value;
5272 buffer[1]=(
unsigned char) (value >> 8);
5273 buffer[2]=(
unsigned char) (value >> 16);
5274 buffer[3]=(
unsigned char) (value >> 24);
5275 return(WriteBlobStream(image,4,buffer));
5303 MagickExport ssize_t WriteBlobLSBShort(
Image *image,
const unsigned short value)
5308 assert(image != (
Image *) NULL);
5309 assert(image->signature == MagickCoreSignature);
5310 buffer[0]=(
unsigned char) value;
5311 buffer[1]=(
unsigned char) (value >> 8);
5312 return(WriteBlobStream(image,2,buffer));
5340 MagickExport ssize_t WriteBlobLSBSignedLong(
Image *image,
const signed int value)
5354 assert(image != (
Image *) NULL);
5355 assert(image->signature == MagickCoreSignature);
5356 quantum.signed_value=value;
5357 buffer[0]=(
unsigned char) quantum.unsigned_value;
5358 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5359 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 16);
5360 buffer[3]=(
unsigned char) (quantum.unsigned_value >> 24);
5361 return(WriteBlobStream(image,4,buffer));
5389 MagickExport ssize_t WriteBlobLSBSignedShort(
Image *image,
5390 const signed short value)
5404 assert(image != (
Image *) NULL);
5405 assert(image->signature == MagickCoreSignature);
5406 quantum.signed_value=value;
5407 buffer[0]=(
unsigned char) quantum.unsigned_value;
5408 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5409 return(WriteBlobStream(image,2,buffer));
5437 MagickExport ssize_t WriteBlobMSBLong(
Image *image,
const unsigned int value)
5442 assert(image != (
Image *) NULL);
5443 assert(image->signature == MagickCoreSignature);
5444 buffer[0]=(
unsigned char) (value >> 24);
5445 buffer[1]=(
unsigned char) (value >> 16);
5446 buffer[2]=(
unsigned char) (value >> 8);
5447 buffer[3]=(
unsigned char) value;
5448 return(WriteBlobStream(image,4,buffer));
5476 MagickExport ssize_t WriteBlobMSBLongLong(
Image *image,
5477 const MagickSizeType value)
5482 assert(image != (
Image *) NULL);
5483 assert(image->signature == MagickCoreSignature);
5484 buffer[0]=(
unsigned char) (value >> 56);
5485 buffer[1]=(
unsigned char) (value >> 48);
5486 buffer[2]=(
unsigned char) (value >> 40);
5487 buffer[3]=(
unsigned char) (value >> 32);
5488 buffer[4]=(
unsigned char) (value >> 24);
5489 buffer[5]=(
unsigned char) (value >> 16);
5490 buffer[6]=(
unsigned char) (value >> 8);
5491 buffer[7]=(
unsigned char) value;
5492 return(WriteBlobStream(image,8,buffer));
5520 MagickExport ssize_t WriteBlobMSBShort(
Image *image,
const unsigned short value)
5525 assert(image != (
Image *) NULL);
5526 assert(image->signature == MagickCoreSignature);
5527 buffer[0]=(
unsigned char) (value >> 8);
5528 buffer[1]=(
unsigned char) value;
5529 return(WriteBlobStream(image,2,buffer));
5557 MagickExport ssize_t WriteBlobMSBSignedLong(
Image *image,
const signed int value)
5571 assert(image != (
Image *) NULL);
5572 assert(image->signature == MagickCoreSignature);
5573 quantum.signed_value=value;
5574 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 24);
5575 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 16);
5576 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 8);
5577 buffer[3]=(
unsigned char) quantum.unsigned_value;
5578 return(WriteBlobStream(image,4,buffer));
5606 MagickExport ssize_t WriteBlobMSBSignedShort(
Image *image,
5607 const signed short value)
5621 assert(image != (
Image *) NULL);
5622 assert(image->signature == MagickCoreSignature);
5623 quantum.signed_value=value;
5624 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 8);
5625 buffer[1]=(
unsigned char) quantum.unsigned_value;
5626 return(WriteBlobStream(image,2,buffer));
5654 MagickExport ssize_t WriteBlobString(
Image *image,
const char *
string)
5656 assert(image != (
Image *) NULL);
5657 assert(image->signature == MagickCoreSignature);
5658 assert(
string != (
const char *) NULL);
5659 return(WriteBlobStream(image,strlen(
string),(
const unsigned char *)
string));