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)
179 SyncBlob(
const Image *);
208MagickExport
void AttachBlob(
BlobInfo *blob_info,
const void *blob,
211 assert(blob_info != (
BlobInfo *) NULL);
212 if (IsEventLogging() != MagickFalse)
213 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
214 blob_info->length=length;
215 blob_info->extent=length;
216 blob_info->quantum=(size_t) MagickMaxBlobExtent;
218 blob_info->type=BlobStream;
219 blob_info->file_info.file=(FILE *) NULL;
220 blob_info->data=(
unsigned char *) blob;
221 blob_info->mapped=MagickFalse;
254MagickExport MagickBooleanType BlobToFile(
char *filename,
const void *blob,
266 assert(filename != (
const char *) NULL);
267 assert(blob != (
const void *) NULL);
268 if (IsEventLogging() != MagickFalse)
269 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
270 if (*filename ==
'\0')
271 file=AcquireUniqueFileResource(filename);
273 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
276 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
279 for (i=0; i < length; i+=(size_t) count)
281 count=write(file,(
const char *) blob+i,MagickMin(length-i,(
size_t)
282 MagickMaxBufferExtent));
291 if ((file == -1) || (i < length))
293 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
330MagickExport
Image *BlobToImage(
const ImageInfo *image_info,
const void *blob,
346 assert(image_info != (
ImageInfo *) NULL);
347 assert(image_info->signature == MagickCoreSignature);
349 if (IsEventLogging() != MagickFalse)
350 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
351 image_info->filename);
352 if ((blob == (
const void *) NULL) || (length == 0))
354 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
355 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
356 return((
Image *) NULL);
358 blob_info=CloneImageInfo(image_info);
359 blob_info->blob=(
void *) blob;
360 blob_info->length=length;
361 if (*blob_info->magick ==
'\0')
362 (void) SetImageInfo(blob_info,0,exception);
363 magick_info=GetMagickInfo(blob_info->magick,exception);
366 (void) ThrowMagickException(exception,GetMagickModule(),
367 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
369 blob_info=DestroyImageInfo(blob_info);
370 return((
Image *) NULL);
372 if (GetMagickBlobSupport(magick_info) != MagickFalse)
375 filename[MagickPathExtent];
380 (void) CopyMagickString(filename,blob_info->filename,MagickPathExtent);
381 (void) FormatLocaleString(blob_info->filename,MagickPathExtent,
"%s:%s",
382 blob_info->magick,filename);
383 image=ReadImage(blob_info,exception);
384 if (image != (
Image *) NULL)
385 (void) DetachBlob(image->blob);
386 blob_info=DestroyImageInfo(blob_info);
392 blob_info->blob=(
void *) NULL;
394 *blob_info->filename=
'\0';
395 status=BlobToFile(blob_info->filename,blob,length,exception);
396 if (status == MagickFalse)
398 (void) RelinquishUniqueFileResource(blob_info->filename);
399 blob_info=DestroyImageInfo(blob_info);
400 return((
Image *) NULL);
402 clone_info=CloneImageInfo(blob_info);
403 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
404 blob_info->magick,blob_info->filename);
405 image=ReadImage(clone_info,exception);
406 if (image != (
Image *) NULL)
414 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
416 (void) CopyMagickString(images->filename,image_info->filename,
418 (void) CopyMagickString(images->magick_filename,image_info->filename,
420 (void) CopyMagickString(images->magick,magick_info->name,
422 images=GetNextImageInList(images);
425 clone_info=DestroyImageInfo(clone_info);
426 (void) RelinquishUniqueFileResource(blob_info->filename);
427 blob_info=DestroyImageInfo(blob_info);
462 clone_info=(
BlobInfo *) AcquireCriticalMemory(
sizeof(*clone_info));
463 GetBlobInfo(clone_info);
466 semaphore=clone_info->semaphore;
467 (void) memcpy(clone_info,blob_info,
sizeof(*clone_info));
468 if (blob_info->mapped != MagickFalse)
469 (void) AcquireMagickResource(MapResource,blob_info->length);
470 clone_info->semaphore=semaphore;
471 LockSemaphoreInfo(clone_info->semaphore);
472 clone_info->reference_count=1;
473 UnlockSemaphoreInfo(clone_info->semaphore);
500static inline void ThrowBlobException(
BlobInfo *blob_info)
502 if ((blob_info->status == 0) && (errno != 0))
503 blob_info->error_number=errno;
504 blob_info->status=(-1);
507MagickExport MagickBooleanType CloseBlob(
Image *image)
510 *magick_restrict blob_info;
518 assert(image != (
Image *) NULL);
519 assert(image->signature == MagickCoreSignature);
520 if (IsEventLogging() != MagickFalse)
521 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
522 blob_info=image->blob;
523 if ((blob_info == (
BlobInfo *) NULL) || (blob_info->type == UndefinedStream))
525 (void) SyncBlob(image);
526 status=blob_info->status;
527 switch (blob_info->type)
529 case UndefinedStream:
535 if (blob_info->synchronize != MagickFalse)
537 status=fflush(blob_info->file_info.file);
539 ThrowBlobException(blob_info);
540 status=fsync(fileno(blob_info->file_info.file));
542 ThrowBlobException(blob_info);
544 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
545 ThrowBlobException(blob_info);
550#if defined(MAGICKCORE_ZLIB_DELEGATE)
552 (void) gzerror(blob_info->file_info.gzfile,&status);
554 ThrowBlobException(blob_info);
560#if defined(MAGICKCORE_BZLIB_DELEGATE)
562 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
564 ThrowBlobException(blob_info);
572 if (blob_info->file_info.file != (FILE *) NULL)
574 if (blob_info->synchronize != MagickFalse)
576 status=fflush(blob_info->file_info.file);
578 ThrowBlobException(blob_info);
579 status=fsync(fileno(blob_info->file_info.file));
581 ThrowBlobException(blob_info);
583 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
584 ThrowBlobException(blob_info);
589 blob_info->size=GetBlobSize(image);
590 image->extent=blob_info->size;
591 blob_info->eof=MagickFalse;
593 blob_info->mode=UndefinedBlobMode;
594 if (blob_info->exempt != MagickFalse)
596 blob_info->type=UndefinedStream;
597 return(blob_info->status != 0 ? MagickFalse : MagickTrue);
599 switch (blob_info->type)
601 case UndefinedStream:
606 if (blob_info->file_info.file != (FILE *) NULL)
608 status=fclose(blob_info->file_info.file);
610 ThrowBlobException(blob_info);
616#if defined(MAGICKCORE_HAVE_PCLOSE)
617 status=pclose(blob_info->file_info.file);
619 ThrowBlobException(blob_info);
625#if defined(MAGICKCORE_ZLIB_DELEGATE)
626 status=gzclose(blob_info->file_info.gzfile);
628 ThrowBlobException(blob_info);
634#if defined(MAGICKCORE_BZLIB_DELEGATE)
635 BZ2_bzclose(blob_info->file_info.bzfile);
643 if (blob_info->file_info.file != (FILE *) NULL)
645 status=fclose(blob_info->file_info.file);
647 ThrowBlobException(blob_info);
652 (void) DetachBlob(blob_info);
653 return(blob_info->status != 0 ? MagickFalse : MagickTrue);
678MagickExport
void DestroyBlob(
Image *image)
681 *magick_restrict blob_info;
686 assert(image != (
Image *) NULL);
687 assert(image->signature == MagickCoreSignature);
688 assert(image->blob != (
BlobInfo *) NULL);
689 assert(image->blob->signature == MagickCoreSignature);
690 if (IsEventLogging() != MagickFalse)
691 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
692 blob_info=image->blob;
694 LockSemaphoreInfo(blob_info->semaphore);
695 blob_info->reference_count--;
696 assert(blob_info->reference_count >= 0);
697 if (blob_info->reference_count == 0)
699 UnlockSemaphoreInfo(blob_info->semaphore);
700 if (destroy == MagickFalse)
705 (void) CloseBlob(image);
706 if (blob_info->mapped != MagickFalse)
708 (void) UnmapBlob(blob_info->data,blob_info->length);
709 RelinquishMagickResource(MapResource,blob_info->length);
712 DestroySemaphoreInfo(&blob_info->semaphore);
713 blob_info->signature=(~MagickCoreSignature);
714 image->blob=(
BlobInfo *) RelinquishMagickMemory(blob_info);
739MagickExport
unsigned char *DetachBlob(
BlobInfo *blob_info)
744 assert(blob_info != (
BlobInfo *) NULL);
745 if (IsEventLogging() != MagickFalse)
746 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
747 if (blob_info->mapped != MagickFalse)
749 (void) UnmapBlob(blob_info->data,blob_info->length);
750 blob_info->data=NULL;
751 RelinquishMagickResource(MapResource,blob_info->length);
753 blob_info->mapped=MagickFalse;
756 blob_info->mode=UndefinedBlobMode;
757 blob_info->eof=MagickFalse;
759 blob_info->exempt=MagickFalse;
760 blob_info->type=UndefinedStream;
761 blob_info->file_info.file=(FILE *) NULL;
762 data=blob_info->data;
763 blob_info->data=(
unsigned char *) NULL;
764 blob_info->stream=(StreamHandler) NULL;
792MagickPrivate
void DisassociateBlob(
Image *image)
795 *magick_restrict blob_info,
801 assert(image != (
Image *) NULL);
802 assert(image->signature == MagickCoreSignature);
803 assert(image->blob != (
BlobInfo *) NULL);
804 assert(image->blob->signature == MagickCoreSignature);
805 if (IsEventLogging() != MagickFalse)
806 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
807 blob_info=image->blob;
809 LockSemaphoreInfo(blob_info->semaphore);
810 assert(blob_info->reference_count >= 0);
811 if (blob_info->reference_count > 1)
813 UnlockSemaphoreInfo(blob_info->semaphore);
814 if (clone == MagickFalse)
816 clone_info=CloneBlobInfo(blob_info);
818 image->blob=clone_info;
846MagickExport MagickBooleanType DiscardBlobBytes(
Image *image,
847 const MagickSizeType length)
859 buffer[MagickMinBufferExtent >> 1];
861 assert(image != (
Image *) NULL);
862 assert(image->signature == MagickCoreSignature);
863 if (length != (MagickSizeType) ((MagickOffsetType) length))
866 for (i=0; i < length; i+=(MagickSizeType) count)
868 quantum=(size_t) MagickMin(length-i,
sizeof(buffer));
869 (void) ReadBlobStream(image,quantum,buffer,&count);
877 return(i < (MagickSizeType) length ? MagickFalse : MagickTrue);
904MagickExport
void DuplicateBlob(
Image *image,
const Image *duplicate)
906 assert(image != (
Image *) NULL);
907 assert(image->signature == MagickCoreSignature);
908 assert(duplicate != (
Image *) NULL);
909 assert(duplicate->signature == MagickCoreSignature);
910 if (IsEventLogging() != MagickFalse)
911 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
913 image->blob=ReferenceBlob(duplicate->blob);
939MagickExport
int EOFBlob(
const Image *image)
942 *magick_restrict blob_info;
944 assert(image != (
Image *) NULL);
945 assert(image->signature == MagickCoreSignature);
946 assert(image->blob != (
BlobInfo *) NULL);
947 assert(image->blob->type != UndefinedStream);
948 if (IsEventLogging() != MagickFalse)
949 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
950 blob_info=image->blob;
951 switch (blob_info->type)
953 case UndefinedStream:
959 blob_info->eof=feof(blob_info->file_info.file) != 0 ? MagickTrue :
965#if defined(MAGICKCORE_ZLIB_DELEGATE)
966 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
973#if defined(MAGICKCORE_BZLIB_DELEGATE)
978 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
979 blob_info->eof=status == BZ_UNEXPECTED_EOF ? MagickTrue : MagickFalse;
985 blob_info->eof=MagickFalse;
991 return((
int) blob_info->eof);
1017MagickExport
int ErrorBlob(
const Image *image)
1020 *magick_restrict blob_info;
1022 assert(image != (
Image *) NULL);
1023 assert(image->signature == MagickCoreSignature);
1024 assert(image->blob != (
BlobInfo *) NULL);
1025 assert(image->blob->type != UndefinedStream);
1026 if (IsEventLogging() != MagickFalse)
1027 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1028 blob_info=image->blob;
1029 switch (blob_info->type)
1031 case UndefinedStream:
1032 case StandardStream:
1037 blob_info->error=ferror(blob_info->file_info.file);
1042#if defined(MAGICKCORE_ZLIB_DELEGATE)
1043 (void) gzerror(blob_info->file_info.gzfile,&blob_info->error);
1049#if defined(MAGICKCORE_BZLIB_DELEGATE)
1050 (void) BZ2_bzerror(blob_info->file_info.bzfile,&blob_info->error);
1062 return(blob_info->error);
1100MagickExport
unsigned char *FileToBlob(
const char *filename,
const size_t extent,
1127 assert(filename != (
const char *) NULL);
1129 assert(exception->signature == MagickCoreSignature);
1130 if (IsEventLogging() != MagickFalse)
1131 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1133 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
1134 if (status == MagickFalse)
1137 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
1138 "NotAuthorized",
"`%s'",filename);
1142 if (LocaleCompare(filename,
"-") != 0)
1144 status=GetPathAttributes(filename,&attributes);
1145 if ((status == MagickFalse) || (S_ISDIR(attributes.st_mode) != 0))
1147 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1150 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1154 ThrowFileException(exception,BlobError,
"UnableToOpenFile",filename);
1155 return((
unsigned char *) NULL);
1157 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
1159 if ((file == fileno(stdin)) || (offset < 0) ||
1160 (offset != (MagickOffsetType) ((ssize_t) offset)))
1171 offset=(MagickOffsetType) lseek(file,0,SEEK_SET);
1172 quantum=(size_t) MagickMaxBufferExtent;
1173 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1174 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1175 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1176 for (i=0; blob != (
unsigned char *) NULL; i+=count)
1178 count=read(file,blob+i,quantum);
1185 if (~((
size_t) i) < (count+quantum+1))
1187 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1190 blob=(
unsigned char *) ResizeQuantumMemory(blob,i+count+quantum+1,
1192 if ((
size_t) (i+count) >= extent)
1195 if (LocaleCompare(filename,
"-") != 0)
1197 if (blob == (
unsigned char *) NULL)
1199 (void) ThrowMagickException(exception,GetMagickModule(),
1200 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1201 return((
unsigned char *) NULL);
1205 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1206 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1207 return((
unsigned char *) NULL);
1209 *length=(size_t) MagickMin(i+count,extent);
1213 *length=(size_t) MagickMin(offset,(MagickOffsetType)
1214 MagickMin(extent,(
size_t) MAGICK_SSIZE_MAX));
1215 blob=(
unsigned char *) NULL;
1216 if (~(*length) >= (MagickPathExtent-1))
1217 blob=(
unsigned char *) AcquireQuantumMemory(*length+MagickPathExtent,
1219 if (blob == (
unsigned char *) NULL)
1222 (void) ThrowMagickException(exception,GetMagickModule(),
1223 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1224 return((
unsigned char *) NULL);
1226 map=MapBlob(file,ReadMode,0,*length);
1227 if (map != (
unsigned char *) NULL)
1229 (void) memcpy(blob,map,*length);
1230 (void) UnmapBlob(map,*length);
1234 (void) lseek(file,0,SEEK_SET);
1235 for (i=0; i < *length; i+=count)
1237 count=read(file,blob+i,(
size_t) MagickMin(*length-i,(
size_t)
1238 MagickMaxBufferExtent));
1249 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1250 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1251 return((
unsigned char *) NULL);
1255 if (LocaleCompare(filename,
"-") != 0)
1259 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1260 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1290static inline ssize_t WriteBlobStream(
Image *image,
const size_t length,
1291 const unsigned char *magick_restrict data)
1294 *magick_restrict blob_info;
1302 assert(image->blob != (
BlobInfo *) NULL);
1303 assert(image->blob->type != UndefinedStream);
1304 assert(data != (
void *) NULL);
1305 blob_info=image->blob;
1306 if (blob_info->type != BlobStream)
1307 return(WriteBlob(image,length,data));
1308 extent=(MagickSizeType) (blob_info->offset+(MagickOffsetType) length);
1309 if (extent >= blob_info->extent)
1311 extent=blob_info->extent+blob_info->quantum+length;
1312 blob_info->quantum<<=1;
1313 if (SetBlobExtent(image,extent) == MagickFalse)
1316 q=blob_info->data+blob_info->offset;
1317 (void) memcpy(q,data,length);
1318 blob_info->offset+=length;
1319 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
1320 blob_info->length=(size_t) blob_info->offset;
1321 return((ssize_t) length);
1324MagickExport MagickBooleanType FileToImage(
Image *image,
const char *filename)
1345 assert(image != (
const Image *) NULL);
1346 assert(image->signature == MagickCoreSignature);
1347 assert(filename != (
const char *) NULL);
1348 if (IsEventLogging() != MagickFalse)
1349 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1350 status=IsRightsAuthorized(PathPolicyDomain,WritePolicyRights,filename);
1351 if (status == MagickFalse)
1354 (void) ThrowMagickException(&image->exception,GetMagickModule(),
1355 PolicyError,
"NotAuthorized",
"`%s'",filename);
1356 return(MagickFalse);
1359 if (LocaleCompare(filename,
"-") != 0)
1360 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1363 ThrowFileException(&image->exception,BlobError,
"UnableToOpenBlob",
1365 return(MagickFalse);
1367 quantum=(size_t) MagickMaxBufferExtent;
1368 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1369 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1370 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1371 if (blob == (
unsigned char *) NULL)
1374 ThrowFileException(&image->exception,ResourceLimitError,
1375 "MemoryAllocationFailed",filename);
1376 return(MagickFalse);
1380 count=read(file,blob,quantum);
1387 length=(size_t) count;
1388 count=WriteBlobStream(image,length,blob);
1389 if (count != (ssize_t) length)
1391 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1398 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1400 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1427MagickExport MagickBooleanType GetBlobError(
const Image *image)
1429 assert(image != (
const Image *) NULL);
1430 assert(image->signature == MagickCoreSignature);
1431 if (IsEventLogging() != MagickFalse)
1432 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1433 if ((image->blob->status != 0) && (image->blob->error_number != 0))
1434 errno=image->blob->error_number;
1435 return(image->blob->status == 0 ? MagickFalse : MagickTrue);
1460MagickExport FILE *GetBlobFileHandle(
const Image *image)
1462 assert(image != (
const Image *) NULL);
1463 assert(image->signature == MagickCoreSignature);
1464 return(image->blob->file_info.file);
1489MagickExport
void GetBlobInfo(
BlobInfo *blob_info)
1491 assert(blob_info != (
BlobInfo *) NULL);
1492 (void) memset(blob_info,0,
sizeof(*blob_info));
1493 blob_info->type=UndefinedStream;
1494 blob_info->quantum=(size_t) MagickMaxBlobExtent;
1495 blob_info->properties.st_mtime=GetMagickTime();
1496 blob_info->properties.st_ctime=blob_info->properties.st_mtime;
1497 blob_info->debug=GetLogEventMask() & BlobEvent ? MagickTrue : MagickFalse;
1498 blob_info->reference_count=1;
1499 blob_info->semaphore=AllocateSemaphoreInfo();
1500 blob_info->signature=MagickCoreSignature;
1525MagickExport
const struct stat *GetBlobProperties(
const Image *image)
1527 assert(image != (
Image *) NULL);
1528 assert(image->signature == MagickCoreSignature);
1529 if (IsEventLogging() != MagickFalse)
1530 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1531 return(&image->blob->properties);
1557MagickExport MagickSizeType GetBlobSize(
const Image *image)
1560 *magick_restrict blob_info;
1565 assert(image != (
Image *) NULL);
1566 assert(image->signature == MagickCoreSignature);
1567 assert(image->blob != (
BlobInfo *) NULL);
1568 if (IsEventLogging() != MagickFalse)
1569 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1570 blob_info=image->blob;
1572 switch (blob_info->type)
1574 case UndefinedStream:
1575 case StandardStream:
1577 extent=blob_info->size;
1585 extent=(MagickSizeType) blob_info->properties.st_size;
1587 extent=blob_info->size;
1588 file_descriptor=fileno(blob_info->file_info.file);
1589 if (file_descriptor == -1)
1591 if (fstat(file_descriptor,&blob_info->properties) == 0)
1592 extent=(MagickSizeType) blob_info->properties.st_size;
1597 extent=blob_info->size;
1606 status=GetPathAttributes(image->filename,&blob_info->properties);
1607 if (status != MagickFalse)
1608 extent=(MagickSizeType) blob_info->properties.st_size;
1615 extent=(MagickSizeType) blob_info->length;
1644MagickExport
unsigned char *GetBlobStreamData(
const Image *image)
1646 assert(image != (
const Image *) NULL);
1647 assert(image->signature == MagickCoreSignature);
1648 return(image->blob->data);
1673MagickExport StreamHandler GetBlobStreamHandler(
const Image *image)
1675 assert(image != (
const Image *) NULL);
1676 assert(image->signature == MagickCoreSignature);
1677 if (IsEventLogging() != MagickFalse)
1678 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1679 return(image->blob->stream);
1715MagickExport
unsigned char *ImageToBlob(
const ImageInfo *image_info,
1730 assert(image_info != (
const ImageInfo *) NULL);
1731 assert(image_info->signature == MagickCoreSignature);
1732 assert(image != (
Image *) NULL);
1733 assert(image->signature == MagickCoreSignature);
1735 assert(exception->signature == MagickCoreSignature);
1736 if (IsEventLogging() != MagickFalse)
1737 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1738 image_info->filename);
1740 blob=(
unsigned char *) NULL;
1741 blob_info=CloneImageInfo(image_info);
1742 blob_info->adjoin=MagickFalse;
1743 (void) SetImageInfo(blob_info,1,exception);
1744 if (*blob_info->magick !=
'\0')
1745 (void) CopyMagickString(image->magick,blob_info->magick,MagickPathExtent);
1746 magick_info=GetMagickInfo(image->magick,exception);
1747 if (magick_info == (
const MagickInfo *) NULL)
1749 (void) ThrowMagickException(exception,GetMagickModule(),
1750 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
1752 blob_info=DestroyImageInfo(blob_info);
1755 (void) CopyMagickString(blob_info->magick,image->magick,MagickPathExtent);
1756 if (GetMagickBlobSupport(magick_info) != MagickFalse)
1761 blob_info->length=0;
1762 blob_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent,
1763 sizeof(
unsigned char));
1764 if (blob_info->blob == NULL)
1765 (void) ThrowMagickException(exception,GetMagickModule(),
1766 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",image->filename);
1769 (void) CloseBlob(image);
1770 image->blob->exempt=MagickTrue;
1771 *image->filename=
'\0';
1772 status=WriteImage(blob_info,image);
1773 InheritException(exception,&image->exception);
1774 *length=image->blob->length;
1775 blob=DetachBlob(image->blob);
1776 if (blob != (
void *) NULL)
1778 if (status == MagickFalse)
1779 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1781 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
1782 sizeof(
unsigned char));
1784 else if (status == MagickFalse)
1785 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
1791 unique[MagickPathExtent];
1799 file=AcquireUniqueFileResource(unique);
1802 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",
1803 image_info->filename);
1807 blob_info->file=fdopen(file,
"wb");
1808 if (blob_info->file != (FILE *) NULL)
1810 (void) FormatLocaleString(image->filename,MagickPathExtent,
1811 "%s:%s",image->magick,unique);
1812 status=WriteImage(blob_info,image);
1813 (void) fclose(blob_info->file);
1814 if (status == MagickFalse)
1815 InheritException(exception,&image->exception);
1817 blob=FileToBlob(unique,SIZE_MAX,length,exception);
1819 (void) RelinquishUniqueFileResource(unique);
1822 blob_info=DestroyImageInfo(blob_info);
1854MagickExport MagickBooleanType ImageToFile(
Image *image,
char *filename,
1879 assert(image != (
Image *) NULL);
1880 assert(image->signature == MagickCoreSignature);
1881 assert(image->blob != (
BlobInfo *) NULL);
1882 assert(image->blob->type != UndefinedStream);
1883 assert(filename != (
const char *) NULL);
1884 if (IsEventLogging() != MagickFalse)
1885 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1886 if (*filename ==
'\0')
1887 file=AcquireUniqueFileResource(filename);
1889 if (LocaleCompare(filename,
"-") == 0)
1890 file=fileno(stdout);
1892 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
1895 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1896 return(MagickFalse);
1898 quantum=(size_t) MagickMaxBufferExtent;
1899 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1900 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1901 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
1902 if (buffer == (
unsigned char *) NULL)
1905 (void) ThrowMagickException(exception,GetMagickModule(),
1906 ResourceLimitError,
"MemoryAllocationError",
"`%s'",filename);
1907 return(MagickFalse);
1910 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1911 for (i=0; count > 0; )
1913 length=(size_t) count;
1914 for (i=0; i < length; i+=count)
1916 count=write(file,p+i,(
size_t) (length-i));
1926 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1928 if (LocaleCompare(filename,
"-") != 0)
1930 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
1931 if ((file == -1) || (i < length))
1935 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1936 return(MagickFalse);
1976MagickExport
unsigned char *ImagesToBlob(
const ImageInfo *image_info,
1991 assert(image_info != (
const ImageInfo *) NULL);
1992 assert(image_info->signature == MagickCoreSignature);
1993 assert(images != (
Image *) NULL);
1994 assert(images->signature == MagickCoreSignature);
1996 if (IsEventLogging() != MagickFalse)
1997 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1998 image_info->filename);
2000 blob=(
unsigned char *) NULL;
2001 blob_info=CloneImageInfo(image_info);
2002 (void) SetImageInfo(blob_info,(
unsigned int) GetImageListLength(images),
2004 if (*blob_info->magick !=
'\0')
2005 (void) CopyMagickString(images->magick,blob_info->magick,MagickPathExtent);
2006 magick_info=GetMagickInfo(images->magick,exception);
2007 if (magick_info == (
const MagickInfo *) NULL)
2009 (void) ThrowMagickException(exception,GetMagickModule(),
2010 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
2012 blob_info=DestroyImageInfo(blob_info);
2015 if (GetMagickAdjoin(magick_info) == MagickFalse)
2017 blob_info=DestroyImageInfo(blob_info);
2018 return(ImageToBlob(image_info,images,length,exception));
2020 (void) CopyMagickString(blob_info->magick,images->magick,MagickPathExtent);
2021 if (GetMagickBlobSupport(magick_info) != MagickFalse)
2026 blob_info->length=0;
2027 blob_info->blob=(
void *) AcquireQuantumMemory(MagickMaxBlobExtent,
2028 sizeof(
unsigned char));
2029 if (blob_info->blob == (
void *) NULL)
2030 (void) ThrowMagickException(exception,GetMagickModule(),
2031 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",images->filename);
2034 (void) CloseBlob(images);
2035 images->blob->exempt=MagickTrue;
2036 *images->filename=
'\0';
2037 status=WriteImages(blob_info,images,images->filename,exception);
2038 *length=images->blob->length;
2039 blob=DetachBlob(images->blob);
2040 if (blob != (
void *) NULL)
2042 if (status == MagickFalse)
2043 blob=(
unsigned char *) RelinquishMagickMemory(blob);
2045 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
2046 sizeof(
unsigned char));
2049 if (status == MagickFalse)
2050 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
2056 filename[MagickPathExtent],
2057 unique[MagickPathExtent];
2065 file=AcquireUniqueFileResource(unique);
2068 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",
2069 image_info->filename);
2073 blob_info->file=fdopen(file,
"wb");
2074 if (blob_info->file != (FILE *) NULL)
2076 (void) FormatLocaleString(filename,MagickPathExtent,
"%s:%s",
2077 images->magick,unique);
2078 status=WriteImages(blob_info,images,filename,exception);
2079 (void) fclose(blob_info->file);
2080 if (status == MagickFalse)
2081 InheritException(exception,&images->exception);
2083 blob=FileToBlob(unique,SIZE_MAX,length,exception);
2085 (void) RelinquishUniqueFileResource(unique);
2088 blob_info=DestroyImageInfo(blob_info);
2124MagickExport MagickBooleanType InjectImageBlob(
const ImageInfo *image_info,
2128 filename[MagickPathExtent];
2157 assert(image_info != (
ImageInfo *) NULL);
2158 assert(image_info->signature == MagickCoreSignature);
2159 assert(image != (
Image *) NULL);
2160 assert(image->signature == MagickCoreSignature);
2161 assert(inject_image != (
Image *) NULL);
2162 assert(inject_image->signature == MagickCoreSignature);
2164 if (IsEventLogging() != MagickFalse)
2165 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2166 unique_file=(FILE *) NULL;
2167 file=AcquireUniqueFileResource(filename);
2169 unique_file=fdopen(file,
"wb");
2170 if ((file == -1) || (unique_file == (FILE *) NULL))
2172 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2173 ThrowFileException(exception,FileOpenError,
"UnableToCreateTemporaryFile",
2175 return(MagickFalse);
2177 byte_image=CloneImage(inject_image,0,0,MagickFalse,exception);
2178 if (byte_image == (
Image *) NULL)
2180 (void) fclose(unique_file);
2181 (void) RelinquishUniqueFileResource(filename);
2182 return(MagickFalse);
2184 (void) FormatLocaleString(byte_image->filename,MagickPathExtent,
"%s:%s",
2186 DestroyBlob(byte_image);
2187 byte_image->blob=CloneBlobInfo((
BlobInfo *) NULL);
2188 write_info=CloneImageInfo(image_info);
2189 SetImageInfoFile(write_info,unique_file);
2190 status=WriteImage(write_info,byte_image);
2191 write_info=DestroyImageInfo(write_info);
2192 byte_image=DestroyImage(byte_image);
2193 (void) fclose(unique_file);
2194 if (status == MagickFalse)
2196 (void) RelinquishUniqueFileResource(filename);
2197 return(MagickFalse);
2202 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
2205 (void) RelinquishUniqueFileResource(filename);
2206 ThrowFileException(exception,FileOpenError,
"UnableToOpenFile",
2207 image_info->filename);
2208 return(MagickFalse);
2210 quantum=(size_t) MagickMaxBufferExtent;
2211 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
2212 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
2213 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
2214 if (buffer == (
unsigned char *) NULL)
2216 (void) RelinquishUniqueFileResource(filename);
2218 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2223 ssize_t count = read(file,buffer,quantum);
2230 status=WriteBlobStream(image,(
size_t) count,buffer) == count ? MagickTrue :
2235 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",filename);
2236 (void) RelinquishUniqueFileResource(filename);
2237 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
2263MagickExport MagickBooleanType IsBlobExempt(
const Image *image)
2265 assert(image != (
const Image *) NULL);
2266 assert(image->signature == MagickCoreSignature);
2267 if (IsEventLogging() != MagickFalse)
2268 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2269 return(image->blob->exempt);
2294MagickExport MagickBooleanType IsBlobSeekable(
const Image *image)
2297 *magick_restrict blob_info;
2299 assert(image != (
const Image *) NULL);
2300 assert(image->signature == MagickCoreSignature);
2301 if (IsEventLogging() != MagickFalse)
2302 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2303 blob_info=image->blob;
2304 switch (blob_info->type)
2313 if (blob_info->file_info.file == (FILE *) NULL)
2314 return(MagickFalse);
2315 status=fseek(blob_info->file_info.file,0,SEEK_CUR);
2316 return(status == -1 ? MagickFalse : MagickTrue);
2320#if defined(MAGICKCORE_ZLIB_DELEGATE)
2324 if (blob_info->file_info.gzfile == (gzFile) NULL)
2325 return(MagickFalse);
2326 offset=gzseek(blob_info->file_info.gzfile,0,SEEK_CUR);
2327 return(offset < 0 ? MagickFalse : MagickTrue);
2332 case UndefinedStream:
2336 case StandardStream:
2341 return(MagickFalse);
2366MagickExport MagickBooleanType IsBlobTemporary(
const Image *image)
2368 assert(image != (
const Image *) NULL);
2369 assert(image->signature == MagickCoreSignature);
2370 if (IsEventLogging() != MagickFalse)
2371 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2372 return(image->blob->temporary);
2404MagickExport
unsigned char *MapBlob(
int file,
const MapMode mode,
2405 const MagickOffsetType offset,
const size_t length)
2407#if defined(MAGICKCORE_HAVE_MMAP)
2420#if defined(MAP_ANONYMOUS)
2421 flags|=MAP_ANONYMOUS;
2423 return((
unsigned char *) NULL);
2430 protection=PROT_READ;
2436 protection=PROT_WRITE;
2442 protection=PROT_READ | PROT_WRITE;
2447#if !defined(MAGICKCORE_HAVE_HUGEPAGES) || !defined(MAP_HUGETLB)
2448 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,offset);
2450 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags |
2451 MAP_HUGETLB,file,offset);
2452 if (map == (
unsigned char *) MAP_FAILED)
2453 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,
2456 if (map == (
unsigned char *) MAP_FAILED)
2457 return((
unsigned char *) NULL);
2464 return((
unsigned char *) NULL);
2493MagickExport
void MSBOrderLong(
unsigned char *buffer,
const size_t length)
2502 assert(buffer != (
unsigned char *) NULL);
2509 *buffer++=(
unsigned char) c;
2513 *buffer++=(
unsigned char) c;
2543MagickExport
void MSBOrderShort(
unsigned char *p,
const size_t length)
2551 assert(p != (
unsigned char *) NULL);
2558 *p++=(
unsigned char) c;
2594static inline MagickBooleanType SetStreamBuffering(
const ImageInfo *image_info,
2606 size=MagickMinBufferExtent;
2607 option=GetImageOption(image_info,
"stream:buffer-size");
2608 if (option != (
const char *) NULL)
2609 size=StringToUnsignedLong(option);
2610 status=setvbuf(image->blob->file_info.file,(
char *) NULL,size == 0 ?
2611 _IONBF : _IOFBF,size);
2612 return(status == 0 ? MagickTrue : MagickFalse);
2615#if defined(MAGICKCORE_ZLIB_DELEGATE)
2616static inline gzFile gzopen_utf8(
const char *path,
const char *mode)
2618#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
2619 return(gzopen(path,mode));
2627 path_wide=create_wchar_path(path);
2628 if (path_wide == (
wchar_t *) NULL)
2629 return((gzFile) NULL);
2630 file=gzopen_w(path_wide,mode);
2631 path_wide=(
wchar_t *) RelinquishMagickMemory(path_wide);
2637MagickExport MagickBooleanType OpenBlob(
const ImageInfo *image_info,
2641 *magick_restrict blob_info;
2644 extension[MagickPathExtent],
2645 filename[MagickPathExtent];
2656 assert(image_info != (
ImageInfo *) NULL);
2657 assert(image_info->signature == MagickCoreSignature);
2658 assert(image != (
Image *) NULL);
2659 assert(image->signature == MagickCoreSignature);
2660 if (IsEventLogging() != MagickFalse)
2661 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2662 image_info->filename);
2663 blob_info=image->blob;
2664 if (image_info->blob != (
void *) NULL)
2666 if (image_info->stream != (StreamHandler) NULL)
2667 blob_info->stream=(StreamHandler) image_info->stream;
2668 AttachBlob(blob_info,image_info->blob,image_info->length);
2671 (void) DetachBlob(blob_info);
2672 blob_info->mode=mode;
2675 default: type=
"r";
break;
2676 case ReadBlobMode: type=
"r";
break;
2677 case ReadBinaryBlobMode: type=
"rb";
break;
2678 case WriteBlobMode: type=
"w";
break;
2679 case WriteBinaryBlobMode: type=
"w+b";
break;
2680 case AppendBlobMode: type=
"a";
break;
2681 case AppendBinaryBlobMode: type=
"a+b";
break;
2684 blob_info->synchronize=image_info->synchronize;
2685 if (image_info->stream != (StreamHandler) NULL)
2687 blob_info->stream=(StreamHandler) image_info->stream;
2690 blob_info->type=FifoStream;
2698 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2699 rights=ReadPolicyRights;
2701 rights=WritePolicyRights;
2702 if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse)
2705 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
2706 "NotAuthorized",
"`%s'",filename);
2707 return(MagickFalse);
2709 if ((LocaleCompare(filename,
"-") == 0) ||
2710 ((*filename ==
'\0') && (image_info->file == (FILE *) NULL)))
2712 blob_info->file_info.file=(*type ==
'r') ? stdin : stdout;
2713#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2714 if (strchr(type,
'b') != (
char *) NULL)
2715 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2717 blob_info->type=StandardStream;
2718 blob_info->exempt=MagickTrue;
2719 return(SetStreamBuffering(image_info,image));
2721 if ((LocaleNCompare(filename,
"fd:",3) == 0) &&
2722 (IsGeometry(filename+3) != MagickFalse))
2725 fileMode[MagickPathExtent];
2729 blob_info->file_info.file=fdopen(StringToLong(filename+3),fileMode);
2730 if (blob_info->file_info.file == (FILE *) NULL)
2732 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2733 return(MagickFalse);
2735#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2736 if (strchr(type,
'b') != (
char *) NULL)
2737 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2739 blob_info->type=FileStream;
2740 blob_info->exempt=MagickTrue;
2741 return(SetStreamBuffering(image_info,image));
2743#if defined(MAGICKCORE_HAVE_POPEN) && defined(MAGICKCORE_PIPES_SUPPORT)
2744 if (*filename ==
'|')
2747 fileMode[MagickPathExtent],
2755 (void) signal(SIGPIPE,SIG_IGN);
2759 sanitize_command=SanitizeString(filename+1);
2760 blob_info->file_info.file=(FILE *) popen_utf8(sanitize_command,
2762 sanitize_command=DestroyString(sanitize_command);
2763 if (blob_info->file_info.file == (FILE *) NULL)
2765 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2766 return(MagickFalse);
2768 blob_info->type=PipeStream;
2769 blob_info->exempt=MagickTrue;
2770 return(SetStreamBuffering(image_info,image));
2773 status=GetPathAttributes(filename,&blob_info->properties);
2774#if defined(S_ISFIFO)
2775 if ((status != MagickFalse) && S_ISFIFO(blob_info->properties.st_mode))
2777 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2778 if (blob_info->file_info.file == (FILE *) NULL)
2780 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2781 return(MagickFalse);
2783 blob_info->type=FileStream;
2784 blob_info->exempt=MagickTrue;
2785 return(SetStreamBuffering(image_info,image));
2788 GetPathComponent(image->filename,ExtensionPath,extension);
2791 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2792 if ((image_info->adjoin == MagickFalse) ||
2793 (strchr(filename,
'%') != (
char *) NULL))
2798 (void) InterpretImageFilename(image_info,image,image->filename,(
int)
2799 image->scene,filename);
2800 if ((LocaleCompare(filename,image->filename) == 0) &&
2801 ((GetPreviousImageInList(image) != (
Image *) NULL) ||
2802 (GetNextImageInList(image) != (
Image *) NULL)))
2805 path[MagickPathExtent];
2807 GetPathComponent(image->filename,RootPath,path);
2808 if (*extension ==
'\0')
2809 (void) FormatLocaleString(filename,MagickPathExtent,
"%s-%.20g",
2810 path,(
double) image->scene);
2812 (
void) FormatLocaleString(filename,MagickPathExtent,
2813 "%s-%.20g.%s",path,(
double) image->scene,extension);
2815 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2816#if defined(macintosh)
2817 SetApplicationType(filename,image_info->magick,
'8BIM');
2821 if (image_info->file != (FILE *) NULL)
2823 blob_info->file_info.file=image_info->file;
2824 blob_info->type=FileStream;
2825 blob_info->exempt=MagickTrue;
2830 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2831 if (blob_info->file_info.file != (FILE *) NULL)
2839 blob_info->type=FileStream;
2840 (void) fstat(fileno(blob_info->file_info.file),
2841 &blob_info->properties);
2842 (void) SetStreamBuffering(image_info,image);
2843 (void) memset(magick,0,
sizeof(magick));
2844 count=fread(magick,1,
sizeof(magick),blob_info->file_info.file);
2845 (void) fseek(blob_info->file_info.file,-((off_t) count),SEEK_CUR);
2846#if defined(MAGICKCORE_POSIX_SUPPORT)
2847 (void) fflush(blob_info->file_info.file);
2849 (void) LogMagickEvent(BlobEvent,GetMagickModule(),
2850 " read %.20g magic header bytes",(
double) count);
2851#if defined(MAGICKCORE_ZLIB_DELEGATE)
2852 if (((
int) magick[0] == 0x1F) && ((
int) magick[1] == 0x8B) &&
2853 ((
int) magick[2] == 0x08))
2856 gzfile = gzopen_utf8(filename,
"rb");
2858 if (gzfile != (gzFile) NULL)
2860 if (blob_info->file_info.file != (FILE *) NULL)
2861 (void) fclose(blob_info->file_info.file);
2862 blob_info->file_info.file=(FILE *) NULL;
2863 blob_info->file_info.gzfile=gzfile;
2864 blob_info->type=ZipStream;
2868#if defined(MAGICKCORE_BZLIB_DELEGATE)
2869 if (strncmp((
char *) magick,
"BZh",3) == 0)
2872 *bzfile = BZ2_bzopen(filename,
"r");
2874 if (bzfile != (BZFILE *) NULL)
2876 if (blob_info->file_info.file != (FILE *) NULL)
2877 (void) fclose(blob_info->file_info.file);
2878 blob_info->file_info.file=(FILE *) NULL;
2879 blob_info->file_info.bzfile=bzfile;
2880 blob_info->type=BZipStream;
2884 if (blob_info->type == FileStream)
2895 sans_exception=AcquireExceptionInfo();
2896 magick_info=GetMagickInfo(image_info->magick,sans_exception);
2897 sans_exception=DestroyExceptionInfo(sans_exception);
2898 length=(size_t) blob_info->properties.st_size;
2899 if ((magick_info != (
const MagickInfo *) NULL) &&
2900 (GetMagickBlobSupport(magick_info) != MagickFalse) &&
2901 (length > MagickMaxBufferExtent) &&
2902 (AcquireMagickResource(MapResource,length) != MagickFalse))
2907 blob=MapBlob(fileno(blob_info->file_info.file),ReadMode,0,
2909 if (blob == (
void *) NULL)
2910 RelinquishMagickResource(MapResource,length);
2916 if (image_info->file != (FILE *) NULL)
2917 blob_info->exempt=MagickFalse;
2920 (void) fclose(blob_info->file_info.file);
2921 blob_info->file_info.file=(FILE *) NULL;
2923 AttachBlob(blob_info,blob,length);
2924 blob_info->mapped=MagickTrue;
2931#if defined(MAGICKCORE_ZLIB_DELEGATE)
2932 if ((LocaleCompare(extension,
"gz") == 0) ||
2933 (LocaleCompare(extension,
"wmz") == 0) ||
2934 (LocaleCompare(extension,
"svgz") == 0))
2936 blob_info->file_info.gzfile=gzopen_utf8(filename,
"wb");
2937 if (blob_info->file_info.gzfile != (gzFile) NULL)
2938 blob_info->type=ZipStream;
2942#if defined(MAGICKCORE_BZLIB_DELEGATE)
2943 if (LocaleCompare(extension,
"bz2") == 0)
2945 if (mode == WriteBinaryBlobMode)
2947 blob_info->file_info.bzfile=BZ2_bzopen(filename,
"w");
2948 if (blob_info->file_info.bzfile != (BZFILE *) NULL)
2949 blob_info->type=BZipStream;
2954 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2955 if (blob_info->file_info.file != (FILE *) NULL)
2957 blob_info->type=FileStream;
2958 (void) SetStreamBuffering(image_info,image);
2961 blob_info->status=0;
2962 blob_info->error_number=0;
2963 if (blob_info->type != UndefinedStream)
2964 blob_info->size=GetBlobSize(image);
2967 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2968 return(MagickFalse);
3007#if defined(__cplusplus) || defined(c_plusplus)
3011static size_t PingStream(
const Image *magick_unused(image),
3012 const void *magick_unused(pixels),
const size_t columns)
3014 magick_unreferenced(image);
3015 magick_unreferenced(pixels);
3020#if defined(__cplusplus) || defined(c_plusplus)
3024MagickExport
Image *PingBlob(
const ImageInfo *image_info,
const void *blob,
3040 assert(image_info != (
ImageInfo *) NULL);
3041 assert(image_info->signature == MagickCoreSignature);
3043 if (IsEventLogging() != MagickFalse)
3044 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
3045 image_info->filename);
3046 if ((blob == (
const void *) NULL) || (length == 0))
3048 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
3049 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
3050 return((
Image *) NULL);
3052 ping_info=CloneImageInfo(image_info);
3053 ping_info->blob=(
void *) blob;
3054 ping_info->length=length;
3055 ping_info->ping=MagickTrue;
3056 if (*ping_info->magick ==
'\0')
3057 (void) SetImageInfo(ping_info,0,exception);
3058 magick_info=GetMagickInfo(ping_info->magick,exception);
3059 if (magick_info == (
const MagickInfo *) NULL)
3061 (void) ThrowMagickException(exception,GetMagickModule(),
3062 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
3064 ping_info=DestroyImageInfo(ping_info);
3065 return((
Image *) NULL);
3067 if (GetMagickBlobSupport(magick_info) != MagickFalse)
3070 filename[MagickPathExtent];
3075 (void) CopyMagickString(filename,ping_info->filename,MagickPathExtent);
3076 (void) FormatLocaleString(ping_info->filename,MagickPathExtent,
"%s:%s",
3077 ping_info->magick,filename);
3078 image=ReadStream(ping_info,&PingStream,exception);
3079 if (image != (
Image *) NULL)
3080 (void) DetachBlob(image->blob);
3081 ping_info=DestroyImageInfo(ping_info);
3087 ping_info->blob=(
void *) NULL;
3088 ping_info->length=0;
3089 *ping_info->filename=
'\0';
3090 status=BlobToFile(ping_info->filename,blob,length,exception);
3091 if (status == MagickFalse)
3093 (void) RelinquishUniqueFileResource(ping_info->filename);
3094 ping_info=DestroyImageInfo(ping_info);
3095 return((
Image *) NULL);
3097 clone_info=CloneImageInfo(ping_info);
3098 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
3099 ping_info->magick,ping_info->filename);
3100 image=ReadStream(clone_info,&PingStream,exception);
3101 if (image != (
Image *) NULL)
3109 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
3111 (void) CopyMagickString(images->filename,image_info->filename,
3113 (void) CopyMagickString(images->magick_filename,image_info->filename,
3115 (void) CopyMagickString(images->magick,magick_info->name,
3117 images=GetNextImageInList(images);
3120 clone_info=DestroyImageInfo(clone_info);
3121 (void) RelinquishUniqueFileResource(ping_info->filename);
3122 ping_info=DestroyImageInfo(ping_info);
3157MagickExport ssize_t ReadBlob(
Image *image,
const size_t length,
3158 unsigned char *data)
3161 *magick_restrict blob_info;
3172 assert(image != (
Image *) NULL);
3173 assert(image->signature == MagickCoreSignature);
3174 assert(image->blob != (
BlobInfo *) NULL);
3175 assert(image->blob->type != UndefinedStream);
3178 assert(data != (
void *) NULL);
3179 blob_info=image->blob;
3182 switch (blob_info->type)
3184 case UndefinedStream:
3186 case StandardStream:
3194 count=(ssize_t) fread(q,1,length,blob_info->file_info.file);
3199 c=getc(blob_info->file_info.file);
3202 *q++=(
unsigned char) c;
3208 c=getc(blob_info->file_info.file);
3211 *q++=(
unsigned char) c;
3217 c=getc(blob_info->file_info.file);
3220 *q++=(
unsigned char) c;
3226 c=getc(blob_info->file_info.file);
3229 *q++=(
unsigned char) c;
3236 if ((count != (ssize_t) length) &&
3237 (ferror(blob_info->file_info.file) != 0))
3238 ThrowBlobException(blob_info);
3243#if defined(MAGICKCORE_ZLIB_DELEGATE)
3254 for (i=0; i < (ssize_t) length; i+=count)
3256 count=(ssize_t) gzread(blob_info->file_info.gzfile,q+i,
3257 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3270 c=gzgetc(blob_info->file_info.gzfile);
3273 *q++=(
unsigned char) c;
3279 c=gzgetc(blob_info->file_info.gzfile);
3282 *q++=(
unsigned char) c;
3288 c=gzgetc(blob_info->file_info.gzfile);
3291 *q++=(
unsigned char) c;
3297 c=gzgetc(blob_info->file_info.gzfile);
3300 *q++=(
unsigned char) c;
3308 (void) gzerror(blob_info->file_info.gzfile,&status);
3309 if ((count != (ssize_t) length) && (status != Z_OK))
3310 ThrowBlobException(blob_info);
3311 if (blob_info->eof == MagickFalse)
3312 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
3319#if defined(MAGICKCORE_BZLIB_DELEGATE)
3326 for (i=0; i < (ssize_t) length; i+=count)
3328 count=(ssize_t) BZ2_bzread(blob_info->file_info.bzfile,q+i,
3329 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3339 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
3340 if ((count != (ssize_t) length) && (status != BZ_OK))
3341 ThrowBlobException(blob_info);
3352 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3354 blob_info->eof=MagickTrue;
3357 p=blob_info->data+blob_info->offset;
3358 count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
3359 blob_info->length-blob_info->offset);
3360 blob_info->offset+=count;
3361 if (count != (ssize_t) length)
3362 blob_info->eof=MagickTrue;
3363 (void) memcpy(q,p,(
size_t) count);
3392MagickExport
int ReadBlobByte(
Image *image)
3395 *magick_restrict blob_info;
3400 assert(image != (
Image *) NULL);
3401 assert(image->signature == MagickCoreSignature);
3402 assert(image->blob != (
BlobInfo *) NULL);
3403 assert(image->blob->type != UndefinedStream);
3404 blob_info=image->blob;
3405 switch (blob_info->type)
3407 case StandardStream:
3411 c=getc(blob_info->file_info.file);
3414 if (ferror(blob_info->file_info.file) != 0)
3415 ThrowBlobException(blob_info);
3422 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3424 blob_info->eof=MagickTrue;
3427 c=(int) (*((
unsigned char *) blob_info->data+blob_info->offset));
3428 blob_info->offset++;
3439 count=ReadBlob(image,1,buffer);
3472MagickExport
double ReadBlobDouble(
Image *image)
3483 quantum.double_value=0.0;
3484 quantum.unsigned_value=ReadBlobLongLong(image);
3485 return(quantum.double_value);
3511MagickExport
float ReadBlobFloat(
Image *image)
3522 quantum.float_value=0.0;
3523 quantum.unsigned_value=ReadBlobLong(image);
3524 return(quantum.float_value);
3550MagickExport
unsigned int ReadBlobLong(
Image *image)
3564 assert(image != (
Image *) NULL);
3565 assert(image->signature == MagickCoreSignature);
3567 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3570 if (image->endian == LSBEndian)
3572 value=(
unsigned int) (*p++);
3573 value|=(
unsigned int) (*p++) << 8;
3574 value|=(
unsigned int) (*p++) << 16;
3575 value|=(
unsigned int) (*p++) << 24;
3578 value=(
unsigned int) (*p++) << 24;
3579 value|=(
unsigned int) (*p++) << 16;
3580 value|=(
unsigned int) (*p++) << 8;
3581 value|=(
unsigned int) (*p++);
3608MagickExport MagickSizeType ReadBlobLongLong(
Image *image)
3622 assert(image != (
Image *) NULL);
3623 assert(image->signature == MagickCoreSignature);
3625 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3627 return(MagickULLConstant(0));
3628 if (image->endian == LSBEndian)
3630 value=(MagickSizeType) (*p++);
3631 value|=(MagickSizeType) (*p++) << 8;
3632 value|=(MagickSizeType) (*p++) << 16;
3633 value|=(MagickSizeType) (*p++) << 24;
3634 value|=(MagickSizeType) (*p++) << 32;
3635 value|=(MagickSizeType) (*p++) << 40;
3636 value|=(MagickSizeType) (*p++) << 48;
3637 value|=(MagickSizeType) (*p++) << 56;
3640 value=(MagickSizeType) (*p++) << 56;
3641 value|=(MagickSizeType) (*p++) << 48;
3642 value|=(MagickSizeType) (*p++) << 40;
3643 value|=(MagickSizeType) (*p++) << 32;
3644 value|=(MagickSizeType) (*p++) << 24;
3645 value|=(MagickSizeType) (*p++) << 16;
3646 value|=(MagickSizeType) (*p++) << 8;
3647 value|=(MagickSizeType) (*p++);
3674MagickExport
unsigned short ReadBlobShort(
Image *image)
3688 assert(image != (
Image *) NULL);
3689 assert(image->signature == MagickCoreSignature);
3691 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3693 return((
unsigned short) 0U);
3694 if (image->endian == LSBEndian)
3696 value=(
unsigned short) (*p++);
3697 value|=(
unsigned short) (*p++) << 8;
3700 value=(
unsigned short) ((
unsigned short) (*p++) << 8);
3701 value|=(
unsigned short) (*p++);
3728MagickExport
unsigned int ReadBlobLSBLong(
Image *image)
3742 assert(image != (
Image *) NULL);
3743 assert(image->signature == MagickCoreSignature);
3745 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3748 value=(
unsigned int) (*p++);
3749 value|=(
unsigned int) (*p++) << 8;
3750 value|=(
unsigned int) (*p++) << 16;
3751 value|=(
unsigned int) (*p++) << 24;
3778MagickExport
signed int ReadBlobLSBSignedLong(
Image *image)
3789 quantum.unsigned_value=ReadBlobLSBLong(image);
3790 return(quantum.signed_value);
3816MagickExport
unsigned short ReadBlobLSBShort(
Image *image)
3830 assert(image != (
Image *) NULL);
3831 assert(image->signature == MagickCoreSignature);
3833 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3835 return((
unsigned short) 0U);
3836 value=(
unsigned short) (*p++);
3837 value|=(
unsigned short) (*p++) << 8;
3864MagickExport
signed short ReadBlobLSBSignedShort(
Image *image)
3875 quantum.unsigned_value=ReadBlobLSBShort(image);
3876 return(quantum.signed_value);
3902MagickExport
unsigned int ReadBlobMSBLong(
Image *image)
3916 assert(image != (
Image *) NULL);
3917 assert(image->signature == MagickCoreSignature);
3919 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3922 value=(
unsigned int) (*p++) << 24;
3923 value|=(
unsigned int) (*p++) << 16;
3924 value|=(
unsigned int) (*p++) << 8;
3925 value|=(
unsigned int) (*p++);
3952MagickExport MagickSizeType ReadBlobMSBLongLong(
Image *image)
3966 assert(image != (
Image *) NULL);
3967 assert(image->signature == MagickCoreSignature);
3969 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3971 return(MagickULLConstant(0));
3972 value=(MagickSizeType) (*p++) << 56;
3973 value|=(MagickSizeType) (*p++) << 48;
3974 value|=(MagickSizeType) (*p++) << 40;
3975 value|=(MagickSizeType) (*p++) << 32;
3976 value|=(MagickSizeType) (*p++) << 24;
3977 value|=(MagickSizeType) (*p++) << 16;
3978 value|=(MagickSizeType) (*p++) << 8;
3979 value|=(MagickSizeType) (*p++);
4006MagickExport
unsigned short ReadBlobMSBShort(
Image *image)
4020 assert(image != (
Image *) NULL);
4021 assert(image->signature == MagickCoreSignature);
4023 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
4025 return((
unsigned short) 0U);
4026 value=(
unsigned short) ((*p++) << 8);
4027 value|=(
unsigned short) (*p++);
4054MagickExport
signed int ReadBlobMSBSignedLong(
Image *image)
4065 quantum.unsigned_value=ReadBlobMSBLong(image);
4066 return(quantum.signed_value);
4092MagickExport
signed short ReadBlobMSBSignedShort(
Image *image)
4103 quantum.unsigned_value=ReadBlobMSBShort(image);
4104 return(quantum.signed_value);
4130MagickExport
signed int ReadBlobSignedLong(
Image *image)
4141 quantum.unsigned_value=ReadBlobLong(image);
4142 return(quantum.signed_value);
4168MagickExport
signed short ReadBlobSignedShort(
Image *image)
4179 quantum.unsigned_value=ReadBlobShort(image);
4180 return(quantum.signed_value);
4218MagickExport magick_hot_spot
const void *ReadBlobStream(
Image *image,
4219 const size_t length,
void *magick_restrict data,ssize_t *count)
4222 *magick_restrict blob_info;
4224 assert(image != (
Image *) NULL);
4225 assert(image->signature == MagickCoreSignature);
4226 assert(image->blob != (
BlobInfo *) NULL);
4227 assert(image->blob->type != UndefinedStream);
4228 assert(count != (ssize_t *) NULL);
4229 blob_info=image->blob;
4230 if (blob_info->type != BlobStream)
4232 assert(data != NULL);
4233 *count=ReadBlob(image,length,(
unsigned char *) data);
4236 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
4239 blob_info->eof=MagickTrue;
4242 data=blob_info->data+blob_info->offset;
4243 *count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
4244 blob_info->length-blob_info->offset);
4245 blob_info->offset+=(*count);
4246 if (*count != (ssize_t) length)
4247 blob_info->eof=MagickTrue;
4276MagickExport
char *ReadBlobString(
Image *image,
char *
string)
4279 *magick_restrict blob_info;
4287 assert(image != (
Image *) NULL);
4288 assert(image->signature == MagickCoreSignature);
4289 assert(image->blob != (
BlobInfo *) NULL);
4290 assert(image->blob->type != UndefinedStream);
4291 if (IsEventLogging() != MagickFalse)
4292 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4294 blob_info=image->blob;
4295 switch (blob_info->type)
4297 case UndefinedStream:
4299 case StandardStream:
4302 char *p = fgets(
string,MagickPathExtent,blob_info->file_info.file);
4303 if (p == (
char *) NULL)
4305 if (ferror(blob_info->file_info.file) != 0)
4306 ThrowBlobException(blob_info);
4307 return((
char *) NULL);
4314#if defined(MAGICKCORE_ZLIB_DELEGATE)
4315 char *p = gzgets(blob_info->file_info.gzfile,
string,MagickPathExtent);
4316 if (p == (
char *) NULL)
4319 (void) gzerror(blob_info->file_info.gzfile,&status);
4321 ThrowBlobException(blob_info);
4322 return((
char *) NULL);
4332 c=ReadBlobByte(image);
4335 blob_info->eof=MagickTrue;
4341 }
while (i < (MaxTextExtent-2));
4349 if ((
string[i] ==
'\r') || (
string[i] ==
'\n'))
4352 if ((
string[i-1] ==
'\r') || (
string[i-1] ==
'\n'))
4354 if ((*
string ==
'\0') && (blob_info->eof != MagickFalse))
4355 return((
char *) NULL);
4385 assert(blob->signature == MagickCoreSignature);
4386 if (IsEventLogging() != MagickFalse)
4387 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4388 LockSemaphoreInfo(blob->semaphore);
4389 blob->reference_count++;
4390 UnlockSemaphoreInfo(blob->semaphore);
4427MagickExport MagickOffsetType SeekBlob(
Image *image,
4428 const MagickOffsetType offset,
const int whence)
4431 *magick_restrict blob_info;
4433 assert(image != (
Image *) NULL);
4434 assert(image->signature == MagickCoreSignature);
4435 assert(image->blob != (
BlobInfo *) NULL);
4436 assert(image->blob->type != UndefinedStream);
4437 if (IsEventLogging() != MagickFalse)
4438 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4439 blob_info=image->blob;
4440 switch (blob_info->type)
4442 case UndefinedStream:
4444 case StandardStream:
4449 if ((offset < 0) && (whence == SEEK_SET))
4451 if (fseek(blob_info->file_info.file,offset,whence) < 0)
4453 blob_info->offset=TellBlob(image);
4458#if defined(MAGICKCORE_ZLIB_DELEGATE)
4459 if (gzseek(blob_info->file_info.gzfile,offset,whence) < 0)
4462 blob_info->offset=TellBlob(image);
4478 blob_info->offset=offset;
4483 if (((offset > 0) && (blob_info->offset > (MAGICK_SSIZE_MAX-offset))) ||
4484 ((offset < 0) && (blob_info->offset < (MAGICK_SSIZE_MIN-offset))))
4489 if ((blob_info->offset+offset) < 0)
4491 blob_info->offset+=offset;
4496 if (((MagickOffsetType) blob_info->length+offset) < 0)
4498 blob_info->offset=blob_info->length+offset;
4502 if (blob_info->offset < (MagickOffsetType) ((off_t) blob_info->length))
4504 blob_info->eof=MagickFalse;
4510 return(blob_info->offset);
4538MagickExport
void SetBlobExempt(
Image *image,
const MagickBooleanType exempt)
4540 assert(image != (
const Image *) NULL);
4541 assert(image->signature == MagickCoreSignature);
4542 if (IsEventLogging() != MagickFalse)
4543 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4544 image->blob->exempt=exempt;
4573MagickExport MagickBooleanType SetBlobExtent(
Image *image,
4574 const MagickSizeType extent)
4577 *magick_restrict blob_info;
4579 assert(image != (
Image *) NULL);
4580 assert(image->signature == MagickCoreSignature);
4581 assert(image->blob != (
BlobInfo *) NULL);
4582 assert(image->blob->type != UndefinedStream);
4583 if (IsEventLogging() != MagickFalse)
4584 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4585 blob_info=image->blob;
4586 switch (blob_info->type)
4588 case UndefinedStream:
4590 case StandardStream:
4591 return(MagickFalse);
4600 if (extent != (MagickSizeType) ((off_t) extent))
4601 return(MagickFalse);
4602 offset=SeekBlob(image,0,SEEK_END);
4604 return(MagickFalse);
4605 if ((MagickSizeType) offset >= extent)
4607 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4610 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4611 blob_info->file_info.file);
4612#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4613 if (blob_info->synchronize != MagickFalse)
4618 file=fileno(blob_info->file_info.file);
4619 if ((file == -1) || (offset < 0))
4620 return(MagickFalse);
4621 (void) posix_fallocate(file,offset,extent-offset);
4624 offset=SeekBlob(image,offset,SEEK_SET);
4626 return(MagickFalse);
4631 return(MagickFalse);
4633 return(MagickFalse);
4635 return(MagickFalse);
4638 if (extent != (MagickSizeType) ((
size_t) extent))
4639 return(MagickFalse);
4640 if (blob_info->mapped != MagickFalse)
4648 (void) UnmapBlob(blob_info->data,blob_info->length);
4649 RelinquishMagickResource(MapResource,blob_info->length);
4650 if (extent != (MagickSizeType) ((off_t) extent))
4651 return(MagickFalse);
4652 offset=SeekBlob(image,0,SEEK_END);
4654 return(MagickFalse);
4655 if ((MagickSizeType) offset >= extent)
4657 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4658 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4659 blob_info->file_info.file);
4660#if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4661 if (blob_info->synchronize != MagickFalse)
4666 file=fileno(blob_info->file_info.file);
4667 if ((file == -1) || (offset < 0))
4668 return(MagickFalse);
4669 (void) posix_fallocate(file,offset,extent-offset);
4672 offset=SeekBlob(image,offset,SEEK_SET);
4674 return(MagickFalse);
4675 (void) AcquireMagickResource(MapResource,extent);
4676 blob_info->data=(
unsigned char*) MapBlob(fileno(
4677 blob_info->file_info.file),WriteMode,0,(
size_t) extent);
4678 blob_info->extent=(size_t) extent;
4679 blob_info->length=(size_t) extent;
4680 (void) SyncBlob(image);
4683 blob_info->extent=(size_t) extent;
4684 blob_info->data=(
unsigned char *) ResizeQuantumMemory(blob_info->data,
4685 blob_info->extent+1,
sizeof(*blob_info->data));
4686 (void) SyncBlob(image);
4687 if (blob_info->data == (
unsigned char *) NULL)
4689 (void) DetachBlob(blob_info);
4690 return(MagickFalse);
4722static int SyncBlob(
const Image *image)
4725 *magick_restrict blob_info;
4730 assert(image != (
Image *) NULL);
4731 assert(image->signature == MagickCoreSignature);
4732 assert(image->blob != (
BlobInfo *) NULL);
4733 if (IsEventLogging() != MagickFalse)
4734 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4735 if (EOFBlob(image) != 0)
4737 blob_info=image->blob;
4739 switch (blob_info->type)
4741 case UndefinedStream:
4742 case StandardStream:
4747 status=fflush(blob_info->file_info.file);
4752#if defined(MAGICKCORE_ZLIB_DELEGATE)
4753 (void) gzflush(blob_info->file_info.gzfile,Z_SYNC_FLUSH);
4759#if defined(MAGICKCORE_BZLIB_DELEGATE)
4760 status=BZ2_bzflush(blob_info->file_info.bzfile);
4794MagickExport MagickOffsetType TellBlob(
const Image *image)
4797 *magick_restrict blob_info;
4802 assert(image != (
Image *) NULL);
4803 assert(image->signature == MagickCoreSignature);
4804 assert(image->blob != (
BlobInfo *) NULL);
4805 assert(image->blob->type != UndefinedStream);
4806 if (IsEventLogging() != MagickFalse)
4807 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4808 blob_info=image->blob;
4810 switch (blob_info->type)
4812 case UndefinedStream:
4813 case StandardStream:
4817 offset=ftell(blob_info->file_info.file);
4824#if defined(MAGICKCORE_ZLIB_DELEGATE)
4825 offset=(MagickOffsetType) gztell(blob_info->file_info.gzfile);
4835 offset=blob_info->offset;
4867MagickExport MagickBooleanType UnmapBlob(
void *map,
const size_t length)
4869#if defined(MAGICKCORE_HAVE_MMAP)
4873 status=munmap(map,length);
4874 return(status == -1 ? MagickFalse : MagickTrue);
4878 return(MagickFalse);
4911MagickExport ssize_t WriteBlob(
Image *image,
const size_t length,
4912 const unsigned char *data)
4915 *magick_restrict blob_info;
4929 assert(image != (
Image *) NULL);
4930 assert(image->signature == MagickCoreSignature);
4931 assert(image->blob != (
BlobInfo *) NULL);
4932 assert(image->blob->type != UndefinedStream);
4935 assert(data != (
const unsigned char *) NULL);
4936 blob_info=image->blob;
4938 p=(
const unsigned char *) data;
4939 q=(
unsigned char *) data;
4940 switch (blob_info->type)
4942 case UndefinedStream:
4944 case StandardStream:
4952 count=(ssize_t) fwrite((
const char *) data,1,length,
4953 blob_info->file_info.file);
4958 c=putc((
int) *p++,blob_info->file_info.file);
4966 c=putc((
int) *p++,blob_info->file_info.file);
4974 c=putc((
int) *p++,blob_info->file_info.file);
4982 c=putc((
int) *p++,blob_info->file_info.file);
4991 if ((count != (ssize_t) length) &&
4992 (ferror(blob_info->file_info.file) != 0))
4993 ThrowBlobException(blob_info);
4998#if defined(MAGICKCORE_ZLIB_DELEGATE)
5009 for (i=0; i < (ssize_t) length; i+=count)
5011 count=(ssize_t) gzwrite(blob_info->file_info.gzfile,q+i,
5012 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
5025 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5033 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5041 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5049 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5059 (void) gzerror(blob_info->file_info.gzfile,&status);
5060 if ((count != (ssize_t) length) && (status != Z_OK))
5061 ThrowBlobException(blob_info);
5067#if defined(MAGICKCORE_BZLIB_DELEGATE)
5074 for (i=0; i < (ssize_t) length; i+=count)
5076 count=(ssize_t) BZ2_bzwrite(blob_info->file_info.bzfile,q+i,
5077 (
int) MagickMin(length-i,MagickMaxBufferExtent));
5087 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
5088 if ((count != (ssize_t) length) && (status != BZ_OK))
5089 ThrowBlobException(blob_info);
5095 count=(ssize_t) blob_info->stream(image,data,length);
5100 if ((blob_info->offset+(MagickOffsetType) length) >=
5101 (MagickOffsetType) blob_info->extent)
5103 if (blob_info->mapped != MagickFalse)
5105 blob_info->extent+=length+blob_info->quantum;
5106 blob_info->quantum<<=1;
5107 blob_info->data=(
unsigned char *) ResizeQuantumMemory(
5108 blob_info->data,blob_info->extent+1,
sizeof(*blob_info->data));
5109 (void) SyncBlob(image);
5110 if (blob_info->data == (
unsigned char *) NULL)
5112 (void) DetachBlob(blob_info);
5116 q=blob_info->data+blob_info->offset;
5117 (void) memcpy(q,p,length);
5118 blob_info->offset+=length;
5119 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
5120 blob_info->length=(size_t) blob_info->offset;
5121 count=(ssize_t) length;
5124 if (count != (ssize_t) length)
5125 ThrowBlobException(blob_info);
5154MagickExport ssize_t WriteBlobByte(
Image *image,
const unsigned char value)
5157 *magick_restrict blob_info;
5162 assert(image != (
Image *) NULL);
5163 assert(image->signature == MagickCoreSignature);
5164 assert(image->blob != (
BlobInfo *) NULL);
5165 assert(image->blob->type != UndefinedStream);
5166 blob_info=image->blob;
5168 switch (blob_info->type)
5170 case StandardStream:
5177 c=putc((
int) value,blob_info->file_info.file);
5180 if (ferror(blob_info->file_info.file) != 0)
5181 ThrowBlobException(blob_info);
5189 count=WriteBlobStream(image,1,&value);
5221MagickExport ssize_t WriteBlobFloat(
Image *image,
const float value)
5232 quantum.unsigned_value=0U;
5233 quantum.float_value=value;
5234 return(WriteBlobLong(image,quantum.unsigned_value));
5262MagickExport ssize_t WriteBlobLong(
Image *image,
const unsigned int value)
5267 assert(image != (
Image *) NULL);
5268 assert(image->signature == MagickCoreSignature);
5269 if (image->endian == LSBEndian)
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));
5277 buffer[0]=(
unsigned char) (value >> 24);
5278 buffer[1]=(
unsigned char) (value >> 16);
5279 buffer[2]=(
unsigned char) (value >> 8);
5280 buffer[3]=(
unsigned char) value;
5281 return(WriteBlobStream(image,4,buffer));
5309MagickExport ssize_t WriteBlobShort(
Image *image,
const unsigned short value)
5314 assert(image != (
Image *) NULL);
5315 assert(image->signature == MagickCoreSignature);
5316 if (image->endian == LSBEndian)
5318 buffer[0]=(
unsigned char) value;
5319 buffer[1]=(
unsigned char) (value >> 8);
5320 return(WriteBlobStream(image,2,buffer));
5322 buffer[0]=(
unsigned char) (value >> 8);
5323 buffer[1]=(
unsigned char) value;
5324 return(WriteBlobStream(image,2,buffer));
5352MagickExport ssize_t WriteBlobLSBLong(
Image *image,
const unsigned int value)
5357 assert(image != (
Image *) NULL);
5358 assert(image->signature == MagickCoreSignature);
5359 buffer[0]=(
unsigned char) value;
5360 buffer[1]=(
unsigned char) (value >> 8);
5361 buffer[2]=(
unsigned char) (value >> 16);
5362 buffer[3]=(
unsigned char) (value >> 24);
5363 return(WriteBlobStream(image,4,buffer));
5391MagickExport ssize_t WriteBlobLSBShort(
Image *image,
const unsigned short value)
5396 assert(image != (
Image *) NULL);
5397 assert(image->signature == MagickCoreSignature);
5398 buffer[0]=(
unsigned char) value;
5399 buffer[1]=(
unsigned char) (value >> 8);
5400 return(WriteBlobStream(image,2,buffer));
5428MagickExport ssize_t WriteBlobLSBSignedLong(
Image *image,
const signed int value)
5442 assert(image != (
Image *) NULL);
5443 assert(image->signature == MagickCoreSignature);
5444 quantum.signed_value=value;
5445 buffer[0]=(
unsigned char) quantum.unsigned_value;
5446 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5447 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 16);
5448 buffer[3]=(
unsigned char) (quantum.unsigned_value >> 24);
5449 return(WriteBlobStream(image,4,buffer));
5477MagickExport ssize_t WriteBlobLSBSignedShort(
Image *image,
5478 const signed short value)
5492 assert(image != (
Image *) NULL);
5493 assert(image->signature == MagickCoreSignature);
5494 quantum.signed_value=value;
5495 buffer[0]=(
unsigned char) quantum.unsigned_value;
5496 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5497 return(WriteBlobStream(image,2,buffer));
5525MagickExport ssize_t WriteBlobMSBLong(
Image *image,
const unsigned int value)
5530 assert(image != (
Image *) NULL);
5531 assert(image->signature == MagickCoreSignature);
5532 buffer[0]=(
unsigned char) (value >> 24);
5533 buffer[1]=(
unsigned char) (value >> 16);
5534 buffer[2]=(
unsigned char) (value >> 8);
5535 buffer[3]=(
unsigned char) value;
5536 return(WriteBlobStream(image,4,buffer));
5564MagickExport ssize_t WriteBlobMSBLongLong(
Image *image,
5565 const MagickSizeType value)
5570 assert(image != (
Image *) NULL);
5571 assert(image->signature == MagickCoreSignature);
5572 buffer[0]=(
unsigned char) (value >> 56);
5573 buffer[1]=(
unsigned char) (value >> 48);
5574 buffer[2]=(
unsigned char) (value >> 40);
5575 buffer[3]=(
unsigned char) (value >> 32);
5576 buffer[4]=(
unsigned char) (value >> 24);
5577 buffer[5]=(
unsigned char) (value >> 16);
5578 buffer[6]=(
unsigned char) (value >> 8);
5579 buffer[7]=(
unsigned char) value;
5580 return(WriteBlobStream(image,8,buffer));
5608MagickExport ssize_t WriteBlobMSBShort(
Image *image,
const unsigned short value)
5613 assert(image != (
Image *) NULL);
5614 assert(image->signature == MagickCoreSignature);
5615 buffer[0]=(
unsigned char) (value >> 8);
5616 buffer[1]=(
unsigned char) value;
5617 return(WriteBlobStream(image,2,buffer));
5645MagickExport ssize_t WriteBlobMSBSignedLong(
Image *image,
const signed int value)
5659 assert(image != (
Image *) NULL);
5660 assert(image->signature == MagickCoreSignature);
5661 quantum.signed_value=value;
5662 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 24);
5663 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 16);
5664 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 8);
5665 buffer[3]=(
unsigned char) quantum.unsigned_value;
5666 return(WriteBlobStream(image,4,buffer));
5694MagickExport ssize_t WriteBlobMSBSignedShort(
Image *image,
5695 const signed short value)
5709 assert(image != (
Image *) NULL);
5710 assert(image->signature == MagickCoreSignature);
5711 quantum.signed_value=value;
5712 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 8);
5713 buffer[1]=(
unsigned char) quantum.unsigned_value;
5714 return(WriteBlobStream(image,2,buffer));
5742MagickExport ssize_t WriteBlobString(
Image *image,
const char *
string)
5744 assert(image != (
Image *) NULL);
5745 assert(image->signature == MagickCoreSignature);
5746 assert(
string != (
const char *) NULL);
5747 return(WriteBlobStream(image,strlen(
string),(
const unsigned char *)
string));