54 #include "magick/studio.h"
55 #include "magick/cache.h"
56 #include "magick/cache-private.h"
57 #include "magick/distribute-cache.h"
58 #include "magick/distribute-cache-private.h"
59 #include "magick/exception.h"
60 #include "magick/exception-private.h"
61 #include "magick/geometry.h"
62 #include "magick/image.h"
63 #include "magick/image-private.h"
64 #include "magick/list.h"
65 #include "magick/locale_.h"
66 #include "magick/memory_.h"
67 #include "magick/nt-base-private.h"
68 #include "magick/policy.h"
69 #include "magick/random_.h"
70 #include "magick/registry.h"
71 #include "magick/splay-tree.h"
72 #include "magick/string_.h"
73 #include "magick/string-private.h"
74 #include "magick/version.h"
75 #include "magick/version-private.h"
76 #undef MAGICKCORE_HAVE_DISTRIBUTE_CACHE
77 #if defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT)
78 #include <netinet/in.h>
80 #include <sys/socket.h>
81 #include <arpa/inet.h>
82 #define CHAR_TYPE_CAST
83 #define CLOSE_SOCKET(socket) (void) close(socket)
84 #define HANDLER_RETURN_TYPE void *
85 #define HANDLER_RETURN_VALUE (void *) NULL
86 #define SOCKET_TYPE int
87 #define LENGTH_TYPE size_t
88 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE
89 #elif defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__)
90 #define CHAR_TYPE_CAST (char *)
91 #define CLOSE_SOCKET(socket) (void) closesocket(socket)
92 #define HANDLER_RETURN_TYPE DWORD WINAPI
93 #define HANDLER_RETURN_VALUE 0
94 #define SOCKET_TYPE SOCKET
95 #define LENGTH_TYPE int
96 #define MAGICKCORE_HAVE_DISTRIBUTE_CACHE
99 #define CLOSE_SOCKET(socket) (void) close(socket)
101 #define CLOSE_SOCKET(socket)
103 #define HANDLER_RETURN_TYPE void *
104 #define HANDLER_RETURN_VALUE (void *) NULL
105 #define SOCKET_TYPE int
106 #define LENGTH_TYPE size_t
109 #define send(file,buffer,length,flags) 0
110 #define recv(file,buffer,length,flags) 0
116 #define DPCHostname "127.0.0.1"
117 #define DPCPendingConnections 10
119 #define DPCSessionKeyLength 8
121 # define MSG_NOSIGNAL 0
147 static inline MagickOffsetType dpc_read(
int file,
const MagickSizeType length,
148 unsigned char *magick_restrict message)
156 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
157 magick_unreferenced(file);
158 magick_unreferenced(message);
161 for (i=0; i < (MagickOffsetType) length; i+=count)
163 count=recv(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE) MagickMin(length-i,
164 (MagickSizeType) MAGICK_SSIZE_MAX),0);
175 static int ConnectPixelCacheServer(
const char *hostname,
const int port,
178 #if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
180 service[MaxTextExtent],
197 secret[MaxTextExtent];
203 shared_secret=GetPolicyValue(
"cache:shared-secret");
204 if (shared_secret == (
char *) NULL)
206 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
207 "DistributedPixelCache",
"'%s'",
"shared secret expected");
210 shared_secret=DestroyString(shared_secret);
211 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
212 NTInitializeWinsock(MagickTrue);
214 (void) memset(&hint,0,
sizeof(hint));
215 hint.ai_family=AF_INET;
216 hint.ai_socktype=SOCK_STREAM;
217 hint.ai_flags=AI_PASSIVE;
218 (void) FormatLocaleString(service,MaxTextExtent,
"%d",port);
219 status=getaddrinfo(hostname,service,&hint,&result);
222 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
223 "DistributedPixelCache",
"'%s'",hostname);
226 client_socket=socket(result->ai_family,result->ai_socktype,
227 result->ai_protocol);
228 if (client_socket == -1)
230 freeaddrinfo(result);
231 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
232 "DistributedPixelCache",
"'%s'",hostname);
235 status=connect(client_socket,result->ai_addr,(socklen_t) result->ai_addrlen);
238 CLOSE_SOCKET(client_socket);
239 freeaddrinfo(result);
240 (void) ThrowMagickException(exception,GetMagickModule(),CacheError,
241 "DistributedPixelCache",
"'%s'",hostname);
244 count=recv(client_socket,CHAR_TYPE_CAST secret,MaxTextExtent,0);
250 nonce=AcquireStringInfo(count);
251 (void) memcpy(GetStringInfoDatum(nonce),secret,(size_t) count);
252 *session_key=GetMagickCoreSignature(nonce);
253 nonce=DestroyStringInfo(nonce);
255 if (*session_key == 0)
257 CLOSE_SOCKET(client_socket);
258 client_socket=(SOCKET_TYPE) (-1);
260 freeaddrinfo(result);
261 return(client_socket);
263 magick_unreferenced(hostname);
264 magick_unreferenced(port);
265 magick_unreferenced(session_key);
266 magick_unreferenced(exception);
267 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
268 "DelegateLibrarySupportNotBuiltIn",
"distributed pixel cache");
292 hosts=(
char *) GetImageRegistry(StringRegistryType,
"cache:hosts",exception);
293 if (hosts == (
char *) NULL)
296 return(AcquireString(DPCHostname));
298 (void) SubstituteString(&hosts,
",",
" ");
299 hostlist=StringToArgv(hosts,&argc);
300 hosts=DestroyString(hosts);
301 if (hostlist == (
char **) NULL)
304 return(AcquireString(DPCHostname));
306 hosts=AcquireString(hostlist[(
id++ % (argc-1))+1]);
307 for (i=0; i < (ssize_t) argc; i++)
308 hostlist[i]=DestroyString(hostlist[i]);
309 hostlist=(
char **) RelinquishMagickMemory(hostlist);
310 (void) SubstituteString(&hosts,
":",
" ");
311 hostlist=StringToArgv(hosts,&argc);
312 if (hostlist == (
char **) NULL)
315 return(AcquireString(DPCHostname));
317 host=AcquireString(hostlist[1]);
318 if (hostlist[2] == (
char *) NULL)
321 *port=StringToLong(hostlist[2]);
322 for (i=0; i < (ssize_t) argc; i++)
323 hostlist[i]=DestroyString(hostlist[i]);
324 hostlist=(
char **) RelinquishMagickMemory(hostlist);
345 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
346 (void) memset(server_info,0,
sizeof(*server_info));
347 server_info->signature=MagickCoreSignature;
349 hostname=GetHostname(&server_info->port,exception);
351 server_info->file=ConnectPixelCacheServer(hostname,server_info->port,
352 &session_key,exception);
353 if (server_info->file == -1)
354 server_info=DestroyDistributeCacheInfo(server_info);
357 server_info->session_key=session_key;
358 (void) CopyMagickString(server_info->hostname,hostname,MaxTextExtent);
359 server_info->debug=GetLogEventMask() & CacheEvent ? MagickTrue :
362 hostname=DestroyString(hostname);
394 assert(server_info->signature == MagickCoreSignature);
395 if (server_info->file > 0)
396 CLOSE_SOCKET(server_info->file);
397 server_info->signature=(~MagickCoreSignature);
428 static MagickBooleanType DestroyDistributeCache(
SplayTreeInfo *registry,
429 const size_t session_key)
434 return(DeleteNodeFromSplayTree(registry,(
const void *) session_key));
437 static inline MagickOffsetType dpc_send(
int file,
const MagickSizeType length,
438 const unsigned char *magick_restrict message)
446 #if !defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
447 magick_unreferenced(file);
448 magick_unreferenced(message);
455 for (i=0; i < (MagickOffsetType) length; i+=count)
457 count=(MagickOffsetType) send(file,CHAR_TYPE_CAST message+i,(LENGTH_TYPE)
458 MagickMin(length-i,(MagickSizeType) MAGICK_SSIZE_MAX),MSG_NOSIGNAL);
469 static MagickBooleanType OpenDistributeCache(
SplayTreeInfo *registry,
int file,
485 message[MaxTextExtent],
492 if (image == (
Image *) NULL)
494 length=
sizeof(image->storage_class)+
sizeof(image->colorspace)+
495 sizeof(image->channels)+
sizeof(image->columns)+
sizeof(image->rows);
496 count=dpc_read(file,length,message);
497 if (count != (MagickOffsetType) length)
503 (void) memcpy(&image->storage_class,p,
sizeof(image->storage_class));
504 p+=
sizeof(image->storage_class);
505 (void) memcpy(&image->colorspace,p,
sizeof(image->colorspace));
506 p+=
sizeof(image->colorspace);
507 (void) memcpy(&image->channels,p,
sizeof(image->channels));
508 p+=
sizeof(image->channels);
509 (void) memcpy(&image->columns,p,
sizeof(image->columns));
510 p+=
sizeof(image->columns);
511 (void) memcpy(&image->rows,p,
sizeof(image->rows));
512 p+=
sizeof(image->rows);
513 if (SyncImagePixelCache(image,exception) == MagickFalse)
515 status=AddValueToSplayTree(registry,(
const void *) session_key,image);
519 static MagickBooleanType ReadDistributeCacheIndexes(
SplayTreeInfo *registry,
541 message[MaxTextExtent],
547 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) session_key);
548 if (image == (
Image *) NULL)
550 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
551 sizeof(region.y)+
sizeof(length);
552 count=dpc_read(file,length,message);
553 if (count != (MagickOffsetType) length)
556 (void) memcpy(®ion.width,q,
sizeof(region.width));
557 q+=
sizeof(region.width);
558 (void) memcpy(®ion.height,q,
sizeof(region.height));
559 q+=
sizeof(region.height);
560 (void) memcpy(®ion.x,q,
sizeof(region.x));
562 (void) memcpy(®ion.y,q,
sizeof(region.y));
564 (void) memcpy(&length,q,
sizeof(length));
566 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
570 indexes=GetVirtualIndexQueue(image);
571 count=dpc_send(file,length,(
unsigned char *) indexes);
572 if (count != (MagickOffsetType) length)
577 static MagickBooleanType ReadDistributeCachePixels(
SplayTreeInfo *registry,
596 message[MaxTextExtent],
602 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) session_key);
603 if (image == (
Image *) NULL)
605 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
606 sizeof(region.y)+
sizeof(length);
607 count=dpc_read(file,length,message);
608 if (count != (MagickOffsetType) length)
611 (void) memcpy(®ion.width,q,
sizeof(region.width));
612 q+=
sizeof(region.width);
613 (void) memcpy(®ion.height,q,
sizeof(region.height));
614 q+=
sizeof(region.height);
615 (void) memcpy(®ion.x,q,
sizeof(region.x));
617 (void) memcpy(®ion.y,q,
sizeof(region.y));
619 (void) memcpy(&length,q,
sizeof(length));
621 p=GetVirtualPixels(image,region.x,region.y,region.width,region.height,
625 count=dpc_send(file,length,(
unsigned char *) p);
626 if (count != (MagickOffsetType) length)
631 static void *RelinquishImageRegistry(
void *image)
633 return((
void *) DestroyImageList((
Image *) image));
636 static MagickBooleanType WriteDistributeCacheIndexes(
SplayTreeInfo *registry,
657 message[MaxTextExtent],
663 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) session_key);
664 if (image == (
Image *) NULL)
666 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
667 sizeof(region.y)+
sizeof(length);
668 count=dpc_read(file,length,message);
669 if (count != (MagickOffsetType) length)
672 (void) memcpy(®ion.width,p,
sizeof(region.width));
673 p+=
sizeof(region.width);
674 (void) memcpy(®ion.height,p,
sizeof(region.height));
675 p+=
sizeof(region.height);
676 (void) memcpy(®ion.x,p,
sizeof(region.x));
678 (void) memcpy(®ion.y,p,
sizeof(region.y));
680 (void) memcpy(&length,p,
sizeof(length));
682 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
686 indexes=GetAuthenticIndexQueue(image);
687 count=dpc_read(file,length,(
unsigned char *) indexes);
688 if (count != (MagickOffsetType) length)
690 return(SyncAuthenticPixels(image,exception));
693 static MagickBooleanType WriteDistributeCachePixels(
SplayTreeInfo *registry,
712 message[MaxTextExtent],
718 image=(
Image *) GetValueFromSplayTree(registry,(
const void *) session_key);
719 if (image == (
Image *) NULL)
721 length=
sizeof(region.width)+
sizeof(region.height)+
sizeof(region.x)+
722 sizeof(region.y)+
sizeof(length);
723 count=dpc_read(file,length,message);
724 if (count != (MagickOffsetType) length)
727 (void) memcpy(®ion.width,p,
sizeof(region.width));
728 p+=
sizeof(region.width);
729 (void) memcpy(®ion.height,p,
sizeof(region.height));
730 p+=
sizeof(region.height);
731 (void) memcpy(®ion.x,p,
sizeof(region.x));
733 (void) memcpy(®ion.y,p,
sizeof(region.y));
735 (void) memcpy(&length,p,
sizeof(length));
737 q=GetAuthenticPixels(image,region.x,region.y,region.width,region.height,
741 count=dpc_read(file,length,(
unsigned char *) q);
742 if (count != (MagickOffsetType) length)
744 return(SyncAuthenticPixels(image,exception));
747 static HANDLER_RETURN_TYPE DistributePixelCacheClient(
void *socket)
756 status = MagickFalse;
782 session[2*MaxTextExtent];
787 shared_secret=GetPolicyValue(
"cache:shared-secret");
788 if (shared_secret == (
char *) NULL)
789 ThrowFatalException(CacheFatalError,
"shared secret expected");
791 (void) CopyMagickString((
char *) p,shared_secret,MaxTextExtent);
792 p+=strlen(shared_secret);
793 shared_secret=DestroyString(shared_secret);
794 random_info=AcquireRandomInfo();
795 secret=GetRandomKey(random_info,DPCSessionKeyLength);
796 (void) memcpy(p,GetStringInfoDatum(secret),DPCSessionKeyLength);
797 session_key=GetMagickCoreSignature(secret);
798 random_info=DestroyRandomInfo(random_info);
799 exception=AcquireExceptionInfo();
800 registry=NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
801 (
void *(*)(
void *)) NULL,RelinquishImageRegistry);
802 client_socket=(*(
int *) socket);
803 count=dpc_send(client_socket,DPCSessionKeyLength,GetStringInfoDatum(secret));
804 secret=DestroyStringInfo(secret);
805 for (status=MagickFalse; ; )
807 count=dpc_read(client_socket,1,(
unsigned char *) &command);
810 count=dpc_read(client_socket,
sizeof(key),(
unsigned char *) &key);
811 if ((count != (MagickOffsetType)
sizeof(key)) || (key != session_key))
817 status=OpenDistributeCache(registry,client_socket,session_key,
819 count=dpc_send(client_socket,
sizeof(status),(
unsigned char *) &status);
824 status=ReadDistributeCachePixels(registry,client_socket,session_key,
830 status=ReadDistributeCacheIndexes(registry,client_socket,session_key,
836 status=WriteDistributeCachePixels(registry,client_socket,session_key,
842 status=WriteDistributeCacheIndexes(registry,client_socket,session_key,
848 status=DestroyDistributeCache(registry,session_key);
854 if (status == MagickFalse)
859 count=dpc_send(client_socket,
sizeof(status),(
unsigned char *) &status);
860 CLOSE_SOCKET(client_socket);
861 exception=DestroyExceptionInfo(exception);
862 registry=DestroySplayTree(registry);
863 return(HANDLER_RETURN_VALUE);
866 MagickExport
void DistributePixelCacheServer(
const int port,
869 #if defined(MAGICKCORE_HAVE_DISTRIBUTE_CACHE)
871 service[MaxTextExtent];
876 #if defined(MAGICKCORE_THREAD_SUPPORT)
882 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
906 assert(exception->signature == MagickCoreSignature);
907 magick_unreferenced(exception);
908 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
909 NTInitializeWinsock(MagickFalse);
911 (void) memset(&hint,0,
sizeof(hint));
912 hint.ai_family=AF_INET;
913 hint.ai_socktype=SOCK_STREAM;
914 hint.ai_flags=AI_PASSIVE;
915 (void) FormatLocaleString(service,MaxTextExtent,
"%d",port);
916 status=getaddrinfo((
const char *) NULL,service,&hint,&result);
918 ThrowFatalException(CacheFatalError,
"UnableToListen");
919 server_socket=(SOCKET_TYPE) 0;
920 for (p=result; p != (
struct addrinfo *) NULL; p=p->ai_next)
925 server_socket=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
926 if (server_socket == -1)
929 status=setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,
930 CHAR_TYPE_CAST &one,(socklen_t)
sizeof(one));
933 CLOSE_SOCKET(server_socket);
936 status=bind(server_socket,p->ai_addr,(socklen_t) p->ai_addrlen);
939 CLOSE_SOCKET(server_socket);
944 if (p == (
struct addrinfo *) NULL)
945 ThrowFatalException(CacheFatalError,
"UnableToBind");
946 freeaddrinfo(result);
947 status=listen(server_socket,DPCPendingConnections);
949 ThrowFatalException(CacheFatalError,
"UnableToListen");
950 #if defined(MAGICKCORE_THREAD_SUPPORT)
951 pthread_attr_init(&attributes);
961 length=(socklen_t)
sizeof(address);
962 client_socket=accept(server_socket,(
struct sockaddr *) &address,&length);
963 if (client_socket == -1)
964 ThrowFatalException(CacheFatalError,
"UnableToEstablishConnection");
965 #if defined(MAGICKCORE_THREAD_SUPPORT)
966 status=pthread_create(&threads,&attributes,DistributePixelCacheClient,
967 (
void *) &client_socket);
969 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
970 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
971 if (CreateThread(0,0,DistributePixelCacheClient,(
void*) &client_socket,0,
972 &threadID) == (HANDLE) NULL)
973 ThrowFatalException(CacheFatalError,
"UnableToCreateClientThread");
979 magick_unreferenced(port);
980 magick_unreferenced(exception);
981 ThrowFatalException(MissingDelegateError,
"DelegateLibrarySupportNotBuiltIn");
1011 assert(server_info->signature == MagickCoreSignature);
1012 return(server_info->file);
1039 MagickPrivate
const char *GetDistributeCacheHostname(
1043 assert(server_info->signature == MagickCoreSignature);
1044 return(server_info->hostname);
1073 assert(server_info->signature == MagickCoreSignature);
1074 return(server_info->port);
1102 MagickPrivate MagickBooleanType OpenDistributePixelCache(
1112 message[MaxTextExtent],
1119 assert(server_info->signature == MagickCoreSignature);
1120 assert(image != (
Image *) NULL);
1121 assert(image->signature == MagickCoreSignature);
1127 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1128 p+=
sizeof(server_info->session_key);
1129 (void) memcpy(p,&image->storage_class,
sizeof(image->storage_class));
1130 p+=
sizeof(image->storage_class);
1131 (void) memcpy(p,&image->colorspace,
sizeof(image->colorspace));
1132 p+=
sizeof(image->colorspace);
1133 (void) memcpy(p,&image->channels,
sizeof(image->channels));
1134 p+=
sizeof(image->channels);
1135 (void) memcpy(p,&image->columns,
sizeof(image->columns));
1136 p+=
sizeof(image->columns);
1137 (void) memcpy(p,&image->rows,
sizeof(image->rows));
1138 p+=
sizeof(image->rows);
1139 count=dpc_send(server_info->file,p-message,message);
1140 if (count != (MagickOffsetType) (p-message))
1141 return(MagickFalse);
1143 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1144 if (count != (MagickOffsetType)
sizeof(status))
1145 return(MagickFalse);
1182 MagickPrivate MagickOffsetType ReadDistributePixelCacheIndexes(
1184 const MagickSizeType length,
unsigned char *indexes)
1190 message[MaxTextExtent],
1197 assert(server_info->signature == MagickCoreSignature);
1199 assert(indexes != (
unsigned char *) NULL);
1200 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1204 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1205 p+=
sizeof(server_info->session_key);
1206 (void) memcpy(p,®ion->width,
sizeof(region->width));
1207 p+=
sizeof(region->width);
1208 (void) memcpy(p,®ion->height,
sizeof(region->height));
1209 p+=
sizeof(region->height);
1210 (void) memcpy(p,®ion->x,
sizeof(region->x));
1211 p+=
sizeof(region->x);
1212 (void) memcpy(p,®ion->y,
sizeof(region->y));
1213 p+=
sizeof(region->y);
1214 (void) memcpy(p,&length,
sizeof(length));
1216 count=dpc_send(server_info->file,p-message,message);
1217 if (count != (MagickOffsetType) (p-message))
1219 return(dpc_read(server_info->file,length,indexes));
1255 MagickPrivate MagickOffsetType ReadDistributePixelCachePixels(
1257 const MagickSizeType length,
unsigned char *magick_restrict pixels)
1263 message[MaxTextExtent],
1270 assert(server_info->signature == MagickCoreSignature);
1272 assert(pixels != (
unsigned char *) NULL);
1273 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1277 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1278 p+=
sizeof(server_info->session_key);
1279 (void) memcpy(p,®ion->width,
sizeof(region->width));
1280 p+=
sizeof(region->width);
1281 (void) memcpy(p,®ion->height,
sizeof(region->height));
1282 p+=
sizeof(region->height);
1283 (void) memcpy(p,®ion->x,
sizeof(region->x));
1284 p+=
sizeof(region->x);
1285 (void) memcpy(p,®ion->y,
sizeof(region->y));
1286 p+=
sizeof(region->y);
1287 (void) memcpy(p,&length,
sizeof(length));
1289 count=dpc_send(server_info->file,p-message,message);
1290 if (count != (MagickOffsetType) (p-message))
1292 return(dpc_read(server_info->file,length,pixels));
1319 MagickPrivate MagickBooleanType RelinquishDistributePixelCache(
1329 message[MaxTextExtent],
1336 assert(server_info->signature == MagickCoreSignature);
1339 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1340 p+=
sizeof(server_info->session_key);
1341 count=dpc_send(server_info->file,p-message,message);
1342 if (count != (MagickOffsetType) (p-message))
1343 return(MagickFalse);
1345 count=dpc_read(server_info->file,
sizeof(status),(
unsigned char *) &status);
1346 if (count != (MagickOffsetType)
sizeof(status))
1347 return(MagickFalse);
1384 MagickPrivate MagickOffsetType WriteDistributePixelCacheIndexes(
1386 const MagickSizeType length,
const unsigned char *indexes)
1392 message[MaxTextExtent],
1399 assert(server_info->signature == MagickCoreSignature);
1401 assert(indexes != (
unsigned char *) NULL);
1402 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1406 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1407 p+=
sizeof(server_info->session_key);
1408 (void) memcpy(p,®ion->width,
sizeof(region->width));
1409 p+=
sizeof(region->width);
1410 (void) memcpy(p,®ion->height,
sizeof(region->height));
1411 p+=
sizeof(region->height);
1412 (void) memcpy(p,®ion->x,
sizeof(region->x));
1413 p+=
sizeof(region->x);
1414 (void) memcpy(p,®ion->y,
sizeof(region->y));
1415 p+=
sizeof(region->y);
1416 (void) memcpy(p,&length,
sizeof(length));
1418 count=dpc_send(server_info->file,p-message,message);
1419 if (count != (MagickOffsetType) (p-message))
1421 return(dpc_send(server_info->file,length,indexes));
1458 MagickPrivate MagickOffsetType WriteDistributePixelCachePixels(
1460 const MagickSizeType length,
const unsigned char *magick_restrict pixels)
1466 message[MaxTextExtent],
1473 assert(server_info->signature == MagickCoreSignature);
1475 assert(pixels != (
const unsigned char *) NULL);
1476 if (length > (MagickSizeType) MAGICK_SSIZE_MAX)
1480 (void) memcpy(p,&server_info->session_key,
sizeof(server_info->session_key));
1481 p+=
sizeof(server_info->session_key);
1482 (void) memcpy(p,®ion->width,
sizeof(region->width));
1483 p+=
sizeof(region->width);
1484 (void) memcpy(p,®ion->height,
sizeof(region->height));
1485 p+=
sizeof(region->height);
1486 (void) memcpy(p,®ion->x,
sizeof(region->x));
1487 p+=
sizeof(region->x);
1488 (void) memcpy(p,®ion->y,
sizeof(region->y));
1489 p+=
sizeof(region->y);
1490 (void) memcpy(p,&length,
sizeof(length));
1492 count=dpc_send(server_info->file,p-message,message);
1493 if (count != (MagickOffsetType) (p-message))
1495 return(dpc_send(server_info->file,length,pixels));