mirror of
https://github.com/sheumann/hush.git
synced 2025-01-29 20:31:57 +00:00
ash: if tcgetattr(stdin) fails, don't mess with tcsetattr
ash: size-optimize ulimit's table of limits text data bss dec hex filename 777345 974 9676 787995 c061b busybox_old 777253 974 9676 787903 c05bf busybox_unstripped
This commit is contained in:
parent
7ab5e3dfcd
commit
a59f435b5f
110
shell/ash.c
110
shell/ash.c
@ -11575,26 +11575,31 @@ readcmd(int argc, char **argv)
|
|||||||
ifs = defifs;
|
ifs = defifs;
|
||||||
#if ENABLE_ASH_READ_NCHARS
|
#if ENABLE_ASH_READ_NCHARS
|
||||||
if (n_flag || silent) {
|
if (n_flag || silent) {
|
||||||
tcgetattr(0, &tty);
|
if (tcgetattr(0, &tty) != 0) {
|
||||||
old_tty = tty;
|
/* Not a tty */
|
||||||
if (n_flag) {
|
n_flag = 0;
|
||||||
tty.c_lflag &= ~ICANON;
|
silent = 0;
|
||||||
tty.c_cc[VMIN] = nchars;
|
} else {
|
||||||
|
old_tty = tty;
|
||||||
|
if (n_flag) {
|
||||||
|
tty.c_lflag &= ~ICANON;
|
||||||
|
tty.c_cc[VMIN] = nchars < 256 ? nchars : 255;
|
||||||
|
}
|
||||||
|
if (silent) {
|
||||||
|
tty.c_lflag &= ~(ECHO | ECHOK | ECHONL);
|
||||||
|
}
|
||||||
|
tcsetattr(0, TCSANOW, &tty);
|
||||||
}
|
}
|
||||||
if (silent) {
|
|
||||||
tty.c_lflag &= ~(ECHO|ECHOK|ECHONL);
|
|
||||||
}
|
|
||||||
tcsetattr(0, TCSANOW, &tty);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_ASH_READ_TIMEOUT
|
#if ENABLE_ASH_READ_TIMEOUT
|
||||||
if (ts.tv_sec || ts.tv_usec) {
|
if (ts.tv_sec || ts.tv_usec) {
|
||||||
// TODO: replace with poll, it is smaller
|
|
||||||
FD_ZERO(&set);
|
FD_ZERO(&set);
|
||||||
FD_SET(0, &set);
|
FD_SET(0, &set);
|
||||||
|
|
||||||
i = select(FD_SETSIZE, &set, NULL, NULL, &ts);
|
/* poll-based wait produces bigger code, using select */
|
||||||
if (!i) {
|
i = select(1, &set, NULL, NULL, &ts);
|
||||||
|
if (!i) { /* timed out! */
|
||||||
#if ENABLE_ASH_READ_NCHARS
|
#if ENABLE_ASH_READ_NCHARS
|
||||||
if (n_flag)
|
if (n_flag)
|
||||||
tcsetattr(0, TCSANOW, &old_tty);
|
tcsetattr(0, TCSANOW, &old_tty);
|
||||||
@ -11742,48 +11747,81 @@ umaskcmd(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
struct limits {
|
struct limits {
|
||||||
const char *name;
|
uint8_t cmd; /* RLIMIT_xxx fit into it */
|
||||||
int cmd;
|
uint8_t factor_shift; /* shift by to get rlim_{cur,max} values */
|
||||||
int factor; /* multiply by to get rlim_{cur,max} values */
|
|
||||||
char option;
|
char option;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct limits limits[] = {
|
static const struct limits limits_tbl[] = {
|
||||||
#ifdef RLIMIT_CPU
|
#ifdef RLIMIT_CPU
|
||||||
{ "time(seconds)", RLIMIT_CPU, 1, 't' },
|
{ RLIMIT_CPU, 0, 't' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_FSIZE
|
#ifdef RLIMIT_FSIZE
|
||||||
{ "file(blocks)", RLIMIT_FSIZE, 512, 'f' },
|
{ RLIMIT_FSIZE, 9, 'f' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_DATA
|
#ifdef RLIMIT_DATA
|
||||||
{ "data(kbytes)", RLIMIT_DATA, 1024, 'd' },
|
{ RLIMIT_DATA, 10, 'd' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_STACK
|
#ifdef RLIMIT_STACK
|
||||||
{ "stack(kbytes)", RLIMIT_STACK, 1024, 's' },
|
{ RLIMIT_STACK, 10, 's' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_CORE
|
#ifdef RLIMIT_CORE
|
||||||
{ "coredump(blocks)", RLIMIT_CORE, 512, 'c' },
|
{ RLIMIT_CORE, 9, 'c' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_RSS
|
#ifdef RLIMIT_RSS
|
||||||
{ "memory(kbytes)", RLIMIT_RSS, 1024, 'm' },
|
{ RLIMIT_RSS, 10, 'm' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_MEMLOCK
|
#ifdef RLIMIT_MEMLOCK
|
||||||
{ "locked memory(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' },
|
{ RLIMIT_MEMLOCK, 10, 'l' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_NPROC
|
#ifdef RLIMIT_NPROC
|
||||||
{ "process", RLIMIT_NPROC, 1, 'p' },
|
{ RLIMIT_NPROC, 0, 'p' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_NOFILE
|
#ifdef RLIMIT_NOFILE
|
||||||
{ "nofiles", RLIMIT_NOFILE, 1, 'n' },
|
{ RLIMIT_NOFILE, 0, 'n' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_AS
|
#ifdef RLIMIT_AS
|
||||||
{ "vmemory(kbytes)", RLIMIT_AS, 1024, 'v' },
|
{ RLIMIT_AS, 10, 'v' },
|
||||||
#endif
|
#endif
|
||||||
#ifdef RLIMIT_LOCKS
|
#ifdef RLIMIT_LOCKS
|
||||||
{ "locks", RLIMIT_LOCKS, 1, 'w' },
|
{ RLIMIT_LOCKS, 0, 'w' },
|
||||||
#endif
|
#endif
|
||||||
{ NULL, 0, 0, '\0' }
|
|
||||||
};
|
};
|
||||||
|
static const char limits_name[] =
|
||||||
|
#ifdef RLIMIT_CPU
|
||||||
|
"time(seconds)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_FSIZE
|
||||||
|
"file(blocks)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_DATA
|
||||||
|
"data(kb)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_STACK
|
||||||
|
"stack(kb)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_CORE
|
||||||
|
"coredump(blocks)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_RSS
|
||||||
|
"memory(kb)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_MEMLOCK
|
||||||
|
"locked memory(kb)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_NPROC
|
||||||
|
"process" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_NOFILE
|
||||||
|
"nofiles" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_AS
|
||||||
|
"vmemory(kb)" "\0"
|
||||||
|
#endif
|
||||||
|
#ifdef RLIMIT_LOCKS
|
||||||
|
"locks" "\0"
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
enum limtype { SOFT = 0x1, HARD = 0x2 };
|
enum limtype { SOFT = 0x1, HARD = 0x2 };
|
||||||
|
|
||||||
@ -11800,7 +11838,7 @@ printlim(enum limtype how, const struct rlimit *limit,
|
|||||||
if (val == RLIM_INFINITY)
|
if (val == RLIM_INFINITY)
|
||||||
out1fmt("unlimited\n");
|
out1fmt("unlimited\n");
|
||||||
else {
|
else {
|
||||||
val /= l->factor;
|
val >>= l->factor_shift;
|
||||||
out1fmt("%lld\n", (long long) val);
|
out1fmt("%lld\n", (long long) val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -11866,8 +11904,8 @@ ulimitcmd(int argc, char **argv)
|
|||||||
what = optc;
|
what = optc;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = limits; l->option != what; l++)
|
for (l = limits_tbl; l->option != what; l++)
|
||||||
;
|
continue;
|
||||||
|
|
||||||
set = *argptr ? 1 : 0;
|
set = *argptr ? 1 : 0;
|
||||||
if (set) {
|
if (set) {
|
||||||
@ -11887,13 +11925,15 @@ ulimitcmd(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (c)
|
if (c)
|
||||||
ash_msg_and_raise_error("bad number");
|
ash_msg_and_raise_error("bad number");
|
||||||
val *= l->factor;
|
val <<= l->factor_shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (all) {
|
if (all) {
|
||||||
for (l = limits; l->name; l++) {
|
const char *lname = limits_name;
|
||||||
|
for (l = limits_tbl; l != &limits_tbl[ARRAY_SIZE(limits_tbl)]; l++) {
|
||||||
getrlimit(l->cmd, &limit);
|
getrlimit(l->cmd, &limit);
|
||||||
out1fmt("%-20s ", l->name);
|
out1fmt("%-20s ", lname);
|
||||||
|
lname += strlen(lname) + 1;
|
||||||
printlim(how, &limit, l);
|
printlim(how, &limit, l);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user