changeset 2703:333cd67fe595

6468291 init s on a pseudo terminal takes two tries
author vikram
date Sat, 09 Sep 2006 12:20:02 -0700
parents d92a4e3ea90c
children bac0ea518d0f
files usr/src/cmd/init/init.c
diffstat 1 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/init/init.c	Fri Sep 08 16:31:23 2006 -0700
+++ b/usr/src/cmd/init/init.c	Sat Sep 09 12:20:02 2006 -0700
@@ -3515,14 +3515,16 @@
 			    ADT_FAIL_VALUE_BAD_TTY, argv[1]);
 			exit(1);
 		}
-		if (stat(ln, &sconbuf) != -1 &&
-		    stat(SYSCON, &conbuf) != -1 &&
-		    sconbuf.st_rdev != conbuf.st_rdev &&
-		    sconbuf.st_ino != conbuf.st_ino) {
+
+		if ((stat(ln, &sconbuf) != -1) &&
+		    (stat(SYSCON, &conbuf) == -1 ||
+		    sconbuf.st_rdev != conbuf.st_rdev)) {
 			/*
+			 * /dev/syscon needs to change.
 			 * Unlink /dev/syscon and relink it to the current line.
 			 */
-			if (unlink(SYSCON) == FAILURE) {
+			if (lstat(SYSCON, &conbuf) != -1 &&
+			    unlink(SYSCON) == FAILURE) {
 				perror("Can't unlink /dev/syscon");
 				(void) fprintf(stderr,
 				    "Run command on the system console.\n");
@@ -3530,9 +3532,9 @@
 				    ADT_FAIL_VALUE_PROGRAM, argv[1]);
 				exit(1);
 			}
-			if (link(ln, SYSCON) == FAILURE) {
+			if (symlink(ln, SYSCON) == FAILURE) {
 				(void) fprintf(stderr,
-				    "Can't link /dev/syscon to %s: %s", ln,
+				    "Can't symlink /dev/syscon to %s: %s", ln,
 				    strerror(errno));
 
 				/* Try to leave a syscon */