blob: d3980a6111888565b72e3bd7bf3bd0a92323274e [file] [log] [blame]
--- fontconfig-2.11.0/test/test-migration.c.orig 2014-02-06 12:24:45.529605800 +0000
+++ fontconfig-2.11.0/test/test-migration.c 2014-02-06 14:43:19.691870300 +0000
@@ -9,6 +9,213 @@
#endif
#include <fontconfig/fontconfig.h>
+#if defined(_WIN32)
+#include <time.h>
+#include <math.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <windows.h>
+#include <accctrl.h>
+#include <aclapi.h>
+
+static PSECURITY_DESCRIPTOR
+create_sd (int permissions)
+{
+ PSECURITY_DESCRIPTOR pSD = NULL;
+ int i;
+ int j;
+ EXPLICIT_ACCESS ea[3];
+ PSID sids[3] = { NULL, NULL, NULL };
+ WELL_KNOWN_SID_TYPE sidtypes[3] = { WinCreatorOwnerSid, WinCreatorGroupSid, WinWorldSid };
+ int ea_len = 0;
+ DWORD dwRes, dwDisposition;
+ PACL pACL = NULL;
+
+ /* Initialize a security descriptor. */
+ pSD = (PSECURITY_DESCRIPTOR) LocalAlloc (LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
+ if (NULL == pSD)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ if (!InitializeSecurityDescriptor (pSD, SECURITY_DESCRIPTOR_REVISION))
+ {
+ LocalFree (pSD);
+ errno = EIO;
+ return NULL;
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ BOOL b;
+ DWORD bytes;
+ int imasked = permissions & (07 << (2 - i));
+ if (!imasked)
+ continue;
+
+ bytes = SECURITY_MAX_SID_SIZE;
+ sids[ea_len] = (PSID) LocalAlloc (LMEM_FIXED, bytes);
+ if (NULL == sids[ea_len])
+ {
+ errno = ENOMEM;
+ LocalFree (pSD);
+ for (j = 0; j < ea_len; j++)
+ {
+ if (sids[j] != NULL)
+ {
+ LocalFree (sids[j]);
+ sids[j] = NULL;
+ }
+ }
+ return NULL;
+ }
+
+ b = CreateWellKnownSid (sidtypes[i], NULL, sids[ea_len], &bytes);
+ if (!b)
+ {
+ errno = EINVAL;
+ LocalFree (pSD);
+ for (j = 0; j < ea_len; j++)
+ {
+ if (sids[j] != NULL)
+ {
+ LocalFree (sids[j]);
+ sids[j] = NULL;
+ }
+ }
+ return NULL;
+ }
+
+ /* Initialize an EXPLICIT_ACCESS structure for an ACE. */
+ ZeroMemory (&ea[ea_len], sizeof(EXPLICIT_ACCESS));
+ bytes = 0;
+ if (01 & imasked)
+ bytes = bytes | GENERIC_READ;
+ if (02 & imasked)
+ bytes = bytes | GENERIC_WRITE;
+ if (04 & imasked)
+ bytes = bytes | GENERIC_EXECUTE;
+ ea[ea_len].grfAccessPermissions = bytes;
+ ea[ea_len].grfAccessMode = SET_ACCESS;
+ ea[ea_len].grfInheritance= NO_INHERITANCE;
+ ea[ea_len].Trustee.TrusteeForm = TRUSTEE_IS_SID;
+ ea[ea_len].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
+ ea[ea_len].Trustee.ptstrName = (LPTSTR) sids[ea_len];
+ ea_len = ea_len + 1;
+ }
+
+ /* Create a new ACL that contains the new ACEs. */
+ dwRes = SetEntriesInAcl (ea_len, ea, NULL, &pACL);
+ if (ERROR_SUCCESS != dwRes)
+ {
+ errno = EIO;
+ LocalFree (pSD);
+ for (j = 0; j < ea_len; j++)
+ {
+ if (sids[j] != NULL)
+ {
+ LocalFree (sids[j]);
+ sids[j] = NULL;
+ }
+ }
+ return NULL;
+ }
+
+ for (j = 0; j < ea_len; j++)
+ {
+ if (sids[j] != NULL)
+ {
+ LocalFree (sids[j]);
+ sids[j] = NULL;
+ }
+ }
+
+ /* Add the ACL to the security descriptor. */
+ if (!SetSecurityDescriptorDacl (pSD,
+ TRUE, // bDaclPresent flag
+ pACL,
+ FALSE)) // not a default DACL
+ {
+ errno = EIO;
+ LocalFree (pSD);
+ LocalFree (pACL);
+ return NULL;
+ }
+
+ return pSD;
+}
+
+static void
+free_sd (PSECURITY_DESCRIPTOR sd)
+{
+ BOOL b, present, defaulted;
+ PACL pACL = NULL;
+ present = FALSE;
+ b = GetSecurityDescriptorDacl (sd, &present, &pACL, &defaulted);
+ if (b && present && !defaulted && pACL)
+ LocalFree (pACL);
+ LocalFree (sd);
+}
+
+static void
+randtemplate (char *template, size_t l)
+{
+ int i;
+ for (i = l - 6; i < l; i++)
+ {
+ int r = rand ();
+ if ((r / (RAND_MAX + 1)) > ((RAND_MAX + 1) / 2))
+ template[i] = 'A' + (double) rand () / (RAND_MAX + 1) * ('Z' - 'A');
+ else
+ template[i] = 'a' + (double) rand () / (RAND_MAX + 1) * ('z' - 'a');
+ }
+}
+
+static char *
+mkdtemp (char *template)
+{
+ int i;
+ size_t l;
+ BOOL b;
+ SECURITY_ATTRIBUTES sa;
+
+ if (template == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+ l = strlen (template);
+ if (l < 6 || strcmp (&template[l - 6], "XXXXXX") != 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+ srand(time (NULL));
+ sa.nLength = sizeof (sa);
+ sa.lpSecurityDescriptor = create_sd (0700);
+ sa.bInheritHandle = FALSE;
+ do
+ {
+ randtemplate (template, l);
+ SetLastError (0);
+ b = CreateDirectoryA (template, &sa);
+ } while (!b && GetLastError () == ERROR_ALREADY_EXISTS);
+ free_sd (sa.lpSecurityDescriptor);
+ if (!b)
+ {
+ errno = EIO;
+ return NULL;
+ }
+ else
+ {
+ errno = 0;
+ return template;
+ }
+}
+#endif
+
FcBool
mkdir_p(const char *dir)
{