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 *);
208 MagickExport
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;
254 MagickExport 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)
291 if ((file == -1) || (i < length))
293 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
330 MagickExport
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);
500 static 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);
507 MagickExport 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 if (SyncBlob(image) != 0)
526 ThrowBlobException(blob_info);
527 status=blob_info->status;
528 switch (blob_info->type)
530 case UndefinedStream:
536 if (blob_info->synchronize != MagickFalse)
538 status=fflush(blob_info->file_info.file);
540 ThrowBlobException(blob_info);
541 status=fsync(fileno(blob_info->file_info.file));
543 ThrowBlobException(blob_info);
545 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
546 ThrowBlobException(blob_info);
551 #if defined(MAGICKCORE_ZLIB_DELEGATE)
553 (void) gzerror(blob_info->file_info.gzfile,&status);
555 ThrowBlobException(blob_info);
561 #if defined(MAGICKCORE_BZLIB_DELEGATE)
563 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
565 ThrowBlobException(blob_info);
573 if (blob_info->file_info.file != (FILE *) NULL)
575 if (blob_info->synchronize != MagickFalse)
577 status=fflush(blob_info->file_info.file);
579 ThrowBlobException(blob_info);
580 status=fsync(fileno(blob_info->file_info.file));
582 ThrowBlobException(blob_info);
584 if ((status != 0) && (ferror(blob_info->file_info.file) != 0))
585 ThrowBlobException(blob_info);
590 blob_info->size=GetBlobSize(image);
591 image->extent=blob_info->size;
592 blob_info->eof=MagickFalse;
594 blob_info->mode=UndefinedBlobMode;
595 if (blob_info->exempt != MagickFalse)
597 blob_info->type=UndefinedStream;
598 return(blob_info->status != 0 ? MagickFalse : MagickTrue);
600 switch (blob_info->type)
602 case UndefinedStream:
607 if (blob_info->file_info.file != (FILE *) NULL)
609 status=fclose(blob_info->file_info.file);
611 ThrowBlobException(blob_info);
617 #if defined(MAGICKCORE_HAVE_PCLOSE)
618 status=pclose(blob_info->file_info.file);
620 ThrowBlobException(blob_info);
626 #if defined(MAGICKCORE_ZLIB_DELEGATE)
627 status=gzclose(blob_info->file_info.gzfile);
629 ThrowBlobException(blob_info);
635 #if defined(MAGICKCORE_BZLIB_DELEGATE)
636 BZ2_bzclose(blob_info->file_info.bzfile);
644 if (blob_info->file_info.file != (FILE *) NULL)
646 status=fclose(blob_info->file_info.file);
648 ThrowBlobException(blob_info);
653 (void) DetachBlob(blob_info);
654 return(blob_info->status != 0 ? MagickFalse : MagickTrue);
679 MagickExport
void DestroyBlob(
Image *image)
682 *magick_restrict blob_info;
687 assert(image != (
Image *) NULL);
688 assert(image->signature == MagickCoreSignature);
689 assert(image->blob != (
BlobInfo *) NULL);
690 assert(image->blob->signature == MagickCoreSignature);
691 if (IsEventLogging() != MagickFalse)
692 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
693 blob_info=image->blob;
695 LockSemaphoreInfo(blob_info->semaphore);
696 blob_info->reference_count--;
697 assert(blob_info->reference_count >= 0);
698 if (blob_info->reference_count == 0)
700 UnlockSemaphoreInfo(blob_info->semaphore);
701 if (destroy == MagickFalse)
706 (void) CloseBlob(image);
707 if (blob_info->mapped != MagickFalse)
709 (void) UnmapBlob(blob_info->data,blob_info->length);
710 RelinquishMagickResource(MapResource,blob_info->length);
713 DestroySemaphoreInfo(&blob_info->semaphore);
714 blob_info->signature=(~MagickCoreSignature);
715 image->blob=(
BlobInfo *) RelinquishMagickMemory(blob_info);
740 MagickExport
unsigned char *DetachBlob(
BlobInfo *blob_info)
745 assert(blob_info != (
BlobInfo *) NULL);
746 if (IsEventLogging() != MagickFalse)
747 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
748 if (blob_info->mapped != MagickFalse)
750 (void) UnmapBlob(blob_info->data,blob_info->length);
751 blob_info->data=NULL;
752 RelinquishMagickResource(MapResource,blob_info->length);
754 blob_info->mapped=MagickFalse;
757 blob_info->mode=UndefinedBlobMode;
758 blob_info->eof=MagickFalse;
760 blob_info->exempt=MagickFalse;
761 blob_info->type=UndefinedStream;
762 blob_info->file_info.file=(FILE *) NULL;
763 data=blob_info->data;
764 blob_info->data=(
unsigned char *) NULL;
765 blob_info->stream=(StreamHandler) NULL;
793 MagickPrivate
void DisassociateBlob(
Image *image)
796 *magick_restrict blob_info,
802 assert(image != (
Image *) NULL);
803 assert(image->signature == MagickCoreSignature);
804 assert(image->blob != (
BlobInfo *) NULL);
805 assert(image->blob->signature == MagickCoreSignature);
806 if (IsEventLogging() != MagickFalse)
807 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
808 blob_info=image->blob;
810 LockSemaphoreInfo(blob_info->semaphore);
811 assert(blob_info->reference_count >= 0);
812 if (blob_info->reference_count > 1)
814 UnlockSemaphoreInfo(blob_info->semaphore);
815 if (clone == MagickFalse)
817 clone_info=CloneBlobInfo(blob_info);
819 image->blob=clone_info;
847 MagickExport MagickBooleanType DiscardBlobBytes(
Image *image,
848 const MagickSizeType length)
860 buffer[MagickMinBufferExtent >> 1];
862 assert(image != (
Image *) NULL);
863 assert(image->signature == MagickCoreSignature);
864 if (length != (MagickSizeType) ((MagickOffsetType) length))
867 for (i=0; i < length; i+=(MagickSizeType) count)
869 quantum=(size_t) MagickMin(length-i,
sizeof(buffer));
870 (void) ReadBlobStream(image,quantum,buffer,&count);
878 return(i < (MagickSizeType) length ? MagickFalse : MagickTrue);
905 MagickExport
void DuplicateBlob(
Image *image,
const Image *duplicate)
907 assert(image != (
Image *) NULL);
908 assert(image->signature == MagickCoreSignature);
909 assert(duplicate != (
Image *) NULL);
910 assert(duplicate->signature == MagickCoreSignature);
911 if (IsEventLogging() != MagickFalse)
912 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
914 image->blob=ReferenceBlob(duplicate->blob);
940 MagickExport
int EOFBlob(
const Image *image)
943 *magick_restrict blob_info;
945 assert(image != (
Image *) NULL);
946 assert(image->signature == MagickCoreSignature);
947 assert(image->blob != (
BlobInfo *) NULL);
948 assert(image->blob->type != UndefinedStream);
949 if (IsEventLogging() != MagickFalse)
950 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
951 blob_info=image->blob;
952 switch (blob_info->type)
954 case UndefinedStream:
960 blob_info->eof=feof(blob_info->file_info.file) != 0 ? MagickTrue :
966 #if defined(MAGICKCORE_ZLIB_DELEGATE)
967 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
974 #if defined(MAGICKCORE_BZLIB_DELEGATE)
979 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
980 blob_info->eof=status == BZ_UNEXPECTED_EOF ? MagickTrue : MagickFalse;
986 blob_info->eof=MagickFalse;
992 return((
int) blob_info->eof);
1018 MagickExport
int ErrorBlob(
const Image *image)
1021 *magick_restrict blob_info;
1023 assert(image != (
Image *) NULL);
1024 assert(image->signature == MagickCoreSignature);
1025 assert(image->blob != (
BlobInfo *) NULL);
1026 assert(image->blob->type != UndefinedStream);
1027 if (IsEventLogging() != MagickFalse)
1028 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1029 blob_info=image->blob;
1030 switch (blob_info->type)
1032 case UndefinedStream:
1033 case StandardStream:
1038 blob_info->error=ferror(blob_info->file_info.file);
1043 #if defined(MAGICKCORE_ZLIB_DELEGATE)
1044 (void) gzerror(blob_info->file_info.gzfile,&blob_info->error);
1050 #if defined(MAGICKCORE_BZLIB_DELEGATE)
1051 (void) BZ2_bzerror(blob_info->file_info.bzfile,&blob_info->error);
1063 return(blob_info->error);
1101 MagickExport
unsigned char *FileToBlob(
const char *filename,
const size_t extent,
1128 assert(filename != (
const char *) NULL);
1130 assert(exception->signature == MagickCoreSignature);
1131 if (IsEventLogging() != MagickFalse)
1132 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1134 status=IsRightsAuthorized(PathPolicyDomain,ReadPolicyRights,filename);
1135 if (status == MagickFalse)
1138 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
1139 "NotAuthorized",
"`%s'",filename);
1143 if (LocaleCompare(filename,
"-") != 0)
1145 status=GetPathAttributes(filename,&attributes);
1146 if ((status == MagickFalse) || (S_ISDIR(attributes.st_mode) != 0))
1148 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1151 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1155 ThrowFileException(exception,BlobError,
"UnableToOpenFile",filename);
1156 return((
unsigned char *) NULL);
1158 offset=(MagickOffsetType) lseek(file,0,SEEK_END);
1160 if ((file == fileno(stdin)) || (offset < 0) ||
1161 (offset != (MagickOffsetType) ((ssize_t) offset)))
1172 offset=(MagickOffsetType) lseek(file,0,SEEK_SET);
1173 quantum=(size_t) MagickMaxBufferExtent;
1174 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1175 quantum=(
size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1176 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1177 for (i=0; blob != (
unsigned char *) NULL; i+=count)
1179 count=read(file,blob+i,quantum);
1186 if (~((
size_t) i) < (count+quantum+1))
1188 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1191 blob=(
unsigned char *) ResizeQuantumMemory(blob,i+count+quantum+1,
1193 if ((
size_t) (i+count) >= extent)
1196 if (LocaleCompare(filename,
"-") != 0)
1198 if (blob == (
unsigned char *) NULL)
1200 (void) ThrowMagickException(exception,GetMagickModule(),
1201 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1202 return((
unsigned char *) NULL);
1206 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1207 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1208 return((
unsigned char *) NULL);
1210 *length=(size_t) MagickMin(i+count,extent);
1214 *length=(size_t) MagickMin(offset,(MagickOffsetType)
1215 MagickMin(extent,(
size_t) MAGICK_SSIZE_MAX));
1216 blob=(
unsigned char *) NULL;
1217 if (~(*length) >= (MagickPathExtent-1))
1218 blob=(
unsigned char *) AcquireQuantumMemory(*length+MagickPathExtent,
1220 if (blob == (
unsigned char *) NULL)
1223 (void) ThrowMagickException(exception,GetMagickModule(),
1224 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",filename);
1225 return((
unsigned char *) NULL);
1227 map=MapBlob(file,ReadMode,0,*length);
1228 if (map != (
unsigned char *) NULL)
1230 (void) memcpy(blob,map,*length);
1231 (void) UnmapBlob(map,*length);
1235 (void) lseek(file,0,SEEK_SET);
1236 for (i=0; i < *length; i+=count)
1238 count=read(file,blob+i,(
size_t) MagickMin(*length-i,(
size_t)
1250 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1251 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1252 return((
unsigned char *) NULL);
1256 if (LocaleCompare(filename,
"-") != 0)
1260 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1261 ThrowFileException(exception,BlobError,
"UnableToReadBlob",filename);
1291 static inline ssize_t WriteBlobStream(
Image *image,
const size_t length,
1292 const unsigned char *magick_restrict data)
1295 *magick_restrict blob_info;
1303 assert(image->blob != (
BlobInfo *) NULL);
1304 assert(image->blob->type != UndefinedStream);
1305 assert(data != (
void *) NULL);
1306 blob_info=image->blob;
1307 if (blob_info->type != BlobStream)
1308 return(WriteBlob(image,length,data));
1309 extent=(MagickSizeType) (blob_info->offset+(MagickOffsetType) length);
1310 if (extent >= blob_info->extent)
1312 extent=blob_info->extent+blob_info->quantum+length;
1313 blob_info->quantum<<=1;
1314 if (SetBlobExtent(image,extent) == MagickFalse)
1317 q=blob_info->data+blob_info->offset;
1318 (void) memcpy(q,data,length);
1319 blob_info->offset+=length;
1320 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
1321 blob_info->length=(
size_t) blob_info->offset;
1322 return((ssize_t) length);
1325 MagickExport MagickBooleanType FileToImage(
Image *image,
const char *filename)
1346 assert(image != (
const Image *) NULL);
1347 assert(image->signature == MagickCoreSignature);
1348 assert(filename != (
const char *) NULL);
1349 if (IsEventLogging() != MagickFalse)
1350 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1351 status=IsRightsAuthorized(PathPolicyDomain,WritePolicyRights,filename);
1352 if (status == MagickFalse)
1355 (void) ThrowMagickException(&image->exception,GetMagickModule(),
1356 PolicyError,
"NotAuthorized",
"`%s'",filename);
1357 return(MagickFalse);
1360 if (LocaleCompare(filename,
"-") != 0)
1361 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
1364 ThrowFileException(&image->exception,BlobError,
"UnableToOpenBlob",
1366 return(MagickFalse);
1368 quantum=(size_t) MagickMaxBufferExtent;
1369 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1370 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1371 blob=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*blob));
1372 if (blob == (
unsigned char *) NULL)
1375 ThrowFileException(&image->exception,ResourceLimitError,
1376 "MemoryAllocationFailed",filename);
1377 return(MagickFalse);
1381 count=read(file,blob,quantum);
1388 length=(size_t) count;
1389 count=WriteBlobStream(image,length,blob);
1390 if (count != (ssize_t) length)
1392 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1399 ThrowFileException(&image->exception,BlobError,
"UnableToWriteBlob",
1401 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1428 MagickExport MagickBooleanType GetBlobError(
const Image *image)
1430 assert(image != (
const Image *) NULL);
1431 assert(image->signature == MagickCoreSignature);
1432 if (IsEventLogging() != MagickFalse)
1433 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1434 if ((image->blob->status != 0) && (image->blob->error_number != 0))
1435 errno=image->blob->error_number;
1436 return(image->blob->status == 0 ? MagickFalse : MagickTrue);
1461 MagickExport FILE *GetBlobFileHandle(
const Image *image)
1463 assert(image != (
const Image *) NULL);
1464 assert(image->signature == MagickCoreSignature);
1465 return(image->blob->file_info.file);
1490 MagickExport
void GetBlobInfo(
BlobInfo *blob_info)
1492 assert(blob_info != (
BlobInfo *) NULL);
1493 (void) memset(blob_info,0,
sizeof(*blob_info));
1494 blob_info->type=UndefinedStream;
1495 blob_info->quantum=(size_t) MagickMaxBlobExtent;
1496 blob_info->properties.st_mtime=GetMagickTime();
1497 blob_info->properties.st_ctime=blob_info->properties.st_mtime;
1498 blob_info->debug=GetLogEventMask() & BlobEvent ? MagickTrue : MagickFalse;
1499 blob_info->reference_count=1;
1500 blob_info->semaphore=AllocateSemaphoreInfo();
1501 blob_info->signature=MagickCoreSignature;
1526 MagickExport
const struct stat *GetBlobProperties(
const Image *image)
1528 assert(image != (
Image *) NULL);
1529 assert(image->signature == MagickCoreSignature);
1530 if (IsEventLogging() != MagickFalse)
1531 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1532 return(&image->blob->properties);
1558 MagickExport MagickSizeType GetBlobSize(
const Image *image)
1561 *magick_restrict blob_info;
1566 assert(image != (
Image *) NULL);
1567 assert(image->signature == MagickCoreSignature);
1568 assert(image->blob != (
BlobInfo *) NULL);
1569 if (IsEventLogging() != MagickFalse)
1570 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1571 blob_info=image->blob;
1573 switch (blob_info->type)
1575 case UndefinedStream:
1576 case StandardStream:
1578 extent=blob_info->size;
1586 extent=(MagickSizeType) blob_info->properties.st_size;
1588 extent=blob_info->size;
1589 file_descriptor=fileno(blob_info->file_info.file);
1590 if (file_descriptor == -1)
1592 if (fstat(file_descriptor,&blob_info->properties) == 0)
1593 extent=(MagickSizeType) blob_info->properties.st_size;
1598 extent=blob_info->size;
1607 status=GetPathAttributes(image->filename,&blob_info->properties);
1608 if (status != MagickFalse)
1609 extent=(MagickSizeType) blob_info->properties.st_size;
1616 extent=(MagickSizeType) blob_info->length;
1645 MagickExport
unsigned char *GetBlobStreamData(
const Image *image)
1647 assert(image != (
const Image *) NULL);
1648 assert(image->signature == MagickCoreSignature);
1649 return(image->blob->data);
1674 MagickExport StreamHandler GetBlobStreamHandler(
const Image *image)
1676 assert(image != (
const Image *) NULL);
1677 assert(image->signature == MagickCoreSignature);
1678 if (IsEventLogging() != MagickFalse)
1679 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1680 return(image->blob->stream);
1716 MagickExport
unsigned char *ImageToBlob(
const ImageInfo *image_info,
1731 assert(image_info != (
const ImageInfo *) NULL);
1732 assert(image_info->signature == MagickCoreSignature);
1733 assert(image != (
Image *) NULL);
1734 assert(image->signature == MagickCoreSignature);
1736 assert(exception->signature == MagickCoreSignature);
1737 if (IsEventLogging() != MagickFalse)
1738 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1739 image_info->filename);
1741 blob=(
unsigned char *) NULL;
1742 blob_info=CloneImageInfo(image_info);
1743 blob_info->adjoin=MagickFalse;
1744 (void) SetImageInfo(blob_info,1,exception);
1745 if (*blob_info->magick !=
'\0')
1746 (void) CopyMagickString(image->magick,blob_info->magick,MagickPathExtent);
1747 magick_info=GetMagickInfo(image->magick,exception);
1748 if (magick_info == (
const MagickInfo *) NULL)
1750 (void) ThrowMagickException(exception,GetMagickModule(),
1751 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
1753 blob_info=DestroyImageInfo(blob_info);
1756 (void) CopyMagickString(blob_info->magick,image->magick,MagickPathExtent);
1757 if (GetMagickBlobSupport(magick_info) != MagickFalse)
1762 blob_info->length=0;
1763 blob_info->blob=AcquireQuantumMemory(MagickMaxBlobExtent,
1764 sizeof(
unsigned char));
1765 if (blob_info->blob == NULL)
1766 (void) ThrowMagickException(exception,GetMagickModule(),
1767 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",image->filename);
1770 (void) CloseBlob(image);
1771 image->blob->exempt=MagickTrue;
1772 *image->filename=
'\0';
1773 status=WriteImage(blob_info,image);
1774 InheritException(exception,&image->exception);
1775 *length=image->blob->length;
1776 blob=DetachBlob(image->blob);
1777 if (blob != (
void *) NULL)
1779 if (status == MagickFalse)
1780 blob=(
unsigned char *) RelinquishMagickMemory(blob);
1782 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
1783 sizeof(
unsigned char));
1785 else if (status == MagickFalse)
1786 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
1792 unique[MagickPathExtent];
1800 file=AcquireUniqueFileResource(unique);
1803 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",
1804 image_info->filename);
1808 blob_info->file=fdopen(file,
"wb");
1809 if (blob_info->file != (FILE *) NULL)
1811 (void) FormatLocaleString(image->filename,MagickPathExtent,
1812 "%s:%s",image->magick,unique);
1813 status=WriteImage(blob_info,image);
1814 (void) fclose(blob_info->file);
1815 if (status == MagickFalse)
1816 InheritException(exception,&image->exception);
1818 blob=FileToBlob(unique,SIZE_MAX,length,exception);
1820 (void) RelinquishUniqueFileResource(unique);
1823 blob_info=DestroyImageInfo(blob_info);
1855 MagickExport MagickBooleanType ImageToFile(
Image *image,
char *filename,
1880 assert(image != (
Image *) NULL);
1881 assert(image->signature == MagickCoreSignature);
1882 assert(image->blob != (
BlobInfo *) NULL);
1883 assert(image->blob->type != UndefinedStream);
1884 assert(filename != (
const char *) NULL);
1885 if (IsEventLogging() != MagickFalse)
1886 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",filename);
1887 if (*filename ==
'\0')
1888 file=AcquireUniqueFileResource(filename);
1890 if (LocaleCompare(filename,
"-") == 0)
1891 file=fileno(stdout);
1893 file=open_utf8(filename,O_RDWR | O_CREAT | O_EXCL | O_BINARY,S_MODE);
1896 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1897 return(MagickFalse);
1899 quantum=(size_t) MagickMaxBufferExtent;
1900 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
1901 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
1902 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
1903 if (buffer == (
unsigned char *) NULL)
1906 (void) ThrowMagickException(exception,GetMagickModule(),
1907 ResourceLimitError,
"MemoryAllocationError",
"`%s'",filename);
1908 return(MagickFalse);
1911 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1912 for (i=0; count > 0; )
1914 length=(size_t) count;
1915 for (i=0; i < length; i+=count)
1917 count=write(file,p+i,(
size_t) (length-i));
1927 p=(
const unsigned char *) ReadBlobStream(image,quantum,buffer,&count);
1929 if (LocaleCompare(filename,
"-") != 0)
1931 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
1932 if ((file == -1) || (i < length))
1936 ThrowFileException(exception,BlobError,
"UnableToWriteBlob",filename);
1937 return(MagickFalse);
1977 MagickExport
unsigned char *ImagesToBlob(
const ImageInfo *image_info,
1992 assert(image_info != (
const ImageInfo *) NULL);
1993 assert(image_info->signature == MagickCoreSignature);
1994 assert(images != (
Image *) NULL);
1995 assert(images->signature == MagickCoreSignature);
1997 if (IsEventLogging() != MagickFalse)
1998 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1999 image_info->filename);
2001 blob=(
unsigned char *) NULL;
2002 blob_info=CloneImageInfo(image_info);
2003 (void) SetImageInfo(blob_info,(
unsigned int) GetImageListLength(images),
2005 if (*blob_info->magick !=
'\0')
2006 (void) CopyMagickString(images->magick,blob_info->magick,MagickPathExtent);
2007 magick_info=GetMagickInfo(images->magick,exception);
2008 if (magick_info == (
const MagickInfo *) NULL)
2010 (void) ThrowMagickException(exception,GetMagickModule(),
2011 MissingDelegateError,
"NoEncodeDelegateForThisImageFormat",
"`%s'",
2013 blob_info=DestroyImageInfo(blob_info);
2016 if (GetMagickAdjoin(magick_info) == MagickFalse)
2018 blob_info=DestroyImageInfo(blob_info);
2019 return(ImageToBlob(image_info,images,length,exception));
2021 (void) CopyMagickString(blob_info->magick,images->magick,MagickPathExtent);
2022 if (GetMagickBlobSupport(magick_info) != MagickFalse)
2027 blob_info->length=0;
2028 blob_info->blob=(
void *) AcquireQuantumMemory(MagickMaxBlobExtent,
2029 sizeof(
unsigned char));
2030 if (blob_info->blob == (
void *) NULL)
2031 (
void) ThrowMagickException(exception,GetMagickModule(),
2032 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",images->filename);
2035 (void) CloseBlob(images);
2036 images->blob->exempt=MagickTrue;
2037 *images->filename=
'\0';
2038 status=WriteImages(blob_info,images,images->filename,exception);
2039 *length=images->blob->length;
2040 blob=DetachBlob(images->blob);
2041 if (blob != (
void *) NULL)
2043 if (status == MagickFalse)
2044 blob=(
unsigned char *) RelinquishMagickMemory(blob);
2046 blob=(
unsigned char *) ResizeQuantumMemory(blob,*length+1,
2047 sizeof(
unsigned char));
2050 if (status == MagickFalse)
2051 blob_info->blob=RelinquishMagickMemory(blob_info->blob);
2057 filename[MagickPathExtent],
2058 unique[MagickPathExtent];
2066 file=AcquireUniqueFileResource(unique);
2069 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",
2070 image_info->filename);
2074 blob_info->file=fdopen(file,
"wb");
2075 if (blob_info->file != (FILE *) NULL)
2077 (void) FormatLocaleString(filename,MagickPathExtent,
"%s:%s",
2078 images->magick,unique);
2079 status=WriteImages(blob_info,images,filename,exception);
2080 (void) fclose(blob_info->file);
2081 if (status == MagickFalse)
2082 InheritException(exception,&images->exception);
2084 blob=FileToBlob(unique,SIZE_MAX,length,exception);
2086 (void) RelinquishUniqueFileResource(unique);
2089 blob_info=DestroyImageInfo(blob_info);
2125 MagickExport MagickBooleanType InjectImageBlob(
const ImageInfo *image_info,
2129 filename[MagickPathExtent];
2158 assert(image_info != (
ImageInfo *) NULL);
2159 assert(image_info->signature == MagickCoreSignature);
2160 assert(image != (
Image *) NULL);
2161 assert(image->signature == MagickCoreSignature);
2162 assert(inject_image != (
Image *) NULL);
2163 assert(inject_image->signature == MagickCoreSignature);
2165 if (IsEventLogging() != MagickFalse)
2166 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2167 unique_file=(FILE *) NULL;
2168 file=AcquireUniqueFileResource(filename);
2170 unique_file=fdopen(file,
"wb");
2171 if ((file == -1) || (unique_file == (FILE *) NULL))
2173 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2174 ThrowFileException(exception,FileOpenError,
"UnableToCreateTemporaryFile",
2176 return(MagickFalse);
2178 byte_image=CloneImage(inject_image,0,0,MagickFalse,exception);
2179 if (byte_image == (
Image *) NULL)
2181 (void) fclose(unique_file);
2182 (void) RelinquishUniqueFileResource(filename);
2183 return(MagickFalse);
2185 (void) FormatLocaleString(byte_image->filename,MagickPathExtent,
"%s:%s",
2187 DestroyBlob(byte_image);
2188 byte_image->blob=CloneBlobInfo((
BlobInfo *) NULL);
2189 write_info=CloneImageInfo(image_info);
2190 SetImageInfoFile(write_info,unique_file);
2191 status=WriteImage(write_info,byte_image);
2192 write_info=DestroyImageInfo(write_info);
2193 byte_image=DestroyImage(byte_image);
2194 (void) fclose(unique_file);
2195 if (status == MagickFalse)
2197 (void) RelinquishUniqueFileResource(filename);
2198 return(MagickFalse);
2203 file=open_utf8(filename,O_RDONLY | O_BINARY,0);
2206 (void) RelinquishUniqueFileResource(filename);
2207 ThrowFileException(exception,FileOpenError,
"UnableToOpenFile",
2208 image_info->filename);
2209 return(MagickFalse);
2211 quantum=(size_t) MagickMaxBufferExtent;
2212 if ((fstat(file,&file_stats) == 0) && (file_stats.st_size > 0))
2213 quantum=(size_t) MagickMin(file_stats.st_size,MagickMaxBufferExtent);
2214 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
2215 if (buffer == (
unsigned char *) NULL)
2217 (void) RelinquishUniqueFileResource(filename);
2219 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2224 ssize_t count = read(file,buffer,quantum);
2231 status=WriteBlobStream(image,(
size_t) count,buffer) == count ? MagickTrue :
2236 ThrowFileException(exception,FileOpenError,
"UnableToWriteBlob",filename);
2237 (void) RelinquishUniqueFileResource(filename);
2238 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
2264 MagickExport MagickBooleanType IsBlobExempt(
const Image *image)
2266 assert(image != (
const Image *) NULL);
2267 assert(image->signature == MagickCoreSignature);
2268 if (IsEventLogging() != MagickFalse)
2269 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2270 return(image->blob->exempt);
2295 MagickExport MagickBooleanType IsBlobSeekable(
const Image *image)
2298 *magick_restrict blob_info;
2300 assert(image != (
const Image *) NULL);
2301 assert(image->signature == MagickCoreSignature);
2302 if (IsEventLogging() != MagickFalse)
2303 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2304 blob_info=image->blob;
2305 switch (blob_info->type)
2314 if (blob_info->file_info.file == (FILE *) NULL)
2315 return(MagickFalse);
2316 status=fseek(blob_info->file_info.file,0,SEEK_CUR);
2317 return(status == -1 ? MagickFalse : MagickTrue);
2321 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2325 if (blob_info->file_info.gzfile == (gzFile) NULL)
2326 return(MagickFalse);
2327 offset=gzseek(blob_info->file_info.gzfile,0,SEEK_CUR);
2328 return(offset < 0 ? MagickFalse : MagickTrue);
2333 case UndefinedStream:
2337 case StandardStream:
2342 return(MagickFalse);
2367 MagickExport MagickBooleanType IsBlobTemporary(
const Image *image)
2369 assert(image != (
const Image *) NULL);
2370 assert(image->signature == MagickCoreSignature);
2371 if (IsEventLogging() != MagickFalse)
2372 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2373 return(image->blob->temporary);
2405 MagickExport
unsigned char *MapBlob(
int file,
const MapMode mode,
2406 const MagickOffsetType offset,
const size_t length)
2408 #if defined(MAGICKCORE_HAVE_MMAP)
2421 #if defined(MAP_ANONYMOUS)
2422 flags|=MAP_ANONYMOUS;
2424 return((
unsigned char *) NULL);
2431 protection=PROT_READ;
2437 protection=PROT_WRITE;
2443 protection=PROT_READ | PROT_WRITE;
2448 #if !defined(MAGICKCORE_HAVE_HUGEPAGES) || !defined(MAP_HUGETLB)
2449 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,offset);
2451 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags |
2452 MAP_HUGETLB,file,offset);
2453 if (map == (
unsigned char *) MAP_FAILED)
2454 map=(
unsigned char *) mmap((
char *) NULL,length,protection,flags,file,
2457 if (map == (
unsigned char *) MAP_FAILED)
2458 return((
unsigned char *) NULL);
2465 return((
unsigned char *) NULL);
2494 MagickExport
void MSBOrderLong(
unsigned char *buffer,
const size_t length)
2503 assert(buffer != (
unsigned char *) NULL);
2510 *buffer++=(
unsigned char) c;
2514 *buffer++=(
unsigned char) c;
2544 MagickExport
void MSBOrderShort(
unsigned char *p,
const size_t length)
2552 assert(p != (
unsigned char *) NULL);
2559 *p++=(
unsigned char) c;
2595 static inline MagickBooleanType SetStreamBuffering(
const ImageInfo *image_info,
2607 size=MagickMinBufferExtent;
2608 option=GetImageOption(image_info,
"stream:buffer-size");
2609 if (option != (
const char *) NULL)
2610 size=StringToUnsignedLong(option);
2611 status=setvbuf(image->blob->file_info.file,(
char *) NULL,size == 0 ?
2612 _IONBF : _IOFBF,size);
2613 return(status == 0 ? MagickTrue : MagickFalse);
2616 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2617 static inline gzFile gzopen_utf8(
const char *path,
const char *mode)
2619 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
2620 return(gzopen(path,mode));
2628 path_wide=create_wchar_path(path);
2629 if (path_wide == (
wchar_t *) NULL)
2630 return((gzFile) NULL);
2631 file=gzopen_w(path_wide,mode);
2632 path_wide=(
wchar_t *) RelinquishMagickMemory(path_wide);
2638 MagickExport MagickBooleanType OpenBlob(
const ImageInfo *image_info,
2642 *magick_restrict blob_info;
2645 extension[MagickPathExtent],
2646 filename[MagickPathExtent];
2657 assert(image_info != (
ImageInfo *) NULL);
2658 assert(image_info->signature == MagickCoreSignature);
2659 assert(image != (
Image *) NULL);
2660 assert(image->signature == MagickCoreSignature);
2661 if (IsEventLogging() != MagickFalse)
2662 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2663 image_info->filename);
2664 blob_info=image->blob;
2665 if (image_info->blob != (
void *) NULL)
2667 if (image_info->stream != (StreamHandler) NULL)
2668 blob_info->stream=(StreamHandler) image_info->stream;
2669 AttachBlob(blob_info,image_info->blob,image_info->length);
2672 (void) DetachBlob(blob_info);
2673 blob_info->mode=mode;
2676 default: type=
"r";
break;
2677 case ReadBlobMode: type=
"r";
break;
2678 case ReadBinaryBlobMode: type=
"rb";
break;
2679 case WriteBlobMode: type=
"w";
break;
2680 case WriteBinaryBlobMode: type=
"w+b";
break;
2681 case AppendBlobMode: type=
"a";
break;
2682 case AppendBinaryBlobMode: type=
"a+b";
break;
2685 blob_info->synchronize=image_info->synchronize;
2686 if (image_info->stream != (StreamHandler) NULL)
2688 blob_info->stream=(StreamHandler) image_info->stream;
2691 blob_info->type=FifoStream;
2699 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2700 rights=ReadPolicyRights;
2702 rights=WritePolicyRights;
2703 if (IsRightsAuthorized(PathPolicyDomain,rights,filename) == MagickFalse)
2706 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
2707 "NotAuthorized",
"`%s'",filename);
2708 return(MagickFalse);
2710 if ((LocaleCompare(filename,
"-") == 0) ||
2711 ((*filename ==
'\0') && (image_info->file == (FILE *) NULL)))
2713 blob_info->file_info.file=(*type ==
'r') ? stdin : stdout;
2714 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2715 if (strchr(type,
'b') != (
char *) NULL)
2716 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2718 blob_info->type=StandardStream;
2719 blob_info->exempt=MagickTrue;
2720 return(SetStreamBuffering(image_info,image));
2722 if ((LocaleNCompare(filename,
"fd:",3) == 0) &&
2723 (IsGeometry(filename+3) != MagickFalse))
2726 fileMode[MagickPathExtent];
2730 blob_info->file_info.file=fdopen(StringToLong(filename+3),fileMode);
2731 if (blob_info->file_info.file == (FILE *) NULL)
2733 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2734 return(MagickFalse);
2736 #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__OS2__)
2737 if (strchr(type,
'b') != (
char *) NULL)
2738 (void) setmode(fileno(blob_info->file_info.file),_O_BINARY);
2740 blob_info->type=FileStream;
2741 blob_info->exempt=MagickTrue;
2742 return(SetStreamBuffering(image_info,image));
2744 #if defined(MAGICKCORE_HAVE_POPEN) && defined(MAGICKCORE_PIPES_SUPPORT)
2745 if (*filename ==
'|')
2748 fileMode[MagickPathExtent],
2754 #if defined(SIGPIPE)
2756 (void) signal(SIGPIPE,SIG_IGN);
2760 sanitize_command=SanitizeString(filename+1);
2761 blob_info->file_info.file=(FILE *) popen_utf8(sanitize_command,
2763 sanitize_command=DestroyString(sanitize_command);
2764 if (blob_info->file_info.file == (FILE *) NULL)
2766 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2767 return(MagickFalse);
2769 blob_info->type=PipeStream;
2770 blob_info->exempt=MagickTrue;
2771 return(SetStreamBuffering(image_info,image));
2774 status=GetPathAttributes(filename,&blob_info->properties);
2775 #if defined(S_ISFIFO)
2776 if ((status != MagickFalse) && S_ISFIFO(blob_info->properties.st_mode))
2778 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2779 if (blob_info->file_info.file == (FILE *) NULL)
2781 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2782 return(MagickFalse);
2784 blob_info->type=FileStream;
2785 blob_info->exempt=MagickTrue;
2786 return(SetStreamBuffering(image_info,image));
2789 GetPathComponent(image->filename,ExtensionPath,extension);
2792 (void) CopyMagickString(filename,image->filename,MagickPathExtent);
2793 if ((image_info->adjoin == MagickFalse) ||
2794 (strchr(filename,
'%') != (
char *) NULL))
2799 (void) InterpretImageFilename(image_info,image,image->filename,(
int)
2800 image->scene,filename);
2801 if ((LocaleCompare(filename,image->filename) == 0) &&
2802 ((GetPreviousImageInList(image) != (
Image *) NULL) ||
2803 (GetNextImageInList(image) != (
Image *) NULL)))
2806 path[MagickPathExtent];
2808 GetPathComponent(image->filename,RootPath,path);
2809 if (*extension ==
'\0')
2810 (void) FormatLocaleString(filename,MagickPathExtent,
"%s-%.20g",
2811 path,(
double) image->scene);
2813 (
void) FormatLocaleString(filename,MagickPathExtent,
2814 "%s-%.20g.%s",path,(
double) image->scene,extension);
2816 (void) CopyMagickString(image->filename,filename,MagickPathExtent);
2817 #if defined(macintosh)
2818 SetApplicationType(filename,image_info->magick,
'8BIM');
2822 if (image_info->file != (FILE *) NULL)
2824 blob_info->file_info.file=image_info->file;
2825 blob_info->type=FileStream;
2826 blob_info->exempt=MagickTrue;
2831 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2832 if (blob_info->file_info.file != (FILE *) NULL)
2840 blob_info->type=FileStream;
2841 (void) fstat(fileno(blob_info->file_info.file),
2842 &blob_info->properties);
2843 (void) SetStreamBuffering(image_info,image);
2844 (void) memset(magick,0,
sizeof(magick));
2845 count=fread(magick,1,
sizeof(magick),blob_info->file_info.file);
2846 (void) fseek(blob_info->file_info.file,-((off_t) count),SEEK_CUR);
2847 #if defined(MAGICKCORE_POSIX_SUPPORT)
2848 (void) fflush(blob_info->file_info.file);
2850 (void) LogMagickEvent(BlobEvent,GetMagickModule(),
2851 " read %.20g magic header bytes",(double) count);
2852 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2853 if (((
int) magick[0] == 0x1F) && ((
int) magick[1] == 0x8B) &&
2854 ((
int) magick[2] == 0x08))
2857 gzfile = gzopen_utf8(filename,
"rb");
2859 if (gzfile != (gzFile) NULL)
2861 if (blob_info->file_info.file != (FILE *) NULL)
2862 (void) fclose(blob_info->file_info.file);
2863 blob_info->file_info.file=(FILE *) NULL;
2864 blob_info->file_info.gzfile=gzfile;
2865 blob_info->type=ZipStream;
2869 #if defined(MAGICKCORE_BZLIB_DELEGATE)
2870 if (strncmp((
char *) magick,
"BZh",3) == 0)
2873 *bzfile = BZ2_bzopen(filename,
"r");
2875 if (bzfile != (BZFILE *) NULL)
2877 if (blob_info->file_info.file != (FILE *) NULL)
2878 (void) fclose(blob_info->file_info.file);
2879 blob_info->file_info.file=(FILE *) NULL;
2880 blob_info->file_info.bzfile=bzfile;
2881 blob_info->type=BZipStream;
2885 if (blob_info->type == FileStream)
2896 sans_exception=AcquireExceptionInfo();
2897 magick_info=GetMagickInfo(image_info->magick,sans_exception);
2898 sans_exception=DestroyExceptionInfo(sans_exception);
2899 length=(size_t) blob_info->properties.st_size;
2900 if ((magick_info != (
const MagickInfo *) NULL) &&
2901 (GetMagickBlobSupport(magick_info) != MagickFalse) &&
2902 (length > MagickMaxBufferExtent) &&
2903 (AcquireMagickResource(MapResource,length) != MagickFalse))
2908 blob=MapBlob(fileno(blob_info->file_info.file),ReadMode,0,
2910 if (blob == (
void *) NULL)
2911 RelinquishMagickResource(MapResource,length);
2917 if (image_info->file != (FILE *) NULL)
2918 blob_info->exempt=MagickFalse;
2921 (void) fclose(blob_info->file_info.file);
2922 blob_info->file_info.file=(FILE *) NULL;
2924 AttachBlob(blob_info,blob,length);
2925 blob_info->mapped=MagickTrue;
2932 #if defined(MAGICKCORE_ZLIB_DELEGATE)
2933 if ((LocaleCompare(extension,
"gz") == 0) ||
2934 (LocaleCompare(extension,
"wmz") == 0) ||
2935 (LocaleCompare(extension,
"svgz") == 0))
2937 blob_info->file_info.gzfile=gzopen_utf8(filename,
"wb");
2938 if (blob_info->file_info.gzfile != (gzFile) NULL)
2939 blob_info->type=ZipStream;
2943 #if defined(MAGICKCORE_BZLIB_DELEGATE)
2944 if (LocaleCompare(extension,
"bz2") == 0)
2946 if (mode == WriteBinaryBlobMode)
2948 blob_info->file_info.bzfile=BZ2_bzopen(filename,
"w");
2949 if (blob_info->file_info.bzfile != (BZFILE *) NULL)
2950 blob_info->type=BZipStream;
2955 blob_info->file_info.file=(FILE *) fopen_utf8(filename,type);
2956 if (blob_info->file_info.file != (FILE *) NULL)
2958 blob_info->type=FileStream;
2959 (void) SetStreamBuffering(image_info,image);
2962 blob_info->status=0;
2963 blob_info->error_number=0;
2964 if (blob_info->type != UndefinedStream)
2965 blob_info->size=GetBlobSize(image);
2968 ThrowFileException(exception,BlobError,
"UnableToOpenBlob",filename);
2969 return(MagickFalse);
3008 #if defined(__cplusplus) || defined(c_plusplus)
3012 static size_t PingStream(
const Image *magick_unused(image),
3013 const void *magick_unused(pixels),
const size_t columns)
3015 magick_unreferenced(image);
3016 magick_unreferenced(pixels);
3021 #if defined(__cplusplus) || defined(c_plusplus)
3025 MagickExport
Image *PingBlob(
const ImageInfo *image_info,
const void *blob,
3041 assert(image_info != (
ImageInfo *) NULL);
3042 assert(image_info->signature == MagickCoreSignature);
3044 if (IsEventLogging() != MagickFalse)
3045 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
3046 image_info->filename);
3047 if ((blob == (
const void *) NULL) || (length == 0))
3049 (void) ThrowMagickException(exception,GetMagickModule(),BlobError,
3050 "ZeroLengthBlobNotPermitted",
"`%s'",image_info->filename);
3051 return((
Image *) NULL);
3053 ping_info=CloneImageInfo(image_info);
3054 ping_info->blob=(
void *) blob;
3055 ping_info->length=length;
3056 ping_info->ping=MagickTrue;
3057 if (*ping_info->magick ==
'\0')
3058 (void) SetImageInfo(ping_info,0,exception);
3059 magick_info=GetMagickInfo(ping_info->magick,exception);
3060 if (magick_info == (
const MagickInfo *) NULL)
3062 (void) ThrowMagickException(exception,GetMagickModule(),
3063 MissingDelegateError,
"NoDecodeDelegateForThisImageFormat",
"`%s'",
3065 ping_info=DestroyImageInfo(ping_info);
3066 return((
Image *) NULL);
3068 if (GetMagickBlobSupport(magick_info) != MagickFalse)
3071 filename[MagickPathExtent];
3076 (void) CopyMagickString(filename,ping_info->filename,MagickPathExtent);
3077 (void) FormatLocaleString(ping_info->filename,MagickPathExtent,
"%s:%s",
3078 ping_info->magick,filename);
3079 image=ReadStream(ping_info,&PingStream,exception);
3080 if (image != (
Image *) NULL)
3081 (void) DetachBlob(image->blob);
3082 ping_info=DestroyImageInfo(ping_info);
3088 ping_info->blob=(
void *) NULL;
3089 ping_info->length=0;
3090 *ping_info->filename=
'\0';
3091 status=BlobToFile(ping_info->filename,blob,length,exception);
3092 if (status == MagickFalse)
3094 (void) RelinquishUniqueFileResource(ping_info->filename);
3095 ping_info=DestroyImageInfo(ping_info);
3096 return((
Image *) NULL);
3098 clone_info=CloneImageInfo(ping_info);
3099 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:%s",
3100 ping_info->magick,ping_info->filename);
3101 image=ReadStream(clone_info,&PingStream,exception);
3102 if (image != (
Image *) NULL)
3110 for (images=GetFirstImageInList(image); images != (
Image *) NULL; )
3112 (void) CopyMagickString(images->filename,image_info->filename,
3114 (void) CopyMagickString(images->magick_filename,image_info->filename,
3116 (void) CopyMagickString(images->magick,magick_info->name,
3118 images=GetNextImageInList(images);
3121 clone_info=DestroyImageInfo(clone_info);
3122 (void) RelinquishUniqueFileResource(ping_info->filename);
3123 ping_info=DestroyImageInfo(ping_info);
3158 MagickExport ssize_t ReadBlob(
Image *image,
const size_t length,
3159 unsigned char *data)
3162 *magick_restrict blob_info;
3173 assert(image != (
Image *) NULL);
3174 assert(image->signature == MagickCoreSignature);
3175 assert(image->blob != (
BlobInfo *) NULL);
3176 assert(image->blob->type != UndefinedStream);
3179 assert(data != (
void *) NULL);
3180 blob_info=image->blob;
3183 switch (blob_info->type)
3185 case UndefinedStream:
3187 case StandardStream:
3195 count=(ssize_t) fread(q,1,length,blob_info->file_info.file);
3200 c=getc(blob_info->file_info.file);
3203 *q++=(
unsigned char) c;
3209 c=getc(blob_info->file_info.file);
3212 *q++=(
unsigned char) c;
3218 c=getc(blob_info->file_info.file);
3221 *q++=(
unsigned char) c;
3227 c=getc(blob_info->file_info.file);
3230 *q++=(
unsigned char) c;
3237 if ((count != (ssize_t) length) &&
3238 (ferror(blob_info->file_info.file) != 0))
3239 ThrowBlobException(blob_info);
3244 #if defined(MAGICKCORE_ZLIB_DELEGATE)
3255 for (i=0; i < (ssize_t) length; i+=count)
3257 count=(ssize_t) gzread(blob_info->file_info.gzfile,q+i,
3258 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3271 c=gzgetc(blob_info->file_info.gzfile);
3274 *q++=(
unsigned char) c;
3280 c=gzgetc(blob_info->file_info.gzfile);
3283 *q++=(
unsigned char) c;
3289 c=gzgetc(blob_info->file_info.gzfile);
3292 *q++=(
unsigned char) c;
3298 c=gzgetc(blob_info->file_info.gzfile);
3301 *q++=(
unsigned char) c;
3309 (void) gzerror(blob_info->file_info.gzfile,&status);
3310 if ((count != (ssize_t) length) && (status != Z_OK))
3311 ThrowBlobException(blob_info);
3312 if (blob_info->eof == MagickFalse)
3313 blob_info->eof=gzeof(blob_info->file_info.gzfile) != 0 ? MagickTrue :
3320 #if defined(MAGICKCORE_BZLIB_DELEGATE)
3327 for (i=0; i < (ssize_t) length; i+=count)
3329 count=(ssize_t) BZ2_bzread(blob_info->file_info.bzfile,q+i,
3330 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
3340 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
3341 if ((count != (ssize_t) length) && (status != BZ_OK))
3342 ThrowBlobException(blob_info);
3353 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3355 blob_info->eof=MagickTrue;
3358 p=blob_info->data+blob_info->offset;
3359 count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
3360 blob_info->length-blob_info->offset);
3361 blob_info->offset+=count;
3362 if (count != (ssize_t) length)
3363 blob_info->eof=MagickTrue;
3364 (
void) memcpy(q,p,(
size_t) count);
3393 MagickExport
int ReadBlobByte(
Image *image)
3396 *magick_restrict blob_info;
3401 assert(image != (
Image *) NULL);
3402 assert(image->signature == MagickCoreSignature);
3403 assert(image->blob != (
BlobInfo *) NULL);
3404 assert(image->blob->type != UndefinedStream);
3405 blob_info=image->blob;
3406 switch (blob_info->type)
3408 case StandardStream:
3412 c=getc(blob_info->file_info.file);
3415 if (ferror(blob_info->file_info.file) != 0)
3416 ThrowBlobException(blob_info);
3423 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
3425 blob_info->eof=MagickTrue;
3428 c=(int) (*((
unsigned char *) blob_info->data+blob_info->offset));
3429 blob_info->offset++;
3440 count=ReadBlob(image,1,buffer);
3473 MagickExport
double ReadBlobDouble(
Image *image)
3484 quantum.double_value=0.0;
3485 quantum.unsigned_value=ReadBlobLongLong(image);
3486 return(quantum.double_value);
3512 MagickExport
float ReadBlobFloat(
Image *image)
3523 quantum.float_value=0.0;
3524 quantum.unsigned_value=ReadBlobLong(image);
3525 return(quantum.float_value);
3551 MagickExport
unsigned int ReadBlobLong(
Image *image)
3565 assert(image != (
Image *) NULL);
3566 assert(image->signature == MagickCoreSignature);
3568 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3571 if (image->endian == LSBEndian)
3573 value=(
unsigned int) (*p++);
3574 value|=(
unsigned int) (*p++) << 8;
3575 value|=(
unsigned int) (*p++) << 16;
3576 value|=(
unsigned int) (*p++) << 24;
3579 value=(
unsigned int) (*p++) << 24;
3580 value|=(
unsigned int) (*p++) << 16;
3581 value|=(
unsigned int) (*p++) << 8;
3582 value|=(
unsigned int) (*p++);
3609 MagickExport MagickSizeType ReadBlobLongLong(
Image *image)
3623 assert(image != (
Image *) NULL);
3624 assert(image->signature == MagickCoreSignature);
3626 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3628 return(MagickULLConstant(0));
3629 if (image->endian == LSBEndian)
3631 value=(MagickSizeType) (*p++);
3632 value|=(MagickSizeType) (*p++) << 8;
3633 value|=(MagickSizeType) (*p++) << 16;
3634 value|=(MagickSizeType) (*p++) << 24;
3635 value|=(MagickSizeType) (*p++) << 32;
3636 value|=(MagickSizeType) (*p++) << 40;
3637 value|=(MagickSizeType) (*p++) << 48;
3638 value|=(MagickSizeType) (*p++) << 56;
3641 value=(MagickSizeType) (*p++) << 56;
3642 value|=(MagickSizeType) (*p++) << 48;
3643 value|=(MagickSizeType) (*p++) << 40;
3644 value|=(MagickSizeType) (*p++) << 32;
3645 value|=(MagickSizeType) (*p++) << 24;
3646 value|=(MagickSizeType) (*p++) << 16;
3647 value|=(MagickSizeType) (*p++) << 8;
3648 value|=(MagickSizeType) (*p++);
3675 MagickExport
unsigned short ReadBlobShort(
Image *image)
3689 assert(image != (
Image *) NULL);
3690 assert(image->signature == MagickCoreSignature);
3692 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3694 return((
unsigned short) 0U);
3695 if (image->endian == LSBEndian)
3697 value=(
unsigned short) (*p++);
3698 value|=(
unsigned short) (*p++) << 8;
3701 value=(
unsigned short) ((
unsigned short) (*p++) << 8);
3702 value|=(
unsigned short) (*p++);
3729 MagickExport
unsigned int ReadBlobLSBLong(
Image *image)
3743 assert(image != (
Image *) NULL);
3744 assert(image->signature == MagickCoreSignature);
3746 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3749 value=(
unsigned int) (*p++);
3750 value|=(
unsigned int) (*p++) << 8;
3751 value|=(
unsigned int) (*p++) << 16;
3752 value|=(
unsigned int) (*p++) << 24;
3779 MagickExport
signed int ReadBlobLSBSignedLong(
Image *image)
3790 quantum.unsigned_value=ReadBlobLSBLong(image);
3791 return(quantum.signed_value);
3817 MagickExport
unsigned short ReadBlobLSBShort(
Image *image)
3831 assert(image != (
Image *) NULL);
3832 assert(image->signature == MagickCoreSignature);
3834 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
3836 return((
unsigned short) 0U);
3837 value=(
unsigned short) (*p++);
3838 value|=(
unsigned short) (*p++) << 8;
3865 MagickExport
signed short ReadBlobLSBSignedShort(
Image *image)
3876 quantum.unsigned_value=ReadBlobLSBShort(image);
3877 return(quantum.signed_value);
3903 MagickExport
unsigned int ReadBlobMSBLong(
Image *image)
3917 assert(image != (
Image *) NULL);
3918 assert(image->signature == MagickCoreSignature);
3920 p=(
const unsigned char *) ReadBlobStream(image,4,buffer,&count);
3923 value=(
unsigned int) (*p++) << 24;
3924 value|=(
unsigned int) (*p++) << 16;
3925 value|=(
unsigned int) (*p++) << 8;
3926 value|=(
unsigned int) (*p++);
3953 MagickExport MagickSizeType ReadBlobMSBLongLong(
Image *image)
3967 assert(image != (
Image *) NULL);
3968 assert(image->signature == MagickCoreSignature);
3970 p=(
const unsigned char *) ReadBlobStream(image,8,buffer,&count);
3972 return(MagickULLConstant(0));
3973 value=(MagickSizeType) (*p++) << 56;
3974 value|=(MagickSizeType) (*p++) << 48;
3975 value|=(MagickSizeType) (*p++) << 40;
3976 value|=(MagickSizeType) (*p++) << 32;
3977 value|=(MagickSizeType) (*p++) << 24;
3978 value|=(MagickSizeType) (*p++) << 16;
3979 value|=(MagickSizeType) (*p++) << 8;
3980 value|=(MagickSizeType) (*p++);
4007 MagickExport
unsigned short ReadBlobMSBShort(
Image *image)
4021 assert(image != (
Image *) NULL);
4022 assert(image->signature == MagickCoreSignature);
4024 p=(
const unsigned char *) ReadBlobStream(image,2,buffer,&count);
4026 return((
unsigned short) 0U);
4027 value=(
unsigned short) ((*p++) << 8);
4028 value|=(
unsigned short) (*p++);
4055 MagickExport
signed int ReadBlobMSBSignedLong(
Image *image)
4066 quantum.unsigned_value=ReadBlobMSBLong(image);
4067 return(quantum.signed_value);
4093 MagickExport
signed short ReadBlobMSBSignedShort(
Image *image)
4104 quantum.unsigned_value=ReadBlobMSBShort(image);
4105 return(quantum.signed_value);
4131 MagickExport
signed int ReadBlobSignedLong(
Image *image)
4142 quantum.unsigned_value=ReadBlobLong(image);
4143 return(quantum.signed_value);
4169 MagickExport
signed short ReadBlobSignedShort(
Image *image)
4180 quantum.unsigned_value=ReadBlobShort(image);
4181 return(quantum.signed_value);
4219 MagickExport magick_hot_spot
const void *ReadBlobStream(
Image *image,
4220 const size_t length,
void *magick_restrict data,ssize_t *count)
4223 *magick_restrict blob_info;
4225 assert(image != (
Image *) NULL);
4226 assert(image->signature == MagickCoreSignature);
4227 assert(image->blob != (
BlobInfo *) NULL);
4228 assert(image->blob->type != UndefinedStream);
4229 assert(count != (ssize_t *) NULL);
4230 blob_info=image->blob;
4231 if (blob_info->type != BlobStream)
4233 assert(data != NULL);
4234 *count=ReadBlob(image,length,(
unsigned char *) data);
4237 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
4240 blob_info->eof=MagickTrue;
4243 data=blob_info->data+blob_info->offset;
4244 *count=(ssize_t) MagickMin((MagickOffsetType) length,(MagickOffsetType)
4245 blob_info->length-blob_info->offset);
4246 blob_info->offset+=(*count);
4247 if (*count != (ssize_t) length)
4248 blob_info->eof=MagickTrue;
4277 MagickExport
char *ReadBlobString(
Image *image,
char *
string)
4280 *magick_restrict blob_info;
4288 assert(image != (
Image *) NULL);
4289 assert(image->signature == MagickCoreSignature);
4290 assert(image->blob != (
BlobInfo *) NULL);
4291 assert(image->blob->type != UndefinedStream);
4292 if (IsEventLogging() != MagickFalse)
4293 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4295 blob_info=image->blob;
4296 switch (blob_info->type)
4298 case UndefinedStream:
4300 case StandardStream:
4303 char *p = fgets(
string,MagickPathExtent,blob_info->file_info.file);
4304 if (p == (
char *) NULL)
4306 if (ferror(blob_info->file_info.file) != 0)
4307 ThrowBlobException(blob_info);
4308 return((
char *) NULL);
4315 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4316 char *p = gzgets(blob_info->file_info.gzfile,
string,MagickPathExtent);
4317 if (p == (
char *) NULL)
4320 (void) gzerror(blob_info->file_info.gzfile,&status);
4322 ThrowBlobException(blob_info);
4323 return((
char *) NULL);
4333 c=ReadBlobByte(image);
4336 blob_info->eof=MagickTrue;
4342 }
while (i < (MaxTextExtent-2));
4350 if ((
string[i] ==
'\r') || (
string[i] ==
'\n'))
4353 if ((
string[i-1] ==
'\r') || (
string[i-1] ==
'\n'))
4355 if ((*
string ==
'\0') && (blob_info->eof != MagickFalse))
4356 return((
char *) NULL);
4386 assert(blob->signature == MagickCoreSignature);
4387 if (IsEventLogging() != MagickFalse)
4388 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
4389 LockSemaphoreInfo(blob->semaphore);
4390 blob->reference_count++;
4391 UnlockSemaphoreInfo(blob->semaphore);
4428 MagickExport MagickOffsetType SeekBlob(
Image *image,
4429 const MagickOffsetType offset,
const int whence)
4432 *magick_restrict blob_info;
4434 assert(image != (
Image *) NULL);
4435 assert(image->signature == MagickCoreSignature);
4436 assert(image->blob != (
BlobInfo *) NULL);
4437 assert(image->blob->type != UndefinedStream);
4438 if (IsEventLogging() != MagickFalse)
4439 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4440 blob_info=image->blob;
4441 switch (blob_info->type)
4443 case UndefinedStream:
4445 case StandardStream:
4450 if ((offset < 0) && (whence == SEEK_SET))
4452 if (fseek(blob_info->file_info.file,offset,whence) < 0)
4454 blob_info->offset=TellBlob(image);
4459 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4460 if (gzseek(blob_info->file_info.gzfile,offset,whence) < 0)
4463 blob_info->offset=TellBlob(image);
4479 blob_info->offset=offset;
4484 if (((offset > 0) && (blob_info->offset > (MAGICK_SSIZE_MAX-offset))) ||
4485 ((offset < 0) && (blob_info->offset < (MAGICK_SSIZE_MIN-offset))))
4490 if ((blob_info->offset+offset) < 0)
4492 blob_info->offset+=offset;
4497 if (((MagickOffsetType) blob_info->length+offset) < 0)
4499 blob_info->offset=blob_info->length+offset;
4503 if (blob_info->offset < (MagickOffsetType) ((off_t) blob_info->length))
4505 blob_info->eof=MagickFalse;
4508 if (blob_info->offset >= (MagickOffsetType) ((off_t) blob_info->extent))
4513 return(blob_info->offset);
4541 MagickExport
void SetBlobExempt(
Image *image,
const MagickBooleanType exempt)
4543 assert(image != (
const Image *) NULL);
4544 assert(image->signature == MagickCoreSignature);
4545 if (IsEventLogging() != MagickFalse)
4546 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4547 image->blob->exempt=exempt;
4576 MagickExport MagickBooleanType SetBlobExtent(
Image *image,
4577 const MagickSizeType extent)
4580 *magick_restrict blob_info;
4582 assert(image != (
Image *) NULL);
4583 assert(image->signature == MagickCoreSignature);
4584 assert(image->blob != (
BlobInfo *) NULL);
4585 assert(image->blob->type != UndefinedStream);
4586 if (IsEventLogging() != MagickFalse)
4587 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4588 blob_info=image->blob;
4589 switch (blob_info->type)
4591 case UndefinedStream:
4593 case StandardStream:
4594 return(MagickFalse);
4603 if (extent != (MagickSizeType) ((off_t) extent))
4604 return(MagickFalse);
4605 offset=SeekBlob(image,0,SEEK_END);
4607 return(MagickFalse);
4608 if ((MagickSizeType) offset >= extent)
4610 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4613 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4614 blob_info->file_info.file);
4615 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4616 if (blob_info->synchronize != MagickFalse)
4621 file=fileno(blob_info->file_info.file);
4622 if ((file == -1) || (offset < 0))
4623 return(MagickFalse);
4624 (void) posix_fallocate(file,offset,extent-offset);
4627 offset=SeekBlob(image,offset,SEEK_SET);
4629 return(MagickFalse);
4634 return(MagickFalse);
4636 return(MagickFalse);
4638 return(MagickFalse);
4641 if (extent != (MagickSizeType) ((
size_t) extent))
4642 return(MagickFalse);
4643 if (blob_info->mapped != MagickFalse)
4651 (void) UnmapBlob(blob_info->data,blob_info->length);
4652 RelinquishMagickResource(MapResource,blob_info->length);
4653 if (extent != (MagickSizeType) ((off_t) extent))
4654 return(MagickFalse);
4655 offset=SeekBlob(image,0,SEEK_END);
4657 return(MagickFalse);
4658 if ((MagickSizeType) offset >= extent)
4660 offset=SeekBlob(image,(MagickOffsetType) extent-1,SEEK_SET);
4661 count=(ssize_t) fwrite((
const unsigned char *)
"",1,1,
4662 blob_info->file_info.file);
4663 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE)
4664 if (blob_info->synchronize != MagickFalse)
4669 file=fileno(blob_info->file_info.file);
4670 if ((file == -1) || (offset < 0))
4671 return(MagickFalse);
4672 (void) posix_fallocate(file,offset,extent-offset);
4675 offset=SeekBlob(image,offset,SEEK_SET);
4677 return(MagickFalse);
4678 (void) AcquireMagickResource(MapResource,extent);
4679 blob_info->data=(
unsigned char*) MapBlob(fileno(
4680 blob_info->file_info.file),WriteMode,0,(size_t) extent);
4681 blob_info->extent=(size_t) extent;
4682 blob_info->length=(size_t) extent;
4683 (void) SyncBlob(image);
4686 blob_info->extent=(size_t) extent;
4687 blob_info->data=(
unsigned char *) ResizeQuantumMemory(blob_info->data,
4688 blob_info->extent+1,
sizeof(*blob_info->data));
4689 (void) SyncBlob(image);
4690 if (blob_info->data == (
unsigned char *) NULL)
4692 (void) DetachBlob(blob_info);
4693 return(MagickFalse);
4725 static int SyncBlob(
const Image *image)
4728 *magick_restrict blob_info;
4733 assert(image != (
Image *) NULL);
4734 assert(image->signature == MagickCoreSignature);
4735 assert(image->blob != (
BlobInfo *) NULL);
4736 if (IsEventLogging() != MagickFalse)
4737 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4738 blob_info=image->blob;
4740 switch (blob_info->type)
4742 case UndefinedStream:
4743 case StandardStream:
4748 status=fflush(blob_info->file_info.file);
4753 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4754 (void) gzflush(blob_info->file_info.gzfile,Z_SYNC_FLUSH);
4760 #if defined(MAGICKCORE_BZLIB_DELEGATE)
4761 status=BZ2_bzflush(blob_info->file_info.bzfile);
4795 MagickExport MagickOffsetType TellBlob(
const Image *image)
4798 *magick_restrict blob_info;
4803 assert(image != (
Image *) NULL);
4804 assert(image->signature == MagickCoreSignature);
4805 assert(image->blob != (
BlobInfo *) NULL);
4806 assert(image->blob->type != UndefinedStream);
4807 if (IsEventLogging() != MagickFalse)
4808 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
4809 blob_info=image->blob;
4811 switch (blob_info->type)
4813 case UndefinedStream:
4814 case StandardStream:
4818 offset=ftell(blob_info->file_info.file);
4825 #if defined(MAGICKCORE_ZLIB_DELEGATE)
4826 offset=(MagickOffsetType) gztell(blob_info->file_info.gzfile);
4836 offset=blob_info->offset;
4868 MagickExport MagickBooleanType UnmapBlob(
void *map,
const size_t length)
4870 #if defined(MAGICKCORE_HAVE_MMAP)
4874 status=munmap(map,length);
4875 return(status == -1 ? MagickFalse : MagickTrue);
4879 return(MagickFalse);
4912 MagickExport ssize_t WriteBlob(
Image *image,
const size_t length,
4913 const unsigned char *data)
4916 *magick_restrict blob_info;
4930 assert(image != (
Image *) NULL);
4931 assert(image->signature == MagickCoreSignature);
4932 assert(image->blob != (
BlobInfo *) NULL);
4933 assert(image->blob->type != UndefinedStream);
4936 assert(data != (
const unsigned char *) NULL);
4937 blob_info=image->blob;
4939 p=(
const unsigned char *) data;
4940 q=(
unsigned char *) data;
4941 switch (blob_info->type)
4943 case UndefinedStream:
4945 case StandardStream:
4953 count=(ssize_t) fwrite((
const char *) data,1,length,
4954 blob_info->file_info.file);
4959 c=putc((
int) *p++,blob_info->file_info.file);
4967 c=putc((
int) *p++,blob_info->file_info.file);
4975 c=putc((
int) *p++,blob_info->file_info.file);
4983 c=putc((
int) *p++,blob_info->file_info.file);
4992 if ((count != (ssize_t) length) &&
4993 (ferror(blob_info->file_info.file) != 0))
4994 ThrowBlobException(blob_info);
4999 #if defined(MAGICKCORE_ZLIB_DELEGATE)
5010 for (i=0; i < (ssize_t) length; i+=count)
5012 count=(ssize_t) gzwrite(blob_info->file_info.gzfile,q+i,
5013 (
unsigned int) MagickMin(length-i,MagickMaxBufferExtent));
5026 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5034 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5042 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5050 c=gzputc(blob_info->file_info.gzfile,(
int) *p++);
5060 (void) gzerror(blob_info->file_info.gzfile,&status);
5061 if ((count != (ssize_t) length) && (status != Z_OK))
5062 ThrowBlobException(blob_info);
5068 #if defined(MAGICKCORE_BZLIB_DELEGATE)
5075 for (i=0; i < (ssize_t) length; i+=count)
5077 count=(ssize_t) BZ2_bzwrite(blob_info->file_info.bzfile,q+i,
5078 (
int) MagickMin(length-i,MagickMaxBufferExtent));
5088 (void) BZ2_bzerror(blob_info->file_info.bzfile,&status);
5089 if ((count != (ssize_t) length) && (status != BZ_OK))
5090 ThrowBlobException(blob_info);
5096 count=(ssize_t) blob_info->stream(image,data,length);
5101 if ((blob_info->offset+(MagickOffsetType) length) >=
5102 (MagickOffsetType) blob_info->extent)
5104 if (blob_info->mapped != MagickFalse)
5106 blob_info->extent+=length+blob_info->quantum;
5107 blob_info->quantum<<=1;
5108 blob_info->data=(
unsigned char *) ResizeQuantumMemory(
5109 blob_info->data,blob_info->extent+1,
sizeof(*blob_info->data));
5110 (void) SyncBlob(image);
5111 if (blob_info->data == (
unsigned char *) NULL)
5113 (void) DetachBlob(blob_info);
5117 q=blob_info->data+blob_info->offset;
5118 (void) memcpy(q,p,length);
5119 blob_info->offset+=length;
5120 if (blob_info->offset >= (MagickOffsetType) blob_info->length)
5121 blob_info->length=(
size_t) blob_info->offset;
5122 count=(ssize_t) length;
5125 if (count != (ssize_t) length)
5126 ThrowBlobException(blob_info);
5155 MagickExport ssize_t WriteBlobByte(
Image *image,
const unsigned char value)
5158 *magick_restrict blob_info;
5163 assert(image != (
Image *) NULL);
5164 assert(image->signature == MagickCoreSignature);
5165 assert(image->blob != (
BlobInfo *) NULL);
5166 assert(image->blob->type != UndefinedStream);
5167 blob_info=image->blob;
5169 switch (blob_info->type)
5171 case StandardStream:
5178 c=putc((
int) value,blob_info->file_info.file);
5181 if (ferror(blob_info->file_info.file) != 0)
5182 ThrowBlobException(blob_info);
5190 count=WriteBlobStream(image,1,&value);
5222 MagickExport ssize_t WriteBlobFloat(
Image *image,
const float value)
5233 quantum.unsigned_value=0U;
5234 quantum.float_value=value;
5235 return(WriteBlobLong(image,quantum.unsigned_value));
5263 MagickExport ssize_t WriteBlobLong(
Image *image,
const unsigned int value)
5268 assert(image != (
Image *) NULL);
5269 assert(image->signature == MagickCoreSignature);
5270 if (image->endian == LSBEndian)
5272 buffer[0]=(
unsigned char) value;
5273 buffer[1]=(
unsigned char) (value >> 8);
5274 buffer[2]=(
unsigned char) (value >> 16);
5275 buffer[3]=(
unsigned char) (value >> 24);
5276 return(WriteBlobStream(image,4,buffer));
5278 buffer[0]=(
unsigned char) (value >> 24);
5279 buffer[1]=(
unsigned char) (value >> 16);
5280 buffer[2]=(
unsigned char) (value >> 8);
5281 buffer[3]=(
unsigned char) value;
5282 return(WriteBlobStream(image,4,buffer));
5310 MagickExport ssize_t WriteBlobShort(
Image *image,
const unsigned short value)
5315 assert(image != (
Image *) NULL);
5316 assert(image->signature == MagickCoreSignature);
5317 if (image->endian == LSBEndian)
5319 buffer[0]=(
unsigned char) value;
5320 buffer[1]=(
unsigned char) (value >> 8);
5321 return(WriteBlobStream(image,2,buffer));
5323 buffer[0]=(
unsigned char) (value >> 8);
5324 buffer[1]=(
unsigned char) value;
5325 return(WriteBlobStream(image,2,buffer));
5353 MagickExport ssize_t WriteBlobLSBLong(
Image *image,
const unsigned int value)
5358 assert(image != (
Image *) NULL);
5359 assert(image->signature == MagickCoreSignature);
5360 buffer[0]=(
unsigned char) value;
5361 buffer[1]=(
unsigned char) (value >> 8);
5362 buffer[2]=(
unsigned char) (value >> 16);
5363 buffer[3]=(
unsigned char) (value >> 24);
5364 return(WriteBlobStream(image,4,buffer));
5392 MagickExport ssize_t WriteBlobLSBShort(
Image *image,
const unsigned short value)
5397 assert(image != (
Image *) NULL);
5398 assert(image->signature == MagickCoreSignature);
5399 buffer[0]=(
unsigned char) value;
5400 buffer[1]=(
unsigned char) (value >> 8);
5401 return(WriteBlobStream(image,2,buffer));
5429 MagickExport ssize_t WriteBlobLSBSignedLong(
Image *image,
const signed int value)
5443 assert(image != (
Image *) NULL);
5444 assert(image->signature == MagickCoreSignature);
5445 quantum.signed_value=value;
5446 buffer[0]=(
unsigned char) quantum.unsigned_value;
5447 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5448 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 16);
5449 buffer[3]=(
unsigned char) (quantum.unsigned_value >> 24);
5450 return(WriteBlobStream(image,4,buffer));
5478 MagickExport ssize_t WriteBlobLSBSignedShort(
Image *image,
5479 const signed short value)
5493 assert(image != (
Image *) NULL);
5494 assert(image->signature == MagickCoreSignature);
5495 quantum.signed_value=value;
5496 buffer[0]=(
unsigned char) quantum.unsigned_value;
5497 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 8);
5498 return(WriteBlobStream(image,2,buffer));
5526 MagickExport ssize_t WriteBlobMSBLong(
Image *image,
const unsigned int value)
5531 assert(image != (
Image *) NULL);
5532 assert(image->signature == MagickCoreSignature);
5533 buffer[0]=(
unsigned char) (value >> 24);
5534 buffer[1]=(
unsigned char) (value >> 16);
5535 buffer[2]=(
unsigned char) (value >> 8);
5536 buffer[3]=(
unsigned char) value;
5537 return(WriteBlobStream(image,4,buffer));
5565 MagickExport ssize_t WriteBlobMSBLongLong(
Image *image,
5566 const MagickSizeType value)
5571 assert(image != (
Image *) NULL);
5572 assert(image->signature == MagickCoreSignature);
5573 buffer[0]=(
unsigned char) (value >> 56);
5574 buffer[1]=(
unsigned char) (value >> 48);
5575 buffer[2]=(
unsigned char) (value >> 40);
5576 buffer[3]=(
unsigned char) (value >> 32);
5577 buffer[4]=(
unsigned char) (value >> 24);
5578 buffer[5]=(
unsigned char) (value >> 16);
5579 buffer[6]=(
unsigned char) (value >> 8);
5580 buffer[7]=(
unsigned char) value;
5581 return(WriteBlobStream(image,8,buffer));
5609 MagickExport ssize_t WriteBlobMSBShort(
Image *image,
const unsigned short value)
5614 assert(image != (
Image *) NULL);
5615 assert(image->signature == MagickCoreSignature);
5616 buffer[0]=(
unsigned char) (value >> 8);
5617 buffer[1]=(
unsigned char) value;
5618 return(WriteBlobStream(image,2,buffer));
5646 MagickExport ssize_t WriteBlobMSBSignedLong(
Image *image,
const signed int value)
5660 assert(image != (
Image *) NULL);
5661 assert(image->signature == MagickCoreSignature);
5662 quantum.signed_value=value;
5663 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 24);
5664 buffer[1]=(
unsigned char) (quantum.unsigned_value >> 16);
5665 buffer[2]=(
unsigned char) (quantum.unsigned_value >> 8);
5666 buffer[3]=(
unsigned char) quantum.unsigned_value;
5667 return(WriteBlobStream(image,4,buffer));
5695 MagickExport ssize_t WriteBlobMSBSignedShort(
Image *image,
5696 const signed short value)
5710 assert(image != (
Image *) NULL);
5711 assert(image->signature == MagickCoreSignature);
5712 quantum.signed_value=value;
5713 buffer[0]=(
unsigned char) (quantum.unsigned_value >> 8);
5714 buffer[1]=(
unsigned char) quantum.unsigned_value;
5715 return(WriteBlobStream(image,2,buffer));
5743 MagickExport ssize_t WriteBlobString(
Image *image,
const char *
string)
5745 assert(image != (
Image *) NULL);
5746 assert(image->signature == MagickCoreSignature);
5747 assert(
string != (
const char *) NULL);
5748 return(WriteBlobStream(image,strlen(
string),(
const unsigned char *)
string));