[ros-diffs] [cwittich] 32587: apply patch from Christophe Gisquet <christophe dot gisquet at free.fr> with some modifications -don't use access with X_OK, it won't work on Vista http://lists.samba.org/archive/ccache/2006q3/000242.html

cwittich at svn.reactos.org cwittich at svn.reactos.org
Sun Mar 9 12:34:52 CET 2008


Author: cwittich
Date: Thu Mar  6 17:36:43 2008
New Revision: 32587

URL: http://svn.reactos.org/svn/reactos?rev=3D32587&view=3Drev
Log:
apply patch from Christophe Gisquet <christophe dot gisquet at free.fr> wit=
h some modifications
-don't use access with X_OK, it won't work on Vista
http://lists.samba.org/archive/ccache/2006q3/000242.html

Modified:
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/args.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.h
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/cleanup.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/execute.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/hash.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/stats.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/unify.c
    trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/util.c

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/args.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/args.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/args.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/args.c Thu Mar  6 17:3=
6:43 2008
@@ -38,7 +38,7 @@
 void args_add(ARGS *args, const char *s)
 {
 	args->argv =3D (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(ch=
ar *));
-	args->argv[args->argc] =3D x_strdup(s);
+	args->argv[args->argc] =3D x_quote_strdup(s);
 	args->argc++;
 	args->argv[args->argc] =3D NULL;
 }
@@ -69,7 +69,7 @@
 	args->argv =3D (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(ch=
ar *));
 	memmove(&args->argv[1], &args->argv[0], =

 		(args->argc+1) * sizeof(args->argv[0]));
-	args->argv[0] =3D x_strdup(s);
+	args->argv[0] =3D x_quote_strdup(s);
 	args->argc++;
 }
 =


Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/ccache.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.c Thu Mar  6 17=
:36:43 2008
@@ -87,6 +87,38 @@
 	{"ii", "ii"},
 	{NULL, NULL}};
 =

+static int first_is_meh(const char* first)
+{
+    const char*  exe =3D strrchr(first, PATH_SEP_CHAR);
+    const size_t len =3D strlen(MYNAME);
+
+    if (exe) exe++;
+    else     exe=3Dfirst;
+    return (strlen(exe) >=3D len && strncmp(exe, MYNAME, len) =3D=3D 0 &&
+            (exe[len]=3D=3D0 || strcmp(exe+len, ".exe")=3D=3D0) );
+}
+
+char *build_command(char **argv)
+{
+	char *cmd;
+	int i, length =3D 0;
+
+	for(i =3D 0; argv[i]; i++) {
+		length++;
+		length +=3D (int)strlen(argv[i]);
+	}
+
+	cmd =3D (char *)malloc(length);
+	strcpy(cmd, argv[0]);
+
+	for(i =3D 1; argv[i]; i++) {
+		strcat(cmd, " ");
+		strcat(cmd, argv[i]);
+	}
+
+	return cmd;
+}
+
 /*
   something went badly wrong - just execute the real compiler
 */
