[PATCH xts v2] Write results directly to results directory

Peter Harris pharris at opentext.com
Mon Jun 3 15:25:45 PDT 2013


If an installed xtest is run, the user does not normally have write
access to the test directory. Writing intermediate files and results
directly to the results directory avoids a number of spurious FAILs and
UNRESOLVEDs.

Reviewed-by: Jamey Sharp <jamey at minilop.net>
Signed-off-by: Peter Harris <pharris at opentext.com>
---
 xts5/Xlib16/XrmCombineFileDatabase.m |   16 ++++----
 xts5/Xlib16/XrmGetFileDatabase.m     |   10 ++---
 xts5/Xlib16/XrmPutFileDatabase.m     |    2 +-
 xts5/Xlib17/XReadBitmapFile.m        |    6 +--
 xts5/Xlib17/XWriteBitmapFile.m       |   16 ++++----
 xts5/Xt9/XtAppAddInput.m             |   12 +++---
 xts5/Xt9/XtAppMainLoop.m             |    4 +-
 xts5/Xt9/XtAppNextEvent.m            |    4 +-
 xts5/Xt9/XtAppPeekEvent.m            |    4 +-
 xts5/Xt9/XtAppPending.m              |    8 ++--
 xts5/Xt9/XtAppProcessEvent.m         |   12 +++---
 xts5/XtC/XtAddInput.m                |   12 +++---
 xts5/XtC/XtMainLoop.m                |    4 +-
 xts5/XtC/XtNextEvent.m               |    4 +-
 xts5/XtC/XtPeekEvent.m               |    6 +--
 xts5/XtC/XtProcessEvent.m            |   10 ++---
 xts5/include/XtTest.h                |    1 +
 xts5/include/xtlibproto.h            |    2 +
 xts5/src/lib/Makefile.am             |    1 +
 xts5/src/lib/block.c                 |   14 +++----
 xts5/src/lib/checkarea.c             |    2 +-
 xts5/src/lib/dumpimage.c             |    2 +-
 xts5/src/lib/outfile.c               |   67 ++++++++++++++++++++++++++++++++++
 xts5/src/lib/savimage.c              |    2 +-
 xts5/src/lib/verimage.c              |    7 +++-
 xts5/src/xim/linklocale.c            |    4 +-
 xts5/src/xim/xim_save.c              |    2 +-
 27 files changed, 154 insertions(+), 80 deletions(-)
 create mode 100644 xts5/src/lib/outfile.c

diff --git a/xts5/Xlib16/XrmCombineFileDatabase.m b/xts5/Xlib16/XrmCombineFileDatabase.m
index 5881ae4..b06d471 100644
--- a/xts5/Xlib16/XrmCombineFileDatabase.m
+++ b/xts5/Xlib16/XrmCombineFileDatabase.m
@@ -150,13 +150,13 @@ shall merge the contents of a resource file into a database.
 	gfd_return = XrmGetStringDatabase(src_spec1);
 
 	tet_infoline("PREP: Add data to resource file");
-	(void)XrmPutFileDatabase(gfd_return, file_name_good);
+	(void)XrmPutFileDatabase(gfd_return, outfile(file_name_good));
 	tet_infoline("PREP: Add to database");
 
 	(void)XrmPutLineResource(&dst_database_id, dst_spec);
 
 	tet_infoline("TEST: Call to XrmCombineFileDatabase merges resource file into database");
-	XrmCombineFileDatabase(file_name_good, &dst_database_id, True);
+	XrmCombineFileDatabase(outfile(file_name_good), &dst_database_id, True);
 
 	XSync(display_arg, 0);
 	XSetErrorHandler(unexp_err);          
@@ -234,13 +234,13 @@ the entry in target_db.
 	(void)XrmPutLineResource(&gfd_return, src_spec3);
 
 	tet_infoline("PREP: Add data to resource file");
-	(void)XrmPutFileDatabase(gfd_return, file_name_good);
+	(void)XrmPutFileDatabase(gfd_return, outfile(file_name_good));
 
 	tet_infoline("PREP: Add to database");
 	(void)XrmPutLineResource(&dst_database_id, dst_spec);
 
 	tet_infoline("TEST: Entry in the file replaces the database entry");
-	XrmCombineFileDatabase(file_name_good, &dst_database_id, True);
+	XrmCombineFileDatabase(outfile(file_name_good), &dst_database_id, True);
 
 	XSync(display_arg, 0);
 	XSetErrorHandler(unexp_err);          
