Index: trunk/archive/pslib/src/Utils/trace.c
===================================================================
--- trunk/archive/pslib/src/Utils/trace.c	(revision 569)
+++ trunk/archive/pslib/src/Utils/trace.c	(revision 707)
@@ -34,5 +34,5 @@
 #define NO_CACHE "\a"			// no name is cached
 
-#define UNKNOWN_LEVEL -9999		// we don't know this name's level
+#define UNKNOWN_LEVEL -9999		// we don\'t know this name\'s level
 
 static char cachedName[CACHE_NAME_LEN + 1] = NO_CACHE; // last name looked up
@@ -176,5 +176,5 @@
 /*****************************************************************************/
 
-int psSetTraceLevel(const char *comp,	// component of interest
+int psTraceSetLevel(const char *comp,	// component of interest
 		    int level)		// desired trace level
 {
@@ -201,5 +201,5 @@
  * Return a trace level given a name
  */
-static int doGetTraceLevel(const Component *comp, // end of component to search
+static int doTraceGetLevel(const Component *comp, // end of component to search
 			   const char *aname) // name to find
 {
@@ -215,10 +215,10 @@
     for (int i = 0; i < comp->n; i++) {
 	if (strcmp(comp->subcomp[i]->name, cpt0) == 0) { // a match
-	    if (rest == NULL) {		// we're there
+	    if (rest == NULL) {		// we\'re there
 		int level = comp->subcomp[i]->level;
 
 		return (level == UNKNOWN_LEVEL) ? comp->level : level;
 	    } else {
-		return doGetTraceLevel(comp->subcomp[i], rest);
+		return doTraceGetLevel(comp->subcomp[i], rest);
 	    }
 	}
@@ -230,5 +230,5 @@
 }
 
-int psGetTraceLevel(const char *name)	// component of interest
+int psTraceGetLevel(const char *name)	// component of interest
 {
     if (croot == NULL) {
@@ -240,5 +240,5 @@
     }
 
-    int level = doGetTraceLevel(croot, name);
+    int level = doTraceGetLevel(croot, name);
 
     strncpy(cachedName, name, CACHE_NAME_LEN);
@@ -252,5 +252,5 @@
  * Print a tree of trace levels
  */
-static void doPrintTraceLevels(const Component *comp, int depth)
+static void doTracePrintLevels(const Component *comp, int depth)
 {
     if (comp->name[0] == '\0') {
@@ -268,9 +268,9 @@
     
     for (int i = 0; i < comp->n; i++) {
-	doPrintTraceLevels(comp->subcomp[i], depth + 1);
-    }
-}
-
-void psPrintTraceLevels(void)
+       doTracePrintLevels(comp->subcomp[i], depth + 1);
+    }
+}
+
+void psTracePrintLevels(void)
 {
     if (croot == NULL) {
@@ -278,6 +278,23 @@
     }
 
-    doPrintTraceLevels(croot, 0);
-}
+    doTracePrintLevels(croot, 0);
+}
+
+/*****************************************************************************/
+/*
+ * Change where we're writing to; close previous file descriptor
+ * if it isn't stdout/stderr
+ */
+static FILE *traceFD = NULL;
+
+void psTraceSetDestination(FILE *fp)
+{
+   if (traceFD != stdout && traceFD != stderr) {
+      fclose(traceFD);
+   }
+
+   traceFD = fp;
+}
+
 
 /*****************************************************************************/
@@ -290,14 +307,18 @@
 	       ...)			// arguments
 {
-    if (level <= highest_level && psGetTraceLevel(comp) >= level) {
+    if (level <= highest_level && psTraceGetLevel(comp) >= level) {
+        if (traceFD == NULL) {		// not initialised, or fopen failed
+	   traceFD = stdout;
+	}
+
 	va_list ap;
 	va_start(ap, level);
 	for (int i = 0; i < level; i++) {
-	    putchar(' ');
+	    fputc(' ', traceFD);
 	}
 	char *fmt = va_arg(ap, char *);
-	vprintf(fmt, ap);
+	vfprintf(traceFD, fmt, ap);
 	if (strchr(fmt, '\n') == NULL) {
-	    printf("\n");
+	    fputc('\n', traceFD);
 	}
 	va_end(ap);
