blob: 3f43ada2675d9ff3582958c4ccbe9ee0254cd58f [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% SSSSS TTTTT AAA TTTTT IIIII CCCC %
7% SS T A A T I C %
8% SSS T AAAAA T I C %
9% SS T A A T I C %
10% SSSSS T A A T IIIII CCCC %
11% %
12% %
13% MagickCore Static Methods %
14% %
15% Software Design %
cristyde984cd2013-12-01 14:49:27 +000016% Cristy %
cristy3ed852e2009-09-05 21:47:34 +000017% March 2000 %
18% %
19% %
Cristyd8420112021-01-01 14:52:00 -050020% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% dedicated to making software imaging solutions freely available. %
22% %
23% You may not use this file except in compliance with the License. You may %
24% obtain a copy of the License at %
25% %
Cristy9ddfcca2018-09-09 19:46:34 -040026% https://imagemagick.org/script/license.php %
cristy3ed852e2009-09-05 21:47:34 +000027% %
28% Unless required by applicable law or agreed to in writing, software %
29% distributed under the License is distributed on an "AS IS" BASIS, %
30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31% See the License for the specific language governing permissions and %
32% limitations under the License. %
33% %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37%
38*/
Cristy3c49d7c2018-10-07 09:56:28 -040039
cristy3ed852e2009-09-05 21:47:34 +000040/*
41 Include declarations.
42*/
cristy4c08aed2011-07-01 19:47:50 +000043#include "MagickCore/studio.h"
Cristy2221db32018-01-27 19:07:45 -050044#include "MagickCore/coder.h"
cristy4c08aed2011-07-01 19:47:50 +000045#include "MagickCore/exception-private.h"
46#include "MagickCore/image.h"
47#include "MagickCore/module.h"
48#include "MagickCore/policy.h"
49#include "MagickCore/static.h"
50#include "MagickCore/string_.h"
Dirk Lemstra7903f952018-10-04 21:55:17 +020051#include "coders/coders.h"
Cristy3c49d7c2018-10-07 09:56:28 -040052
Dirk Lemstra7903f952018-10-04 21:55:17 +020053/*
54 Define declarations.
55*/
Dirk Lemstradee4d662018-10-06 17:43:14 +020056#define AddMagickCoder(coder) { #coder, MagickFalse, \
Dirk Lemstra7903f952018-10-04 21:55:17 +020057 Register ## coder ## Image, Unregister ## coder ## Image },
Cristy3c49d7c2018-10-07 09:56:28 -040058
Cristy0ea771d2018-01-28 09:03:48 -050059/*
60 ImageMagick module stub.
61*/
62ModuleExport size_t RegisterUndefinedImage(void)
63{
64 return(MagickImageCoderSignature);
65}
66
67ModuleExport void UnregisterUndefinedImage(void)
68{
69}
Cristy3c49d7c2018-10-07 09:56:28 -040070
Cristy62a2a482018-01-28 08:39:43 -050071/*
72 ImageMagick modules.
73*/
Cristy2221db32018-01-27 19:07:45 -050074static struct
Cristydbfbc2a2018-01-01 08:08:24 -050075{
Cristyc733b9c2018-01-27 12:46:37 -050076 const char
Cristy2221db32018-01-27 19:07:45 -050077 *module;
Cristydbfbc2a2018-01-01 08:08:24 -050078
Cristy2221db32018-01-27 19:07:45 -050079 MagickBooleanType
80 registered;
81
Cristyb9eb8852018-02-10 15:25:04 -050082 size_t
Cristydbfbc2a2018-01-01 08:08:24 -050083 (*register_module)(void);
84
Cristyb9eb8852018-02-10 15:25:04 -050085 void
Cristydbfbc2a2018-01-01 08:08:24 -050086 (*unregister_module)(void);
Cristy3c49d7c2018-10-07 09:56:28 -040087} MagickModules[] = {
Cristy72ab7762018-02-21 20:44:49 -050088#if !defined(MAGICKCORE_BUILD_MODULES)
Dirk Lemstra7903f952018-10-04 21:55:17 +020089 #include "coders/coders-list.h"
Cristyd93c63e2018-02-21 20:31:33 -050090#endif
Cristy0ea771d2018-01-28 09:03:48 -050091 { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage }
Cristydbfbc2a2018-01-01 08:08:24 -050092};
Cristy3c49d7c2018-10-07 09:56:28 -040093
cristy3ed852e2009-09-05 21:47:34 +000094/*
95%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96% %
97% %
98% %
99% I n v o k e S t a t i c I m a g e F i l t e r %
100% %
101% %
102% %
103%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104%
105% InvokeStaticImageFilter() invokes a static image filter.
106%
107% The format of the InvokeStaticImageFilter method is:
108%
109% MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image,
110% const int argc,const char **argv)
111%
112% A description of each parameter follows:
113%
114% o tag: the module tag.
115%
116% o image: the image.
117%
118% o argc: the number of elements in the argument vector.
119%
120% o argv: A text array containing the command line arguments.
121%
122% o argv: A text array containing the command line arguments.
123%
124% o exception: return any errors or warnings in this structure.
125%
126*/
127#if defined(MAGICKCORE_MODULES_SUPPORT)
128MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag,
129 Image **image,const int argc,const char **argv,ExceptionInfo *exception)
130{
131 PolicyRights
132 rights;
133
134 assert(image != (Image **) NULL);
cristye1c94d92015-06-28 12:16:33 +0000135 assert((*image)->signature == MagickCoreSignature);
cristy3ed852e2009-09-05 21:47:34 +0000136 if ((*image)->debug != MagickFalse)
137 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
138 rights=ReadPolicyRights;
139 if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse)
140 {
cristya9197f62010-01-12 02:23:34 +0000141 errno=EPERM;
cristy3ed852e2009-09-05 21:47:34 +0000142 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
cristyefe601c2013-01-05 17:51:12 +0000143 "NotAuthorized","`%s'",tag);
cristy3ed852e2009-09-05 21:47:34 +0000144 return(MagickFalse);
145 }
Cristy9a772e82018-01-31 11:23:07 -0500146#if defined(MAGICKCORE_MODULES_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000147 (void) tag;
148 (void) argc;
149 (void) argv;
150 (void) exception;
151#else
152 {
cristybb503372010-05-27 20:51:26 +0000153 extern size_t
cristya0b81c32010-01-22 02:54:33 +0000154 analyzeImage(Image **,const int,char **,ExceptionInfo *);
cristy3ed852e2009-09-05 21:47:34 +0000155
156 ImageFilterHandler
157 *image_filter;
158
159 image_filter=(ImageFilterHandler *) NULL;
160 if (LocaleCompare("analyze",tag) == 0)
cristyc4c8d132010-01-07 01:58:38 +0000161 image_filter=(ImageFilterHandler *) analyzeImage;
cristya6de29a2010-06-30 14:34:26 +0000162 if (image_filter == (ImageFilterHandler *) NULL)
163 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
cristyefe601c2013-01-05 17:51:12 +0000164 "UnableToLoadModule","`%s'",tag);
cristya6de29a2010-06-30 14:34:26 +0000165 else
cristy3ed852e2009-09-05 21:47:34 +0000166 {
cristybb503372010-05-27 20:51:26 +0000167 size_t
cristy3ed852e2009-09-05 21:47:34 +0000168 signature;
169
170 if ((*image)->debug != MagickFalse)
171 (void) LogMagickEvent(CoderEvent,GetMagickModule(),
172 "Invoking \"%s\" static image filter",tag);
173 signature=image_filter(image,argc,argv,exception);
174 if ((*image)->debug != MagickFalse)
175 (void) LogMagickEvent(CoderEvent,GetMagickModule(),"\"%s\" completes",
176 tag);
177 if (signature != MagickImageFilterSignature)
178 {
179 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
anthonye5b39652012-04-21 05:37:29 +0000180 "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
cristyb65b3302010-05-29 16:58:33 +0000181 (unsigned long) signature,(unsigned long)
cristy3ed852e2009-09-05 21:47:34 +0000182 MagickImageFilterSignature);
183 return(MagickFalse);
184 }
185 }
186 }
187#endif
188 return(MagickTrue);
189}
190#endif
Cristy3c49d7c2018-10-07 09:56:28 -0400191
cristy3ed852e2009-09-05 21:47:34 +0000192/*
193%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
194% %
195% %
196% %
Cristy2221db32018-01-27 19:07:45 -0500197% R e g i s t e r S t a t i c M o d u l e %
198% %
199% %
200% %
201%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
202%
203% RegisterStaticModule() statically registers a module.
204%
205% The format of the RegisterStaticModule method is:
206%
Cristy62a2a482018-01-28 08:39:43 -0500207% MagickBooleanType RegisterStaticModule(const char module,
Cristy2221db32018-01-27 19:07:45 -0500208% ExceptionInfo *exception)
209%
210% A description of each parameter follows:
211%
212% o module: the want to register.
213%
214% o exception: return any errors or warnings in this structure.
215%
216*/
Cristy62a2a482018-01-28 08:39:43 -0500217MagickExport MagickBooleanType RegisterStaticModule(const char *module,
Cristy2221db32018-01-27 19:07:45 -0500218 ExceptionInfo *exception)
219{
220 char
221 module_name[MagickPathExtent];
222
Cristy777e3142018-08-24 20:59:00 -0400223 PolicyRights
224 rights;
225
Cristyf2dc1dd2020-12-28 13:59:26 -0500226 const CoderInfo
Cristy2221db32018-01-27 19:07:45 -0500227 *p;
228
Cristy62a2a482018-01-28 08:39:43 -0500229 size_t
230 extent;
231
Cristy2221db32018-01-27 19:07:45 -0500232 ssize_t
233 i;
234
235 /*
236 Assign module name from alias.
237 */
238 assert(module != (const char *) NULL);
Cristy777e3142018-08-24 20:59:00 -0400239 rights=ReadPolicyRights;
240 if (IsRightsAuthorized(ModulePolicyDomain,rights,module) == MagickFalse)
241 {
242 errno=EPERM;
243 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
244 "NotAuthorized","`%s'",module);
245 return(MagickFalse);
246 }
Cristy2221db32018-01-27 19:07:45 -0500247 (void) CopyMagickString(module_name,module,MagickPathExtent);
248 p=GetCoderInfo(module,exception);
249 if (p != (CoderInfo *) NULL)
250 (void) CopyMagickString(module_name,p->name,MagickPathExtent);
Cristy62a2a482018-01-28 08:39:43 -0500251 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
252 for (i=0; i < (ssize_t) extent; i++)
Cristy2221db32018-01-27 19:07:45 -0500253 if (LocaleCompare(MagickModules[i].module,module_name) == 0)
254 {
255 if (MagickModules[i].registered == MagickFalse)
256 {
257 (void) (MagickModules[i].register_module)();
258 MagickModules[i].registered=MagickTrue;
259 }
Cristy62a2a482018-01-28 08:39:43 -0500260 return(MagickTrue);
Cristy2221db32018-01-27 19:07:45 -0500261 }
Cristy62a2a482018-01-28 08:39:43 -0500262 return(MagickFalse);
Cristy2221db32018-01-27 19:07:45 -0500263}
Cristy3c49d7c2018-10-07 09:56:28 -0400264
Cristy2221db32018-01-27 19:07:45 -0500265/*
266%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
267% %
268% %
269% %
cristy3ed852e2009-09-05 21:47:34 +0000270% R e g i s t e r S t a t i c M o d u l e s %
271% %
272% %
273% %
274%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
275%
Cristy0ea771d2018-01-28 09:03:48 -0500276% RegisterStaticModules() statically registers all the available module
cristy3ed852e2009-09-05 21:47:34 +0000277% handlers.
278%
279% The format of the RegisterStaticModules method is:
280%
281% (void) RegisterStaticModules(void)
282%
283*/
284MagickExport void RegisterStaticModules(void)
285{
Cristy62a2a482018-01-28 08:39:43 -0500286 size_t
287 extent;
288
Cristy2221db32018-01-27 19:07:45 -0500289 ssize_t
290 i;
291
Cristy62a2a482018-01-28 08:39:43 -0500292 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
293 for (i=0; i < (ssize_t) extent; i++)
Cristy2221db32018-01-27 19:07:45 -0500294 {
295 if (MagickModules[i].registered == MagickFalse)
296 {
297 (void) (MagickModules[i].register_module)();
298 MagickModules[i].registered=MagickTrue;
299 }
300 }
301}
Cristy3c49d7c2018-10-07 09:56:28 -0400302
Cristy2221db32018-01-27 19:07:45 -0500303/*
304%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305% %
306% %
307% %
308% U n r e g i s t e r S t a t i c M o d u l e %
309% %
310% %
311% %
312%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
313%
314% UnregisterStaticModule() statically unregisters the named module.
315%
316% The format of the UnregisterStaticModule method is:
317%
Cristy62a2a482018-01-28 08:39:43 -0500318% MagickBooleanType UnregisterStaticModule(const char *module)
Cristy2221db32018-01-27 19:07:45 -0500319%
320% A description of each parameter follows:
321%
322% o module: the module we want to unregister.
323%
324*/
Cristy62a2a482018-01-28 08:39:43 -0500325MagickExport MagickBooleanType UnregisterStaticModule(const char *module)
Cristy2221db32018-01-27 19:07:45 -0500326{
Cristy62a2a482018-01-28 08:39:43 -0500327 size_t
328 extent;
329
Cristydbfbc2a2018-01-01 08:08:24 -0500330 ssize_t
331 i;
332
Cristy62a2a482018-01-28 08:39:43 -0500333 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
334 for (i=0; i < (ssize_t) extent; i++)
Cristy2221db32018-01-27 19:07:45 -0500335 if (LocaleCompare(MagickModules[i].module,module) == 0)
336 {
337 if (MagickModules[i].registered != MagickFalse)
338 {
339 (MagickModules[i].unregister_module)();
340 MagickModules[i].registered=MagickFalse;
341 }
Cristy62a2a482018-01-28 08:39:43 -0500342 return(MagickTrue);
Cristy2221db32018-01-27 19:07:45 -0500343 }
Cristy62a2a482018-01-28 08:39:43 -0500344 return(MagickFalse);
cristy3ed852e2009-09-05 21:47:34 +0000345}
Cristy3c49d7c2018-10-07 09:56:28 -0400346
cristy3ed852e2009-09-05 21:47:34 +0000347/*
348%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
349% %
350% %
351% %
352% U n r e g i s t e r S t a t i c M o d u l e s %
353% %
354% %
355% %
356%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
357%
358% UnregisterStaticModules() statically unregisters all the available module
359% handlers.
360%
361% The format of the UnregisterStaticModules method is:
362%
363% UnregisterStaticModules(void)
364%
365*/
366MagickExport void UnregisterStaticModules(void)
367{
Cristy62a2a482018-01-28 08:39:43 -0500368 size_t
369 extent;
370
Cristydbfbc2a2018-01-01 08:08:24 -0500371 ssize_t
372 i;
373
Cristy62a2a482018-01-28 08:39:43 -0500374 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
375 for (i=0; i < (ssize_t) extent; i++)
Cristy2221db32018-01-27 19:07:45 -0500376 {
377 if (MagickModules[i].registered != MagickFalse)
378 {
379 (MagickModules[i].unregister_module)();
380 MagickModules[i].registered=MagickFalse;
381 }
382 }
cristy3ed852e2009-09-05 21:47:34 +0000383}