PERFORCE change 212771 for review

Brooks Davis brooks at FreeBSD.org
Wed Jun 13 19:54:17 UTC 2012


http://p4web.freebsd.org/@@212771?ac=10

Change 212771 by brooks at brooks_ecr_current on 2012/06/13 19:53:39

	Checkpoint simple support for running pictview directly from init
	       via and entry in /etc/ttys.  The code is incomplete in that it
	       does not allocate a pty and thus lacks things like ECHO support
	       which makes typing in the swapped /bin/sh quite difficult.  I don't
	need that for the demo so I'm not going to spend further time on it.
	
	The original  behavior suitable for use with a manual invocation and
	watch should be preserved.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#2 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/ctsrd/pictview/pictview.c#2 (text+ko) ====

@@ -28,10 +28,12 @@
  * SUCH DAMAGE.
  */
 
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <syslog.h>
+#include <stdarg.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
@@ -62,6 +64,9 @@
 // number of lines in the line pattern
 static const int num_lines_pattern = 600;
 
+// send keyboard output to stdout by default
+static int kbdfd = 0;
+
 
 /*****************************************************************************
  * hack around endian issue
@@ -702,8 +707,9 @@
 	  }
 	  if(ic < 0x80) {
 	    // printf("key = \"%c\" = 0x%02x\n", c, ic);
-	    putchar(c);
-	    fflush(stdout);
+            /* XXX: should handle full buffers */
+	    if (write(kbdfd, &c, 1) == -1)
+	      err(1, "write");
 	    // cancel shift and ctrl modes after character sent
 	    if((keymode==1) || (keymode==3))
 	      keymode=0;
@@ -1012,6 +1018,10 @@
 int
 main(int argc, char *argv[])
 {
+  int ofd, pipefds[2];
+  pid_t pid;
+  char *devpath;
+
   // initialise framebuffers and mtl control for mmap access
   fb_init();
   fb_text_cursor(255, 255);
@@ -1023,6 +1033,40 @@
   // pen_drawing();
   // line_pattern();
 
+  if (argc > 2)
+    errx(1, "usage: pictview [tty]");
+  if (argc == 2) {
+    if (pipe(pipefds) == -1)
+      err(1, "pipe()");
+    pid = fork();
+    if (pid < 0)
+      return (pid);
+    else if (pid > 0) {
+      /* XXX: should probably wait a bit and see if the child fails quickly */
+      kbdfd=pipefds[0];
+    } else {
+      if (dup2(pipefds[1], 0) == -1)
+        err(1, "dup2(%d, 0)", pipefds[1]);
+      if (argv[1][0] != '/')
+	asprintf(&devpath, "/dev/%s", argv[1]);
+      else
+	devpath = argv[1];
+      ofd = open(devpath, O_WRONLY);
+      if (ofd < 0)
+        err(1, "open(%s)", argv[1]);
+      if (dup2(ofd, 1) == -1) {
+        syslog(LOG_ALERT, "redir: dup2(%d, 1) failed with %d", ofd, errno);
+        exit(1);
+      }
+      if (dup2(ofd, 2) == -1) {
+        syslog(LOG_ALERT, "redir: dup2(%d, 2) failed with %d", ofd, errno);
+        exit(1);
+      }
+      execl("/bin/sh", "sh", "-i", NULL);
+      err(1, "execl()");
+    }
+  }
+
   pictview();
 
   close(ctrlfd);


More information about the p4-projects mailing list