slattach: code shrink (Bernhard Fischer <rep.dot.nop@gmail.com>)
This commit is contained in:
parent
88976d00d8
commit
833358798a
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user