@@ -155,12 +187,15 @@
 {
 	char *path_stderr;
 	char *tmp_stdout, *tmp_stderr, *tmp_hashname;
-	struct stat st1, st2;
+	struct stat st;
 	int status;
-
-	x_asprintf(&tmp_stdout, "%s/tmp.stdout.%s", temp_dir, tmp_string());
-	x_asprintf(&tmp_stderr, "%s/tmp.stderr.%s", temp_dir, tmp_string());
-	x_asprintf(&tmp_hashname, "%s/tmp.hash.%s.o", temp_dir, tmp_string());
+	off_t size =3D 0;
+
+	/* No quoting, unique arguments */
+	x_asprintf(&tmp_stdout, "%s"PATH_SEP"tmp.stdout.%s", temp_dir, tmp_string=
());
+	x_asprintf(&tmp_stderr, "%s"PATH_SEP"tmp.stderr.%s", temp_dir, tmp_string=
());
+	/* Must be quoted as it will belong to a command-line */
+	x_asprintf(&tmp_hashname, "%s"PATH_SEP"tmp.hash.%s.o", temp_dir, tmp_stri=
ng());
 =

 	args_add(args, "-o");
 	args_add(args, tmp_hashname);
@@ -181,7 +216,7 @@
 	status =3D execute(args->argv, tmp_stdout, tmp_stderr);
 	args_pop(args, 3);
 =

-	if (stat(tmp_stdout, &st1) !=3D 0 || st1.st_size !=3D 0) {
+	if (stat(tmp_stdout, &st) !=3D 0 || st.st_size !=3D 0) {
 		cc_log("compiler produced stdout for %s\n", output_file);
 		stats_update(STATS_STDOUT);
 		unlink(tmp_stdout);
@@ -198,7 +233,7 @@
 =

 		fd =3D open(tmp_stderr, O_RDONLY | O_BINARY);
 		if (fd !=3D -1) {
-			if (strcmp(output_file, "/dev/null") =3D=3D 0 ||
+			if (strcmp(output_file, DEV_NULL) =3D=3D 0 ||
 			    rename(tmp_hashname, output_file) =3D=3D 0 || errno =3D=3D ENOENT) {
 				if (cpp_stderr) {
 					/* we might have some stderr from cpp */
@@ -211,8 +246,7 @@
 					}
 				}
 =

-				/* we can use a quick method of
-                                   getting the failed output */
+				/* we can use a quick method of getting the failed output */
 				copy_fd(fd, 2);
 				close(fd);
 				unlink(tmp_stderr);
@@ -228,19 +262,32 @@
 		failed();
 	}
 =

+    if (stat(tmp_hashname, &st) !=3D 0 || rename(tmp_hashname, hashname) !=
=3D 0) {
+        cc_log("failed to rename output: %s\n"
+               "  '%s'\n"
+               "  -> '%s': \n",
+               strerror(errno), tmp_hashname, hashname);
+		stats_update(STATS_ERROR);
+		failed();
+	}
+    cc_log("Moved '%s' to '%s'\n", tmp_hashname, hashname);
+    size +=3D file_size(&st);
+
 	x_asprintf(&path_stderr, "%s.stderr", hashname);
-
-	if (stat(tmp_stderr, &st1) !=3D 0 ||
-	    stat(tmp_hashname, &st2) !=3D 0 ||
-	    rename(tmp_hashname, hashname) !=3D 0 ||
-	    rename(tmp_stderr, path_stderr) !=3D 0) {
-		cc_log("failed to rename tmp files - %s\n", strerror(errno));
+	if (stat(tmp_stderr, &st) !=3D 0 || rename(tmp_stderr, path_stderr) !=3D =
0) {
+        cc_log("failed to rename stderr: %s\n"
+               "  '%s'\n"
+               "  -> '%s': \n",
+               strerror(errno), tmp_stderr, path_stderr);
 		stats_update(STATS_ERROR);
 		failed();
 	}
 =

+	cc_log("Moved '%s' to '%s'\n", tmp_stderr, path_stderr);
+    size +=3D file_size(&st);
+
 	cc_log("Placed %s into cache\n", output_file);
-	stats_tocache(file_size(&st1) + file_size(&st2));
+	stats_tocache(size);
 =

 	free(tmp_hashname);
 	free(tmp_stderr);
@@ -331,8 +378,8 @@
 		hash_string(str_basename(args->argv[0]));
 	}
 =

-	hash_int(st.st_size);
-	hash_int(st.st_mtime);
+	hash_int((int)st.st_size);
+	hash_int((int)st.st_mtime);
 =

 	/* possibly hash the current working directory */
 	if (getenv("CCACHE_HASHDIR")) {
@@ -356,11 +403,11 @@
 		input_base[10] =3D 0;
 	}
 =

-	/* now the run */
-	x_asprintf(&path_stdout, "%s/%s.tmp.%s.%s", temp_dir,
-		   input_base, tmp_string(), =

-		   i_extension);
-	x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string());
+	/* now the run - path_std* are unique args =3D> no quoting */
+	x_asprintf(&path_stdout, "%s"PATH_SEP"%s.tmp.%s.%s", temp_dir,
+ 		   input_base, tmp_string(), =

+ 		   i_extension);
+	x_asprintf(&path_stderr, "%s"PATH_SEP"tmp.cpp_stderr.%s", temp_dir, tmp_s=
tring());
 =

 	if (!direct_i_file) {
 		/* run cpp on the input file to obtain the .i */
@@ -423,17 +470,18 @@
 =

 	/* we use a N level subdir for the cache path to reduce the impact
 	   on filesystems which are slow for large directories
+	   Quoting not necessary because unique argument, or not used yet.
 	*/
 	s =3D hash_result();
-	x_asprintf(&hash_dir, "%s/%c", cache_dir, s[0]);
-	x_asprintf(&stats_file, "%s/stats", hash_dir);
+	x_asprintf(&hash_dir, "%s"PATH_SEP"%c", cache_dir, s[0]);
+	x_asprintf(&stats_file, "%s"PATH_SEP"stats", hash_dir);
 	for (i=3D1; i<nlevels; i++) {
 		char *p;
 		if (create_dir(hash_dir) !=3D 0) {
 			cc_log("failed to create %s\n", hash_dir);
 			failed();
 		}
-		x_asprintf(&p, "%s/%c", hash_dir, s[i]);
+		x_asprintf(&p, "%s"PATH_SEP"%c", hash_dir, s[i]);
 		free(hash_dir);
 		hash_dir =3D p;
 	}
@@ -441,7 +489,7 @@
 		cc_log("failed to create %s\n", hash_dir);
 		failed();
 	}
-	x_asprintf(&hashname, "%s/%s", hash_dir, s+nlevels);
+	x_asprintf(&hashname, "%s"PATH_SEP"%s", hash_dir, s+nlevels);
 	free(hash_dir);
 }
 =

@@ -483,7 +531,7 @@
 =

 	utime(stderr_file, NULL);
 =

-	if (strcmp(output_file, "/dev/null") =3D=3D 0) {
+	if (strcmp(output_file, DEV_NULL) =3D=3D 0) {
 		ret =3D 0;
 	} else {
 		unlink(output_file);
@@ -562,10 +610,10 @@
 	base =3D str_basename(argv[0]);
 =

 	/* we might be being invoked like "ccache gcc -c foo.c" */
-	if (strcmp(base, MYNAME) =3D=3D 0) {
+	if (first_is_meh(argv[0])) {
 		args_remove_first(orig_args);
 		free(base);
-		if (strchr(argv[1],'/')) {
+		if (strchr(argv[1],PATH_SEP_CHAR)) {
 			/* a full path was given */
 			return;
 		}
@@ -801,7 +849,7 @@
 	if (!output_file) {
 		char *p;
 		output_file =3D x_strdup(input_file);
-		if ((p =3D strrchr(output_file, '/'))) {
+		if ((p =3D strrchr(output_file, PATH_SEP_CHAR))) {
 			output_file =3D p+1;
 		}
 		p =3D strrchr(output_file, '.');
@@ -815,7 +863,7 @@
 	}
 =

 	/* cope with -o /dev/null */
-	if (strcmp(output_file,"/dev/null") !=3D 0 && stat(output_file, &st) =3D=
=3D 0 && !S_ISREG(st.st_mode)) {
+	if (strcmp(output_file, DEV_NULL) !=3D 0 && stat(output_file, &st) =3D=3D=
 0 && !S_ISREG(st.st_mode)) {
 		cc_log("Not a regular file %s\n", output_file);
 		stats_update(STATS_DEVICE);
 		failed();
@@ -934,14 +982,15 @@
 =

 		case 'F':
 			v =3D atoi(optarg);
-			stats_set_limits(v, -1);
+			stats_set_limits((long)v, -1);
 			printf("Set cache file limit to %u\n", (unsigned)v);
 			break;
 =

 		case 'M':
 			v =3D value_units(optarg);
-			stats_set_limits(-1, v);
+			stats_set_limits(-1, (long) v);
 			printf("Set cache size limit to %uk\n", (unsigned)v);
+			printf("not implemented");
 			break;
 =

 		default:
@@ -983,7 +1032,7 @@
 =

 	cache_dir =3D getenv("CCACHE_DIR");
 	if (!cache_dir) {
-		x_asprintf(&cache_dir, "%s/.ccache", get_home_directory());
+		x_asprintf(&cache_dir, "%s"PATH_SEP".ccache", get_home_directory());
 	}
 =

 	temp_dir =3D getenv("CCACHE_TEMPDIR");
@@ -1009,8 +1058,8 @@
 =

 =

 	/* check if we are being invoked as "ccache" */
-	if (strlen(argv[0]) >=3D strlen(MYNAME) &&
-	    strcmp(argv[0] + strlen(argv[0]) - strlen(MYNAME), MYNAME) =3D=3D 0) {
+	if (first_is_meh(argv[0]))
+	{
 		if (argc < 2) {
 			usage();
 			exit(1);

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.h
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/ccache.h?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.h (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/ccache.h Thu Mar  6 17=
:36:43 2008
@@ -1,23 +1,38 @@
 #define CCACHE_VERSION "2.4"
 =

 #include "config.h"
+#define USUAL_PATH_SEP_CHAR '/'
+#define USUAL_PATH_SEP "/"
+#define WIN32_PATH_SEP_CHAR '\\'
+#define WIN32_PATH_SEP "\\"
 =

 #include <stdio.h>
-#include <unistd.h>
 #include <stdlib.h>
 #include <errno.h>
+#include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/mman.h>
-#include <sys/file.h>
+#ifdef _WIN32
+ #include <windows.h>
+ #include <sys/locking.h>
+ #define PATH_SEP WIN32_PATH_SEP
+ #define PATH_SEP_CHAR WIN32_PATH_SEP_CHAR
+ #define DEV_NULL "NUL"
+#else
+ #include <unistd.h>
+ #include <sys/wait.h>
+ #include <sys/mman.h>
+ #include <sys/file.h>
+ #include <utime.h>
+ #include <dirent.h>
+ #define PATH_SEP USUAL_PATH_SEP
+ #define PATH_SEP_CHAR USUAL_PATH_SEP_CHAR
+ #define DEV_NULL "/dev/null"
+#endif
 #include <fcntl.h>
 #include <time.h>
 #include <string.h>
 #include <ctype.h>
-#include <utime.h>
 #include <stdarg.h>
-#include <dirent.h>
 #include <limits.h>
 #ifdef HAVE_PWD_H
 #include <pwd.h>
@@ -83,6 +98,7 @@
 int create_dir(const char *dir);
 void x_asprintf(char **ptr, const char *format, ...);
 char *x_strdup(const char *s);
+char *x_quote_strdup(const char* s);
 void *x_realloc(void *ptr, size_t size);
 void *x_malloc(size_t size);
 void traverse(const char *dir, void (*fn)(const char *, struct stat *));

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/cleanup.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/cleanup.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/cleanup.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/cleanup.c Thu Mar  6 1=
7:36:43 2008
@@ -50,7 +50,9 @@
 {
 	char *p;
 =

+#ifndef WIN32
 	if (!S_ISREG(st->st_mode)) return;
+#endif
 =

 	p =3D str_basename(fname);
 	if (strcmp(p, "stats") =3D=3D 0) {
@@ -107,8 +109,8 @@
 {
 	unsigned i;
 =

-	size_threshold =3D maxsize * LIMIT_MULTIPLE;
-	files_threshold =3D maxfiles * LIMIT_MULTIPLE;
+	size_threshold =3D maxsize * (size_t) LIMIT_MULTIPLE;
+	files_threshold =3D maxfiles * (size_t) LIMIT_MULTIPLE;
 =

 	num_files =3D 0;
 	total_size =3D 0;
@@ -143,8 +145,9 @@
 	int i;
 	=

 	for (i=3D0;i<=3D0xF;i++) {
-		x_asprintf(&dname, "%s/%1x", dir, i);
-		x_asprintf(&sfile, "%s/%1x/stats", dir, i);
+		/* No need to quote, unique argument */
+		x_asprintf(&dname, "%s"PATH_SEP"%1x", dir, i);
+		x_asprintf(&sfile, "%s"PATH_SEP"%1x"PATH_SEP"stats", dir, i);
 =

 		memset(counters, 0, sizeof(counters));
 		stats_read(sfile, counters);
@@ -183,7 +186,7 @@
 	int i;
 	=

 	for (i=3D0;i<=3D0xF;i++) {
-		x_asprintf(&dname, "%s/%1x", dir, i);
+		x_asprintf(&dname, "%s"PATH_SEP"%1x", dir, i);
 		traverse(dir, wipe_fn);
 		free(dname);
 	}

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/execute.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/execute.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/execute.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/execute.c Thu Mar  6 1=
7:36:43 2008
@@ -27,6 +27,7 @@
 	    const char *path_stdout,
 	    const char *path_stderr)
 {
+#ifndef _WIN32
 	pid_t pid;
 	int status;
 =

@@ -64,8 +65,87 @@
 	}
 =

 	return WEXITSTATUS(status);
+#else /* Should be portable */
+    int   status =3D -2;
+    int   fd, std_od =3D -1, std_ed =3D -1;
+
+    unlink(path_stdout);
+    std_od =3D _dup(1);
+    fd =3D _open(path_stdout, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 06=
66);
+    if (fd =3D=3D -1) {
+        status =3D STATUS_NOCACHE;
+        cc_log("stdout error: failed to open %s\n", path_stdout);
+        goto out;
+    }
+    /*std_od =3D */ _dup2(fd, 1);
+    _close(fd);
+
+    unlink(path_stderr);
+    fd =3D _open(path_stderr, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 06=
66);
+    std_ed =3D _dup(2); =

+    if (fd =3D=3D -1) {
+        status =3D STATUS_NOCACHE;
+        cc_log("stderr error: failed to open %s\n", path_stderr);
+        goto out;
+    }
+    /*std_ed =3D*/ _dup2(fd, 2);
+    _close(fd);
+
+    /* Spawn process (_exec* familly doesn't return) */
+    status =3D _spawnv(_P_WAIT, argv[0], argv);
+
+ out:
+    cc_log("%s:\n  stdout -> %s\n  stderr -> %s\n  process status=3D%i\n",
+           argv[0], path_stdout, path_stderr, status);
+    if (status =3D=3D -1) cc_log("Error %i: %s\n", errno, strerror(errno));
+
+    /* Restore descriptors */
+    if (std_od !=3D -1) _dup2(std_od, 1);
+    if (std_ed !=3D -1) _dup2(std_ed, 2); =

+    _flushall();
+
+    return (status>0);
+#endif
 }
 =

+
+
+/*
+ Check that the executable exists
+*/
+char is_exec_file(const char *fname, const char *exclude_name)
+{
+	struct stat st1, st2;
+
+    if (access(fname, 0) =3D=3D 0 &&
+#ifndef _WIN32 /* Symlinks not used under windows */
+        lstat(fname, &st1) =3D=3D 0 &&
+#endif
+        stat(fname, &st2) =3D=3D 0 &&
+        S_ISREG(st2.st_mode)) {
+#ifndef _WIN32 /* Symlinks not used under windows */
+        /* if its a symlink then ensure it doesn't
+           point at something called exclude_name */
+        if (S_ISLNK(st1.st_mode)) {
+            char *buf =3D x_realpath(fname);
+            if (buf) {
+                char *p =3D str_basename(buf);
+                if (strcmp(p, exclude_name) =3D=3D 0) {
+                    /* its a link to "ccache" ! */
+                    free(p);
+                    free(buf);
+                    return -1;
+                }
+                free(buf);
+                free(p);
+            }
+        }
+#endif    =

+        /* found it! */
+        return 1;
+    }
+    return -1;
+}
 =

 /*
   find an executable by name in $PATH. Exclude any that are links to exclu=
de_name =

@@ -74,9 +154,9 @@
 {
 	char *path;
 	char *tok;
-	struct stat st1, st2;
-
-	if (*name =3D=3D '/') {
+	const char *sep =3D ":";
+
+	if (*name =3D=3D PATH_SEP_CHAR) {
 		return x_strdup(name);
 	}
 =

@@ -91,39 +171,37 @@
 =

 	path =3D x_strdup(path);
 	=

+	/* Determine path separator */
+    if (strchr(path, ';')) sep =3D ";";
+
 	/* search the path looking for the first compiler of the right name
 	   that isn't us */
-	for (tok=3Dstrtok(path,":"); tok; tok =3D strtok(NULL, ":")) {
+	for (tok=3Dstrtok(path, sep); tok; tok =3D strtok(NULL, sep)) {
 		char *fname;
-		x_asprintf(&fname, "%s/%s", tok, name);
+		x_asprintf(&fname, "%s"PATH_SEP"%s", tok, name);
 		/* look for a normal executable file */
-		if (access(fname, X_OK) =3D=3D 0 &&
-		    lstat(fname, &st1) =3D=3D 0 &&
-		    stat(fname, &st2) =3D=3D 0 &&
-		    S_ISREG(st2.st_mode)) {
-			/* if its a symlink then ensure it doesn't
-                           point at something called exclude_name */
-			if (S_ISLNK(st1.st_mode)) {
-				char *buf =3D x_realpath(fname);
-				if (buf) {
-					char *p =3D str_basename(buf);
-					if (strcmp(p, exclude_name) =3D=3D 0) {
-						/* its a link to "ccache" ! */
-						free(p);
-						free(buf);
-						continue;
-					}
-					free(buf);
-					free(p);
-				}
-			}
-
-			/* found it! */
+		=

+
+		if (is_exec_file(fname, exclude_name) > 0)
+        {
 			free(path);
 			return fname;
 		}
 		free(fname);
-	}
-
+
+			/* found it! */
+#ifdef _WIN32 /* Add .exe under win32 */
+		x_asprintf(&fname, "%s"PATH_SEP"%s.exe", tok, name);
+
+		/* look for a normal executable file */
+        if (is_exec_file(fname, exclude_name) > 0)
+        {
+			free(path);
+			return fname;
+		}
+		free(fname);
+#endif
+	}
+free(path);
 	return NULL;
 }

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/hash.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/hash.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/hash.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/hash.c Thu Mar  6 17:3=
6:43 2008
@@ -35,7 +35,7 @@
 =

 void hash_string(const char *s)
 {
-	hash_buffer(s, strlen(s));
+	hash_buffer(s, (int)strlen(s));
 }
 =

 void hash_int(int x)

Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/stats.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/stats.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/stats.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/stats.c Thu Mar  6 17:=
36:43 2008
@@ -126,7 +126,7 @@
 =

 	if (!stats_file) {
 		if (!cache_dir) return;
-		x_asprintf(&stats_file, "%s/stats", cache_dir);
+		x_asprintf(&stats_file, "%s"PATH_SEP"stats", cache_dir);
 	}
 =

 	/* open safely to try to prevent symlink races */
@@ -215,9 +215,9 @@
 		char *fname;
 =

 		if (dir =3D=3D -1) {
-			x_asprintf(&fname, "%s/stats", cache_dir);
+			x_asprintf(&fname, "%s"PATH_SEP"stats", cache_dir);
 		} else {
-			x_asprintf(&fname, "%s/%1x/stats", cache_dir, dir);
+			x_asprintf(&fname, "%s"PATH_SEP"%1x"PATH_SEP"stats", cache_dir, dir);
 		}
 =

 		stats_read(fname, counters);
@@ -259,12 +259,12 @@
 	char *fname;
 	unsigned counters[STATS_END];
 =

-	x_asprintf(&fname, "%s/stats", cache_dir);
+	x_asprintf(&fname, "%s"PATH_SEP"stats", cache_dir);
 	unlink(fname);
 	free(fname);
 =

 	for (dir=3D0;dir<=3D0xF;dir++) {
-		x_asprintf(&fname, "%s/%1x/stats", cache_dir, dir);
+		x_asprintf(&fname, "%s"PATH_SEP"%1x"PATH_SEP"stats", cache_dir, dir);
 		fd =3D safe_open(fname);
 		if (fd =3D=3D -1) {
 			free(fname);
@@ -305,9 +305,9 @@
 		char *fname, *cdir;
 		int fd;
 =

-		x_asprintf(&cdir, "%s/%1x", cache_dir, dir);
+		x_asprintf(&cdir, "%s"PATH_SEP"%1x", cache_dir, dir);
 		create_dir(cdir);
-		x_asprintf(&fname, "%s/stats", cdir);
+		x_asprintf(&fname, "%s"PATH_SEP"stats", cdir);
 		free(cdir);
 =

 		memset(counters, 0, sizeof(counters));
@@ -336,7 +336,7 @@
 	char *stats_file;
 =

 	create_dir(dir);
-	x_asprintf(&stats_file, "%s/stats", dir);
+	x_asprintf(&stats_file, "%s"PATH_SEP"stats", dir);
 =

 	memset(counters, 0, sizeof(counters));
 =


Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/unify.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/unify.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/unify.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/unify.c Thu Mar  6 17:=
36:43 2008
@@ -209,7 +209,7 @@
 			q =3D p[ofs];
 			for (i=3D0;i<tokens[q].num_toks;i++) {
 				unsigned char *s =3D (unsigned char *)tokens[q].toks[i];
-				int len =3D strlen((char *)s);
+				int len =3D (int) strlen((char *)s);
 				if (size >=3D ofs+len && memcmp(&p[ofs], s, len) =3D=3D 0) {
 					int j;
 					for (j=3D0;s[j];j++) {
@@ -241,6 +241,7 @@
 	int fd;
 	struct stat st;	=

 	char *map;
+	HANDLE view;
 =

 	fd =3D open(fname, O_RDONLY|O_BINARY);
 	if (fd =3D=3D -1 || fstat(fd, &st) !=3D 0) {
@@ -249,6 +250,33 @@
 		return -1;
 	}
 =

+#ifdef _WIN32
+    /* win32 equivalent of mmap is ViewMapOfFile, but malloc+read
+       may be better */
+    view =3D CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL,
+                                    PAGE_READONLY|SEC_COMMIT, 0,0 , NULL);
+    if (NULL =3D=3D view) {
+        cc_log("Failed to create file mapping %s: %s\n",
+               fname, strerror(errno));
+		stats_update(STATS_PREPROCESSOR);
+		return -1;
+	}
+
+	map =3D MapViewOfFile(view, FILE_MAP_READ, 0, 0, st.st_size);
+    if (NULL =3D=3D map) {
+        cc_log("Failed to map view of file %s: %s\n",
+               fname, strerror(errno));
+		stats_update(STATS_PREPROCESSOR);
+		return -1;
+	}
+
+	/* pass it through the unifier */
+	unify((unsigned char *)map, st.st_size);
+
+    UnmapViewOfFile(map);
+    CloseHandle(view);
+    close(fd);
+#else
 	/* we use mmap() to make it easy to handle arbitrarily long
            lines in preprocessor output. I have seen lines of over
            100k in length, so this is well worth it */
@@ -263,7 +291,7 @@
 	unify((unsigned char *)map, st.st_size);
 =

 	munmap(map, st.st_size);
-
+#endif
 	return 0;
 }
 =


Modified: trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/util.c
URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-Windows/Too=
ls/ccache-2.4/util.c?rev=3D32587&r1=3D32586&r2=3D32587&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/util.c (original)
+++ trunk/tools/RosBE/RosBE-Windows/Tools/ccache-2.4/util.c Thu Mar  6 17:3=
6:43 2008
@@ -20,6 +20,22 @@
 =

 static FILE *logfile;
 =

+#ifdef _WIN32
+int fchmod(int fildes, mode_t mode)
+{
+    return 0;
+}
+#endif
+
+#ifndef HAVE_MKSTEMP
+/* cheap and nasty mkstemp replacement */
+int mkstemp(char *template)
+{
+	_mktemp(template);
+	return open(template, O_RDWR|O_CREAT|O_EXCL|O_BINARY, 0600);
+}
+#endif
+
 /* log a message to the CCACHE_LOGFILE location */
 void cc_log(const char *format, ...)
 {
@@ -155,6 +171,34 @@
 }
 =

 /*
+  this is like strdup() but dies if the malloc fails and add quotes
+  around the argument if it contains spaces.
+*/
+char*
+x_quote_strdup(const char* s)
+{
+    /* Protect against args containing spaces in them - unicode-able ? */
+    if (strchr(s, ' ') !=3D NULL) {
+        size_t len =3D strlen(s); /* at least 1 as it holds ' ' */
+        char  *new_arg =3D x_malloc(len+2*1+1); /* Make room for quoting */
+
+        /* Quote */
+        new_arg[0] =3D '"';
+        memcpy(new_arg+1, s, len);
+        new_arg[len+1] =3D '"';
+        new_arg[len+2] =3D 0;
+
+        /* Done */
+        cc_log("Quoted %s\n", new_arg);
+        return new_arg;
+    }
+    else
+        return x_strdup(s);
+}
+
+
+
+/*
   this is like strdup() but dies if the malloc fails
 */
 char *x_strdup(const char *s)
@@ -220,7 +264,7 @@
 =

 		if (strlen(de->d_name) =3D=3D 0) continue;
 =

-		x_asprintf(&fname, "%s/%s", dir, de->d_name);
+		x_asprintf(&fname, "%s"PATH_SEP"%s", dir, de->d_name);
 		if (lstat(fname, &st)) {
 			if (errno !=3D ENOENT) {
 				perror(fname);
@@ -244,7 +288,7 @@
 /* return the base name of a file - caller frees */
 char *str_basename(const char *s)
 {
-	char *p =3D strrchr(s, '/');
+	char *p =3D strrchr(s, PATH_SEP_CHAR);
 	if (p) {
 		return x_strdup(p+1);
 	} =

@@ -257,7 +301,7 @@
 {
 	char *p;
 	s =3D x_strdup(s);
-	p =3D strrchr(s, '/');
+	p =3D strrchr(s, PATH_SEP_CHAR);
 	if (p) {
 		*p =3D 0;
 	} =

@@ -266,6 +310,9 @@
 =

 int lock_fd(int fd)
 {
+#ifdef _WIN32
+    return _locking(fd, _LK_NBLCK, 1);
+#else
 	struct flock fl;
 	int ret;
 =

@@ -281,17 +328,23 @@
 		ret =3D fcntl(fd, F_SETLKW, &fl);
 	} while (ret =3D=3D -1 && errno =3D=3D EINTR);
 	return ret;
-}
+#endif
+}
+
 =

 /* return size on disk of a file */
 size_t file_size(struct stat *st)
 {
+#ifdef _WIN32
+    return st->st_size;
+#else
 	size_t size =3D st->st_blocks * 512;
 	if ((size_t)st->st_size > size) {
 		/* probably a broken stat() call ... */
 		size =3D (st->st_size + 1023) & ~1023;
 	}
 	return size;
+#endif
 }
 =

 =

@@ -351,6 +404,7 @@
   a sane realpath() function, trying to cope with stupid path limits and =

   a broken API
 */
+#ifndef WIN32
 char *x_realpath(const char *path)
 {
 	int maxlen;
@@ -389,6 +443,7 @@
 	free(ret);
 	return NULL;
 }
+#endif
 =

 /* a getcwd that will returns an allocated buffer */
 char *gnu_getcwd(void)
@@ -397,7 +452,7 @@
 =

 	while (1) {
 		char *buffer =3D (char *)x_malloc(size);
-		if (getcwd(buffer, size) =3D=3D buffer) {
+		if (_getcwd(buffer, size) =3D=3D buffer) {
 			return buffer;
 		}
 		free(buffer);
@@ -408,16 +463,6 @@
 	}
 }
 =

-#ifndef HAVE_MKSTEMP
-/* cheap and nasty mkstemp replacement */
-int mkstemp(char *template)
-{
-	mktemp(template);
-	return open(template, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600);
-}
-#endif
-
-
 /* create an empty file */
 int create_empty_file(const char *fname)
 {
@@ -436,7 +481,18 @@
 */
 const char *get_home_directory(void)
 {
-	const char *p =3D getenv("HOME");
+	const char *p =3D NULL;
+
+#ifdef _WIN32
+    static char szPath[MAX_PATH];
+
+    // "Documents and Settings\user\Application Data" is CSIDL_APPDATA
+    if(SHGetSpecialFolderPathA(NULL, szPath, CSIDL_PROFILE, FALSE))
+    {
+        return szPath;
+    }
+#endif
+    p =3D getenv("HOME");
 	if (p) {
 		return p;
 	}




More information about the Ros-diffs mailing list