slattach: code shrink (Bernhard Fischer <rep.dot.nop@gmail.com>)

This commit is contained in:
Denis Vlasenko 2007-06-21 07:27:43 +00:00
parent 88976d00d8
commit 833358798a

View File

@ -1,3 +1,4 @@
/* vi: set sw=4 ts=4: */
/* /*
* Stripped down version of net-tools for busybox. * Stripped down version of net-tools for busybox.
* *
@ -13,12 +14,13 @@
*/ */
#include "libbb.h" #include "libbb.h"
#include "libiproute/utils.h" /* invarg() */
/* Line discipline code table */ /* Line discipline code table */
static const char *const proto_names[] = { static const char *const proto_names[] = {
"slip", /* 0 */ "cslip"+1, /* 0 */
"cslip", /* 1 */ "cslip", /* 1 */
"slip6", /* 2 */ "cslip6"+1, /* 2 */
"cslip6", /* 3 */ "cslip6", /* 3 */
"adaptive", /* 8 */ "adaptive", /* 8 */
NULL NULL
@ -52,6 +54,18 @@ static void save_state(void)
bb_perror_msg_and_die("get discipline"); 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 * 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)); memcpy(&state, &saved_state, sizeof(state));
cfsetispeed(&state, B0); cfsetispeed(&state, B0);
cfsetospeed(&state, B0); cfsetospeed(&state, B0);
if (tcsetattr(handle, TCSANOW, &state) < 0) { if (set_termios_state_and_warn(&state))
bb_perror_msg("set state");
exitcode = 1; exitcode = 1;
}
sleep(1); sleep(1);
/* Restore line status */ /* Restore line status */
if (tcsetattr(handle, TCSANOW, &saved_state) < 0) { if (set_termios_state_and_warn(&saved_state))
bb_perror_msg_and_die("set state"); exit(EXIT_FAILURE);
}
if (ENABLE_FEATURE_CLEAN_UP) if (ENABLE_FEATURE_CLEAN_UP)
close(handle); close(handle);
@ -102,11 +111,8 @@ static void set_state(struct termios *state, int encap)
int disc; int disc;
/* Set line status */ /* Set line status */
if (tcsetattr(handle, TCSANOW, state) < 0) { if (set_termios_state_and_warn(state))
bb_perror_msg("set state");
goto bad; goto bad;
}
/* Set line discliple (N_SLIP always) */ /* Set line discliple (N_SLIP always) */
disc = N_SLIP; disc = N_SLIP;
if (ioctl(handle, TIOCSETD, &disc) < 0) { if (ioctl(handle, TIOCSETD, &disc) < 0) {
@ -145,7 +151,7 @@ int slattach_main(int argc, char **argv)
OPT_h_watch = 1 << 4, OPT_h_watch = 1 << 4,
OPT_m_nonraw = 1 << 5, OPT_m_nonraw = 1 << 5,
OPT_L_local = 1 << 6, OPT_L_local = 1 << 6,
OPT_F_noflow = 1 << 7, OPT_F_noflow = 1 << 7
}; };
INIT_G(); INIT_G();
@ -161,7 +167,7 @@ int slattach_main(int argc, char **argv)
encap = index_in_str_array(proto_names, proto); encap = index_in_str_array(proto_names, proto);
if (encap < 0) if (encap < 0)
bb_error_msg_and_die("invalid protocol %s", proto); invarg(proto, "protocol");
if (encap > 3) if (encap > 3)
encap = 8; encap = 8;
@ -169,7 +175,7 @@ int slattach_main(int argc, char **argv)
if (opt & OPT_s_baud) { if (opt & OPT_s_baud) {
baud_code = tty_value_to_baud(xatoi(baud_str)); baud_code = tty_value_to_baud(xatoi(baud_str));
if (baud_code < 0) 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 */ /* 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); signal(SIGTERM, sig_handler);
} }
/* Open tty */ /* Open tty */
handle = open(*argv, O_RDWR | O_NDELAY); handle = open(*argv, O_RDWR | O_NDELAY);
if (handle < 0) { if (handle < 0) {
char *buf = xasprintf("/dev/%s", *argv); char *buf = concat_path_file("/dev", *argv);
handle = xopen(buf, O_RDWR | O_NDELAY); handle = xopen(buf, O_RDWR | O_NDELAY);
/* maybe if (ENABLE_FEATURE_CLEAN_UP) ?? */ /* maybe if (ENABLE_FEATURE_CLEAN_UP) ?? */
free(buf); free(buf);
@ -192,7 +198,7 @@ int slattach_main(int argc, char **argv)
/* Save current tty state */ /* Save current tty state */
save_state(); save_state();
/* Confgure tty */ /* Configure tty */
memcpy(&state, &saved_state, sizeof(state)); memcpy(&state, &saved_state, sizeof(state));
if (!(opt & OPT_m_nonraw)) { /* raw not suppressed */ if (!(opt & OPT_m_nonraw)) { /* raw not suppressed */
memset(&state.c_cc, 0, sizeof(state.c_cc)); memset(&state.c_cc, 0, sizeof(state.c_cc));
@ -217,7 +223,7 @@ int slattach_main(int argc, char **argv)
return 0; return 0;
/* If we're not requested to watch, just keep descriptor open /* If we're not requested to watch, just keep descriptor open
* till we are killed */ * until we are killed */
if (!(opt & OPT_h_watch)) if (!(opt & OPT_h_watch))
while (1) while (1)
sleep(24*60*60); sleep(24*60*60);