pathtools: Fix relocation for paths with '.' in them

This commit is contained in:
Ray Donnelly
2014-08-28 20:59:19 +01:00
parent 84a3048de2
commit 9a2dde0b64
13 changed files with 328 additions and 154 deletions

View File

@@ -29,11 +29,13 @@ md5sums=('c8dc151a671b9b92ff3e4c118b174972'
'60ca340e32944e4825747e3681ccd553'
'10d0cebf2d9c0f64c307e82542f519e3'
'cf00f216c47f33272d281e302ab1906a'
'704ac62f19e63d8a2d7197dcbe913254')
'170f80b2fb479fc422557a48d566f432')
prepare() {
cd $startdir/
[ -d $srcdir/${_realname}-$pkgver ] || tar -xzvf ${_realname}-${pkgver}.tar.gz -C $srcdir
# Clean up old sources so re-patching doesn't fail.
[ -d $srcdir/${_realname}-$pkgver ] && rm -rf $srcdir/${_realname}-$pkgver
tar -xzvf ${_realname}-${pkgver}.tar.gz -C $srcdir
cd $srcdir/${_realname}-$pkgver
patch -p1 -i ${srcdir}/openssl-1.0.0a-ldflags.patch

View File

@@ -122,11 +122,15 @@ diff -Naur openssl-1.0.1i-orig/crypto/opensslconf.h.in openssl-1.0.1i/crypto/ope
diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtools.c
--- openssl-1.0.1i-orig/crypto/pathtools.c 1970-01-01 03:00:00.000000000 +0300
+++ openssl-1.0.1i/crypto/pathtools.c 2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,485 @@
@@ -0,0 +1,499 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#if defined(__APPLE__)
@@ -163,7 +167,7 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+char *
+malloc_copy_string(char const * original)
+{
+ char * result = (char *) malloc (sizeof(char*) * strlen(original)+1);
+ char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
+ if (result != NULL)
+ {
+ strcpy (result, original);
@@ -174,7 +178,7 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+void
+sanitise_path(char * path)
+{
+ size_t path_size = strlen(path);
+ size_t path_size = strlen (path);
+
+ /* Replace any '\' with '/' */
+ char * path_p = path;
@@ -184,38 +188,48 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+ }
+ /* Replace any '//' with '/' */
+ path_p = path;
+ while ((path_p = strstr(path_p, "//")) != NULL)
+ while ((path_p = strstr (path_p, "//")) != NULL)
+ {
+ memmove(path_p, path_p + 1, path_size--);
+ memmove (path_p, path_p + 1, path_size--);
+ }
+ return;
+}
+
+char *
+get_relative_path(char const * from, char const * to)
+get_relative_path(char const * from_in, char const * to_in)
+{
+ size_t from_size = strlen (from);
+ size_t to_size = strlen (to);
+ size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
+ size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
+ size_t max_size = (from_size + to_size) * 2 + 4;
+ char * common_part = (char *) alloca (max_size);
+ char * result = (char *) alloca (max_size);
+ char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
+ char * from;
+ char * to;
+ char * common_part;
+ char * result;
+ size_t count;
+
+ /* If either alloca failed, no from was given, from is not absolute
+ or either to or from contains '.' then return a copy of to; it's
+ the best we can do in this instance (though we could call a path
+ normalization function for some of these conditions).
+ */
+ if (common_part == NULL
+ || result == NULL
+ || from == NULL
+ || from[0] != '/'
+ || strchr (to, '.') != NULL
+ || strchr (from, '.') != NULL)
+ /* No to, return "./" */
+ if (to_in == NULL)
+ {
+ return malloc_copy_string (to);
+ return malloc_copy_string ("./");
+ }
+
+ /* If alloca failed or no from was given return a copy of to */
+ if ( from_in == NULL
+ || scratch_space == NULL )
+ {
+ return malloc_copy_string (to_in);
+ }
+
+ from = scratch_space;
+ strcpy (from, from_in);
+ to = from + from_size + 1;
+ strcpy (to, to_in);
+ common_part = to + to_size + 1;
+ result = common_part + max_size;
+ simplify_path (from);
+ simplify_path (to);
+
+ result[0] = '\0';
+
+ size_t match_size_dirsep = 0; /* The match size up to the last /. Always wind back to this - 1 */
@@ -298,7 +312,7 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+ } while ((result_p = strchr (result_p, '/')) != NULL);
+
+ result_p = result;
+ char const ** toks = (char const **) alloca (sizeof(char const*) * n_toks);
+ char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
+ n_toks = 0;
+ do
+ {
@@ -344,7 +358,7 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+ if (removals[j] >= 0) /* Can become -2 */
+ {
+ --n_toks;
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof(char*));
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
+ --i;
+ if (!j)
+ {
@@ -509,11 +523,11 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+ while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
+
+ /* allocate everything in one go. */
+ char * all_memory = (char *) malloc (sizeof(char *) * path_count + strlen(path_list) + 1);
+ char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
+ if (all_memory == NULL)
+ return 0;
+ *arr = (char **)all_memory;
+ all_memory += sizeof(char *) * path_count;
+ all_memory += sizeof (char *) * path_count;
+
+ path_count = 0;
+ path_list_p = path_list;
@@ -542,7 +556,7 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+{
+ char exe_path[MAX_PATH];
+ char * temp;
+ get_executable_path (NULL, &exe_path[0], sizeof(exe_path) / sizeof(exe_path[0]));
+ get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+ if ((temp = strrchr (exe_path, '/')) != NULL)
+ {
+ temp[1] = '\0';
@@ -608,14 +622,18 @@ diff -Naur openssl-1.0.1i-orig/crypto/pathtools.c openssl-1.0.1i/crypto/pathtool
+ free ((void*)arr);
+ return result;
+}
diff -Naur openssl-1.0.1i-orig/crypto/pathtools.h openssl-1.0.1i/crypto/pathtools.h
--- openssl-1.0.1i-orig/crypto/pathtools.h 1970-01-01 03:00:00.000000000 +0300
+++ openssl-1.0.1i/crypto/pathtools.h 2014-08-08 09:36:15.000000000 +0400
@@ -0,0 +1,45 @@
diff -urN old/pathtools.h new/pathtools.h
--- old/pathtools.h 1970-01-01 01:00:00.000000000 +0100
+++ new/pathtools.h 2014-08-28 18:40:03.939064600 +0100
@@ -0,0 +1,49 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#ifndef PATHTOOLS_H

View File

@@ -1,8 +1,10 @@
--- p11-kit-0.17.5/p11-kit/Makefile.am.orig 2013-04-01 19:54:53 +0400
+++ p11-kit-0.17.5/p11-kit/Makefile.am 2013-04-01 20:02:29 +0400
@@ -102,5 +102,4 @@
--- p11-kit-0.17.5/p11-kit/Makefile.am.orig 2014-07-04 14:48:45.000000000 +0100
+++ p11-kit-0.17.5/p11-kit/Makefile.am 2014-08-28 19:38:29.226555600 +0100
@@ -100,7 +100,6 @@
# Proxy module is actually same as library, so install a link
install-exec-hook:
- $(LN_S) -f `readlink $(DESTDIR)$(libdir)/libp11-kit.so` $(DESTDIR)$(libdir)/p11-kit-proxy.so
$(MKDIR_P) $(DESTDIR)$(p11_package_config_modules)
endif

View File

@@ -85,11 +85,15 @@ diff -Naur p11-kit-0.20.3-orig/common/path.h p11-kit-0.20.3/common/path.h
diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtools.c
--- p11-kit-0.20.3-orig/common/pathtools.c 1970-01-01 03:00:00.000000000 +0300
+++ p11-kit-0.20.3/common/pathtools.c 2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,485 @@
@@ -0,0 +1,499 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#if defined(__APPLE__)
@@ -126,7 +130,7 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+char *
+malloc_copy_string(char const * original)
+{
+ char * result = (char *) malloc (sizeof(char*) * strlen(original)+1);
+ char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
+ if (result != NULL)
+ {
+ strcpy (result, original);
@@ -137,7 +141,7 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+void
+sanitise_path(char * path)
+{
+ size_t path_size = strlen(path);
+ size_t path_size = strlen (path);
+
+ /* Replace any '\' with '/' */
+ char * path_p = path;
@@ -147,38 +151,48 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+ }
+ /* Replace any '//' with '/' */
+ path_p = path;
+ while ((path_p = strstr(path_p, "//")) != NULL)
+ while ((path_p = strstr (path_p, "//")) != NULL)
+ {
+ memmove(path_p, path_p + 1, path_size--);
+ memmove (path_p, path_p + 1, path_size--);
+ }
+ return;
+}
+
+char *
+get_relative_path(char const * from, char const * to)
+get_relative_path(char const * from_in, char const * to_in)
+{
+ size_t from_size = strlen (from);
+ size_t to_size = strlen (to);
+ size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
+ size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
+ size_t max_size = (from_size + to_size) * 2 + 4;
+ char * common_part = (char *) alloca (max_size);
+ char * result = (char *) alloca (max_size);
+ char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
+ char * from;
+ char * to;
+ char * common_part;
+ char * result;
+ size_t count;
+
+ /* If either alloca failed, no from was given, from is not absolute
+ or either to or from contains '.' then return a copy of to; it's
+ the best we can do in this instance (though we could call a path
+ normalization function for some of these conditions).
+ */
+ if (common_part == NULL
+ || result == NULL
+ || from == NULL
+ || from[0] != '/'
+ || strchr (to, '.') != NULL
+ || strchr (from, '.') != NULL)
+ /* No to, return "./" */
+ if (to_in == NULL)
+ {
+ return malloc_copy_string (to);
+ return malloc_copy_string ("./");
+ }
+
+ /* If alloca failed or no from was given return a copy of to */
+ if ( from_in == NULL
+ || scratch_space == NULL )
+ {
+ return malloc_copy_string (to_in);
+ }
+
+ from = scratch_space;
+ strcpy (from, from_in);
+ to = from + from_size + 1;
+ strcpy (to, to_in);
+ common_part = to + to_size + 1;
+ result = common_part + max_size;
+ simplify_path (from);
+ simplify_path (to);
+
+ result[0] = '\0';
+
+ size_t match_size_dirsep = 0; /* The match size up to the last /. Always wind back to this - 1 */
@@ -261,7 +275,7 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+ } while ((result_p = strchr (result_p, '/')) != NULL);
+
+ result_p = result;
+ char const ** toks = (char const **) alloca (sizeof(char const*) * n_toks);
+ char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
+ n_toks = 0;
+ do
+ {
@@ -307,7 +321,7 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+ if (removals[j] >= 0) /* Can become -2 */
+ {
+ --n_toks;
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof(char*));
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
+ --i;
+ if (!j)
+ {
@@ -472,11 +486,11 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+ while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
+
+ /* allocate everything in one go. */
+ char * all_memory = (char *) malloc (sizeof(char *) * path_count + strlen(path_list) + 1);
+ char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
+ if (all_memory == NULL)
+ return 0;
+ *arr = (char **)all_memory;
+ all_memory += sizeof(char *) * path_count;
+ all_memory += sizeof (char *) * path_count;
+
+ path_count = 0;
+ path_list_p = path_list;
@@ -505,7 +519,7 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+{
+ char exe_path[MAX_PATH];
+ char * temp;
+ get_executable_path (NULL, &exe_path[0], sizeof(exe_path) / sizeof(exe_path[0]));
+ get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+ if ((temp = strrchr (exe_path, '/')) != NULL)
+ {
+ temp[1] = '\0';
@@ -573,12 +587,16 @@ diff -Naur p11-kit-0.20.3-orig/common/pathtools.c p11-kit-0.20.3/common/pathtool
+}
diff -Naur p11-kit-0.20.3-orig/common/pathtools.h p11-kit-0.20.3/common/pathtools.h
--- p11-kit-0.20.3-orig/common/pathtools.h 1970-01-01 03:00:00.000000000 +0300
+++ p11-kit-0.20.3/common/pathtools.h 2014-08-08 09:36:15.000000000 +0400
@@ -0,0 +1,45 @@
+++ p11-kit-0.20.3/common/pathtools.h 2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,49 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#ifndef PATHTOOLS_H

View File

@@ -0,0 +1,64 @@
--- p11-kit-0.20.3/common/compat.c.orig 2014-07-04 14:48:45.000000000 +0100
+++ p11-kit-0.20.3/common/compat.c 2014-08-28 15:33:25.872571900 +0100
@@ -325,19 +325,27 @@
map->file = CreateFile (path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
if (map->file == INVALID_HANDLE_VALUE) {
+ p11_message ("map->file (%s) == INVALID_HANDLE_VALUE", path);
errn = GetLastError ();
free (map);
SetLastError (errn);
if (errn == ERROR_PATH_NOT_FOUND || errn == ERROR_FILE_NOT_FOUND)
+ {
+ p11_message ("errn == ERROR_PATH_NOT_FOUND || errn == ERROR_FILE_NOT_FOUND, errn = %d", errn);
errno = ENOENT;
+ }
else if (errn == ERROR_ACCESS_DENIED)
+ {
+ p11_message ("errn == ERROR_ACCESS_DENIED");
errno = EPERM;
+ }
return NULL;
}
if (sb == NULL) {
if (!GetFileSizeEx (map->file, &large)) {
errn = GetLastError ();
+ p11_message ("GetFileSizeEx (map->file, &large), errn = %d", errn);
CloseHandle (map->file);
free (map);
SetLastError (errn);
@@ -352,6 +360,7 @@
mapping = CreateFileMapping (map->file, NULL, PAGE_READONLY, 0, 0, NULL);
if (!mapping) {
errn = GetLastError ();
+ p11_message ("CreateFileMapping (map->file, NULL, PAGE_READONLY, 0, 0, NULL), errn = %d", errn);
CloseHandle (map->file);
free (map);
SetLastError (errn);
@@ -365,6 +374,7 @@
if (map->data == NULL) {
errn = GetLastError ();
+ p11_message ("MapViewOfFile (mapping, FILE_MAP_READ, 0, 0, large.QuadPart) map->data = NULL, errn = %d", errn);
CloseHandle (map->file);
free (map);
SetLastError (errn);
@@ -381,8 +391,15 @@
void
p11_mmap_close (p11_mmap *map)
{
- UnmapViewOfFile (map->data);
- CloseHandle (map->file);
+ p11_message ("p11_mmap_close (p11_mmap *map = %p) called", map);
+ if (!UnmapViewOfFile (map->data))
+ {
+ p11_message ("UnmapViewOfFile (map->data = %p) failed", map->data);
+ }
+ if (!CloseHandle (map->file))
+ {
+ p11_message ("CloseHandle (map->file = %d) failed", map->file);
+ }
free (map);
}

View File

@@ -0,0 +1,15 @@
--- p11-kit-0.20.3/common/path.c.orig 2014-08-28 15:38:41.193607200 +0100
+++ p11-kit-0.20.3/common/path.c 2014-08-28 16:18:10.646132100 +0100
@@ -336,8 +336,12 @@
strrchr (exe_path, '/')[1] = '\0';
}
char * rel_to_datadir = get_relative_path (P11_BINDIR, path);
+ p11_message ("get_relative_path (P11_BINDIR = %s, path = %s) = %s", P11_BINDIR, path, rel_to_datadir);
+ p11_message ("exe_path(1) = %s", exe_path);
strcat (exe_path, rel_to_datadir);
+ p11_message ("exe_path(2) = %s", exe_path);
simplify_path (&exe_path[0]);
+ p11_message ("exe_path(3) = %s", exe_path);
return malloc_copy_string(exe_path);
#else
return malloc_copy_string(path);

View File

@@ -22,27 +22,33 @@ source=($url/releases/$_realname-$pkgver.tar.gz{,.sig}
0003-fix-test-path.all.patch
0004-fix-abspath-check.all.patch
0005-no-getuid-on-w32.all.patch
p11-kit-relocation.patch)
0006-p11-kit-relocation.patch
0007-add-debugging-to-mmap.patch
0008-add-debugging-to-path.patch)
md5sums=('c0b057be50ab9721cfc15a7aae86ca3b'
'SKIP'
'9506243bd78f4136b9ab440fe216665d'
'70330b415eb5167e5a530c13bb96c212'
'b7a706e19b5e29d96889ca2410a151df'
'c11cba6726e4791ed8ff917978755596'
'd4feddce2bb360ab466861dbbe4fdadd'
'9a91b743f18126ff7d4d08e43c38d0a3'
'8837624f5b0c588ce043f2774388632d'
'c332ac101f44d5d8c9af34c586c88f3c')
'07d3309cdd542206b2c6b83bc0ab085f'
'0dcd0d7e10d5d898f32da8866580d640'
'27793fc62cf1fbfe52964ba8099d2b44')
prepare() {
cd "${srcdir}"/${_realname}-${pkgver}
rm common/pathtools.c common/pathtools.h || true
rm -f common/pathtools.c common/pathtools.h > /dev/null 2>&1 || true
patch -p1 -i ${srcdir}/0000-no-proxy.mingw.patch
patch -p1 -i ${srcdir}/0001-allow-gtkdocize.all.patch
patch -p1 -i ${srcdir}/0002-disable-managed-test.all.patch
patch -p1 -i ${srcdir}/0003-fix-test-path.all.patch
patch -p1 -i ${srcdir}/0004-fix-abspath-check.all.patch
patch -p1 -i ${srcdir}/0005-no-getuid-on-w32.all.patch
patch -p1 -i ${srcdir}/p11-kit-relocation.patch
patch -p1 -i ${srcdir}/0006-p11-kit-relocation.patch
# patch -p1 -i ${srcdir}/0007-add-debugging-to-mmap.patch
# patch -p1 -i ${srcdir}/0008-add-debugging-to-path.patch
autoreconf -fi
}

View File

@@ -108,7 +108,7 @@ int main(int argc, char *argv[])
#define DATADIR "/mingw64/share"
char exe_path[PATH_MAX];
get_executable_path (argv[0], &exe_path[0], sizeof(exe_path) / sizeof(exe_path[0]));
get_executable_path (argv[0], &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
printf ("executable path is %s\n", exe_path);
char * rel_to_datadir = get_relative_path (BINDIR, DATADIR);
@@ -124,12 +124,14 @@ int main(int argc, char *argv[])
{
get_relative_path_debug (argv[argc-2], argv[argc-1], 0);
}
get_relative_path_debug ("/a/b/c/d", "/a/b/c", "..");
get_relative_path_debug ("/a/b/c/d/", "/a/b/c/", "../");
get_relative_path_debug ("/", "/", "/");
get_relative_path_debug ("/a/testone/c/d", "/a/testtwo/c", "../../../testtwo/c");
get_relative_path_debug ("/a/testone/c/d/", "/a/testtwo/c/", "../../../testtwo/c/");
get_relative_path_debug ("/home/part2/part3/part4", "/work/proj1/proj2", "../../../../work/proj1/proj2");
get_relative_path_debug (NULL, NULL, "./");
get_relative_path_debug ("/mingw64/bin", "/mingw64/etc/pkcs11/pkcs11.conf", "../etc/pkcs11/pkcs11.conf");
get_relative_path_debug ("/a/b/c/d", "/a/b/c", "..");
get_relative_path_debug ("/a/b/c/d/", "/a/b/c/", "../");
get_relative_path_debug ("/", "/", "/");
get_relative_path_debug ("/a/testone/c/d", "/a/testtwo/c", "../../../testtwo/c");
get_relative_path_debug ("/a/testone/c/d/", "/a/testtwo/c/", "../../../testtwo/c/");
get_relative_path_debug ("/home/part2/part3/part4", "/work/proj1/proj2", "../../../../work/proj1/proj2");
simplify_path_debug ("a/b/..", "a");
simplify_path_debug ("a/b/c/../../", "a/");

View File

@@ -1,7 +1,11 @@
/*
.Some useful path tools.
Written by Ray Donnelly in 2014.
Licensed under CC0. No warranty.
.ASCII only for now.
.Written by Ray Donnelly in 2014.
.Licensed under CC0 (and anything.
.else you need to license it under).
.No warranties whatsoever.
.email: <mingw.android@gmail.com>.
*/
#if defined(__APPLE__)
@@ -38,7 +42,7 @@
char *
malloc_copy_string(char const * original)
{
char * result = (char *) malloc (sizeof(char*) * strlen(original)+1);
char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
if (result != NULL)
{
strcpy (result, original);
@@ -49,7 +53,7 @@ malloc_copy_string(char const * original)
void
sanitise_path(char * path)
{
size_t path_size = strlen(path);
size_t path_size = strlen (path);
/* Replace any '\' with '/' */
char * path_p = path;
@@ -59,38 +63,48 @@ sanitise_path(char * path)
}
/* Replace any '//' with '/' */
path_p = path;
while ((path_p = strstr(path_p, "//")) != NULL)
while ((path_p = strstr (path_p, "//")) != NULL)
{
memmove(path_p, path_p + 1, path_size--);
memmove (path_p, path_p + 1, path_size--);
}
return;
}
char *
get_relative_path(char const * from, char const * to)
get_relative_path(char const * from_in, char const * to_in)
{
size_t from_size = strlen (from);
size_t to_size = strlen (to);
size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
size_t max_size = (from_size + to_size) * 2 + 4;
char * common_part = (char *) alloca (max_size);
char * result = (char *) alloca (max_size);
char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
char * from;
char * to;
char * common_part;
char * result;
size_t count;
/* If either alloca failed, no from was given, from is not absolute
or either to or from contains '.' then return a copy of to; it's
the best we can do in this instance (though we could call a path
normalization function for some of these conditions).
*/
if (common_part == NULL
|| result == NULL
|| from == NULL
|| from[0] != '/'
|| strchr (to, '.') != NULL
|| strchr (from, '.') != NULL)
/* No to, return "./" */
if (to_in == NULL)
{
return malloc_copy_string (to);
return malloc_copy_string ("./");
}
/* If alloca failed or no from was given return a copy of to */
if ( from_in == NULL
|| scratch_space == NULL )
{
return malloc_copy_string (to_in);
}
from = scratch_space;
strcpy (from, from_in);
to = from + from_size + 1;
strcpy (to, to_in);
common_part = to + to_size + 1;
result = common_part + max_size;
simplify_path (from);
simplify_path (to);
result[0] = '\0';
size_t match_size_dirsep = 0; /* The match size up to the last /. Always wind back to this - 1 */
@@ -173,7 +187,7 @@ simplify_path(char * path)
} while ((result_p = strchr (result_p, '/')) != NULL);
result_p = result;
char const ** toks = (char const **) alloca (sizeof(char const*) * n_toks);
char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
n_toks = 0;
do
{
@@ -219,7 +233,7 @@ simplify_path(char * path)
if (removals[j] >= 0) /* Can become -2 */
{
--n_toks;
memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof(char*));
memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
--i;
if (!j)
{
@@ -384,11 +398,11 @@ split_path_list(char const * path_list, char split_char, char *** arr)
while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
/* allocate everything in one go. */
char * all_memory = (char *) malloc (sizeof(char *) * path_count + strlen(path_list) + 1);
char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
if (all_memory == NULL)
return 0;
*arr = (char **)all_memory;
all_memory += sizeof(char *) * path_count;
all_memory += sizeof (char *) * path_count;
path_count = 0;
path_list_p = path_list;
@@ -417,7 +431,7 @@ get_relocated_path_list(char const * from, char const * to_path_list)
{
char exe_path[MAX_PATH];
char * temp;
get_executable_path (NULL, &exe_path[0], sizeof(exe_path) / sizeof(exe_path[0]));
get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
if ((temp = strrchr (exe_path, '/')) != NULL)
{
temp[1] = '\0';

View File

@@ -1,7 +1,11 @@
/*
.Some useful path tools.
Written by Ray Donnelly in 2014.
Licensed under CC0. No warranty.
.ASCII only for now.
.Written by Ray Donnelly in 2014.
.Licensed under CC0 (and anything.
.else you need to license it under).
.No warranties whatsoever.
.email: <mingw.android@gmail.com>.
*/
#ifndef PATHTOOLS_H

View File

@@ -119,11 +119,15 @@ diff -Naur pkgconf-0.9.6-orig/Makefile.in pkgconf-0.9.6/Makefile.in
diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
--- pkgconf-0.9.6-orig/pathtools.c 1970-01-01 03:00:00.000000000 +0300
+++ pkgconf-0.9.6/pathtools.c 2014-08-08 09:30:52.000000000 +0400
@@ -0,0 +1,485 @@
@@ -0,0 +1,499 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#if defined(__APPLE__)
@@ -160,7 +164,7 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+char *
+malloc_copy_string(char const * original)
+{
+ char * result = (char *) malloc (sizeof(char*) * strlen(original)+1);
+ char * result = (char *) malloc (sizeof (char*) * strlen (original)+1);
+ if (result != NULL)
+ {
+ strcpy (result, original);
@@ -171,7 +175,7 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+void
+sanitise_path(char * path)
+{
+ size_t path_size = strlen(path);
+ size_t path_size = strlen (path);
+
+ /* Replace any '\' with '/' */
+ char * path_p = path;
@@ -181,38 +185,48 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+ }
+ /* Replace any '//' with '/' */
+ path_p = path;
+ while ((path_p = strstr(path_p, "//")) != NULL)
+ while ((path_p = strstr (path_p, "//")) != NULL)
+ {
+ memmove(path_p, path_p + 1, path_size--);
+ memmove (path_p, path_p + 1, path_size--);
+ }
+ return;
+}
+
+char *
+get_relative_path(char const * from, char const * to)
+get_relative_path(char const * from_in, char const * to_in)
+{
+ size_t from_size = strlen (from);
+ size_t to_size = strlen (to);
+ size_t from_size = (from_in == NULL) ? 0 : strlen (from_in);
+ size_t to_size = (to_in == NULL) ? 0 : strlen (to_in);
+ size_t max_size = (from_size + to_size) * 2 + 4;
+ char * common_part = (char *) alloca (max_size);
+ char * result = (char *) alloca (max_size);
+ char * scratch_space = (char *) alloca (from_size + 1 + to_size + 1 + max_size + max_size);
+ char * from;
+ char * to;
+ char * common_part;
+ char * result;
+ size_t count;
+
+ /* If either alloca failed, no from was given, from is not absolute
+ or either to or from contains '.' then return a copy of to; it's
+ the best we can do in this instance (though we could call a path
+ normalization function for some of these conditions).
+ */
+ if (common_part == NULL
+ || result == NULL
+ || from == NULL
+ || from[0] != '/'
+ || strchr (to, '.') != NULL
+ || strchr (from, '.') != NULL)
+ /* No to, return "./" */
+ if (to_in == NULL)
+ {
+ return malloc_copy_string (to);
+ return malloc_copy_string ("./");
+ }
+
+ /* If alloca failed or no from was given return a copy of to */
+ if ( from_in == NULL
+ || scratch_space == NULL )
+ {
+ return malloc_copy_string (to_in);
+ }
+
+ from = scratch_space;
+ strcpy (from, from_in);
+ to = from + from_size + 1;
+ strcpy (to, to_in);
+ common_part = to + to_size + 1;
+ result = common_part + max_size;
+ simplify_path (from);
+ simplify_path (to);
+
+ result[0] = '\0';
+
+ size_t match_size_dirsep = 0; /* The match size up to the last /. Always wind back to this - 1 */
@@ -295,7 +309,7 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+ } while ((result_p = strchr (result_p, '/')) != NULL);
+
+ result_p = result;
+ char const ** toks = (char const **) alloca (sizeof(char const*) * n_toks);
+ char const ** toks = (char const **) alloca (sizeof (char const*) * n_toks);
+ n_toks = 0;
+ do
+ {
@@ -341,7 +355,7 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+ if (removals[j] >= 0) /* Can become -2 */
+ {
+ --n_toks;
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof(char*));
+ memmove (&toks[removals[j]], &toks[removals[j]+1], (n_toks - removals[j])*sizeof (char*));
+ --i;
+ if (!j)
+ {
@@ -506,11 +520,11 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+ while ((path_list_p = strchr (path_list_p, split_char)) != NULL);
+
+ /* allocate everything in one go. */
+ char * all_memory = (char *) malloc (sizeof(char *) * path_count + strlen(path_list) + 1);
+ char * all_memory = (char *) malloc (sizeof (char *) * path_count + strlen(path_list) + 1);
+ if (all_memory == NULL)
+ return 0;
+ *arr = (char **)all_memory;
+ all_memory += sizeof(char *) * path_count;
+ all_memory += sizeof (char *) * path_count;
+
+ path_count = 0;
+ path_list_p = path_list;
@@ -539,7 +553,7 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+{
+ char exe_path[MAX_PATH];
+ char * temp;
+ get_executable_path (NULL, &exe_path[0], sizeof(exe_path) / sizeof(exe_path[0]));
+ get_executable_path (NULL, &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0]));
+ if ((temp = strrchr (exe_path, '/')) != NULL)
+ {
+ temp[1] = '\0';
@@ -605,14 +619,18 @@ diff -Naur pkgconf-0.9.6-orig/pathtools.c pkgconf-0.9.6/pathtools.c
+ free ((void*)arr);
+ return result;
+}
diff -Naur pkgconf-0.9.6-orig/pathtools.h pkgconf-0.9.6/pathtools.h
--- pkgconf-0.9.6-orig/pathtools.h 1970-01-01 03:00:00.000000000 +0300
+++ pkgconf-0.9.6/pathtools.h 2014-08-08 09:36:15.000000000 +0400
@@ -0,0 +1,45 @@
diff -urN old/pathtools.h new/pathtools.h
--- old/pathtools.h 1970-01-01 01:00:00.000000000 +0100
+++ new/pathtools.h 2014-08-28 18:40:03.939064600 +0100
@@ -0,0 +1,49 @@
+/*
+ .Some useful path tools.
+ Written by Ray Donnelly in 2014.
+ Licensed under CC0. No warranty.
+ .ASCII only for now.
+ .Written by Ray Donnelly in 2014.
+ .Licensed under CC0 (and anything.
+ .else you need to license it under).
+ .No warranties whatsoever.
+ .email: <mingw.android@gmail.com>.
+ */
+
+#ifndef PATHTOOLS_H

View File

@@ -17,10 +17,11 @@ source=(http://rabbit.dereferenced.org/~nenolod/distfiles//$_realname-$pkgver.ta
0002-relocate.patch)
sha256sums=('c40a77543fe5c7259b813f70ddaf229c2760a250d1cf2ccef60b81fb1d3fc299'
'f7b3d51121844999a5a2c2b662d1c69f589d7f023a8c42931425937e64cff1dd'
'78a6331530c3ea1175aadf6002574a205d4ed6f19507c4af8452573013751da0')
'108e30feb249e68a2c494723485cafaa0e47158103699dca8d5916620361228a')
prepare() {
cd $_realname-$pkgver
rm -f pathtools.c pathtools.h m4/as-ac-expand.m4 > /dev/null 2>&1 || true
patch -p1 -i ${srcdir}/0001-fix-windows-separator.patch
patch -p1 -i ${srcdir}/0002-relocate.patch
@@ -29,7 +30,9 @@ prepare() {
build() {
cd $_realname-$pkgver
./configure --prefix=${MINGW_PREFIX} \
[ -d ${CARCH} ] || mkdir ${CARCH}
cd ${CARCH}
../configure --prefix=${MINGW_PREFIX} \
--build=${MINGW_CHOST} \
--host=${MINGW_CHOST} \
--target=${MINGW_CHOST} \
@@ -41,7 +44,7 @@ build() {
}
package() {
cd $_realname-$pkgver
cd $_realname-$pkgver/${CARCH}
make DESTDIR="$pkgdir" install
cp "${pkgdir}${MINGW_PREFIX}"/bin/pkgconf "${pkgdir}${MINGW_PREFIX}"/bin/pkg-config
}

View File

@@ -3,7 +3,7 @@
_realname=rust
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=r31815.18d6eef
pkgver=r31823.b516532
pkgrel=1
pkgdesc="A safe, concurrent, practical language from Mozilla (mingw-w64)"
arch=('any')
@@ -51,3 +51,11 @@ package() {
cd "${srcdir}"/build-${MINGW_CARCH}
make DESTDIR=${pkgdir} install
}
# pushd /e/m2/repo/mingw-w64-rust-git/src/build-
# CFG_SRC_DIR=/e/m2/repo/mingw-w64-rust-git/src/rust/ /mingw64/bin/python2.7 /e/m2/repo/mingw-w64-rust-git/src/rust/src/etc/get-snapshot.py x86_64-w64-mingw32
# ..
# rm -f dl/* ; /usr/bin/curl -o dl/rust-stage0-2014-08-17-a86d9ad-winnt-i386-c2b08d721c5c1628aea4932c0e09e5bf07d54881.tar.bz2.tmp https://static.rust-lang.org/stage0-snapshots/rust-stage0-2014-08-17-a86d9ad-winnt-i386-c2b08d721c5c1628aea4932c0e09e5bf07d54881.tar.bz2
# vs
# rm -f dl/* ; /e/msys64/mingw64/bin/curl.exe -o dl/rust-stage0-2014-08-17-a86d9ad-winnt-i386-c2b08d721c5c1628aea4932c0e09e5bf07d54881.tar.bz2.tmp https://static.rust-lang.org/stage0-snapshots/rust-stage0-2014-08-17-a86d9ad-winnt-i386-c2b08d721c5c1628aea4932c0e09e5bf07d54881.tar.bz2
#