% MagickCore Utility Methods %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% January 1993 %
% %
% %
-% Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2014 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 %
#include "MagickCore/nt-base-private.h"
#include "MagickCore/option.h"
#include "MagickCore/policy.h"
+#include "MagickCore/random_.h"
+#include "MagickCore/registry.h"
#include "MagickCore/resource_.h"
#include "MagickCore/semaphore.h"
#include "MagickCore/signature-private.h"
%
*/
-static inline size_t MagickMin(const size_t x,const size_t y)
+static inline MagickSizeType MagickMin(const MagickSizeType x,
+ const MagickSizeType y)
{
if (x < y)
return(x);
}
quantum=(size_t) MagickMaxBufferExtent;
if ((fstat(source_file,&attributes) == 0) && (attributes.st_size != 0))
- quantum=MagickMin((size_t) attributes.st_size,MagickMaxBufferExtent);
+ quantum=(size_t) MagickMin((size_t) attributes.st_size,
+ MagickMaxBufferExtent);
buffer=(unsigned char *) AcquireQuantumMemory(quantum,sizeof(*buffer));
if (buffer == (unsigned char *) NULL)
{
% Expansion is ignored for coders "label:" "caption:" "pango:" and "vid:".
% Which provide their own '@' meta-character handling.
%
+% You can see the results of the expansion using "Configure" log events.
+%
+% The returned list should be freed using DestroyStringList().
+%
+% However the strings in the original pointed to argv are not
+% freed (TO BE CHECKED). So a copy of the original pointer (and count)
+% should be kept separate if they need to be freed later.
%
% The format of the ExpandFilenames function is:
%
*path='\0';
*filename='\0';
*subimage='\0';
+ number_files=0;
vector[count++]=ConstantString(option);
destroy=MagickTrue;
parameters=ParseCommandOption(MagickCommandOptions,MagickFalse,option);
(LocaleCompare(magick,"PANGO") == 0) ||
(LocaleCompare(magick,"VID") == 0))
continue;
- if ((IsGlob(filename) == MagickFalse) && (*filename != '@'))
+ if ((IsGlob(filename) == MagickFalse) && (*option != '@'))
continue;
- if (*filename != '@')
+ if (*option != '@')
{
/*
Generate file list from wildcard filename (e.g. *.jpg).
Generate file list from file list (e.g. @filelist.txt).
*/
exception=AcquireExceptionInfo();
- files=FileToString(option+1,~0,exception);
+ files=FileToString(option+1,~0UL,exception);
exception=DestroyExceptionInfo(exception);
if (files == (char *) NULL)
continue;
if (*path != '\0')
(void) ConcatenateMagickString(filename,DirectorySeparator,
MaxTextExtent);
- (void) ConcatenateMagickString(filename,filelist[j],MaxTextExtent);
+ if (filelist[j] != (char *) NULL)
+ (void) ConcatenateMagickString(filename,filelist[j],MaxTextExtent);
filelist[j]=DestroyString(filelist[j]);
if (strlen(filename) >= (MaxTextExtent-1))
ThrowFatalException(OptionFatalError,"FilenameTruncated");
program_name=(char *) RelinquishMagickMemory(program_name);
execution_path=(char *) RelinquishMagickMemory(execution_path);
}
+#endif
+#if defined(__OpenBSD__)
+ {
+ extern char
+ *__progname;
+
+ (void) CopyMagickString(path,__progname,extent);
+ }
#endif
return(IsPathAccessible(path));
}
% GetPathComponent() returns the parent directory name, filename, basename, or
% extension of a file path.
%
+% The component string pointed to must have at least MaxTextExtent space
+% for the results to be stored.
+%
% The format of the GetPathComponent function is:
%
% GetPathComponent(const char *path,PathType type,char *component)
%
% The format of the IsPathAccessible method is:
%
-% MagickBooleanType IsPathAccessible(const char *filename)
+% MagickBooleanType IsPathAccessible(const char *path)
%
% A description of each parameter follows.
%
% %
% %
% %
+% S h r e a d F i l e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ShredFile() overwrites the specified file with zeros or random data and then
+% removes it. The overwrite is optional and is only required to help keep
+% the contents of the file private. On the first pass, the file is zeroed.
+% For subsequent passes, random data is written.
+%
+% The format of the ShredFile method is:
+%
+% MagickBooleanType ShredFile(const char *path)
+%
+% A description of each parameter follows.
+%
+% o path: Specifies a path to a file.
+%
+*/
+MagickPrivate MagickBooleanType ShredFile(const char *path)
+{
+ char
+ *passes;
+
+ int
+ file,
+ status;
+
+ MagickSizeType
+ length;
+
+ register ssize_t
+ i;
+
+ size_t
+ quantum;
+
+ struct stat
+ file_stats;
+
+ if ((path == (const char *) NULL) || (*path == '\0'))
+ return(MagickFalse);
+ passes=GetEnvironmentValue("MAGICK_SHRED_PASSES");
+ if (passes == (char *) NULL)
+ {
+ /*
+ Don't shred the file, just remove it.
+ */
+ status=remove_utf8(path);
+ if (status == -1)
+ return(MagickFalse);
+ return(MagickTrue);
+ }
+ file=open_utf8(path,O_WRONLY | O_EXCL | O_BINARY,S_MODE);
+ if (file == -1)
+ {
+ /*
+ Don't shred the file, just remove it.
+ */
+ status=remove_utf8(path);
+ return(MagickFalse);
+ }
+ /*
+ Shred the file.
+ */
+ quantum=(size_t) MagickMaxBufferExtent;
+ if ((fstat(file,&file_stats) == 0) && (file_stats.st_size != 0))
+ quantum=(size_t) MagickMin((MagickSizeType) file_stats.st_size,
+ MagickMaxBufferExtent);
+ length=(MagickSizeType) file_stats.st_size;
+ for (i=0; i < (ssize_t) StringToInteger(passes); i++)
+ {
+ RandomInfo
+ *random_info;
+
+ register MagickOffsetType
+ j;
+
+ ssize_t
+ count;
+
+ if (lseek(file,0,SEEK_SET) < 0)
+ break;
+ random_info=AcquireRandomInfo();
+ for (j=0; j < (MagickOffsetType) length; j+=count)
+ {
+ StringInfo
+ *key;
+
+ key=GetRandomKey(random_info,quantum);
+ if (i == 0)
+ ResetStringInfo(key); /* zero on first pass */
+ count=write(file,GetStringInfoDatum(key),(size_t)
+ MagickMin(quantum,length-j));
+ key=DestroyStringInfo(key);
+ if (count <= 0)
+ {
+ count=0;
+ if (errno != EINTR)
+ break;
+ }
+ }
+ random_info=DestroyRandomInfo(random_info);
+ if (j < (MagickOffsetType) length)
+ break;
+ }
+ status=close(file);
+ status=remove_utf8(path);
+ if (status == -1)
+ return(MagickFalse);
+ return(i < (ssize_t) StringToInteger(passes) ? MagickFalse : MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
% S y s t e m C o m m a n d %
% %
% %
arguments=StringToArgv(command,&number_arguments);
if (arguments == (char **) NULL)
return(status);
+ if (*arguments[1] == '\0')
+ {
+ for (i=0; i < (ssize_t) number_arguments; i++)
+ arguments[i]=DestroyString(arguments[i]);
+ arguments=(char **) RelinquishMagickMemory(arguments);
+ return(-1);
+ }
rights=ExecutePolicyRights;
domain=DelegatePolicyDomain;
if (IsRightsAuthorized(domain,rights,arguments[1]) == MagickFalse)
{
errno=EPERM;
(void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
- "NotAuthorized","'%s'",arguments[1]);
+ "NotAuthorized","`%s'",arguments[1]);
for (i=0; i < (ssize_t) number_arguments; i++)
arguments[i]=DestroyString(arguments[i]);
arguments=(char **) RelinquishMagickMemory(arguments);