2008-04-19  Dmitry V. Levin <ldv@altlinux.org>

	* desc.c (sys_fcntl): Do not initialize auxstr for failed syscall.
	* process.c (sys_fork, sys_rfork) [USE_PROCFS]: Likewise.
	* signal.c (sys_signal): Likewise.
	* stream.c (internal_stream_ioctl): Likewise.
	* time.c (sys_adjtimex): Likewise.
	* syscall.c (trace_syscall): If RVAL_STR is set, then
	print auxstr for failed syscall as well.
diff --git a/ChangeLog b/ChangeLog
index 9059cbf..adcfbf6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-04-19  Dmitry V. Levin <ldv@altlinux.org>
 
+	* desc.c (sys_fcntl): Do not initialize auxstr for failed syscall.
+	* process.c (sys_fork, sys_rfork) [USE_PROCFS]: Likewise.
+	* signal.c (sys_signal): Likewise.
+	* stream.c (internal_stream_ioctl): Likewise.
+	* time.c (sys_adjtimex): Likewise.
+	* syscall.c (trace_syscall): If RVAL_STR is set, then
+	print auxstr for failed syscall as well.
+
 	* syscall.c (is_restart_error): New function.
 	* defs.h (is_restart_error): Declare it.
 
diff --git a/desc.c b/desc.c
index 8460262..951ccf9 100644
--- a/desc.c
+++ b/desc.c
@@ -332,12 +332,14 @@
 		case F_SETOWN: case F_GETOWN:
 			break;
 		case F_GETFD:
-			if (tcp->u_rval == 0)
+			if (syserror(tcp) || tcp->u_rval == 0)
 				return 0;
 			tcp->auxstr =
 				sprintflags("flags ", fdflags, tcp->u_rval);
 			return RVAL_HEX|RVAL_STR;
 		case F_GETFL:
+			if (syserror(tcp))
+				return 0;
 			tcp->auxstr = sprint_open_modes(tcp->u_rval);
 			return RVAL_HEX|RVAL_STR;
 		case F_GETLK:
diff --git a/process.c b/process.c
index bb6164f..cd938e5 100644
--- a/process.c
+++ b/process.c
@@ -498,7 +498,7 @@
 sys_fork(tcp)
 struct tcb *tcp;
 {
-	if (exiting(tcp)) {
+	if (exiting(tcp) && !syserror(tcp)) {
 		if (getrval2(tcp)) {
 			tcp->auxstr = "child process";
 			return RVAL_UDECIMAL | RVAL_STR;
@@ -516,7 +516,7 @@
 	if (entering(tcp)) {
 		tprintf ("%ld", tcp->u_arg[0]);
 	}
-	else {
+	else if (!syserror(tcp)) {
 		if (getrval2(tcp)) {
 			tcp->auxstr = "child process";
 			return RVAL_UDECIMAL | RVAL_STR;
diff --git a/signal.c b/signal.c
index ed413ad..7f43063 100644
--- a/signal.c
+++ b/signal.c
@@ -1199,7 +1199,7 @@
 		}
 		return 0;
 	}
-	else {
+	else if (!syserror(tcp)) {
 		switch (tcp->u_rval) {
 		    case (long) SIG_ERR:
 			tcp->auxstr = "SIG_ERR"; break;
@@ -1212,6 +1212,7 @@
 		}
 		return RVAL_HEX | RVAL_STR;
 	}
+	return 0;
 }
 
 #ifdef SVR4
diff --git a/stream.c b/stream.c
index e97392c..8c7dfda 100644
--- a/stream.c
+++ b/stream.c
@@ -1177,7 +1177,7 @@
 	}
 	if (exiting(tcp)) {
 		tprintf("}");
-		if (timod && tcp->u_rval) {
+		if (timod && tcp->u_rval && !syserror(tcp)) {
 			tcp->auxstr = xlookup (tli_errors, tcp->u_rval);
 			return RVAL_STR + 1;
 		}
diff --git a/syscall.c b/syscall.c
index f1b7054..3c1c9f8 100644
--- a/syscall.c
+++ b/syscall.c
@@ -2369,6 +2369,8 @@
 						strerror(u_error));
 				break;
 			}
+			if ((sys_res & RVAL_STR) && tcp->auxstr)
+				tprintf(" (%s)", tcp->auxstr);
 		}
 		else {
 			if (sys_res & RVAL_NONE)
diff --git a/time.c b/time.c
index 204a6da..af68eee 100644
--- a/time.c
+++ b/time.c
@@ -674,6 +674,8 @@
 			tprintf("%#lx", tcp->u_arg[0]);
 		else if (tprint_timex(tcp, tcp->u_arg[0]) < 0)
 			tprintf("{...}");
+		if (syserror(tcp))
+			return 0;
 		tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval);
 		if (tcp->auxstr)
 			return RVAL_STR;