Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 May 2001 02:42:28 +0300 (EEST)
From:      Maxim Sobolev <sobomax@mail-in.net>
To:        nik@FreeBSD.org, ru@FreeBSD.org, audit@FreeBSD.org, arch@FreeBSD.org
Subject:   Integrating new scrshot(1) utility into vidcontrol(1) [patch for review]
Message-ID:  <200105182342.f4INgJx36064@mail.uic-in.net>

next in thread | raw e-mail | index | archive | help

Ok, as it was agreed I've integrated scrshot(1) into
vidcontrol(1) and also added ability to dump contents
of display buffer in plain text format, so you don't
even need a special utility to see what's going on
on a console of display-less machine. :-)

Please somebody review attached patches (esp. manpage).
Thank you!

-Maxim

Index: vidcontrol.1
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vidcontrol/vidcontrol.1,v
retrieving revision 1.34
diff -d -u -r1.34 vidcontrol.1
--- vidcontrol.1	2001/04/18 15:51:56	1.34
+++ vidcontrol.1	2001/05/18 23:32:37
@@ -36,6 +36,8 @@
 .Op Fl M Ar char
 .Op Fl m Cm on | off
 .Op Fl r Ar foreground Ar background
+.Op Fl p
+.Op Fl P
 .Op Fl s Ar number
 .Op Fl t Ar N | Cm off
 .Op Fl x
@@ -185,6 +187,21 @@
 Used together with the 
 .Xr moused 8
 daemon for text mode cut & paste functionality.
+.It Fl p
+Capture the current contents of the video buffer corresponding
+to the terminal device referred to by standard input.
+.Nm
+writes contents of the video buffer to the standard
+output in a raw binary format. For details about that
+format see
+.Sx Format of Video Buffer Dump
+below.
+.It Fl P
+Same as
+.Fl p ,
+but dump contents of the video buffer in a plain text format
+ignoring nonprintable characters and information about text
+attributes.
 .It Fl r Ar foreground background
 Change reverse mode colors to
 .Ar foreground 
@@ -253,6 +270,106 @@
 option.  See
 .Xr syscons 4
 for more details on this kernel option.
