* [kbd] New vt_mode tool for kbd? @ 2011-03-21 21:42 Michael Schutte 2011-03-21 22:13 ` Dmitry V. Levin 2011-03-25 13:20 ` Alexey Gladkov 0 siblings, 2 replies; 13+ messages in thread From: Michael Schutte @ 2011-03-21 21:42 UTC (permalink / raw) To: kbd [-- Attachment #1.1: Type: text/plain, Size: 858 bytes --] Hi Alexey, The console-setup package in Debian needs a way to check for the text/graphics mode of the active VT (from a shell script). This can be done with “setfont -v -o /dev/null”, for example, but that isn’t very elegant. Julien Cristau has proposed a small utility (which I’m calling “vt_mode” for now) to report this information in a canonical fashion. I’ve adapted it to kbd; see attachment. Do you think this code is suitable for inclusion? If so, I am going to integrate it into the build system and write a short man page for it, so I can send you a proper patch. I’d like to hear your opinion! All the best, -- Michael Schutte | michi@{uiae.at,debian.org} Innsbruck, Austria | happily accepting encrypted mail OpenPGP: 0x16fb 517b a866 c3f6 8f11 1485 f3e4 122f 1D8C 261A [-- Attachment #1.2: vt_mode.c --] [-- Type: text/x-csrc, Size: 1902 bytes --] /* * vt_mode: report VT mode (text or graphics) * * Contributed by Julien Cristau <jcristau@debian.org> in * http://bugs.debian.org/618573; * adapted to kbd by Michael Schutte <michi@debian.org>. */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/kd.h> #include <getopt.h> #include "getfd.h" #include "nls.h" #include "version.h" static void attr_noreturn usage(int code) { fprintf(stderr, _("Usage: vt_mode [-C DEVICE]\n")); exit(code); } int main(int argc, char *argv[]) { int fd, rc, mode, c; char *console = NULL; set_progname(argv[0]); #ifndef __klibc__ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); #endif while ((c = getopt(argc, argv, "C:hV")) != EOF) { switch (c) { case 'C': if (optarg == NULL || optarg[0] == '\0') usage(1); console = optarg; break; case 'h': usage(0); break; case 'V': print_version_and_exit(); break; default: usage(1); } } fd = getfd(console); rc = ioctl(fd, KDGETMODE, &mode); if (rc < 0) { fprintf(stderr, _("%s: Error reading VT mode.\n"), progname); return 1; } switch (mode) { case KD_TEXT: printf("text\n"); break; case KD_GRAPHICS: printf("graphics\n"); break; default: printf("other (%d)\n", mode); break; } return 0; } [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 490 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-21 21:42 [kbd] New vt_mode tool for kbd? Michael Schutte @ 2011-03-21 22:13 ` Dmitry V. Levin 2011-03-21 22:25 ` Michael Schutte 2011-03-25 13:20 ` Alexey Gladkov 1 sibling, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2011-03-21 22:13 UTC (permalink / raw) To: kbd [-- Attachment #1: Type: text/plain, Size: 913 bytes --] On Mon, Mar 21, 2011 at 10:42:36PM +0100, Michael Schutte wrote: > Hi Alexey, > > The console-setup package in Debian needs a way to check for the > text/graphics mode of the active VT (from a shell script). This can be > done with “setfont -v -o /dev/null”, for example, but that isn’t very > elegant. Julien Cristau has proposed a small utility (which I’m calling > “vt_mode” for now) to report this information in a canonical fashion. I wonder whether you actually need to know what's the KD_ mode, or maybe your scripts just need yes/no answers on simple two questions: - whether the active VT is in the text mode? - whether the active VT is in the graphics mode? In the latter case, I suggest to implement an utility with an option or argument specifying what mode to query, and a tty(1)-like exit status, so its use would be as simple as "if vt_mode text; then ...; fi". -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-21 22:13 ` Dmitry V. Levin @ 2011-03-21 22:25 ` Michael Schutte 0 siblings, 0 replies; 13+ messages in thread From: Michael Schutte @ 2011-03-21 22:25 UTC (permalink / raw) To: Linux console tools development discussion [-- Attachment #1: Type: text/plain, Size: 1517 bytes --] Hey, On Tue, Mar 22, 2011 at 01:13:54AM +0300, Dmitry V. Levin wrote: > On Mon, Mar 21, 2011 at 10:42:36PM +0100, Michael Schutte wrote: > > The console-setup package in Debian needs a way to check for the > > text/graphics mode of the active VT (from a shell script). This can be > > done with “setfont -v -o /dev/null”, for example, but that isn’t very > > elegant. Julien Cristau has proposed a small utility (which I’m calling > > “vt_mode” for now) to report this information in a canonical fashion. > > I wonder whether you actually need to know what's the KD_ mode, or > maybe your scripts just need yes/no answers on simple two questions: > - whether the active VT is in the text mode? > - whether the active VT is in the graphics mode? > > In the latter case, I suggest to implement an utility with an option or > argument specifying what mode to query, and a tty(1)-like exit status, > so its use would be as simple as "if vt_mode text; then ...; fi". Yes, that would certainly work as well; it could even do both things, depending on the presence of an argument. I don’t really care either way (it isn’t even my script, I’m just relaying for the console-setup developers). I just figured it would make sense to stick to the way kbd_mode works. Cheers, -- Michael Schutte | michi@{uiae.at,debian.org} Innsbruck, Austria | happily accepting encrypted mail OpenPGP: 0x16fb 517b a866 c3f6 8f11 1485 f3e4 122f 1D8C 261A [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 490 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-21 21:42 [kbd] New vt_mode tool for kbd? Michael Schutte 2011-03-21 22:13 ` Dmitry V. Levin @ 2011-03-25 13:20 ` Alexey Gladkov 2011-03-26 17:33 ` Michael Schutte 2011-03-26 22:33 ` Dmitry V. Levin 1 sibling, 2 replies; 13+ messages in thread From: Alexey Gladkov @ 2011-03-25 13:20 UTC (permalink / raw) To: kbd [-- Attachment #1: Type: text/plain, Size: 563 bytes --] 22.03.2011 00:42, Michael Schutte wrote: > Hi Alexey, > > The console-setup package in Debian needs a way to check for the > text/graphics mode of the active VT (from a shell script). This can be > done with “setfont -v -o /dev/null”, for example, but that isn’t very > elegant. Julien Cristau has proposed a small utility (which I’m calling > “vt_mode” for now) to report this information in a canonical fashion. May be something like this (see attachment) ? I thing this utility is more script-friendly and more extensible. -- Rgrds, legion [-- Attachment #2: kbdinfo.c --] [-- Type: text/plain, Size: 2187 bytes --] #include <stdio.h> #include <errno.h> #include <error.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/kd.h> #include <getopt.h> #include "getfd.h" #include "nls.h" #include "version.h" #define RETURN_BASE 100 #define GETMODE 10 #define GKBMODE 20 #define GKBMETA 30 static void attr_noreturn usage(int code) { fprintf(stderr, _("Usage: kbdinfo [-C DEVICE] GETMODE | GKBMODE | GKBMETA\n")); exit(code); } int main(int argc, char *argv[]) { int fd, mode, c, rc; int quiet = 0; char *console = NULL; set_progname(argv[0]); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); while ((c = getopt(argc, argv, "C:qhV")) != EOF) { switch (c) { case 'C': if (optarg == NULL || optarg[0] == '\0') usage(1); console = optarg; break; case 'q': quiet = 1; break; case 'V': print_version_and_exit(); break; case 'h': usage(0); break; default: usage(1); } } if (argc == optind) usage(1); fd = getfd(console); rc = EXIT_FAILURE; #define answer(typ,text,code) { \ if (!quiet) \ printf("%s\n", text); \ rc = (RETURN_BASE + typ + code); \ }; if (!strcasecmp("GETMODE", argv[optind])) { if (ioctl(fd, KDGETMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case KD_TEXT: answer(GETMODE, "text", 1); break; case KD_GRAPHICS: answer(GETMODE, "graphics", 2); break; } return rc; } if (!strcasecmp("GKBMODE", argv[optind])) { if (ioctl(fd, KDGKBMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_RAW: answer(GKBMODE, "raw", 1); break; case K_XLATE: answer(GKBMODE, "xlate", 2); break; case K_MEDIUMRAW: answer(GKBMODE, "mediumraw", 3); break; case K_UNICODE: answer(GKBMODE, "unicode", 4); break; } return rc; } if (!strcasecmp("GKBMETA", argv[optind])) { if (ioctl(fd, KDGKBMETA, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_METABIT: answer(GKBMETA, "metabit", 1); break; case K_ESCPREFIX: answer(GKBMETA, "escprefix", 2); break; } return rc; } return rc; } ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-25 13:20 ` Alexey Gladkov @ 2011-03-26 17:33 ` Michael Schutte 2011-03-26 22:33 ` Dmitry V. Levin 1 sibling, 0 replies; 13+ messages in thread From: Michael Schutte @ 2011-03-26 17:33 UTC (permalink / raw) To: Linux console tools development discussion [-- Attachment #1: Type: text/plain, Size: 870 bytes --] On Fri, Mar 25, 2011 at 04:20:19PM +0300, Alexey Gladkov wrote: > 22.03.2011 00:42, Michael Schutte wrote: > > The console-setup package in Debian needs a way to check for the > > text/graphics mode of the active VT (from a shell script). This can be > > done with “setfont -v -o /dev/null”, for example, but that isn’t very > > elegant. Julien Cristau has proposed a small utility (which I’m calling > > “vt_mode” for now) to report this information in a canonical fashion. > > May be something like this (see attachment) ? > > I thing this utility is more script-friendly and more extensible. That’s much better, of course! Cheers, -- Michael Schutte | michi@{uiae.at,debian.org} Innsbruck, Austria | happily accepting encrypted mail OpenPGP: 0x16fb 517b a866 c3f6 8f11 1485 f3e4 122f 1D8C 261A [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 490 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-25 13:20 ` Alexey Gladkov 2011-03-26 17:33 ` Michael Schutte @ 2011-03-26 22:33 ` Dmitry V. Levin 2011-03-27 9:33 ` Alexey Gladkov 1 sibling, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2011-03-26 22:33 UTC (permalink / raw) To: Linux console tools development discussion [-- Attachment #1: Type: text/plain, Size: 479 bytes --] On Fri, Mar 25, 2011 at 04:20:19PM +0300, Alexey Gladkov wrote: [...] > I thing this utility is more script-friendly and more extensible. [...] > #define RETURN_BASE 100 > #define GETMODE 10 > #define GKBMODE 20 > #define GKBMETA 30 Multi-value exit status is not quite script-friendly, especially for values greater than 128, because exit codes greater than 128 are used by the shell to indicate that a program died due to a fatal signal. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-26 22:33 ` Dmitry V. Levin @ 2011-03-27 9:33 ` Alexey Gladkov 2011-03-28 10:55 ` Alexey Gladkov 2011-03-28 11:19 ` Dmitry V. Levin 0 siblings, 2 replies; 13+ messages in thread From: Alexey Gladkov @ 2011-03-27 9:33 UTC (permalink / raw) To: kbd 27.03.2011 01:33, Dmitry V. Levin wrote: > Multi-value exit status is not quite script-friendly, especially for > values greater than 128, because exit codes greater than 128 are used > by the shell to indicate that a program died due to a fatal signal. I do not really like the idea of creating for each ioctl by the utility. Does anyone have any suggestions on how combine all the requests in a single utility? On the other hand 127 return codes are sufficient to describe all the values. -- Rgrds, legion ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-27 9:33 ` Alexey Gladkov @ 2011-03-28 10:55 ` Alexey Gladkov 2011-03-28 11:19 ` Dmitry V. Levin 1 sibling, 0 replies; 13+ messages in thread From: Alexey Gladkov @ 2011-03-28 10:55 UTC (permalink / raw) To: kbd 27.03.2011 13:33, Alexey Gladkov wrote: > On the other hand 127 return codes are sufficient to describe all the > values. According this: http://tldp.org/LDP/abs/html/exitcodes.html we have 123 non-reserved exit codes. -- Rgrds, legion ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-27 9:33 ` Alexey Gladkov 2011-03-28 10:55 ` Alexey Gladkov @ 2011-03-28 11:19 ` Dmitry V. Levin 2011-03-28 11:26 ` Alexey Gladkov 2011-03-28 21:07 ` Alexey Gladkov 1 sibling, 2 replies; 13+ messages in thread From: Dmitry V. Levin @ 2011-03-28 11:19 UTC (permalink / raw) To: Linux console tools development discussion [-- Attachment #1: Type: text/plain, Size: 1035 bytes --] On Sun, Mar 27, 2011 at 01:33:23PM +0400, Alexey Gladkov wrote: > 27.03.2011 01:33, Dmitry V. Levin wrote: > > Multi-value exit status is not quite script-friendly, especially for > > values greater than 128, because exit codes greater than 128 are used > > by the shell to indicate that a program died due to a fatal signal. > > I do not really like the idea of creating for each ioctl by the utility. > > Does anyone have any suggestions on how combine all the requests in a > single utility? Usage: kbdinfo [-C DEVICE] getmode [text|graphics] kbdinfo [-C DEVICE] gkbmode [raw|xlate|mediumraw|unicode] kbdinfo [-C DEVICE] gkbmeta [metabit|escprefix] If only one argument is given, then just print the current mode to stdout and exit 0 (unless ioctls returned an error). If two arguments are given, then print nothing to stdout and exit 0 iff the current mode matches the mode described by these two arguments. This interface would be both script-friendly and extensible. -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-28 11:19 ` Dmitry V. Levin @ 2011-03-28 11:26 ` Alexey Gladkov 2011-03-28 21:07 ` Alexey Gladkov 1 sibling, 0 replies; 13+ messages in thread From: Alexey Gladkov @ 2011-03-28 11:26 UTC (permalink / raw) To: kbd 28.03.2011 15:19, Dmitry V. Levin wrote: > Usage: kbdinfo [-C DEVICE] getmode [text|graphics] > kbdinfo [-C DEVICE] gkbmode [raw|xlate|mediumraw|unicode] > kbdinfo [-C DEVICE] gkbmeta [metabit|escprefix] > > If only one argument is given, then just print the current mode to stdout > and exit 0 (unless ioctls returned an error). > > If two arguments are given, then print nothing to stdout and exit 0 iff > the current mode matches the mode described by these two arguments. > > This interface would be both script-friendly and extensible. This is very good idea. Thanks! -- Rgrds, legion ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-28 11:19 ` Dmitry V. Levin 2011-03-28 11:26 ` Alexey Gladkov @ 2011-03-28 21:07 ` Alexey Gladkov 2011-03-29 21:51 ` Dmitry V. Levin 1 sibling, 1 reply; 13+ messages in thread From: Alexey Gladkov @ 2011-03-28 21:07 UTC (permalink / raw) To: kbd [-- Attachment #1: Type: text/plain, Size: 170 bytes --] 28.03.2011 15:19, Dmitry V. Levin wrote: > This interface would be both script-friendly and extensible. Ok. Another implementation. How about this ? -- Rgrds, legion [-- Attachment #2: kbdinfo.c --] [-- Type: text/plain, Size: 3121 bytes --] #include <stdio.h> #include <errno.h> #include <error.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/kd.h> #include <getopt.h> #include "getfd.h" #include "nls.h" #include "version.h" static char *action = NULL; static char *value = NULL; static void attr_noreturn usage(int code) { fprintf(stderr, _("Usage: %s [-C DEVICE] getmode [text|graphics]\n"), progname); fprintf(stderr, _(" or: %s [-C DEVICE] gkbmode [raw|xlate|mediumraw|unicode]\n"), progname); fprintf(stderr, _(" or: %s [-C DEVICE] gkbmeta [metabit|escprefix]\n"), progname); fprintf(stderr, _(" or: %s [-C DEVICE] gkbled [scrolllock|numlock|capslock]\n"), progname); exit(code); } static int answer(char *ans) { if (value) return !strcasecmp(value, ans) ? EXIT_SUCCESS : EXIT_FAILURE; printf("%s\n", ans); return EXIT_SUCCESS; } int main(int argc, char **argv) { int fd, mode, c; int rc = EXIT_FAILURE; char flags; char *console = NULL; set_progname(argv[0]); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE_NAME, LOCALEDIR); textdomain(PACKAGE_NAME); while ((c = getopt(argc, argv, "C:hV")) != EOF) { switch (c) { case 'C': if (optarg == NULL || optarg[0] == '\0') usage(EXIT_FAILURE); console = optarg; break; case 'V': print_version_and_exit(); break; case 'h': usage(EXIT_SUCCESS); break; } } if (optind == argc) { fprintf(stderr, _("Error: Not enough arguments.\n")); exit(EXIT_FAILURE); } action = argv[optind++]; if (optind < argc) value = argv[optind++]; fd = getfd(console); if (!strcasecmp("GETMODE", action)) { if (ioctl(fd, KDGETMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case KD_TEXT: rc = answer("text"); break; case KD_GRAPHICS: rc = answer("graphics"); break; } } else if (!strcasecmp("GKBMODE", action)) { if (ioctl(fd, KDGKBMODE, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_RAW: rc = answer("raw"); break; case K_XLATE: rc = answer("xlate"); break; case K_MEDIUMRAW: rc = answer("mediumraw"); break; case K_UNICODE: rc = answer("unicode"); break; } } else if (!strcasecmp("GKBMETA", action)) { if (ioctl(fd, KDGKBMETA, &mode) == -1) error(EXIT_FAILURE, errno, "ioctl"); switch (mode) { case K_METABIT: rc = answer("metabit"); break; case K_ESCPREFIX: rc = answer("escprefix"); break; } } else if (!strcasecmp("GKBLED", action)) { if (ioctl(fd, KDGKBLED, &flags) == -1) error(EXIT_FAILURE, errno, "ioctl"); mode = (flags & 0x7); if (value) { if (((mode & LED_SCR) && !strcasecmp(value, "scrolllock")) || ((mode & LED_NUM) && !strcasecmp(value, "numlock")) || ((mode & LED_CAP) && !strcasecmp(value, "capslock"))) rc = EXIT_SUCCESS; } else { printf("scrolllock:%s ", (mode & LED_SCR) ? "on" : "off"); printf("numlock:%s ", (mode & LED_NUM) ? "on" : "off"); printf("capslock:%s\n", (mode & LED_CAP) ? "on" : "off"); rc = EXIT_SUCCESS; } } else { fprintf(stderr, _("Error: Unrecognized action: %s\n"), action); } close(fd); return rc; } ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-28 21:07 ` Alexey Gladkov @ 2011-03-29 21:51 ` Dmitry V. Levin 2011-03-29 22:27 ` Alexey Gladkov 0 siblings, 1 reply; 13+ messages in thread From: Dmitry V. Levin @ 2011-03-29 21:51 UTC (permalink / raw) To: Linux console tools development discussion [-- Attachment #1: Type: text/plain, Size: 552 bytes --] On Tue, Mar 29, 2011 at 01:07:28AM +0400, Alexey Gladkov wrote: > 28.03.2011 15:19, Dmitry V. Levin wrote: > > This interface would be both script-friendly and extensible. > > Ok. Another implementation. How about this ? Fine with me. > static int > answer(char *ans) { I'd change this and some others "char *" to "const char *", but it's not important. > return !strcasecmp(value, ans) ? EXIT_SUCCESS : EXIT_FAILURE; I'd code it a bit differently: return strcasecmp(value, ans) ? EXIT_FAILURE : EXIT_SUCCESS; -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [kbd] New vt_mode tool for kbd? 2011-03-29 21:51 ` Dmitry V. Levin @ 2011-03-29 22:27 ` Alexey Gladkov 0 siblings, 0 replies; 13+ messages in thread From: Alexey Gladkov @ 2011-03-29 22:27 UTC (permalink / raw) To: kbd 30.03.2011 01:51, Dmitry V. Levin wrote: > Fine with me. http://git.altlinux.org/people/legion/packages/kbd.git?p=kbd.git;a=commitdiff;h=4578bbc6 Applied. Thanks, Dmitry for your advices! -- Rgrds, legion ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2011-03-29 22:27 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-03-21 21:42 [kbd] New vt_mode tool for kbd? Michael Schutte 2011-03-21 22:13 ` Dmitry V. Levin 2011-03-21 22:25 ` Michael Schutte 2011-03-25 13:20 ` Alexey Gladkov 2011-03-26 17:33 ` Michael Schutte 2011-03-26 22:33 ` Dmitry V. Levin 2011-03-27 9:33 ` Alexey Gladkov 2011-03-28 10:55 ` Alexey Gladkov 2011-03-28 11:19 ` Dmitry V. Levin 2011-03-28 11:26 ` Alexey Gladkov 2011-03-28 21:07 ` Alexey Gladkov 2011-03-29 21:51 ` Dmitry V. Levin 2011-03-29 22:27 ` Alexey Gladkov
Linux console tools development discussion This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/kbd/0 kbd/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 kbd kbd/ http://lore.altlinux.org/kbd \ kbd@lists.altlinux.org kbd@lists.altlinux.ru kbd@lists.altlinux.com public-inbox-index kbd Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.kbd AGPL code for this site: git clone https://public-inbox.org/public-inbox.git