[hackers] [ubase][PATCH 3/3] stty: add symbolic values for line disciplines

From: Mattias Andrée <maandree_AT_kth.se>
Date: Wed, 30 Mar 2016 16:46:09 +0200

Signed-off-by: Mattias Andrée <maandree_AT_kth.se>
---
 stty.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 59 insertions(+), 4 deletions(-)
diff --git a/stty.c b/stty.c
index 9f4307b..e21ab24 100644
--- a/stty.c
+++ b/stty.c
_AT_@ -95,7 +95,6 @@ static void size(int unset, struct termios *m)   { output_size_requested = 1; (v
 static void speed(int unset, struct termios *m)  { output_speed_requested = 1; (void) m; (void) unset; }
 static void tabs(int unset, struct termios *m)   { m->c_oflag &= ~TABDLY, m->c_oflag |= unset ? TAB3 : TAB0; }
 static void cols(char *arg, struct termios *m)   { setwinsize(-1, estrtonum(arg, 0, USHRT_MAX)); (void) m; }
-static void line(char *arg, struct termios *m)   { m->c_line = estrtonum(arg, 0, 255); }
 static void min(char *arg, struct termios *m)    { m->c_cc[VMIN] = estrtonum(arg, 0, CC_MAX); }
 static void rows(char *arg, struct termios *m)   { setwinsize(estrtonum(arg, 0, USHRT_MAX), -1); (void) m; }
 static void stime(char *arg, struct termios *m)  { m->c_cc[VTIME] = estrtonum(arg, 0, CC_MAX); }
_AT_@ -143,6 +142,11 @@ struct speed {
 	speed_t speed;
 };
 
+struct line {
+	const char *str;
+	unsigned char value;
+};
+
 static const struct mode modes[] = {
 	{"clocal",   CTRL,  CLOCAL,  0,       0,      BOOL},
 	{"cmspar",   CTRL,  CMSPAR,  0,       0,      BOOL},
_AT_@ -267,7 +271,6 @@ static const struct key keys[] = {
 static const struct intvalued ints[] = {
 	{"cols",    cols},
 	{"columns", cols},
-	{"line",    line},
 	{"min",     min},
 	{"rows",    rows},
 	{"time",    stime},
_AT_@ -289,6 +292,26 @@ static const struct speed speeds[] = {
 };
 #undef B
 
+static const struct line lines[] = {
+	{"tty",      N_TTY},
+	{"slip",     N_SLIP},
+	{"mouse",    N_MOUSE},
+	{"ppp",      N_PPP},
+	{"strip",    N_STRIP},
+	{"ax25",     N_AX25},
+	{"x25",      N_X25},
+	{"6pack",    N_6PACK},
+	{"masc",     N_MASC},
+	{"r3964",    N_R3964},
+	{"profibus", N_PROFIBUS_FDL},
+	{"irda",     N_IRDA},
+	{"smsblock", N_SMSBLOCK},
+	{"hdlc",     N_HDLC},
+	{"syncppp",  N_SYNC_PPP},
+	{"hci",      N_HCI},
+	{0, 0}
+};
+
 static void
 sane(int unset, struct termios *m)
 {
_AT_@ -489,6 +512,27 @@ baudtostr(speed_t baud)
 	return speed->str ? speed->str : "0";
 }
 
+static const char*
+linetostr(unsigned value)
+{
+	const struct line *ln = lines;
+	while (ln->str && ln->value != value)
+		ln++;
+	return ln->str;
+}
+
+static void
+line(char *arg, struct termios *m)
+{
+	const struct line *ln = lines;
+	while (ln->str && strcmp(ln->str, arg))
+		ln++;
+	if (ln->str)
+		m->c_line = ln->value;
+	else
+		m->c_line = estrtonum(arg, 0, 255);
+}
+
 static int
 parsespeed(char *arg, struct speed *ret)
 {
_AT_@ -609,6 +653,7 @@ displaysettings(struct termios *m, int all)
 	struct winsize winsize;
 	speed_t in, out;
 	tcflag_t *bitsp, mask;
+	const char *linestr;
 
 	in = cfgetispeed(m);
 	out = cfgetospeed(m);
_AT_@ -628,8 +673,13 @@ displaysettings(struct termios *m, int all)
 	}
 	printtoken("\n");
 
-	if (all || m->c_line != 0)
-		printtoken("line = %u;", (unsigned)(m->c_line));
+	if (all || m->c_line != 0) {
+		linestr = linetostr(m->c_line);
+		if (linestr)
+			printtoken("line = %s;", linestr);
+		else
+			printtoken("line = %u;", (unsigned)(m->c_line));
+	}
 	if (all || (m->c_cc[VMIN] != 1 && !(m->c_lflag & ICANON)))
 		printtoken("min = %u;", (unsigned)(m->c_cc[VMIN]));
 	if (all || (m->c_cc[VTIME] != 0 && !(m->c_lflag & ICANON)))
_AT_@ -719,6 +769,11 @@ main(int argc, char *argv[])
 			argv++;
 		} else if (!parseoperand_int(argv[0], argv[1], &mode)) {
 			argv++;
+		} else if (!strcmp(argv[0], "line")) {
+			if (!argv[1])
+				eprintf("missing argument for operand: %s\n", argv[0]);
+			line(argv[1], &mode);
+			argv++;
 		} else if (!parsespeed(*argv, &speed)) {
 			if (cfsetispeed(&mode, speed.speed))
 				eprintf("cfsetispeed %s:", speed.str);
-- 
2.7.4
Received on Wed Mar 30 2016 - 16:46:09 CEST

This archive was generated by hypermail 2.3.0 : Wed Mar 30 2016 - 16:48:22 CEST