diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/slattach.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/networking/slattach.c b/networking/slattach.c index 1c00fddb6..3495df598 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); |