+.Ss Format of Video Buffer Dump
+The
+.Nm
+utility uses the
+.Xr syscons 4
+.Dv CONS_SCRSHOT
+.Xr ioctl 2
+to capture the current contents of the video buffer.
+.Nm
+writes version and additional information to the standard
+output, followed by the contents of the terminal device.
+.Pp
+PC video memory is typically arranged in two byte tuples,
+one per character position.  In each tuple, the first byte
+will be the character code, and the second byte is the
+character's color attribute.
+.Pp
+The color attribute byte is further broken down in to the
+low nibble, which specifies which of 16 different foreground
+colors is active, and the high nibble, which specifies which
+of 16 different background colors is active.
+.Pp
+.Bl -hang -offset indent -compact
+.It 0
+Black
+.It 1
+Blue
+.It 2
+Green
+.It 3
+Cyan
+.It 4
+Red
+.It 5
+Magenta
+.It 6
+Brown
+.It 7
+White
+.It 8
+Grey
+.It 9
+Light Blue
+.It 10
+Light Green
+.It 11
+Light Cyan
+.It 12
+Light Red
+.It 13
+Light Magenta
+.It 14
+Yellow
+.It 15
+White
+.El
+.Pp
+It can be seen that the last 8 colors are brighter
+versions of the first 8.
+.Pp
+For example, the two bytes
+.Pp
+.Dl "65 158"
+.Pp
+specify an uppercase A (character code 65), in
+yellow (low nibble 15) on a light blue background
+(high nibble 9).
+.Pp
+The
+.Nm
+output contains a small header which includes additional
+information which may be useful to utilities processing
+the output.
+.Pp
+The first 10 bytes are always arranged as follows:
+.Bl -column "Byte range" "Contents" -offset indent
+.It Sy "Byte Range	Contents"
+.It "1 thru 8	Literal text" Dq Li SCRSHOT_
+.It "9	File format version number"
+.It "10	Remaining number of bytes in the header"
+.El
+.Pp
+Subsequent bytes depend on the version number.
+.Bl -column "Version" "13 and up" -offset indent
+.It Sy "Version	Byte	Meaning"
+.It "1	11	Terminal width, in characters"
+.It "	12	Terminal depth, in characters"
+.It "	13 and up	The snapshot data"
+.El
+.Pp
+So a dump of an 80x25 screen would start (in hex)
+.Bd -literal -offset indent
+53 43 52 53 48 4f 54 5f 01 02 50 19
+----------------------- -- -- -- --
+          |              |  |  |  ` 25 decimal
+          |              |  |  `--- 80 decimal
+          |              |  `------ 2 remaining bytes of header data
+          |              `--------- File format version 1
+          `------------------------ Literal "SCRSHOT_"
+.Ed
 .Sh VIDEO OUTPUT CONFIGURATION
 .Ss Boot Time Configuration
 You may set the following variables in
@@ -329,6 +446,18 @@
 some LCD models):
 .Pp
 .Dl vidcontrol -g 100x37 VESA_800x600
+.Pp
+The following command will capture the contents of the first virtual
+terminal, and redirect the output to the
+.Pa shot.scr
+file:
+.Pp
+.Dl vidcontrol -p < /dev/ttyv0 > shot.scr
+.Pp
+The following command will dump contents of the forth virtual terminal
+to the standard output in the human readable format:
+.Pp
+.Dl vidcontrol -P < /dev/ttyv3
 .Sh SEE ALSO
 .Xr kbdcontrol 1 ,
 .Xr vidfont 1 ,
@@ -339,5 +468,13 @@
 .Xr rc.conf 5 ,
 .Xr kldload 8 ,
 .Xr moused 8
+.Xr watch 8
+.Pp
+The various
+.Li shot2*
+utilities in the
+.Li textproc
+category of the
+.Em "Ports Collection" .
 .Sh AUTHORS
 .An S\(/oren Schmidt Aq sos@FreeBSD.org
Index: vidcontrol.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/vidcontrol/vidcontrol.c,v
retrieving revision 1.36
diff -d -u -r1.36 vidcontrol.c
--- vidcontrol.c	2001/04/21 13:50:32	1.36
+++ vidcontrol.c	2001/05/18 23:32:37
@@ -50,6 +50,11 @@
 #define _VESA_800x600_DFL_ROWS 25
 #define _VESA_800x600_DFL_FNSZ 16
 
+#define DUMP_RAW	0
+#define DUMP_TXT	1
+
+#define DUMP_FMT_REV	1
+
 char 	legal_colors[16][16] = {
 	"black", "blue", "green", "cyan",
 	"red", "magenta", "brown", "white",
@@ -70,8 +75,8 @@
 	fprintf(stderr, "%s\n%s\n%s\n%s\n",
 "usage: vidcontrol [-r fg bg] [-b color] [-c appearance] [-d] [-l scrmap]",
 "                  [-i adapter | mode] [-L] [-M char] [-m on|off]",
-"                  [-f size file] [-s number] [-t N|off] [-x] [-g geometry]", 
-"                  [mode] [fgcol [bgcol]] [show]");
+"                  [-f size file] [-s number] [-t N|off] [-x] [-g geometry]",
+"                  [-p] [-P] [mode] [fgcol [bgcol]] [show]");
 	exit(1);
 }
 
@@ -638,6 +643,77 @@
 		info.mv_rev.fore, info.mv_rev.back);
 }
 
+/*
+ * Snapshot the video memory of that terminal, using the CONS_SCRSHOT
+ * ioctl, and writes the results to stdout either in the special
+ * binary format (see manual page for details), or in the plain
+ * text format.
+ */
+void
+dump_screen(int mode)
+{
+	scrshot_t shot;
+	vid_info_t info;
+
+	info.size = sizeof(info);
+	if (ioctl(0, CONS_GETINFO, &info) == -1) {
+		warn("failed to obtain current video mode parameters");
+		return;
+	}
+
+	shot.buf = alloca(info.mv_csz * info.mv_rsz * sizeof(u_int16_t));
+	if (shot.buf == NULL) {
+		warn("failed to allocate memory for dump");
+		return;
+	}
+
+	shot.xsize = info.mv_csz;
+	shot.ysize = info.mv_rsz;
+	if (ioctl(0, CONS_SCRSHOT, &shot) == -1) {
+		warn("failed to get dump of the screen");
+		return;
+	}
+
+	if (mode == DUMP_RAW) {
+		printf("SCRSHOT_%c%c%c%c", DUMP_FMT_REV, 2,
+		       shot.xsize, shot.ysize);
+		fflush(stdout);
+
+		(void)write(STDOUT_FILENO, shot.buf,
+			    shot.xsize * shot.ysize * sizeof(u_int16_t));
+	} else {
+		char *line;
+		int x, y;
+		u_int16_t ch;
+
+		line = alloca(shot.xsize + 1);
+		if (line == NULL) {
+			warn("failed to allocate memory for line buffer");
+			return;
+		}
+
+		for (y = 0; y < shot.ysize; y++) {
+			for (x = 0; x < shot.xsize; x++) {
+				ch = shot.buf[x + (y * shot.xsize)];
+				ch &= 0xff;
+				if (isprint(ch) == 0)
+					ch = ' ';
+				line[x] = (char)ch;
+			}
+
+			/* Trim trailing spaces */
+			do {
+				line[x--] = '\0';
+			} while (line[x] == ' ' && x != 0);
+
+			puts(line);
+		}
+		fflush(stdout);
+	}
+
+	return;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -648,7 +724,7 @@
 	info.size = sizeof(info);
 	if (ioctl(0, CONS_GETINFO, &info) < 0)
 		err(1, "must be on a virtual console");
-	while((opt = getopt(argc, argv, "b:c:df:g:i:l:LM:m:r:s:t:x")) != -1)
+	while((opt = getopt(argc, argv, "b:c:df:g:i:l:LM:m:pPr:s:t:x")) != -1)
 		switch(opt) {
 			case 'b':
 				set_border_color(optarg);
@@ -689,6 +765,12 @@
 				break;
 			case 'm':
 				set_mouse(optarg);
+				break;
+			case 'p':
+				dump_screen(DUMP_RAW);
+				break;
+			case 'P':
+				dump_screen(DUMP_TXT);
 				break;
 			case 'r':
 				set_reverse_colors(argc, argv, &optind);

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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105182342.f4INgJx36064>