@@ -318,13 +318,13 @@ replace the entry in target_db.
 	(void)XrmPutLineResource(&gfd_return, src_spec3);
 
 	tet_infoline("PREP: Add data to resource file");
-	(void)XrmPutFileDatabase(gfd_return, file_name_good);
+	(void)XrmPutFileDatabase(gfd_return, outfile(file_name_good));
 
 	tet_infoline("PREP: Add to database");
 	(void)XrmPutLineResource(&dst_database_id, dst_spec);
 
 	tet_infoline("TEST: Entry in the file does not replace the database entry");
-	XrmCombineFileDatabase(file_name_good, &dst_database_id, False);
+	XrmCombineFileDatabase(outfile(file_name_good), &dst_database_id, False);
 
 	XSync(display_arg, 0);
 	XSetErrorHandler(unexp_err);          
@@ -401,12 +401,12 @@ filename in it.
 	gfd_return = XrmGetStringDatabase(src_spec1);
 	(void)XrmPutLineResource(&gfd_return, src_spec2);
 	(void)XrmPutLineResource(&gfd_return, src_spec3);
-	(void)XrmPutFileDatabase(gfd_return, file_name_good);
+	(void)XrmPutFileDatabase(gfd_return, outfile(file_name_good));
 
 	dst_database_id = NULL;
 
 	tet_infoline("TEST: When target_db is NULL a new database is created");
-	XrmCombineFileDatabase(file_name_good, &dst_database_id, True);
+	XrmCombineFileDatabase(outfile(file_name_good), &dst_database_id, True);
 
 	XSync(display_arg, 0);
 	XSetErrorHandler(unexp_err);          
diff --git a/xts5/Xlib16/XrmGetFileDatabase.m b/xts5/Xlib16/XrmGetFileDatabase.m
index 9b6a60a..1094a9f 100644
--- a/xts5/Xlib16/XrmGetFileDatabase.m
+++ b/xts5/Xlib16/XrmGetFileDatabase.m
@@ -169,7 +169,7 @@ char tbuf[256], *tptr;
 XrmDatabase rdb;
 
 /* Create a test database file. */
-	f = fopen(XGFD_TEST_FILE, "w");
+	f = fopen(outfile(XGFD_TEST_FILE), "w");
 	if (f==(FILE *)NULL) {
 		delete("fopen() call to write database failed");
 		return;
@@ -189,7 +189,7 @@ XrmDatabase rdb;
 	fclose(f);
 
 /* Call xname to read the database. */
-	filename = XGFD_TEST_FILE;
+	filename = outfile(XGFD_TEST_FILE);
 	rdb = XCALL;
 
 /* Verify the database was non-NULL, and contained the test information. */
@@ -213,7 +213,7 @@ XrmDatabase rdb;
 
 /* Remove test database file. */
 #ifndef TESTING
-	unlink(XGFD_TEST_FILE);	/* Compiling with CFLOCAL=-DTESTING  */
+	unlink(outfile(XGFD_TEST_FILE));	/* Compiling with CFLOCAL=-DTESTING  */
 					/* allows inspection of the testfile */
 #endif
 
@@ -258,7 +258,7 @@ int	a,b;
 char tbuf[256], *tptr;
 XrmDatabase rdb;
 
-	f = fopen(XGFD_TEST_FILE, "w");
+	f = fopen(outfile(XGFD_TEST_FILE), "w");
 	if (f==(FILE *)NULL) {
 		delete("fopen() call to write database failed");
 		return;
@@ -290,7 +290,7 @@ XrmDatabase rdb;
 		}
 
 		/* Call xname to read the database. */
-		filename = XGFD_TEST_FILE;
+		filename = outfile(XGFD_TEST_FILE);
 		rdb = XCALL;
 
 		/* Verify the database was non-NULL, and contained the test information. */
diff --git a/xts5/Xlib16/XrmPutFileDatabase.m b/xts5/Xlib16/XrmPutFileDatabase.m
index 2a636cf..795635c 100644
--- a/xts5/Xlib16/XrmPutFileDatabase.m
+++ b/xts5/Xlib16/XrmPutFileDatabase.m
@@ -107,7 +107,7 @@ purpose.  It is provided "as is" without express or implied warranty.
 void
 
 XrmDatabase database = (XrmDatabase)NULL;
-char *stored_db = "xpfd_file";
+const char *stored_db = outfile("xpfd_file");
 >>SET startup rmstartup
 >>INCLUDE rescommon.mc
 >>EXTERN
diff --git a/xts5/Xlib17/XReadBitmapFile.m b/xts5/Xlib17/XReadBitmapFile.m
index ab20cd3..a754eae 100644
--- a/xts5/Xlib17/XReadBitmapFile.m
+++ b/xts5/Xlib17/XReadBitmapFile.m
@@ -102,7 +102,7 @@ int
 
 Display *display = Dsp;
 Drawable d = (Drawable)defwin(display);
-char *filename = xrbf_name;
+const char *filename = outfile(xrbf_name);
 unsigned int *width_return = &width;
 unsigned int *height_return = &height;
 Pixmap *bitmap_return = &bitmap;
@@ -191,13 +191,13 @@ int elements;
 static void
 xrbf_b_start() {
 	tpstartup();
-	xrbf_create(xrbf_name, xrbf_one, xrbf_n_one);
+	xrbf_create(outfile(xrbf_name), xrbf_one, xrbf_n_one);
 }
 
 
 static void
 xrbf_b_end()  {
-	unlink(xrbf_name);
+	unlink(outfile(xrbf_name));
 	tpcleanup();
 }
 
diff --git a/xts5/Xlib17/XWriteBitmapFile.m b/xts5/Xlib17/XWriteBitmapFile.m
index f784fea..996d6a3 100644
--- a/xts5/Xlib17/XWriteBitmapFile.m
+++ b/xts5/Xlib17/XWriteBitmapFile.m
@@ -101,7 +101,7 @@ purpose.  It is provided "as is" without express or implied warranty.
 int
 
 Display *display = Dsp;
-char *filename = xwbf_name;
+const char *filename = outfile(xwbf_name);
 Pixmap bitmap = xwbf_bm;
 unsigned int width = xwbf_width;
 unsigned int height = xwbf_height;
@@ -141,7 +141,7 @@ xwbf_start()
 		(char*)xwbf_data, xwbf_width, xwbf_height);
 	regid(Dsp, (union regtypes *)&xwbf_bm, REG_PIXMAP);
 
