Package: util-linux
Version: 2.17.2-5
Severity: wishlist
Tags: patch
User: syst...@packages.debian.org
Usertags: getty

Hi LaMont,

as we would like to use the new agetty -s option in systemd, please
consider packaging a newer git snapshot including [1] and [2] or
cherry-picking those two commits for the current version in unstable.

I've attached a squashed and refreshed patch based on those two commits
for your convenience.

Cheers,
Michael


http://git.kernel.org/?p=utils/util-linux/util-linux.git;a=commit;h=e98f4af950a64db188e0a9f3eed20fefaa463a99
http://git.kernel.org/?p=utils/util-linux/util-linux.git;a=commit;h=848e5e6ce3978d921366b799d907a78a12299924

-- System Information:
Debian Release: 6.0
  APT prefers unstable
  APT policy: (500, 'unstable'), (200, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-5-686 (SMP w/1 CPU core)
Locale: LANG=de_DE.utf8, LC_CTYPE=de_DE.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages util-linux depends on:
ii  debconf [debconf-2.0]   1.5.37           Debian configuration management sy
ii  dpkg                    1.15.8.7         Debian package management system
ii  initscripts             2.88dsf-13       scripts for initializing and shutt
ii  install-info            4.13a.dfsg.1-6   Manage installed documentation in 
ii  libblkid1               2.17.2-5         block device id library
ii  libc6                   2.11.2-7         Embedded GNU C Library: Shared lib
ii  libncurses5             5.7+20100313-4   shared libraries for terminal hand
ii  libselinux1             2.0.96-1         SELinux runtime shared libraries
ii  libslang2               2.2.2-4          The S-Lang programming library - r
ii  libuuid1                2.17.2-5         Universally Unique ID library
ii  lsb-base                3.2-26           Linux Standard Base 3.2 init scrip
ii  tzdata                  2010o-1          time zone and daylight-saving time
ii  zlib1g                  1:1.2.3.4.dfsg-3 compression library - runtime

util-linux recommends no packages.

Versions of packages util-linux suggests:
ii  dosfstools                    3.0.9-1    utilities for making and checking 
ii  kbd                           1.15.2-2   Linux console font and keytable ut
pn  util-linux-locales            <none>     (no description available)

-- debconf information excluded
 based on upstream patch:

        commit 848e5e6ce3978d921366b799d907a78a12299924
        Author: Karel Zak <k...@redhat.com>
        Date:   Wed Aug 18 09:02:03 2010 +0200

        agetty: add -s to reuse existing baud rate

        For example:

        /sbin/agetty -s /dev/ttyS0 9600

        will reuse the speed the kernel configured on the port. If the setting
        from kernel is useless (tty returns BREAK character) then the baud
        rate from command line (9600) is used.

        Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=623685
        Signed-off-by: Karel Zak <k...@redhat.com>

 and

        commit e98f4af950a64db188e0a9f3eed20fefaa463a99
        Author: Karel Zak <k...@redhat.com>
        Date:   Fri Oct 22 21:24:50 2010 +0200

        agetty: fix -s option (baud rate setup)

        The problem is pretty visible in strace output:

        broken version:
        ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo 
...}) = 0
        [...]
        ioctl(0, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo 
...}) = 0
                                           ^^^
        fixed version:
        ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo 
...}) = 0
        [...]
        ioctl(0, SNDCTL_TMR_START or TCSETS, {B115200 -opost -isig -icanon 
-echo ...}) = 0

        Reported-by: Jon Masters <j...@redhat.com>
        Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=645640
        Signed-off-by: Karel Zak <k...@redhat.com>

diff -up util-linux-ng-2.18/login-utils/agetty.8.kzak 
util-linux-ng-2.18/login-utils/agetty.8
--- util-linux-ng-2.18/login-utils/agetty.8.kzak        2010-02-04 
12:53:56.000000000 +0100
+++ util-linux-ng-2.18/login-utils/agetty.8     2010-10-22 22:07:43.000000000 
+0200
@@ -3,7 +3,7 @@
 agetty \- alternative Linux getty
 
 .SH SYNOPSIS
-.BR "agetty " [\-8ihLmnUw]
+.BR "agetty " [\-8ihLmnsUw]
 .RI "[-f " issue_file ]
 .RI "[-l " login_program ]
 .RI "[-I " init ]
@@ -12,16 +12,6 @@ agetty \- alternative Linux getty
 .I port
 .I baud_rate,...
 .RI [ term ]
-.br
-.BR "agetty " [\-8ihLmnw]
-.RI "[-f " issue_file ]
-.RI "[-l " login_program ]
-.RI "[-I " init ]
-.RI "[-t " timeout ]
-.RI "[-H " login_host ]
-.I baud_rate,...
-.I port
-.RI [ term ]
 
 .SH DESCRIPTION
 .ad
@@ -163,6 +153,10 @@ Force the line to be a local line with n
 be useful when you have a locally attached terminal where the serial line
 does not set the carrier detect signal.
 .TP
+\-s
+Try to keep the existing baud rate. The baud rates from
+the command line are used when agetty receives a BREAK character.
+.TP
 \-U
 Turn on support for detecting an uppercase only terminal.  This setting will
 detect a login name containing only capitals as indicating an uppercase
