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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/usr.sbin/vidcontrol/vidcontrol.1,v
retrieving revision 1.34
diff -d -u -r1.34 vidcontrol.1
--- vidcontrol.1=092001/04/18 15:51:56=091.34
+++ vidcontrol.1=092001/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=09Contents"
+.It "1 thru 8=09Literal text" Dq Li SCRSHOT_
+.It "9=09File format version number"
+.It "10=09Remaining 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=09Byte=09Meaning"
+.It "1=0911=09Terminal width, in characters"
+.It "=0912=09Terminal depth, in characters"
+.It "=0913 and up=09The 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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /home/ncvs/src/usr.sbin/vidcontrol/vidcontrol.c,v
retrieving revision 1.36
diff -d -u -r1.36 vidcontrol.c
--- vidcontrol.c=092001/04/21 13:50:32=091.36
+++ vidcontrol.c=092001/05/18 23:32:37
@@ -50,6 +50,11 @@
 #define _VESA_800x600_DFL_ROWS 25
 #define _VESA_800x600_DFL_FNSZ 16
 =

+#define DUMP_RAW=090
+#define DUMP_TXT=091
+
+#define DUMP_FMT_REV=091
+
 char =09legal_colors[16][16] =3D {
 =09"black", "blue", "green", "cyan",
 =09"red", "magenta", "brown", "white",
@@ -70,8 +75,8 @@
 =09fprintf(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]");
 =09exit(1);
 }
 =

@@ -638,6 +643,77 @@
 =09=09info.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)
+{
+=09scrshot_t shot;
+=09vid_info_t info;
+
+=09info.size =3D sizeof(info);
+=09if (ioctl(0, CONS_GETINFO, &info) =3D=3D -1) {
+=09=09warn("failed to obtain current video mode parameters");
+=09=09return;
+=09}
+
+=09shot.buf =3D alloca(info.mv_csz * info.mv_rsz * sizeof(u_int16_t));
+=09if (shot.buf =3D=3D NULL) {
+=09=09warn("failed to allocate memory for dump");
+=09=09return;
+=09}
+
+=09shot.xsize =3D info.mv_csz;
+=09shot.ysize =3D info.mv_rsz;
+=09if (ioctl(0, CONS_SCRSHOT, &shot) =3D=3D -1) {
+=09=09warn("failed to get dump of the screen");
+=09=09return;
+=09}
+
+=09if (mode =3D=3D DUMP_RAW) {
+=09=09printf("SCRSHOT_%c%c%c%c", DUMP_FMT_REV, 2,
+=09=09       shot.xsize, shot.ysize);
+=09=09fflush(stdout);
+
+=09=09(void)write(STDOUT_FILENO, shot.buf,
+=09=09=09    shot.xsize * shot.ysize * sizeof(u_int16_t));
+=09} else {
+=09=09char *line;
+=09=09int x, y;
+=09=09u_int16_t ch;
+
+=09=09line =3D alloca(shot.xsize + 1);
+=09=09if (line =3D=3D NULL) {
+=09=09=09warn("failed to allocate memory for line buffer");
+=09=09=09return;
+=09=09}
+
+=09=09for (y =3D 0; y < shot.ysize; y++) {
+=09=09=09for (x =3D 0; x < shot.xsize; x++) {
+=09=09=09=09ch =3D shot.buf[x + (y * shot.xsize)];
+=09=09=09=09ch &=3D 0xff;
+=09=09=09=09if (isprint(ch) =3D=3D 0)
+=09=09=09=09=09ch =3D ' ';
+=09=09=09=09line[x] =3D (char)ch;
+=09=09=09}
+
+=09=09=09/* Trim trailing spaces */
+=09=09=09do {
+=09=09=09=09line[x--] =3D '\0';
+=09=09=09} while (line[x] =3D=3D ' ' && x !=3D 0);
+
+=09=09=09puts(line);
+=09=09}
+=09=09fflush(stdout);
+=09}
+
+=09return;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -648,7 +724,7 @@
 =09info.size =3D sizeof(info);
 =09if (ioctl(0, CONS_GETINFO, &info) < 0)
 =09=09err(1, "must be on a virtual console");
-=09while((opt =3D getopt(argc, argv, "b:c:df:g:i:l:LM:m:r:s:t:x")) !=3D -1=
)
+=09while((opt =3D getopt(argc, argv, "b:c:df:g:i:l:LM:m:pPr:s:t:x")) !=3D =
-1)
 =09=09switch(opt) {
 =09=09=09case 'b':
 =09=09=09=09set_border_color(optarg);
@@ -689,6 +765,12 @@
 =09=09=09=09break;
 =09=09=09case 'm':
 =09=09=09=09set_mouse(optarg);
+=09=09=09=09break;
+=09=09=09case 'p':
+=09=09=09=09dump_screen(DUMP_RAW);
+=09=09=09=09break;
+=09=09=09case 'P':
+=09=09=09=09dump_screen(DUMP_TXT);
 =09=09=09=09break;
 =09=09=09case 'r':
 =09=09=09=09set_reverse_colors(argc, argv, &optind);

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" 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>