Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 May 2002 08:13:20 -0400 (EDT)
From:      Daniel Eischen <eischen@pcnet1.pcnet.com>
To:        Victor Ivanov <v0rbiz@icon.bg>
Cc:        freebsd-stable@FreeBSD.ORG
Subject:   Re: pthread app from init (/etc/ttys)?
Message-ID:  <Pine.GSO.4.10.10205100811090.22466-100000@pcnet1.pcnet.com>
In-Reply-To: <20020510103805.A99419@icon.icon.bg>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 10 May 2002, Victor Ivanov wrote:

> Hi :)
> 
> I'm developing an pthread app which is run from init on a virtual tty (it's
> not run from a user, it must be run automatically). Yesterday I upgraded to
> 4.6-PRERELEASE and the app started acting strangely.
> The app has a screen-oriented UI, and it needs threads to do data
> collecting and client/server communication "in the background" while
> showing some nice window oriented interface.
> 
> To show the problem I've made a small app which opens the tty the same way
> as getty does it.  First it chmod/chown/revokes it, the int opens it O_RDWR,
> and then it calls login_tty to make it the controlling terminal, stdin,
> stderr, stdout.
> 
> All works fine as long as the app is not compiled/linked -pthread. In the
> latter case none of the initialization calls return error, but after that
> input/output to the console returns 'Resource temporary unavailable'.
> 
> I've tried dup2-ing and TIOCSCTTY-ing and etc instead of using login_tty,
> but the result is just the same.
> 
> I guess I should make some kind of wrapper app or start getty using
> autologin and specifiying the app as the user's shell (which user must
> be uid 0) ... but I really prefer the simple way.
> 
> Any hints/ideas/workarounds?

You can try this patch (to -current, massage it a bit for -stable).

-- 
Dan Eischen

RCS file: /opt/d/CVS/src/lib/libc_r/uthread/uthread_init.c,v
retrieving revision 1.38
diff -u -r1.38 uthread_init.c
--- uthread_init.c	19 Mar 2002 22:58:56 -0000	1.38
+++ uthread_init.c	10 May 2002 11:15:09 -0000
@@ -173,37 +173,24 @@
 	if ((references[0] == NULL) || (libgcc_references[0] == NULL))
 		PANIC("Failed loading mandatory references in _thread_init");
 
-	/*
-	 * Check for the special case of this process running as
-	 * or in place of init as pid = 1:
-	 */
-	if (getpid() == 1) {
+	/* Handle standard I/O file descriptors. */
+	for (i = 0; i < 3; i++) {
 		/*
-		 * Setup a new session for this process which is
-		 * assumed to be running as root.
+		 * Make sure the pipe does not get in the way of stdio:
 		 */
-		if (setsid() == -1)
-			PANIC("Can't set session ID");
-		if (revoke(_PATH_CONSOLE) != 0)
-			PANIC("Can't revoke console");
-		if ((fd = __sys_open(_PATH_CONSOLE, O_RDWR)) < 0)
-			PANIC("Can't open console");
-		if (setlogin("root") == -1)
-			PANIC("Can't set login to root");
-		if (__sys_ioctl(fd,TIOCSCTTY, (char *) NULL) == -1)
-			PANIC("Can't set controlling terminal");
-		if (__sys_dup2(fd,0) == -1 ||
-		    __sys_dup2(fd,1) == -1 ||
-		    __sys_dup2(fd,2) == -1)
-			PANIC("Can't dup2");
-	}
-
-	/* Get the standard I/O flags before messing with them : */
-	for (i = 0; i < 3; i++)
+		if (_thread_kern_pipe[i] < 3) {
+			fd = __sys_fcntl(_thread_kern_pipe[i], F_DUPFD, 3);
+			if (fd == -1)
+			    PANIC("Cannot create kernel pipe");
+			__sys_close(_thread_kern_pipe[i]);
+			_thread_kern_pipe[i] = fd;
+		}
+		/* Get the standard I/O flags before messing with them : */
 		if (((_pthread_stdio_flags[i] =
 		    __sys_fcntl(i,F_GETFL, NULL)) == -1) &&
 		    (errno != EBADF))
 			PANIC("Cannot get stdio flags");
+	}
 
 	/*
 	 * Create a pipe that is written to by the signal handler to prevent



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10205100811090.22466-100000>