diff -up util-linux-ng-2.18/login-utils/agetty.c.kzak 
util-linux-ng-2.18/login-utils/agetty.c
--- util-linux-ng-2.18/login-utils/agetty.c.kzak        2010-04-01 
16:11:56.000000000 +0200
+++ util-linux-ng-2.18/login-utils/agetty.c     2010-10-22 22:15:40.000000000 
+0200
@@ -133,6 +133,7 @@ struct options {
 #define F_CUSTISSUE    (1<<6)          /* give alternative issue file */
 #define F_NOPROMPT     (1<<7)          /* don't ask for login name! */
 #define F_LCUC         (1<<8)          /* Support for *LCUC stty modes */
+#define F_KEEPSPEED    (1<<9)          /* Follow baud rate from kernel */
 
 /* Storage for things detected while the login name was read. */
 
@@ -203,7 +204,7 @@ void parse_args P_((int argc, char **arg
 void parse_speeds P_((struct options *op, char *arg));
 void update_utmp P_((char *line));
 void open_tty P_((char *tty, struct termios *tp, int local));
-void termio_init P_((struct termios *tp, int speed, struct options *op));
+void termio_init P_((struct termios *tp, struct options *op));
 void auto_baud P_((struct termios *tp));
 void do_prompt P_((struct options *op, struct termios *tp));
 void next_speed P_((struct termios *tp, struct options *op));
@@ -297,7 +298,7 @@ main(argc, argv)
     tcsetpgrp(0, getpid());
     /* Initialize the termios settings (raw mode, eight-bit, blocking i/o). */
     debug("calling termio_init\n");
-    termio_init(&termios, options.speeds[FIRST_SPEED], &options);
+    termio_init(&termios, &options);
 
     /* write the modem init string and DON'T flush the buffers */
     if (options.flags & F_INITSTRING) {
@@ -373,7 +374,7 @@ parse_args(argc, argv, op)
     extern int optind;                 /* getopt */
     int     c;
 
-    while (isascii(c = getopt(argc, argv, "8I:LH:f:hil:mt:wUn"))) {
+    while (isascii(c = getopt(argc, argv, "8I:LH:f:hil:mst:wUn"))) {
        switch (c) {
        case '8':
            op->eightbits = 1;
@@ -443,6 +444,9 @@ parse_args(argc, argv, op)
        case 'n':
            op->flags |= F_NOPROMPT;
            break;
+       case 's':
+           op->flags |= F_KEEPSPEED;           /* keep kernel defined speed */
+           break;
        case 't':                               /* time out */
            if ((op->timeout = atoi(optarg)) <= 0)
                error(_("bad timeout value: %s"), optarg);
@@ -691,11 +695,17 @@ char gbuf[1024];
 char area[1024];
 
 void
-termio_init(tp, speed, op)
+termio_init(tp, op)
      struct termios *tp;
-     int     speed;
      struct options *op;
 {
+    speed_t ispeed, ospeed;
+
+    if (op->flags & F_KEEPSPEED) {
+       ispeed = cfgetispeed(tp);               /* save the original setting */
+       ospeed = cfgetospeed(tp);
+    } else
+       ospeed = ispeed = op->speeds[FIRST_SPEED];
 
     /*
      * Initial termios settings: 8-bit characters, raw-mode, blocking i/o.
@@ -706,14 +716,20 @@ termio_init(tp, speed, op)
     /* flush input and output queues, important for modems! */
     (void) tcflush(0, TCIOFLUSH);
 
+    tp->c_iflag = tp->c_lflag = tp->c_oflag = 0;
+
     tp->c_cflag = CS8 | HUPCL | CREAD;
-    cfsetispeed(tp, speed);
-    cfsetospeed(tp, speed);
+
+    /* Note that the speed is stored in the c_cflag termios field, so we have
+     * set the speed always when the cflag se reseted.
+     */
+    cfsetispeed(tp, ispeed);
+    cfsetospeed(tp, ospeed);
+
     if (op->flags & F_LOCAL) {
        tp->c_cflag |= CLOCAL;
     }
 
-    tp->c_iflag = tp->c_lflag = tp->c_oflag = 0;
 #ifdef HAVE_STRUCT_TERMIOS_C_LINE
     tp->c_line = 0;
 #endif
@@ -973,9 +989,18 @@ next_speed(tp, op)
      struct termios *tp;
      struct options *op;
 {
-    static int baud_index = FIRST_SPEED;/* current speed index */
+    static int baud_index = -1;
+
+    if (baud_index == -1)
+       /*
+        * if the F_KEEPSPEED flags is set then the FIRST_SPEED is not
+        * tested yet (see termio_init()).
+        */
+       baud_index = (op->flags & F_KEEPSPEED) ? FIRST_SPEED :
+                                                1 % op->numspeed;
+    else
+       baud_index = (baud_index + 1) % op->numspeed;
 
-    baud_index = (baud_index + 1) % op->numspeed;
     cfsetispeed(tp, op->speeds[baud_index]);
     cfsetospeed(tp, op->speeds[baud_index]);
     (void) tcsetattr(0, TCSANOW, tp);
@@ -1203,7 +1228,7 @@ bcode(s)
 void
 usage()
 {
-    fprintf(stderr, _("Usage: %s [-8hiLmUw] [-l login_program] [-t timeout] 
[-I initstring] [-H login_host] baud_rate,... line [termtype]\nor\t[-hiLmw] [-l 
login_program] [-t timeout] [-I initstring] [-H login_host] line baud_rate,... 
[termtype]\n"), progname);
+    fprintf(stderr, _("Usage: %s [-8hiLmsUw] [-l login_program] [-t timeout] 
[-I initstring] [-H login_host] baud_rate,... line [termtype]\nor\t[-hiLmw] [-l 
login_program] [-t timeout] [-I initstring] [-H login_host] line baud_rate,... 
[termtype]\n"), progname);
     exit(1);
 }
 

Reply via email to