summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/slattach.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/networking/slattach.c b/networking/slattach.c
index 1c00fdd..3495df5 100644
--- a/networking/slattach.c
+++ b/networking/slattach.c
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
/*
* Stripped down version of net-tools for busybox.
*
@@ -13,12 +14,13 @@
*/
#include "libbb.h"
+#include "libiproute/utils.h" /* invarg() */
/* Line discipline code table */
static const char *const proto_names[] = {
- "slip", /* 0 */
+ "cslip"+1, /* 0 */
"cslip", /* 1 */
- "slip6", /* 2 */
+ "cslip6"+1, /* 2 */
"cslip6", /* 3 */
"adaptive", /* 8 */
NULL
@@ -52,6 +54,18 @@ static void save_state(void)
bb_perror_msg_and_die("get discipline");
}
+static int set_termios_state_and_warn(struct termios *state)
+{
+ int ret;
+
+ ret = tcsetattr(handle, TCSANOW, state);
+ if (ret < 0) {
+ bb_perror_msg("set state");
+ return 1; /* used as exitcode */
+ }
+ return 0;
+}
+
/*
* Restore state and line discipline for ALL managed ttys
*
@@ -76,18 +90,13 @@ static void restore_state_and_exit(int exitcode)
memcpy(&state, &saved_state, sizeof(state));
cfsetispeed(&state, B0);
cfsetospeed(&state, B0);
- if (tcsetattr(handle, TCSANOW, &state) < 0) {
- bb_perror_msg("set state");
+ if (set_termios_state_and_warn(&state))
exitcode = 1;
- }
-
sleep(1);
/* Restore line status */
- if (tcsetattr(handle, TCSANOW, &saved_state) < 0) {
- bb_perror_msg_and_die("set state");
- }
-
+ if (set_termios_state_and_warn(&saved_state))
+ exit(EXIT_FAILURE);
if (ENABLE_FEATURE_CLEAN_UP)
close(handle);
@@ -102,11 +111,8 @@ static void set_state(struct termios *state, int encap)
int disc;
/* Set line status */
- if (tcsetattr(handle, TCSANOW, state) < 0) {
- bb_perror_msg("set state");
+ if (set_termios_state_and_warn(state))
goto bad;
- }
-
/* Set line discliple (N_SLIP always) */
disc = N_SLIP;
if (ioctl(handle, TIOCSETD, &disc) < 0) {
@@ -145,7 +151,7 @@ int slattach_main(int argc, char **argv)
OPT_h_watch = 1 << 4,
OPT_m_nonraw = 1 << 5,
OPT_L_local = 1 << 6,
- OPT_F_noflow = 1 << 7,
+ OPT_F_noflow = 1 << 7
};
INIT_G();
@@ -161,7 +167,7 @@ int slattach_main(int argc, char **argv)
encap = index_in_str_array(proto_names, proto);
if (encap < 0)
- bb_error_msg_and_die("invalid protocol %s", proto);
+ invarg(proto, "protocol");
if (encap > 3)
encap = 8;
@@ -169,7 +175,7 @@ int slattach_main(int argc, char **argv)
if (opt & OPT_s_baud) {
baud_code = tty_value_to_baud(xatoi(baud_str));
if (baud_code < 0)
- bb_error_msg_and_die("invalid baud rate");
+ invarg(baud_str, "baud rate");
}
/* Trap signals in order to restore tty states upon exit */
@@ -180,10 +186,10 @@ int slattach_main(int argc, char **argv)
signal(SIGTERM, sig_handler);
}
- /* Open tty */
+ /* Open tty */
handle = open(*argv, O_RDWR | O_NDELAY);
if (handle < 0) {
- char *buf = xasprintf("/dev/%s", *argv);
+ char *buf = concat_path_file("/dev", *argv);
handle = xopen(buf, O_RDWR | O_NDELAY);
/* maybe if (ENABLE_FEATURE_CLEAN_UP) ?? */
free(buf);
@@ -192,7 +198,7 @@ int slattach_main(int argc, char **argv)
/* Save current tty state */
save_state();
- /* Confgure tty */
+ /* Configure tty */
memcpy(&state, &saved_state, sizeof(state));
if (!(opt & OPT_m_nonraw)) { /* raw not suppressed */
memset(&state.c_cc, 0, sizeof(state.c_cc));
@@ -217,7 +223,7 @@ int slattach_main(int argc, char **argv)
return 0;
/* If we're not requested to watch, just keep descriptor open
- * till we are killed */
+ * until we are killed */
if (!(opt & OPT_h_watch))
while (1)
sleep(24*60*60);