00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "magick/studio.h"
00044 #include "magick/blob.h"
00045 #include "magick/cache.h"
00046 #include "magick/coder.h"
00047 #include "magick/client.h"
00048 #include "magick/coder.h"
00049 #include "magick/configure.h"
00050 #include "magick/constitute.h"
00051 #include "magick/delegate.h"
00052 #include "magick/draw.h"
00053 #include "magick/exception.h"
00054 #include "magick/exception-private.h"
00055 #include "magick/locale_.h"
00056 #include "magick/log.h"
00057 #include "magick/magic.h"
00058 #include "magick/magick.h"
00059 #include "magick/memory_.h"
00060 #include "magick/mime.h"
00061 #include "magick/module.h"
00062 #if defined(__WINDOWS__)
00063 # include "magick/nt-feature.h"
00064 #endif
00065 #include "magick/random_.h"
00066 #include "magick/registry.h"
00067 #include "magick/resource_.h"
00068 #include "magick/policy.h"
00069 #include "magick/semaphore.h"
00070 #include "magick/signature-private.h"
00071 #include "magick/splay-tree.h"
00072 #include "magick/string_.h"
00073 #include "magick/thread_.h"
00074 #include "magick/thread-private.h"
00075 #include "magick/token.h"
00076 #include "magick/utility.h"
00077 #include "magick/xwindow-private.h"
00078
00079
00080
00081
00082 #if !defined(MAGICKCORE_RETSIGTYPE)
00083 # define MAGICKCORE_RETSIGTYPE void
00084 #endif
00085 #if !defined(SIG_DFL)
00086 # define SIG_DFL ((SignalHandler *) 0)
00087 #endif
00088 #if !defined(SIG_ERR)
00089 # define SIG_ERR ((SignalHandler *) -1)
00090 #endif
00091 #if !defined(SIGMAX)
00092 #define SIGMAX 64
00093 #endif
00094
00095
00096
00097
00098 typedef MAGICKCORE_RETSIGTYPE
00099 SignalHandler(int);
00100
00101
00102
00103
00104 static SemaphoreInfo
00105 *magick_semaphore = (SemaphoreInfo *) NULL;
00106
00107 static SignalHandler
00108 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
00109
00110 static SplayTreeInfo
00111 *magick_list = (SplayTreeInfo *) NULL;
00112
00113 static volatile MagickBooleanType
00114 instantiate_magick = MagickFalse;
00115
00116
00117
00118
00119 static MagickBooleanType
00120 InitializeMagickList(ExceptionInfo *);
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 MagickExport DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
00145 {
00146 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00147 assert(magick_info != (MagickInfo *) NULL);
00148 assert(magick_info->signature == MagickSignature);
00149 return(magick_info->decoder);
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 MagickExport EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
00175 {
00176 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00177 assert(magick_info != (MagickInfo *) NULL);
00178 assert(magick_info->signature == MagickSignature);
00179 return(magick_info->encoder);
00180 }
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 MagickExport MagickBooleanType GetImageMagick(const unsigned char *magick,
00212 const size_t length,char *format)
00213 {
00214 ExceptionInfo
00215 *exception;
00216
00217 MagickBooleanType
00218 status;
00219
00220 register const MagickInfo
00221 *p;
00222
00223 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00224 assert(magick != (const unsigned char *) NULL);
00225 exception=AcquireExceptionInfo();
00226 p=GetMagickInfo("*",exception);
00227 exception=DestroyExceptionInfo(exception);
00228 if (p == (const MagickInfo *) NULL)
00229 return(MagickFalse);
00230 status=MagickFalse;
00231 (void) LockSemaphoreInfo(magick_semaphore);
00232 ResetSplayTreeIterator(magick_list);
00233 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00234 while (p != (const MagickInfo *) NULL)
00235 {
00236 if ((p->magick != (IsImageFormatHandler *) NULL) &&
00237 (p->magick(magick,length) != 0))
00238 {
00239 status=MagickTrue;
00240 (void) CopyMagickString(format,p->name,MaxTextExtent);
00241 break;
00242 }
00243 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00244 }
00245 (void) UnlockSemaphoreInfo(magick_semaphore);
00246 return(status);
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 MagickExport MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
00272 {
00273 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00274 assert(magick_info != (MagickInfo *) NULL);
00275 assert(magick_info->signature == MagickSignature);
00276 return(magick_info->adjoin);
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301 MagickExport MagickBooleanType GetMagickBlobSupport(
00302 const MagickInfo *magick_info)
00303 {
00304 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00305 assert(magick_info != (MagickInfo *) NULL);
00306 assert(magick_info->signature == MagickSignature);
00307 return(magick_info->blob_support);
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 MagickExport const char *GetMagickDescription(const MagickInfo *magick_info)
00333 {
00334 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00335 assert(magick_info != (MagickInfo *) NULL);
00336 assert(magick_info->signature == MagickSignature);
00337 return(magick_info->description);
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363 MagickExport MagickBooleanType GetMagickEndianSupport(
00364 const MagickInfo *magick_info)
00365 {
00366 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00367 assert(magick_info != (MagickInfo *) NULL);
00368 assert(magick_info->signature == MagickSignature);
00369 return(magick_info->endian_support);
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 MagickExport const MagickInfo *GetMagickInfo(const char *name,
00399 ExceptionInfo *exception)
00400 {
00401 register const MagickInfo
00402 *p;
00403
00404 assert(exception != (ExceptionInfo *) NULL);
00405 if ((magick_list == (SplayTreeInfo *) NULL) ||
00406 (instantiate_magick == MagickFalse))
00407 if (InitializeMagickList(exception) == MagickFalse)
00408 return((const MagickInfo *) NULL);
00409 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
00410 {
00411 #if defined(MAGICKCORE_MODULES_SUPPORT)
00412 if (LocaleCompare(name,"*") == 0)
00413 (void) OpenModules(exception);
00414 #endif
00415 (void) LockSemaphoreInfo(magick_semaphore);
00416 ResetSplayTreeIterator(magick_list);
00417 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00418 (void) UnlockSemaphoreInfo(magick_semaphore);
00419 return(p);
00420 }
00421
00422
00423
00424 (void) LockSemaphoreInfo(magick_semaphore);
00425 ResetSplayTreeIterator(magick_list);
00426 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00427 while (p != (const MagickInfo *) NULL)
00428 {
00429 if (LocaleCompare(p->name,name) == 0)
00430 break;
00431 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00432 }
00433 #if defined(MAGICKCORE_MODULES_SUPPORT)
00434 if (p == (const MagickInfo *) NULL)
00435 {
00436 if (*name != '\0')
00437 (void) OpenModule(name,exception);
00438 ResetSplayTreeIterator(magick_list);
00439 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00440 while (p != (const MagickInfo *) NULL)
00441 {
00442 if (LocaleCompare(p->name,name) == 0)
00443 break;
00444 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00445 }
00446 }
00447 #endif
00448 (void) UnlockSemaphoreInfo(magick_semaphore);
00449 return(p);
00450 }
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481 #if defined(__cplusplus) || defined(c_plusplus)
00482 extern "C" {
00483 #endif
00484
00485 static int MagickInfoCompare(const void *x,const void *y)
00486 {
00487 const MagickInfo
00488 **p,
00489 **q;
00490
00491 p=(const MagickInfo **) x,
00492 q=(const MagickInfo **) y;
00493 return(LocaleCompare((*p)->name,(*q)->name));
00494 }
00495
00496 #if defined(__cplusplus) || defined(c_plusplus)
00497 }
00498 #endif
00499
00500 MagickExport const MagickInfo **GetMagickInfoList(const char *pattern,
00501 unsigned long *number_formats,ExceptionInfo *exception)
00502 {
00503 const MagickInfo
00504 **formats;
00505
00506 register const MagickInfo
00507 *p;
00508
00509 register long
00510 i;
00511
00512
00513
00514
00515 assert(pattern != (char *) NULL);
00516 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
00517 assert(number_formats != (unsigned long *) NULL);
00518 *number_formats=0;
00519 p=GetMagickInfo("*",exception);
00520 if (p == (const MagickInfo *) NULL)
00521 return((const MagickInfo **) NULL);
00522 formats=(const MagickInfo **) AcquireQuantumMemory((size_t)
00523 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
00524 if (formats == (const MagickInfo **) NULL)
00525 return((const MagickInfo **) NULL);
00526
00527
00528
00529 (void) LockSemaphoreInfo(magick_semaphore);
00530 ResetSplayTreeIterator(magick_list);
00531 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00532 for (i=0; p != (const MagickInfo *) NULL; )
00533 {
00534 if ((p->stealth == MagickFalse) &&
00535 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
00536 formats[i++]=p;
00537 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00538 }
00539 (void) UnlockSemaphoreInfo(magick_semaphore);
00540 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare);
00541 formats[i]=(MagickInfo *) NULL;
00542 *number_formats=(unsigned long) i;
00543 return(formats);
00544 }
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574 #if defined(__cplusplus) || defined(c_plusplus)
00575 extern "C" {
00576 #endif
00577
00578 static int MagickCompare(const void *x,const void *y)
00579 {
00580 register const char
00581 **p,
00582 **q;
00583
00584 p=(const char **) x;
00585 q=(const char **) y;
00586 return(LocaleCompare(*p,*q));
00587 }
00588
00589 #if defined(__cplusplus) || defined(c_plusplus)
00590 }
00591 #endif
00592
00593 MagickExport char **GetMagickList(const char *pattern,
00594 unsigned long *number_formats,ExceptionInfo *exception)
00595 {
00596 char
00597 **formats;
00598
00599 register const MagickInfo
00600 *p;
00601
00602 register long
00603 i;
00604
00605
00606
00607
00608 assert(pattern != (char *) NULL);
00609 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
00610 assert(number_formats != (unsigned long *) NULL);
00611 *number_formats=0;
00612 p=GetMagickInfo("*",exception);
00613 if (p == (const MagickInfo *) NULL)
00614 return((char **) NULL);
00615 formats=(char **) AcquireQuantumMemory((size_t)
00616 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
00617 if (formats == (char **) NULL)
00618 return((char **) NULL);
00619 (void) LockSemaphoreInfo(magick_semaphore);
00620 ResetSplayTreeIterator(magick_list);
00621 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00622 for (i=0; p != (const MagickInfo *) NULL; )
00623 {
00624 if ((p->stealth == MagickFalse) &&
00625 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
00626 formats[i++]=ConstantString(p->name);
00627 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
00628 }
00629 (void) UnlockSemaphoreInfo(magick_semaphore);
00630 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare);
00631 formats[i]=(char *) NULL;
00632 *number_formats=(unsigned long) i;
00633 return(formats);
00634 }
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658 MagickExport MagickBooleanType GetMagickRawSupport(
00659 const MagickInfo *magick_info)
00660 {
00661 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00662 assert(magick_info != (MagickInfo *) NULL);
00663 assert(magick_info->signature == MagickSignature);
00664 return(magick_info->raw);
00665 }
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690 MagickExport MagickBooleanType GetMagickSeekableStream(
00691 const MagickInfo *magick_info)
00692 {
00693 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00694 assert(magick_info != (MagickInfo *) NULL);
00695 assert(magick_info->signature == MagickSignature);
00696 return(magick_info->seekable_stream);
00697 }
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 MagickExport MagickStatusType GetMagickThreadSupport(
00722 const MagickInfo *magick_info)
00723 {
00724 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00725 assert(magick_info != (MagickInfo *) NULL);
00726 assert(magick_info->signature == MagickSignature);
00727 return(magick_info->thread_support);
00728 }
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753 static void *DestroyMagickNode(void *magick_info)
00754 {
00755 register MagickInfo
00756 *p;
00757
00758 p=(MagickInfo *) magick_info;
00759 if (p->name != (char *) NULL)
00760 p->name=DestroyString(p->name);
00761 if (p->description != (char *) NULL)
00762 p->description=DestroyString(p->description);
00763 if (p->version != (char *) NULL)
00764 p->version=DestroyString(p->version);
00765 if (p->note != (char *) NULL)
00766 p->note=DestroyString(p->note);
00767 if (p->module != (char *) NULL)
00768 p->module=DestroyString(p->module);
00769 return(RelinquishMagickMemory(p));
00770 }
00771
00772 static MagickBooleanType InitializeMagickList(ExceptionInfo *exception)
00773 {
00774 (void) exception;
00775 if ((magick_list == (SplayTreeInfo *) NULL) &&
00776 (instantiate_magick == MagickFalse))
00777 {
00778 if (magick_semaphore == (SemaphoreInfo *) NULL)
00779 AcquireSemaphoreInfo(&magick_semaphore);
00780 (void) LockSemaphoreInfo(magick_semaphore);
00781 if ((magick_list == (SplayTreeInfo *) NULL) &&
00782 (instantiate_magick == MagickFalse))
00783 {
00784 MagickBooleanType
00785 status;
00786
00787 MagickInfo
00788 *magick_info;
00789
00790 magick_list=NewSplayTree(CompareSplayTreeString,
00791 (void *(*)(void *)) NULL,DestroyMagickNode);
00792 if (magick_list == (SplayTreeInfo *) NULL)
00793 ThrowFatalException(ResourceLimitFatalError,
00794 "MemoryAllocationFailed");
00795 magick_info=SetMagickInfo("ephemeral");
00796 magick_info->stealth=MagickTrue;
00797 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
00798 if (status == MagickFalse)
00799 ThrowFatalException(ResourceLimitFatalError,
00800 "MemoryAllocationFailed");
00801 magick_info=SetMagickInfo("clipmask");
00802 magick_info->stealth=MagickTrue;
00803 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
00804 if (status == MagickFalse)
00805 {
00806 char
00807 *message;
00808
00809 message=GetExceptionMessage(errno);
00810 ThrowFatalException(ResourceLimitFatalError,
00811 "MemoryAllocationFailed");
00812 message=DestroyString(message);
00813 }
00814 #if defined(MAGICKCORE_MODULES_SUPPORT)
00815 (void) GetModuleInfo((char *) NULL,exception);
00816 #endif
00817 #if !defined(MAGICKCORE_BUILD_MODULES)
00818 RegisterStaticModules();
00819 #endif
00820 instantiate_magick=MagickTrue;
00821 }
00822 (void) UnlockSemaphoreInfo(magick_semaphore);
00823 }
00824 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
00825 }
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850 MagickExport MagickBooleanType IsMagickConflict(const char *magick)
00851 {
00852 const DelegateInfo
00853 *delegate_info;
00854
00855 const MagickInfo
00856 *magick_info;
00857
00858 ExceptionInfo
00859 *exception;
00860
00861 assert(magick != (char *) NULL);
00862 exception=AcquireExceptionInfo();
00863 magick_info=GetMagickInfo(magick,exception);
00864 delegate_info=GetDelegateInfo(magick,(char *) NULL,exception);
00865 if (delegate_info == (const DelegateInfo *) NULL)
00866 delegate_info=GetDelegateInfo((char *) NULL,magick,exception);
00867 exception=DestroyExceptionInfo(exception);
00868 if ((magick_info == (const MagickInfo *) NULL) &&
00869 (delegate_info == (const DelegateInfo *) NULL))
00870 return(MagickTrue);
00871 #if defined(macintosh)
00872 return(MACIsMagickConflict(magick));
00873 #elif defined(vms)
00874 return(VMSIsMagickConflict(magick));
00875 #elif defined(__WINDOWS__)
00876 return(NTIsMagickConflict(magick));
00877 #else
00878 return(MagickFalse);
00879 #endif
00880 }
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906 MagickExport MagickBooleanType ListMagickInfo(FILE *file,
00907 ExceptionInfo *exception)
00908 {
00909 const MagickInfo
00910 **magick_info;
00911
00912 long
00913 j;
00914
00915 register long
00916 i;
00917
00918 unsigned long
00919 number_formats;
00920
00921 if (file == (FILE *) NULL)
00922 file=stdout;
00923 magick_info=GetMagickInfoList("*",&number_formats,exception);
00924 if (magick_info == (const MagickInfo **) NULL)
00925 return(MagickFalse);
00926 ClearMagickException(exception);
00927 #if !defined(MAGICKCORE_MODULES_SUPPORT)
00928 (void) fprintf(file," Format Mode Description\n");
00929 #else
00930 (void) fprintf(file," Format Module Mode Description\n");
00931 #endif
00932 (void) fprintf(file,"--------------------------------------------------------"
00933 "-----------------------\n");
00934 for (i=0; i < (long) number_formats; i++)
00935 {
00936 if (magick_info[i]->stealth != MagickFalse)
00937 continue;
00938 (void) fprintf(file,"%9s%c ",magick_info[i]->name != (char *) NULL ?
00939 magick_info[i]->name : "",
00940 magick_info[i]->blob_support != MagickFalse ? '*' : ' ');
00941 #if defined(MAGICKCORE_MODULES_SUPPORT)
00942 {
00943 char
00944 module[MaxTextExtent];
00945
00946 *module='\0';
00947 if (magick_info[i]->module != (char *) NULL)
00948 (void) CopyMagickString(module,magick_info[i]->module,MaxTextExtent);
00949 (void) ConcatenateMagickString(module," ",MaxTextExtent);
00950 module[9]='\0';
00951 (void) fprintf(file,"%9s ",module);
00952 }
00953 #endif
00954 (void) fprintf(file,"%c%c%c ",magick_info[i]->decoder ? 'r' : '-',
00955 magick_info[i]->encoder ? 'w' : '-',magick_info[i]->encoder != NULL &&
00956 magick_info[i]->adjoin != MagickFalse ? '+' : '-');
00957 if (magick_info[i]->description != (char *) NULL)
00958 (void) fprintf(file," %s",magick_info[i]->description);
00959 if (magick_info[i]->version != (char *) NULL)
00960 (void) fprintf(file," (%s)",magick_info[i]->version);
00961 (void) fprintf(file,"\n");
00962 if (magick_info[i]->note != (char *) NULL)
00963 {
00964 char
00965 **text;
00966
00967 text=StringToList(magick_info[i]->note);
00968 if (text != (char **) NULL)
00969 {
00970 for (j=0; text[j] != (char *) NULL; j++)
00971 {
00972 (void) fprintf(file," %s\n",text[j]);
00973 text[j]=DestroyString(text[j]);
00974 }
00975 text=(char **) RelinquishMagickMemory(text);
00976 }
00977 }
00978 }
00979 (void) fprintf(file,"\n* native blob support\n");
00980 (void) fprintf(file,"r read support\n");
00981 (void) fprintf(file,"w write support\n");
00982 (void) fprintf(file,"+ support for multiple images\n");
00983 (void) fflush(file);
00984 magick_info=(const MagickInfo **) RelinquishMagickMemory((void *)
00985 magick_info);
00986 return(MagickTrue);
00987 }
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009 MagickExport MagickBooleanType IsMagickInstantiated(void)
01010 {
01011 return(instantiate_magick);
01012 }
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032 MagickExport MagickBooleanType MagickComponentGenesis(void)
01033 {
01034 AcquireSemaphoreInfo(&magick_semaphore);
01035 return(MagickTrue);
01036 }
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056 MagickExport void MagickComponentTerminus(void)
01057 {
01058 if (magick_semaphore == (SemaphoreInfo *) NULL)
01059 AcquireSemaphoreInfo(&magick_semaphore);
01060 (void) LockSemaphoreInfo(magick_semaphore);
01061 if (magick_list != (SplayTreeInfo *) NULL)
01062 magick_list=DestroySplayTree(magick_list);
01063 instantiate_magick=MagickFalse;
01064 (void) UnlockSemaphoreInfo(magick_semaphore);
01065 DestroySemaphoreInfo(&magick_semaphore);
01066 }
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095 static SignalHandler *SetMagickSignalHandler(int signal_number,
01096 SignalHandler *handler)
01097 {
01098 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
01099 int
01100 status;
01101
01102 sigset_t
01103 mask;
01104
01105 struct sigaction
01106 action,
01107 previous_action;
01108
01109 sigemptyset(&mask);
01110 sigaddset(&mask,signal_number);
01111 sigprocmask(SIG_BLOCK,&mask,NULL);
01112 action.sa_mask=mask;
01113 action.sa_handler=handler;
01114 action.sa_flags=0;
01115 #if defined(SA_INTERRUPT)
01116 action.sa_flags|=SA_INTERRUPT;
01117 #endif
01118 status=sigaction(signal_number,&action,&previous_action);
01119 if (status < 0)
01120 return(SIG_ERR);
01121 sigprocmask(SIG_UNBLOCK,&mask,NULL);
01122 return(previous_action.sa_handler);
01123 #else
01124 return(signal(signal_number,handler));
01125 #endif
01126 }
01127
01128 static void MagickSignalHandler(int signal_number)
01129 {
01130 #if !defined(MAGICKCORE_HAVE_SIGACTION)
01131 (void) signal(signal_number,SIG_IGN);
01132 #endif
01133 AsynchronousResourceComponentTerminus();
01134 instantiate_magick=MagickFalse;
01135 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
01136 #if defined(MAGICKCORE_HAVE_RAISE)
01137 if (signal_handlers[signal_number] != MagickSignalHandler)
01138 raise(signal_number);
01139 #endif
01140 #if !defined(MAGICKCORE_HAVE__EXIT)
01141 exit(signal_number);
01142 #else
01143 #if defined(SIGHUP)
01144 if (signal_number == SIGHUP)
01145 exit(signal_number);
01146 #endif
01147 #if defined(SIGINT) && !defined(__WINDOWS__)
01148 if (signal_number == SIGINT)
01149 exit(signal_number);
01150 #endif
01151 #if defined(SIGTERM)
01152 if (signal_number == SIGTERM)
01153 exit(signal_number);
01154 #endif
01155 _exit(signal_number);
01156 #endif
01157 }
01158
01159 static SignalHandler *RegisterMagickSignalHandler(int signal_number)
01160 {
01161 SignalHandler
01162 *handler;
01163
01164 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
01165 if (handler == SIG_ERR)
01166 return(handler);
01167 if (handler != SIG_DFL)
01168 handler=SetMagickSignalHandler(signal_number,handler);
01169 else
01170 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
01171 "Register handler for signal: %d",signal_number);
01172 return(handler);
01173 }
01174
01175 MagickExport void MagickCoreGenesis(const char *path,
01176 const MagickBooleanType establish_signal_handlers)
01177 {
01178 char
01179 *events,
01180 execution_path[MaxTextExtent],
01181 filename[MaxTextExtent];
01182
01183
01184
01185
01186 (void) setlocale(LC_ALL,"");
01187 (void) setlocale(LC_NUMERIC,"C");
01188 (void) SemaphoreComponentGenesis();
01189 (void) LogComponentGenesis();
01190 (void) LocaleComponentGenesis();
01191 (void) RandomComponentGenesis();
01192 events=GetEnvironmentValue("MAGICK_DEBUG");
01193 if (events != (char *) NULL)
01194 {
01195 (void) SetLogEventMask(events);
01196 events=DestroyString(events);
01197 }
01198 #if defined(__WINDOWS__)
01199 #if defined(_DEBUG) && !defined(__BORLANDC__) && !defined(__MINGW32__)
01200 if (IsEventLogging() != MagickFalse)
01201 {
01202 int
01203 debug;
01204
01205 debug=_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
01206 debug|=_CRTDBG_CHECK_ALWAYS_DF |_CRTDBG_DELAY_FREE_MEM_DF |
01207 _CRTDBG_LEAK_CHECK_DF;
01208 if (0)
01209 {
01210 debug=_CrtSetDbgFlag(debug);
01211 _ASSERTE(_CrtCheckMemory());
01212 }
01213 }
01214 #endif
01215 #endif
01216
01217
01218
01219 (void) GetExecutionPath(execution_path,MaxTextExtent);
01220 if ((path != (const char *) NULL) && (*path != '\0'))
01221 (void) CopyMagickString(execution_path,path,MaxTextExtent);
01222 GetPathComponent(execution_path,TailPath,filename);
01223 (void) SetClientName(filename);
01224 GetPathComponent(execution_path,HeadPath,execution_path);
01225 (void) SetClientPath(execution_path);
01226 if (establish_signal_handlers != MagickFalse)
01227 {
01228
01229
01230
01231 #if defined(SIGABRT)
01232 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
01233 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
01234 #endif
01235 #if defined(SIGFPE)
01236 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
01237 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
01238 #endif
01239 #if defined(SIGHUP)
01240 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
01241 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
01242 #endif
01243 #if defined(SIGINT) && !defined(__WINDOWS__)
01244 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
01245 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
01246 #endif
01247 #if defined(SIGQUIT)
01248 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
01249 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
01250 #endif
01251 #if defined(SIGTERM)
01252 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
01253 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
01254 #endif
01255 #if defined(SIGXCPU)
01256 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
01257 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
01258 #endif
01259 #if defined(SIGXFSZ)
01260 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
01261 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
01262 #endif
01263 }
01264
01265
01266
01267 (void) ConfigureComponentGenesis();
01268 (void) PolicyComponentGenesis();
01269 (void) CacheComponentGenesis();
01270 (void) RegistryComponentGenesis();
01271 (void) ResourceComponentGenesis();
01272 (void) CoderComponentGenesis();
01273 (void) MagickComponentGenesis();
01274 #if defined(MAGICKCORE_MODULES_SUPPORT)
01275 (void) ModuleComponentGenesis();
01276 #endif
01277 (void) DelegateComponentGenesis();
01278 (void) MagicComponentGenesis();
01279 (void) ColorComponentGenesis();
01280 (void) TypeComponentGenesis();
01281 (void) MimeComponentGenesis();
01282 (void) ConstituteComponentGenesis();
01283 (void) XComponentGenesis();
01284 }
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304 MagickExport void MagickCoreTerminus(void)
01305 {
01306 #if defined(MAGICKCORE_X11_DELEGATE)
01307 XComponentTerminus();
01308 #endif
01309 ConstituteComponentTerminus();
01310 MimeComponentTerminus();
01311 TypeComponentTerminus();
01312 ColorComponentTerminus();
01313 #if defined(__WINDOWS__)
01314 NTGhostscriptUnLoadDLL();
01315 #endif
01316 MagicComponentTerminus();
01317 DelegateComponentTerminus();
01318 MagickComponentTerminus();
01319 #if !defined(MAGICKCORE_BUILD_MODULES)
01320 UnregisterStaticModules();
01321 #endif
01322 #if defined(MAGICKCORE_MODULES_SUPPORT)
01323 ModuleComponentTerminus();
01324 #endif
01325 CoderComponentTerminus();
01326 ResourceComponentTerminus();
01327 RegistryComponentTerminus();
01328 CacheComponentTerminus();
01329 PolicyComponentTerminus();
01330 ConfigureComponentTerminus();
01331 RandomComponentTerminus();
01332 LocaleComponentTerminus();
01333 LogComponentTerminus();
01334 SemaphoreComponentTerminus();
01335 instantiate_magick=MagickFalse;
01336 }
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364 MagickExport MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
01365 {
01366 MagickBooleanType
01367 status;
01368
01369
01370
01371
01372 assert(magick_info != (MagickInfo *) NULL);
01373 assert(magick_info->signature == MagickSignature);
01374 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",magick_info->name);
01375 if (magick_list == (SplayTreeInfo *) NULL)
01376 return((MagickInfo *) NULL);
01377 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
01378 if (status == MagickFalse)
01379 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
01380 return(magick_info);
01381 }
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410 MagickExport MagickInfo *SetMagickInfo(const char *name)
01411 {
01412 MagickInfo
01413 *magick_info;
01414
01415 assert(name != (const char *) NULL);
01416 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
01417 magick_info=(MagickInfo *) AcquireMagickMemory(sizeof(*magick_info));
01418 if (magick_info == (MagickInfo *) NULL)
01419 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
01420 (void) ResetMagickMemory(magick_info,0,sizeof(*magick_info));
01421 magick_info->name=ConstantString(name);
01422 magick_info->adjoin=MagickTrue;
01423 magick_info->blob_support=MagickTrue;
01424 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
01425 EncoderThreadSupport);
01426 magick_info->signature=MagickSignature;
01427 return(magick_info);
01428 }
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454 MagickExport MagickBooleanType UnregisterMagickInfo(const char *name)
01455 {
01456 register const MagickInfo
01457 *p;
01458
01459 MagickBooleanType
01460 status;
01461
01462 assert(name != (const char *) NULL);
01463 if (magick_list == (SplayTreeInfo *) NULL)
01464 return(MagickFalse);
01465 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
01466 return(MagickFalse);
01467 (void) LockSemaphoreInfo(magick_semaphore);
01468 ResetSplayTreeIterator(magick_list);
01469 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
01470 while (p != (const MagickInfo *) NULL)
01471 {
01472 if (LocaleCompare(p->name,name) == 0)
01473 break;
01474 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
01475 }
01476 status=DeleteNodeByValueFromSplayTree(magick_list,p);
01477 (void) UnlockSemaphoreInfo(magick_semaphore);
01478 return(status);
01479 }