/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % SSSSS TTTTT AAA TTTTT IIIII CCCC % % SS T A A T I C % % SSS T AAAAA T I C % % SS T A A T I C % % SSSSS T A A T IIIII CCCC % % % % % % MagickCore Static Methods % % % % Software Design % % Cristy % % March 2000 % % % % % % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % % obtain a copy of the License at % % % % https://imagemagick.org/script/license.php % % % % Unless required by applicable law or agreed to in writing, software % % distributed under the License is distributed on an "AS IS" BASIS, % % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % % See the License for the specific language governing permissions and % % limitations under the License. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % */ /* Include declarations. */ #include "MagickCore/studio.h" #include "MagickCore/coder.h" #include "MagickCore/exception-private.h" #include "MagickCore/image.h" #include "MagickCore/module.h" #include "MagickCore/policy.h" #include "MagickCore/static.h" #include "MagickCore/string_.h" #include "coders/coders.h" /* Define declarations. */ #define AddMagickCoder(coder) { #coder, MagickFalse, \ Register ## coder ## Image, Unregister ## coder ## Image }, /* ImageMagick module stub. */ ModuleExport size_t RegisterUndefinedImage(void) { return(MagickImageCoderSignature); } ModuleExport void UnregisterUndefinedImage(void) { } /* ImageMagick modules. */ static struct { const char *module; MagickBooleanType registered; size_t (*register_module)(void); void (*unregister_module)(void); } MagickModules[] = { #if !defined(MAGICKCORE_BUILD_MODULES) #include "coders/coders-list.h" #endif { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage } }; /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % I n v o k e S t a t i c I m a g e F i l t e r % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % InvokeStaticImageFilter() invokes a static image filter. % % The format of the InvokeStaticImageFilter method is: % % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image, % const int argc,const char **argv) % % A description of each parameter follows: % % o tag: the module tag. % % o image: the image. % % o argc: the number of elements in the argument vector. % % o argv: A text array containing the command line arguments. % % o argv: A text array containing the command line arguments. % % o exception: return any errors or warnings in this structure. % */ #if defined(MAGICKCORE_MODULES_SUPPORT) MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag, Image **image,const int argc,const char **argv,ExceptionInfo *exception) { PolicyRights rights; assert(image != (Image **) NULL); assert((*image)->signature == MagickCoreSignature); if ((*image)->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename); rights=ReadPolicyRights; if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse) { errno=EPERM; (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, "NotAuthorized","`%s'",tag); return(MagickFalse); } #if defined(MAGICKCORE_MODULES_SUPPORT) (void) tag; (void) argc; (void) argv; (void) exception; #else { extern size_t analyzeImage(Image **,const int,char **,ExceptionInfo *); ImageFilterHandler *image_filter; image_filter=(ImageFilterHandler *) NULL; if (LocaleCompare("analyze",tag) == 0) image_filter=(ImageFilterHandler *) analyzeImage; if (image_filter == (ImageFilterHandler *) NULL) (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, "UnableToLoadModule","`%s'",tag); else { size_t signature; if ((*image)->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), "Invoking \"%s\" static image filter",tag); signature=image_filter(image,argc,argv,exception); if ((*image)->debug != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(),"\"%s\" completes", tag); if (signature != MagickImageFilterSignature) { (void) ThrowMagickException(exception,GetMagickModule(),ModuleError, "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag, (unsigned long) signature,(unsigned long) MagickImageFilterSignature); return(MagickFalse); } } } #endif return(MagickTrue); } #endif /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % R e g i s t e r S t a t i c M o d u l e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % RegisterStaticModule() statically registers a module. % % The format of the RegisterStaticModule method is: % % MagickBooleanType RegisterStaticModule(const char module, % ExceptionInfo *exception) % % A description of each parameter follows: % % o module: the want to register. % % o exception: return any errors or warnings in this structure. % */ MagickExport MagickBooleanType RegisterStaticModule(const char *module, ExceptionInfo *exception) { char module_name[MagickPathExtent]; PolicyRights rights; const CoderInfo *p; size_t extent; ssize_t i; /* Assign module name from alias. */ assert(module != (const char *) NULL); rights=ReadPolicyRights; if (IsRightsAuthorized(ModulePolicyDomain,rights,module) == MagickFalse) { errno=EPERM; (void) ThrowMagickException(exception,GetMagickModule(),PolicyError, "NotAuthorized","`%s'",module); return(MagickFalse); } (void) CopyMagickString(module_name,module,MagickPathExtent); p=GetCoderInfo(module,exception); if (p != (CoderInfo *) NULL) (void) CopyMagickString(module_name,p->name,MagickPathExtent); extent=sizeof(MagickModules)/sizeof(MagickModules[0]); for (i=0; i < (ssize_t) extent; i++) if (LocaleCompare(MagickModules[i].module,module_name) == 0) { if (MagickModules[i].registered == MagickFalse) { (void) (MagickModules[i].register_module)(); MagickModules[i].registered=MagickTrue; } return(MagickTrue); } return(MagickFalse); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % R e g i s t e r S t a t i c M o d u l e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % RegisterStaticModules() statically registers all the available module % handlers. % % The format of the RegisterStaticModules method is: % % (void) RegisterStaticModules(void) % */ MagickExport void RegisterStaticModules(void) { size_t extent; ssize_t i; extent=sizeof(MagickModules)/sizeof(MagickModules[0]); for (i=0; i < (ssize_t) extent; i++) { if (MagickModules[i].registered == MagickFalse) { (void) (MagickModules[i].register_module)(); MagickModules[i].registered=MagickTrue; } } } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % U n r e g i s t e r S t a t i c M o d u l e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % UnregisterStaticModule() statically unregisters the named module. % % The format of the UnregisterStaticModule method is: % % MagickBooleanType UnregisterStaticModule(const char *module) % % A description of each parameter follows: % % o module: the module we want to unregister. % */ MagickExport MagickBooleanType UnregisterStaticModule(const char *module) { size_t extent; ssize_t i; extent=sizeof(MagickModules)/sizeof(MagickModules[0]); for (i=0; i < (ssize_t) extent; i++) if (LocaleCompare(MagickModules[i].module,module) == 0) { if (MagickModules[i].registered != MagickFalse) { (MagickModules[i].unregister_module)(); MagickModules[i].registered=MagickFalse; } return(MagickTrue); } return(MagickFalse); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % U n r e g i s t e r S t a t i c M o d u l e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % UnregisterStaticModules() statically unregisters all the available module % handlers. % % The format of the UnregisterStaticModules method is: % % UnregisterStaticModules(void) % */ MagickExport void UnregisterStaticModules(void) { size_t extent; ssize_t i; extent=sizeof(MagickModules)/sizeof(MagickModules[0]); for (i=0; i < (ssize_t) extent; i++) { if (MagickModules[i].registered != MagickFalse) { (MagickModules[i].unregister_module)(); MagickModules[i].registered=MagickFalse; } } }