-	(void)unlink(xwbf_name);
+	(void)unlink(outfile(xwbf_name));
 }
 
 static void
@@ -189,7 +189,7 @@ Verify the bitmap was read back, and the details were correct.
 
 /* Read back bitmap with XReadBitmapFile. */
 	ret=XReadBitmapFile(display, DefaultRootWindow(display),
-		xwbf_name, &w_ret, &h_ret, &pm_ret, &x_h_ret, &y_h_ret);
+		outfile(xwbf_name), &w_ret, &h_ret, &pm_ret, &x_h_ret, &y_h_ret);
 
 /* Verify the bitmap was read back, and the details were correct. */
 	if (ret != BitmapSuccess) {
@@ -265,7 +265,7 @@ Verify the bitmap was read back, and the details were correct.
 
 /* Read back bitmap with XReadBitmapFile. */
 	ret=XReadBitmapFile(display, DefaultRootWindow(display),
-		xwbf_name, &w_ret, &h_ret, &pm_ret, &x_h_ret, &y_h_ret);
+		outfile(xwbf_name), &w_ret, &h_ret, &pm_ret, &x_h_ret, &y_h_ret);
 
 /* Verify the bitmap was read back, and the details were correct. */
 	if (ret != BitmapSuccess) {
@@ -322,7 +322,7 @@ int ret;
 
 /* Create a suitable bitmap. */
 /* Create an unwritable directory. */
-	if(mkdir(XWBF_DIR, XWBF_MODE)) {
+	if(mkdir(outfile(XWBF_DIR), XWBF_MODE)) {
 		int en = errno;
 		delete("Could not create the test subdirectory.");
 		report("errno %d", en);
@@ -331,7 +331,7 @@ int ret;
 		CHECK;
 
 /* Call xname to write the bitmap file. */
-	filename = XWBF_FILE;
+	filename = outfile(XWBF_FILE);
 	ret = XCALL;
 
 /* Verify that a BitmapOpenFailed error occurred. */
@@ -346,8 +346,8 @@ int ret;
 
 	CHECKPASS(2);
 
-	unlink(XWBF_FILE);
-	rmdir(XWBF_DIR);
+	unlink(outfile(XWBF_FILE));
+	rmdir(outfile(XWBF_DIR));
 
 >>ASSERTION Bad B 1
 When insufficient memory is allocated, then a call to xname returns
diff --git a/xts5/Xt9/XtAppAddInput.m b/xts5/Xt9/XtAppAddInput.m
index 160cfa2..75c140b 100644
--- a/xts5/Xt9/XtAppAddInput.m
+++ b/xts5/Xt9/XtAppAddInput.m
@@ -127,12 +127,12 @@ when the file descriptor
 .A source 
 has data to be read and return an identifier for it.
 >>CODE
-char *data;
+const char *data;
 int status;
 pid_t pid2;
 
 if (config.posix_system != 0) {
-	data = "tapaddinp.dat";
+	data = outfile("tapaddinp.dat");
 	FORK(pid2);
 	avs_xt_hier("Tapaddinp1", "XtAppAddInput");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
@@ -171,13 +171,13 @@ when the file descriptor
 .A source 
 is ready for writing.
 >>CODE
-char *data;
+const char *data;
 int status;
 pid_t pid2;
 
 if (config.posix_system != 0) {
 	avs_xt_hier("Tapaddinp1", "XtAppAddInput");
-	data = "tapaddinp.dat";
+	data = outfile("tapaddinp.dat");
 	FORK(pid2);
 	sprintf(ebuf, "PREP: Open file %s for write", data);
 	tet_infoline(ebuf);
@@ -235,13 +235,13 @@ to be passed to
 .A proc
 when it is invoked.
 >>CODE
-char *data;
+const char *data;
 int status;
 pid_t pid2;
 
 if (config.posix_system != 0) {
 	avs_xt_hier("Tapaddinp1", "XtAppAddInput");
-	data = "tapaddinp.dat";
+	data = outfile("tapaddinp.dat");
 	FORK(pid2);
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
diff --git a/xts5/Xt9/XtAppMainLoop.m b/xts5/Xt9/XtAppMainLoop.m
index f4ddb7d..8183829 100644
--- a/xts5/Xt9/XtAppMainLoop.m
+++ b/xts5/Xt9/XtAppMainLoop.m
@@ -278,11 +278,11 @@ void XtAppMainLoop(app_context)
 while it is blocked to read an event from the queue the 
 designated input source callback procedure shall be called.
 >>CODE
-char *data;
+const char *data;
 int status;
 pid_t pid2;
 
-	data = "tapmnloop.dat";
+	data = outfile("tapmnloop.dat");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
 	if ((fid = (FILE *)fopen(data, "w+")) == NULL) {
diff --git a/xts5/Xt9/XtAppNextEvent.m b/xts5/Xt9/XtAppNextEvent.m
index 491b5d0..2b25586 100644
--- a/xts5/Xt9/XtAppNextEvent.m
+++ b/xts5/Xt9/XtAppNextEvent.m
@@ -264,7 +264,7 @@ void XtAppNextEvent(app_context, event_return)
 is blocked the designated callback procedure for the input source 
 shall be called.
 >>CODE
-char *data;
+const char *data;
 pid_t pid2;
 int i;
 int status, waited;
@@ -272,7 +272,7 @@ XEvent loop_event;
 Display *display;
 XtInputMask processing;
 
-	data = "tapnxevnt.dat";
+	data = outfile("tapnxevnt.dat");
 	FORK(pid2);
 	avs_xt_hier("Tapnxevnt4", "XtAppNextEvent");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
diff --git a/xts5/Xt9/XtAppPeekEvent.m b/xts5/Xt9/XtAppPeekEvent.m
index 6c67f5d..2ec21f0 100644
--- a/xts5/Xt9/XtAppPeekEvent.m
+++ b/xts5/Xt9/XtAppPeekEvent.m
@@ -185,9 +185,9 @@ Display *display;
 XtInputMask processing;
 Boolean status;
 int i;
-char *data;
+const char *data;
 
-	data = "tappkevnt.dat";
+	data = outfile("tappkevnt.dat");
 	avs_xt_hier("Tappkevnt2", "XtAppPeekEvent");
 	tet_infoline("PREP: Register timeout");
 	XtAppAddTimeOut(app_ctext, AVSXTLOOPTIMEOUT, XtTMO_Proc, topLevel);
diff --git a/xts5/Xt9/XtAppPending.m b/xts5/Xt9/XtAppPending.m
index b05c4ca..430a06c 100644
--- a/xts5/Xt9/XtAppPending.m
+++ b/xts5/Xt9/XtAppPending.m
@@ -222,9 +222,9 @@ XEvent loop_event;
 Display *display;
 XtInputMask processing;
 int i;
-char *data;
+const char *data;
 
-	data = "tappendng.dat";
+	data = outfile("tappendng.dat");
 	FORK(pid2);
 	avs_xt_hier("Tappendng1", "XtAppPending");
 	tet_infoline("PREP: Register timeout");
@@ -279,9 +279,9 @@ XEvent loop_event;
 Display *display;
 XtInputMask processing;
 int i;
-char *data;
+const char *data;
 
-	data = "tappendng.dat";
+	data = outfile("tappendng.dat");
 	FORK(pid2);
 	avs_xt_hier("Tappendng1", "XtAppPending");
 	tet_infoline("PREP: Register timeout");
diff --git a/xts5/Xt9/XtAppProcessEvent.m b/xts5/Xt9/XtAppProcessEvent.m
index edf9d56..1b206fd 100644
--- a/xts5/Xt9/XtAppProcessEvent.m
+++ b/xts5/Xt9/XtAppProcessEvent.m
@@ -257,9 +257,9 @@ pid_t pid2;
 int status;
 Display *display;
 XEvent loop_event;
-char *data;
+const char *data;
 
-	data = "tapprcevt.dat";
+	data = outfile("tapprcevt.dat");
 	FORK(pid2);
 	avs_xt_hier("Tapprcevt1", "XtAppProcessEvent");
 	tet_infoline("PREP: Create a test labelw_msg widget");
@@ -302,10 +302,10 @@ pid_t pid2;
 int status;
 Display *display;
 XEvent loop_event;
-char *data;
+const char *data;
 int i;
 
-	data = "tapprcevt.dat";
+	data = outfile("tapprcevt.dat");
 	FORK(pid2);
 	avs_xt_hier("Tapprcevt1", "XtAppProcessEvent");
 	tet_infoline("PREP: Create a test labelw_msg widget");
@@ -366,10 +366,10 @@ pid_t pid2;
 int status;
 Display *display;
 XEvent loop_event;
-char *data;
+const char *data;
 int i;
 
-	data = "tapprcevt.dat";
+	data = outfile("tapprcevt.dat");
 	FORK(pid2);
 	avs_xt_hier("Tapprcevt1", "XtAppProcessEvent");
 	tet_infoline("PREP: Create a test labelw_msg widget");
diff --git a/xts5/XtC/XtAddInput.m b/xts5/XtC/XtAddInput.m
index 519c682..6f81c69 100644
--- a/xts5/XtC/XtAddInput.m
+++ b/xts5/XtC/XtAddInput.m
@@ -135,7 +135,7 @@ the file descriptor
 .A source 
 has data to be read and return an identifier for it.
 >>CODE
-char *data;
+const char *data;
 int status = 0;
 pid_t pid2;
 pid_t pid3;
@@ -145,7 +145,7 @@ if (config.posix_system != 0) {
 	FORK(pid3);
 	avs_set_event(1, 0);
 	avs_xt_hier_def("Taddinput1", "XtAddInput");
-	data = "data1";
+	data = outfile("data1");
 	FORK(pid2);
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
@@ -192,7 +192,7 @@ the procedure that will be called when the file descriptor
 .A source 
 is ready for writing.
 >>CODE
-char *data;
+const char *data;
 int status = 0;
 pid_t pid2;
 pid_t pid3;
@@ -202,7 +202,7 @@ if (config.posix_system != 0) {
 	FORK(pid3);
 	avs_set_event(1, 0);
 	avs_xt_hier_def("Taddinput1", "XtAddInput");
-	data = "data1";
+	data = outfile("data1");
 	FORK(pid2);
 	sprintf(ebuf, "PREP: Open file %s for write", data);
 	tet_infoline(ebuf);
@@ -268,7 +268,7 @@ to be passed to
 .A proc
 when it is invoked.
 >>CODE
-char *data;
+const char *data;
 int status = 0;
 pid_t pid2;
 pid_t pid3;
@@ -278,7 +278,7 @@ if (config.posix_system != 0) {
 	FORK(pid3);
 	avs_set_event(1, 0);
 	avs_xt_hier_def("Taddinput1", "XtAddInput");
-	data = "data1";
+	data = outfile("data1");
 	FORK(pid2);
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
diff --git a/xts5/XtC/XtMainLoop.m b/xts5/XtC/XtMainLoop.m
index cd155bf..9331618 100644
--- a/xts5/XtC/XtMainLoop.m
+++ b/xts5/XtC/XtMainLoop.m
@@ -340,9 +340,9 @@ pid_t pid2;
 int invoked = 0;
 pid_t pid3;
 int pstatus;
-char *data;
+const char *data;
 
-	data = "data1";
+	data = outfile("data1");
 	FORK(pid3);
 	avs_xt_hier_def("Tmainloop1", "XtMainLoop");
 	tet_infoline("PREP: Create a test labelw_msg widget");
diff --git a/xts5/XtC/XtNextEvent.m b/xts5/XtC/XtNextEvent.m
index 490c2d2..8a17361 100644
--- a/xts5/XtC/XtNextEvent.m
+++ b/xts5/XtC/XtNextEvent.m
@@ -302,11 +302,11 @@ XtInputMask processing;
 int i;
 pid_t pid3;
 int pstatus;
-char *data;
+const char *data;
 
 	FORK(pid3);
 	avs_xt_hier_def("Tnxtevnt3", "XtNextEvent");
-	data = "data1";
+	data = outfile("data1");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
 	if ((fid = (FILE *)fopen(data, "w+")) == NULL) {
diff --git a/xts5/XtC/XtPeekEvent.m b/xts5/XtC/XtPeekEvent.m
index ec39a65..a5464b2 100644
--- a/xts5/XtC/XtPeekEvent.m
+++ b/xts5/XtC/XtPeekEvent.m
@@ -131,10 +131,10 @@ void XtTMO4_Proc(client_data, id)
 XtPointer client_data;
 XtIntervalId *id;
 {
-char *data;
+const char *data;
 
 	avs_set_event(1, 1);
-	data = "data1";
+	data = outfile("data1");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
 	if ((fid = (FILE *)fopen(data, "w+")) == NULL) {
@@ -337,4 +337,4 @@ int pstatus;
 	else {
 		tet_result(TET_PASS);
 	}
-	unlink("data1");
+	unlink(outfile("data1"));
diff --git a/xts5/XtC/XtProcessEvent.m b/xts5/XtC/XtProcessEvent.m
index 048ed68..ea42731 100644
--- a/xts5/XtC/XtProcessEvent.m
+++ b/xts5/XtC/XtProcessEvent.m
@@ -123,7 +123,7 @@ Boolean *continue_to_dispatch;
 	}
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
-	if ((fid = (FILE *)fopen(data, "w+")) == NULL) {
+	if ((fid = (FILE *)fopen(outfile(data), "w+")) == NULL) {
 		sprintf(ebuf, "ERROR: Could not open file %s", data);
 		tet_infoline(ebuf);
 		tet_result(TET_FAIL);
@@ -455,7 +455,7 @@ int pstatus;
 	avs_xt_hier_def("Tprocevnt1", "XtProcessEvent");
 	sprintf(ebuf, "PREP: Open file %s for read", data);
 	tet_infoline(ebuf);
-	if ((fid = (FILE *)fopen(data, "w+")) == NULL) {
+	if ((fid = (FILE *)fopen(outfile(data), "w+")) == NULL) {
 		sprintf(ebuf, "ERROR: Could not open file %s", data);
 		tet_infoline(ebuf);
 		tet_result(TET_FAIL);
@@ -472,7 +472,7 @@ int pstatus;
 	display = XtDisplay(rowcolw);
 	XtProcessEvent(XtIMAlternateInput);
 	LKROF(pid2, AVSXTTIMEOUT-4);
-	unlink(data);
+	unlink(outfile(data));
 	KROF3(pid3, pstatus, AVSXTTIMEOUT-2);
         if (pstatus != 0) {
 		tet_infoline("ERROR: Test process exited abnormally");
@@ -528,7 +528,7 @@ int pstatus;
 		XtProcessEvent(XtIMAlternateInput|XtIMXEvent|XtIMTimer);
 	}
 	LKROF(pid2, AVSXTTIMEOUT-4);
-	unlink(data);
+	unlink(outfile(data));
 	KROF3(pid3, pstatus, AVSXTTIMEOUT-2);
         if (pstatus != 0) {
 		tet_infoline("ERROR: Test process exited abnormally");
@@ -592,7 +592,7 @@ int pstatus;
 		XtProcessEvent(XtIMAll);
 	}
 	LKROF(pid2, AVSXTTIMEOUT-4);
-	unlink(data);
+	unlink(outfile(data));
 	KROF3(pid3, pstatus, AVSXTTIMEOUT-2);
         if (pstatus != 0) {
 		tet_infoline("ERROR: Test process exited abnormally");
diff --git a/xts5/include/XtTest.h b/xts5/include/XtTest.h
index 0d4429f..0404727 100644
--- a/xts5/include/XtTest.h
+++ b/xts5/include/XtTest.h
@@ -101,6 +101,7 @@ SOFTWARE.
 #include <X11/Shell.h>
 
 #include "XtTestProto.h"
+#include "xtestlib.h"
 
 /*
  * Options are all set into this structure.
diff --git a/xts5/include/xtlibproto.h b/xts5/include/xtlibproto.h
index 33bd1de..62c1cef 100644
--- a/xts5/include/xtlibproto.h
+++ b/xts5/include/xtlibproto.h
@@ -354,6 +354,7 @@ int xtest_putenv(char *envstr);
 int curofwin(Display *display, Cursor cursor, Window window);
 int defcur(Display *display, Window window);
 int spriteiswin(Display *display, Window window);
+const char *outfile(const char *fn);
 
 #else
 
@@ -593,6 +594,7 @@ int xtest_putenv();
 int curofwin();
 int defcur();
 int spriteiswin();
+char *outfile();
 
 #endif
 
diff --git a/xts5/src/lib/Makefile.am b/xts5/src/lib/Makefile.am
index ce68bd5..0f70378 100644
--- a/xts5/src/lib/Makefile.am
+++ b/xts5/src/lib/Makefile.am
@@ -57,6 +57,7 @@ libxtest_la_SOURCES = badcmap.c \
 			notmember.c\
 			opendisp.c\
 			openfonts.c\
+			outfile.c\
 			pattern.c\
 			pfcount.c\
 			pointer.c\
diff --git a/xts5/src/lib/block.c b/xts5/src/lib/block.c
index be2499f..ea55aab 100644
--- a/xts5/src/lib/block.c
+++ b/xts5/src/lib/block.c
@@ -186,14 +186,14 @@ Block_Info	*info;
 		delete("Unsupported speedfactor value: %d", config.speedfactor);
 		return(-1);
 	}
-	fp = fopen(block_file, "w");
+	fp = fopen(outfile(block_file), "w");
 	if (fp == (FILE *) NULL) {
 		delete("Could not create block file: %s", block_file);
 		return(-1);
 	}
 	if (setjmp(jumptohere)) {
 		delete("Timeout in block routine");
-		unlink(block_file);
+		unlink(outfile(block_file));
 		return(-1);
 	}
 	parent_status = 1;
@@ -201,7 +201,7 @@ Block_Info	*info;
 	/*
 	 * try removing block file just in case it still exists...
 	 */
-	unlink(block_file);
+	unlink(outfile(block_file));
 	/*
 	 * check for problems in block_parent_proc
 	 */
@@ -273,7 +273,7 @@ block_child_proc()
 	if (display == NULL)
 		exit(CHILD_EXIT_ERROR);
 	sleep(CHILD_SLEEP_TIME);
-	if (access(block_file, F_OK))
+	if (access(outfile(block_file), F_OK))
 		exit(CHILD_EXIT_NOBLOCKING);
 	if (gevent == NULL) {
 		int	retval;
@@ -298,17 +298,17 @@ block_parent_proc()
 	alarm(0);
 	if (parent_status == -1)
 		return;
-	if (access(block_file, F_OK)) {
+	if (access(outfile(block_file), F_OK)) {
 		delete("Block file mysteriously disappeared: %s", block_file);
 		parent_status = -1;
 		return;
 	}
-	if (unlink(block_file)) {
+	if (unlink(outfile(block_file))) {
 		/*
 		 * return value of unlink() does not always indicate
 		 * whether or not the file was removed...pc
 		 */
-		if (!access(block_file, F_OK)) {
+		if (!access(outfile(block_file), F_OK)) {
 			delete("Block file could not be removed: %s", block_file);
 			parent_status = -1;
 			return;
diff --git a/xts5/src/lib/checkarea.c b/xts5/src/lib/checkarea.c
index 81bcb34..edb5315 100644
--- a/xts5/src/lib/checkarea.c
+++ b/xts5/src/lib/checkarea.c
@@ -385,7 +385,7 @@ extern	int 	Errnum;
 	/* Making up an error file should be a subroutine.. */
 	sprintf(name, "Err%04d.err", Errnum++);
 	report("See file %s for details", name);
-	unlink(name);
+	unlink(outfile(name));
 	dumpimage(bad, name, (struct area *)0);
 	dumpimage(good, name, (struct area *)0);
 
diff --git a/xts5/src/lib/dumpimage.c b/xts5/src/lib/dumpimage.c
index a5ffdcc..bca9c86 100644
--- a/xts5/src/lib/dumpimage.c
+++ b/xts5/src/lib/dumpimage.c
@@ -136,7 +136,7 @@ unsigned long 	count;
 extern	int 	tet_thistest;
 static	int 	lasttest;
 
-	fp = fopen(name, (lasttest==tet_thistest)? "a": "w");
+	fp = fopen(outfile(name), (lasttest==tet_thistest)? "a": "w");
 	if (fp == NULL) {
 		report("Could not create image file %s", name);
 		return;
diff --git a/xts5/src/lib/outfile.c b/xts5/src/lib/outfile.c
new file mode 100644
index 0000000..bbaa502
--- /dev/null
+++ b/xts5/src/lib/outfile.c
@@ -0,0 +1,67 @@
+/*
+Copyright (c) Open Text SA and/or Open Text ULC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include "xtest.h"
+#include "xtestlib.h"
+
+/*
+ * outfile takes a bare filename and returns a path to that file in the results
+ * directory. The caller should not free the return value (it will be freed
+ * automatically when tpcleanup is called at the end of each test).
+ */
+const char *
+outfile(const char *fn)
+{
+	char *out;
+	const char *path;
+	char *resfile = getenv("TET_RESFILE");
+	if (!resfile)
+		return fn;
+
+	resfile = strdup(resfile);
+	if (!resfile)
+		return fn;
+
+	path = dirname(resfile);
+	out = malloc(strlen(path) + strlen(fn) + 2);
+	if (!out) {
+		out = (char *)fn;
+		goto done;
+	}
+	regid(NULL, (union regtypes *)&out, REG_MALLOC);
+
+	sprintf(out, "%s/%s", path, fn);
+
+done:
+	free(resfile);
+	return out;
+}
diff --git a/xts5/src/lib/savimage.c b/xts5/src/lib/savimage.c
index 50ec8e4..9a63e1c 100644
--- a/xts5/src/lib/savimage.c
+++ b/xts5/src/lib/savimage.c
@@ -185,7 +185,7 @@ unsigned long	pix1, pix2;
 						, x, y, pix1, pix2);
 					sprintf(name, "Err%04d.err", Errnum++);
 					report("See file %s for details", name);
-					unlink(name);
+					unlink(outfile(name));
 					dumpimage(newim, name, (struct area *)0);
 					dumpimage(im, name, (struct area *)0);
 					XDestroyImage(newim);
diff --git a/xts5/src/lib/verimage.c b/xts5/src/lib/verimage.c
index 037ead3..2cbee15 100644
--- a/xts5/src/lib/verimage.c
+++ b/xts5/src/lib/verimage.c
@@ -199,6 +199,9 @@ extern	int CurVinf;
 		if (fp)
 			fclose(fp);
 		fp = fopen(name, "r");
+		/* Image file may be generated. If not present, check outfile location: */
+		if (!fp)
+			fp = fopen(outfile(name), "r");
 		lasttest = tet_thistest;
 		lastvinf = CurVinf;
 	}
@@ -305,11 +308,11 @@ ok:
 
 		report("A total of %d out of %d pixels were bad", bad, good+bad);
 		sprintf(errfile, "Err%04d.err", Errnum);
-		unlink(errfile);
+		unlink(outfile(errfile));
 		dumpimage(imp, errfile, ap);
 	
 		newpos = ftell(fp);
-		errfp = fopen(errfile, "a");
+		errfp = fopen(outfile(errfile), "a");
 		if (errfp == NULL) {
 				report("Could not open pixel error file %s", errfile);
 		} else {
diff --git a/xts5/src/xim/linklocale.c b/xts5/src/xim/linklocale.c
index 5b2fd72..f517da8 100644
--- a/xts5/src/xim/linklocale.c
+++ b/xts5/src/xim/linklocale.c
@@ -163,7 +163,7 @@ char buf[BUF_LEN];
 		report("Could not open data file for locale %s", plocale);
 		return(False);
 	}
-	fp2 = fopen(name2, "a+");
+	fp2 = fopen(outfile(name2), "a+");
 	if (fp2 == NULL)
 	{
 		report("Could not open data file %s", name2);
@@ -191,5 +191,5 @@ char name[128];
    ic = tet_testlist[tet_thistest-1].icref;
    sprintf(name, "a%d.dat", ic);
 
-	unlink(name);
+	unlink(outfile(name));
 }
diff --git a/xts5/src/xim/xim_save.c b/xts5/src/xim/xim_save.c
index 9c33568..71209c7 100644
--- a/xts5/src/xim/xim_save.c
+++ b/xts5/src/xim/xim_save.c
@@ -577,7 +577,7 @@ Bool xim_save_open(plocale,style)
 		pext);
 
 	/* figure out which file to open */
-	xim_save_fp = fopen(fname,"w");
+	xim_save_fp = fopen(outfile(fname),"w");
 	if(xim_save_fp == NULL)
 	{
 		report("Could not open %s to save responses",fname);
-- 
1.7.10.4



More information about the xorg-devel mailing list