telnet: use poll, it's shorter

*: style fixes
This commit is contained in:
Denis Vlasenko 2007-11-06 02:23:39 +00:00
parent cd0fbb5e77
commit 1bec1b980e
5 changed files with 79 additions and 80 deletions

View File

@ -1951,7 +1951,8 @@ static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
while (n > 0) { while (n > 0) {
ch = *name++; ch = *name++;
h = (h << 4) + ch; h = (h << 4) + ch;
if ((g = (h & 0xf0000000)) != 0) { g = (h & 0xf0000000);
if (g != 0) {
h ^= g >> 24; h ^= g >> 24;
h &= ~g; h &= ~g;
} }

View File

@ -430,7 +430,8 @@ static void register_rpc(servtab_t *sep)
struct protoent *pp; struct protoent *pp;
socklen_t size; socklen_t size;
if ((pp = getprotobyname(sep->se_proto + 4)) == NULL) { pp = getprotobyname(sep->se_proto + 4);
if (pp == NULL) {
bb_perror_msg("%s: getproto", sep->se_proto); bb_perror_msg("%s: getproto", sep->se_proto);
return; return;
} }

View File

@ -352,9 +352,10 @@ static void INET6_setroute(int action, char **args)
memset(&sa6, 0, sizeof(sa6)); memset(&sa6, 0, sizeof(sa6));
} else { } else {
char *cp; char *cp;
if ((cp = strchr(target, '/'))) { /* Yes... const to non is ok. */ cp = strchr(target, '/'); /* Yes... const to non is ok. */
*cp = 0; if (cp) {
prefix_len = xatoul_range(cp+1, 0, 128); *cp = '\0';
prefix_len = xatoul_range(cp + 1, 0, 128);
} else { } else {
prefix_len = 128; prefix_len = 128;
} }

View File

@ -101,6 +101,7 @@ static void iacflush(void)
#define write_str(fd, str) write(fd, str, sizeof(str) - 1) #define write_str(fd, str) write(fd, str, sizeof(str) - 1)
static void doexit(int ev) ATTRIBUTE_NORETURN;
static void doexit(int ev) static void doexit(int ev)
{ {
cookmode(); cookmode();
@ -157,31 +158,29 @@ static void conescape(void)
static void handlenetoutput(int len) static void handlenetoutput(int len)
{ {
/* here we could do smart tricks how to handle 0xFF:s in output /* here we could do smart tricks how to handle 0xFF:s in output
* stream like writing twice every sequence of FF:s (thus doing * stream like writing twice every sequence of FF:s (thus doing
* many write()s. But I think interactive telnet application does * many write()s. But I think interactive telnet application does
* not need to be 100% 8-bit clean, so changing every 0xff:s to * not need to be 100% 8-bit clean, so changing every 0xff:s to
* 0x7f:s * 0x7f:s
* *
* 2002-mar-21, Przemyslaw Czerpak (druzus@polbox.com) * 2002-mar-21, Przemyslaw Czerpak (druzus@polbox.com)
* I don't agree. * I don't agree.
* first - I cannot use programs like sz/rz * first - I cannot use programs like sz/rz
* second - the 0x0D is sent as one character and if the next * second - the 0x0D is sent as one character and if the next
* char is 0x0A then it's eaten by a server side. * char is 0x0A then it's eaten by a server side.
* third - whay doy you have to make 'many write()s'? * third - whay doy you have to make 'many write()s'?
* I don't understand. * I don't understand.
* So I implemented it. It's realy useful for me. I hope that * So I implemented it. It's realy useful for me. I hope that
* others people will find it interesting to. * others people will find it interesting too.
*/ */
int i, j; int i, j;
byte * p = (byte*)G.buf; byte * p = (byte*)G.buf;
byte outbuf[4*DATABUFSIZE]; byte outbuf[4*DATABUFSIZE];
for (i = len, j = 0; i > 0; i--, p++) for (i = len, j = 0; i > 0; i--, p++) {
{ if (*p == 0x1d) {
if (*p == 0x1d)
{
conescape(); conescape();
return; return;
} }
@ -200,68 +199,59 @@ static void handlenetinput(int len)
int i; int i;
int cstart = 0; int cstart = 0;
for (i = 0; i < len; i++) for (i = 0; i < len; i++) {
{
byte c = G.buf[i]; byte c = G.buf[i];
if (G.telstate == 0) /* most of the time state == 0 */ if (G.telstate == 0) { /* most of the time state == 0 */
{ if (c == IAC) {
if (c == IAC)
{
cstart = i; cstart = i;
G.telstate = TS_IAC; G.telstate = TS_IAC;
} }
} } else
else switch (G.telstate) {
switch (G.telstate) case TS_0:
{ if (c == IAC)
case TS_0: G.telstate = TS_IAC;
if (c == IAC) else
G.telstate = TS_IAC; G.buf[cstart++] = c;
else break;
G.buf[cstart++] = c;
break;
case TS_IAC: case TS_IAC:
if (c == IAC) /* IAC IAC -> 0xFF */ if (c == IAC) { /* IAC IAC -> 0xFF */
{ G.buf[cstart++] = c;
G.buf[cstart++] = c; G.telstate = TS_0;
G.telstate = TS_0; break;
break; }
} /* else */
/* else */ switch (c) {
switch (c) case SB:
{ G.telstate = TS_SUB1;
case SB: break;
G.telstate = TS_SUB1; case DO:
break; case DONT:
case DO: case WILL:
case DONT: case WONT:
case WILL: G.telwish = c;
case WONT: G.telstate = TS_OPT;
G.telwish = c; break;
G.telstate = TS_OPT; default:
break; G.telstate = TS_0; /* DATA MARK must be added later */
default: }
G.telstate = TS_0; /* DATA MARK must be added later */ break;
} case TS_OPT: /* WILL, WONT, DO, DONT */
break; telopt(c);
case TS_OPT: /* WILL, WONT, DO, DONT */ G.telstate = TS_0;
telopt(c); break;
G.telstate = TS_0; case TS_SUB1: /* Subnegotiation */
break; case TS_SUB2: /* Subnegotiation */
case TS_SUB1: /* Subnegotiation */ if (subneg(c))
case TS_SUB2: /* Subnegotiation */ G.telstate = TS_0;
if (subneg(c)) break;
G.telstate = TS_0; }
break;
}
} }
if (G.telstate) if (G.telstate) {
{ if (G.iaclen) iacflush();
if (G.iaclen) iacflush();
if (G.telstate == TS_0) G.telstate = 0; if (G.telstate == TS_0) G.telstate = 0;
len = cstart; len = cstart;
} }
@ -440,7 +430,8 @@ static void to_sga(void)
} else if (G.telwish == WONT) } else if (G.telwish == WONT)
return; return;
if ((G.telflags ^= UF_SGA) & UF_SGA) /* toggle */ G.telflags ^= UF_SGA; /* toggle */
if (G.telflags & UF_SGA)
putiac2(DO, TELOPT_SGA); putiac2(DO, TELOPT_SGA);
else else
putiac2(DONT, TELOPT_SGA); putiac2(DONT, TELOPT_SGA);
@ -550,6 +541,9 @@ static void cookmode(void)
tcsetattr(0, TCSADRAIN, &G.termios_def); tcsetattr(0, TCSADRAIN, &G.termios_def);
} }
/* poll gives smaller (-70 bytes) code */
#define USE_POLL 1
int telnet_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int telnet_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int telnet_main(int argc, char **argv) int telnet_main(int argc, char **argv)
{ {

View File

@ -343,8 +343,10 @@ int read_config(const char *file)
p = strchr(buffer, '#'); p = strchr(buffer, '#');
if (p) *p = '\0'; if (p) *p = '\0';
if (!(token = strtok(buffer, " \t"))) continue; token = strtok(buffer, " \t");
if (!(line = strtok(NULL, ""))) continue; if (!token) continue;
line = strtok(NULL, "");
if (!line) continue;
/* eat leading whitespace */ /* eat leading whitespace */
line = skip_whitespace(line); line = skip_whitespace(line);