aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2003-01-21 20:55:56 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2003-01-21 20:55:56 +0000
commit9e5d6c002ca589fb2e767fc8bafd6ceddaa12d39 (patch)
treecc4bb2d87b27a82c93e46d0abc3f9ab8a3f3a232
parent4c51202b9dfe3df38e0a50bef9b66bd4cae39277 (diff)
downloadbusybox-w32-9e5d6c002ca589fb2e767fc8bafd6ceddaa12d39.tar.gz
busybox-w32-9e5d6c002ca589fb2e767fc8bafd6ceddaa12d39.tar.bz2
busybox-w32-9e5d6c002ca589fb2e767fc8bafd6ceddaa12d39.zip
run telnet from inetd, present login prompt if login is configured,
patch from Bastian Blank
-rw-r--r--include/libbb.h4
-rw-r--r--libbb/Makefile.in2
-rw-r--r--loginutils/getty.c138
-rw-r--r--loginutils/login.c20
-rw-r--r--networking/Config.in7
-rw-r--r--networking/telnetd.c107
6 files changed, 121 insertions, 157 deletions
diff --git a/include/libbb.h b/include/libbb.h
index d67bf07ec..42e89a5e9 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -277,7 +277,6 @@ extern const char * const gshadow_file;
277extern const char * const group_file; 277extern const char * const group_file;
278extern const char * const securetty_file; 278extern const char * const securetty_file;
279extern const char * const motd_file; 279extern const char * const motd_file;
280extern const char * const issue_file;
281extern const char * const _path_login; 280extern const char * const _path_login;
282 281
283#ifdef CONFIG_FEATURE_DEVFS 282#ifdef CONFIG_FEATURE_DEVFS
@@ -365,4 +364,7 @@ typedef struct llist_s {
365} llist_t; 364} llist_t;
366extern llist_t *llist_add_to(llist_t *old_head, char *new_item); 365extern llist_t *llist_add_to(llist_t *old_head, char *new_item);
367 366
367void print_login_issue(const char *issue_file, const char *tty);
368void print_login_prompt(void);
369
368#endif /* __LIBCONFIG_H__ */ 370#endif /* __LIBCONFIG_H__ */
diff --git a/libbb/Makefile.in b/libbb/Makefile.in
index c97f7d2b3..08f8028d9 100644
--- a/libbb/Makefile.in
+++ b/libbb/Makefile.in
@@ -33,7 +33,7 @@ LIBBB_SRC:= \
33 get_last_path_component.c get_line_from_file.c herror_msg.c \ 33 get_last_path_component.c get_line_from_file.c herror_msg.c \
34 herror_msg_and_die.c human_readable.c inet_common.c inode_hash.c \ 34 herror_msg_and_die.c human_readable.c inet_common.c inode_hash.c \
35 interface.c isdirectory.c kernel_version.c last_char_is.c libc5.c \ 35 interface.c isdirectory.c kernel_version.c last_char_is.c libc5.c \
36 llist_add_to.c loop.c make_directory.c mode_string.c \ 36 llist_add_to.c login.c loop.c make_directory.c mode_string.c \
37 module_syscalls.c mtab.c mtab_file.c my_getgrgid.c my_getgrnam.c \ 37 module_syscalls.c mtab.c mtab_file.c my_getgrgid.c my_getgrnam.c \
38 my_getpwnam.c my_getpwnamegid.c my_getpwuid.c obscure.c parse_mode.c \ 38 my_getpwnam.c my_getpwnamegid.c my_getpwuid.c obscure.c parse_mode.c \
39 parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \ 39 parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \
diff --git a/loginutils/getty.c b/loginutils/getty.c
index 0f0778caf..1b9c6ac4d 100644
--- a/loginutils/getty.c
+++ b/loginutils/getty.c
@@ -73,8 +73,6 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
73#include <time.h> 73#include <time.h>
74#endif 74#endif
75 75
76#define LOGIN " login: " /* login prompt */
77
78/* Some shorthands for control characters. */ 76/* Some shorthands for control characters. */
79 77
80#define CTL(x) (x ^ 0100) /* Assumes ASCII dialect */ 78#define CTL(x) (x ^ 0100) /* Assumes ASCII dialect */
@@ -752,142 +750,10 @@ static void auto_baud(struct termio *tp)
752/* do_prompt - show login prompt, optionally preceded by /etc/issue contents */ 750/* do_prompt - show login prompt, optionally preceded by /etc/issue contents */
753static void do_prompt(struct options *op, struct termio *tp) 751static void do_prompt(struct options *op, struct termio *tp)
754{ 752{
755#ifdef ISSUE
756 FILE *fd;
757 int oflag;
758 int c;
759 struct utsname uts;
760
761 (void) uname(&uts);
762#endif
763
764 (void) write(1, "\r\n", 2); /* start a new line */
765#ifdef ISSUE /* optional: show /etc/issue */ 753#ifdef ISSUE /* optional: show /etc/issue */
766 if ((op->flags & F_ISSUE) && (fd = fopen(op->issue, "r"))) { 754 print_login_issue(op->issue, op->tty);
767 oflag = tp->c_oflag; /* save current setting */
768 tp->c_oflag |= (ONLCR | OPOST); /* map NL in output to CR-NL */
769 (void) ioctl(0, TCSETAW, tp);
770
771
772 while ((c = getc(fd)) != EOF) {
773 if (c == '\\') {
774 c = getc(fd);
775
776 switch (c) {
777 case 's':
778 (void) printf("%s", uts.sysname);
779 break;
780
781 case 'n':
782 (void) printf("%s", uts.nodename);
783 break;
784
785 case 'r':
786 (void) printf("%s", uts.release);
787 break;
788
789 case 'v':
790 (void) printf("%s", uts.version);
791 break;
792
793 case 'm':
794 (void) printf("%s", uts.machine);
795 break;
796
797 case 'o':
798 {
799 char domainname[256];
800
801 getdomainname(domainname, sizeof(domainname));
802 domainname[sizeof(domainname) - 1] = '\0';
803 printf("%s", domainname);
804 }
805 break;
806
807 case 'd':
808 case 't':
809 {
810 char *weekday[] = { "Sun", "Mon", "Tue", "Wed", "Thu",
811 "Fri", "Sat"
812 };
813 char *month[] = { "Jan", "Feb", "Mar", "Apr", "May",
814 "Jun", "Jul", "Aug", "Sep", "Oct",
815 "Nov", "Dec"
816 };
817 time_t now;
818 struct tm *tm;
819
820 (void) time(&now);
821 tm = localtime(&now);
822
823 if (c == 'd')
824 (void) printf("%s %s %d %d",
825 weekday[tm->tm_wday],
826 month[tm->tm_mon], tm->tm_mday,
827 tm->tm_year <
828 70 ? tm->tm_year +
829 2000 : tm->tm_year + 1900);
830 else
831 (void) printf("%02d:%02d:%02d", tm->tm_hour,
832 tm->tm_min, tm->tm_sec);
833
834 break;
835 }
836
837 case 'l':
838 (void) printf("%s", op->tty);
839 break;
840
841 case 'b':
842 {
843 int i;
844
845 for (i = 0; speedtab[i].speed; i++) {
846 if (speedtab[i].code == (tp->c_cflag & CBAUD)) {
847 printf("%ld", speedtab[i].speed);
848 break;
849 }
850 }
851 break;
852 }
853 case 'u':
854 case 'U':
855 {
856 int users = 0;
857 struct utmp *ut;
858
859 setutent();
860 while ((ut = getutent()))
861 if (ut->ut_type == USER_PROCESS)
862 users++;
863 endutent();
864 printf("%d ", users);
865 if (c == 'U')
866 printf((users == 1) ? "user" : "users");
867 break;
868 }
869 default:
870 (void) putchar(c);
871 }
872 } else
873 (void) putchar(c);
874 }
875 fflush(stdout);
876
877 tp->c_oflag = oflag; /* restore settings */
878 (void) ioctl(0, TCSETAW, tp); /* wait till output is gone */
879 (void) fclose(fd);
880 }
881#endif
882#ifdef __linux__
883 {
884 char hn[MAXHOSTNAMELEN + 1];
885
886 (void) gethostname(hn, MAXHOSTNAMELEN);
887 write(1, hn, strlen(hn));
888 }
889#endif 755#endif
890 (void) write(1, LOGIN, sizeof(LOGIN) - 1); /* always show login prompt */ 756 print_login_prompt();
891} 757}
892 758
893/* next_speed - select next baud rate */ 759/* next_speed - select next baud rate */
diff --git a/loginutils/login.c b/loginutils/login.c
index 4a7f13ae8..c1ea165c8 100644
--- a/loginutils/login.c
+++ b/loginutils/login.c
@@ -253,20 +253,18 @@ static int login_prompt ( char *buf_name )
253 int i; 253 int i;
254 254
255 for(i=0; i<EMPTY_USERNAME_COUNT; i++) { 255 for(i=0; i<EMPTY_USERNAME_COUNT; i++) {
256 gethostname ( buf, sizeof( buf )); 256 print_login_prompt();
257 printf ( "\n%s login: ", buf ); 257
258 fflush ( stdout ); 258 if ( !fgets ( buf, sizeof( buf ) - 1, stdin ))
259 return 0;
259 260
260 if ( !fgets ( buf, sizeof( buf ) - 1, stdin ))
261 return 0;
262
263 if ( !strchr ( buf, '\n' )) 261 if ( !strchr ( buf, '\n' ))
264 return 0; 262 return 0;
265 263
266 for ( sp = buf; isspace ( *sp ); sp++ ) { } 264 for ( sp = buf; isspace ( *sp ); sp++ ) { }
267 for ( ep = sp; isgraph ( *ep ); ep++ ) { } 265 for ( ep = sp; isgraph ( *ep ); ep++ ) { }
268 266
269 *ep = 0; 267 *ep = 0;
270 safe_strncpy(buf_name, sp, USERNAME_SIZE); 268 safe_strncpy(buf_name, sp, USERNAME_SIZE);
271 if(buf_name[0]) 269 if(buf_name[0])
272 return 1; 270 return 1;
diff --git a/networking/Config.in b/networking/Config.in
index bc1178007..ebefd600d 100644
--- a/networking/Config.in
+++ b/networking/Config.in
@@ -315,6 +315,13 @@ config CONFIG_TELNETD
315 help 315 help
316 Please submit a patch to add help text for this item. 316 Please submit a patch to add help text for this item.
317 317
318config CONFIG_FEATURE_TELNETD_INETD
319 bool " Use inetd"
320 default n
321 depends on CONFIG_TELNETD
322 help
323 Please submit a patch to add help text for this item.
324
318config CONFIG_TFTP 325config CONFIG_TFTP
319 bool "tftp" 326 bool "tftp"
320 default n 327 default n
diff --git a/networking/telnetd.c b/networking/telnetd.c
index d208319a3..d17682eb4 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -1,4 +1,4 @@
1/* $Id: telnetd.c,v 1.2 2002/11/10 22:26:19 bug1 Exp $ 1/* $Id: telnetd.c,v 1.3 2003/01/21 20:55:56 bug1 Exp $
2 * 2 *
3 * Simple telnet server 3 * Simple telnet server
4 * Bjorn Wesen, Axis Communications AB (bjornw@axis.com) 4 * Bjorn Wesen, Axis Communications AB (bjornw@axis.com)
@@ -48,7 +48,13 @@
48 48
49#define BUFSIZE 4000 49#define BUFSIZE 4000
50 50
51static const char *loginpath = "/bin/sh"; 51static const char *loginpath =
52#ifdef CONFIG_LOGIN
53"/bin/login";
54#else
55"/bin/sh";
56#endif
57static const char *issuefile = "/etc/issue.net";
52 58
53/* shell name and arguments */ 59/* shell name and arguments */
54 60
@@ -57,8 +63,12 @@ static const char *argv_init[] = {NULL, NULL};
57/* structure that describes a session */ 63/* structure that describes a session */
58 64
59struct tsession { 65struct tsession {
66#ifdef CONFIG_FEATURE_TELNETD_INETD
67 int sockfd_read, sockfd_write, ptyfd;
68#else /* CONFIG_FEATURE_TELNETD_INETD */
60 struct tsession *next; 69 struct tsession *next;
61 int sockfd, ptyfd; 70 int sockfd, ptyfd;
71#endif /* CONFIG_FEATURE_TELNETD_INETD */
62 int shell_pid; 72 int shell_pid;
63 /* two circular buffers */ 73 /* two circular buffers */
64 char *buf1, *buf2; 74 char *buf1, *buf2;
@@ -204,7 +214,11 @@ send_iac(struct tsession *ts, unsigned char command, int option)
204 214
205 215
206static struct tsession * 216static struct tsession *
217#ifdef CONFIG_FEATURE_TELNETD_INETD
218make_new_session(void)
219#else /* CONFIG_FEATURE_TELNETD_INETD */
207make_new_session(int sockfd) 220make_new_session(int sockfd)
221#endif /* CONFIG_FEATURE_TELNETD_INETD */
208{ 222{
209 struct termios termbuf; 223 struct termios termbuf;
210 int pty, pid; 224 int pty, pid;
@@ -214,7 +228,12 @@ make_new_session(int sockfd)
214 ts->buf1 = (char *)(&ts[1]); 228 ts->buf1 = (char *)(&ts[1]);
215 ts->buf2 = ts->buf1 + BUFSIZE; 229 ts->buf2 = ts->buf1 + BUFSIZE;
216 230
231#ifdef CONFIG_FEATURE_TELNETD_INETD
232 ts->sockfd_read = 0;
233 ts->sockfd_write = 1;
234#else /* CONFIG_FEATURE_TELNETD_INETD */
217 ts->sockfd = sockfd; 235 ts->sockfd = sockfd;
236#endif /* CONFIG_FEATURE_TELNETD_INETD */
218 237
219 ts->rdidx1 = ts->wridx1 = ts->size1 = 0; 238 ts->rdidx1 = ts->wridx1 = ts->size1 = 0;
220 ts->rdidx2 = ts->wridx2 = ts->size2 = 0; 239 ts->rdidx2 = ts->wridx2 = ts->size2 = 0;
@@ -278,6 +297,8 @@ make_new_session(int sockfd)
278 /*termbuf.c_lflag &= ~ICANON;*/ 297 /*termbuf.c_lflag &= ~ICANON;*/
279 tcsetattr(0, TCSANOW, &termbuf); 298 tcsetattr(0, TCSANOW, &termbuf);
280 299
300 print_login_issue(issuefile, NULL);
301
281 /* exec shell, with correct argv and env */ 302 /* exec shell, with correct argv and env */
282 execv(loginpath, (char *const *)argv_init); 303 execv(loginpath, (char *const *)argv_init);
283 304
@@ -291,6 +312,7 @@ make_new_session(int sockfd)
291 return ts; 312 return ts;
292} 313}
293 314
315#ifndef CONFIG_FEATURE_TELNETD_INETD
294static void 316static void
295free_session(struct tsession *ts) 317free_session(struct tsession *ts)
296{ 318{
@@ -319,30 +341,44 @@ free_session(struct tsession *ts)
319 341
320 free(ts); 342 free(ts);
321} 343}
344#endif /* CONFIG_FEATURE_TELNETD_INETD */
322 345
323int 346int
324telnetd_main(int argc, char **argv) 347telnetd_main(int argc, char **argv)
325{ 348{
349#ifndef CONFIG_FEATURE_TELNETD_INETD
326 struct sockaddr_in sa; 350 struct sockaddr_in sa;
327 int master_fd; 351 int master_fd;
352#endif /* CONFIG_FEATURE_TELNETD_INETD */
328 fd_set rdfdset, wrfdset; 353 fd_set rdfdset, wrfdset;
329 int selret; 354 int selret;
355#ifndef CONFIG_FEATURE_TELNETD_INETD
330 int on = 1; 356 int on = 1;
331 int portnbr = 23; 357 int portnbr = 23;
358#endif /* CONFIG_FEATURE_TELNETD_INETD */
332 int c; 359 int c;
333 360 static const char options[] =
334 /* check if user supplied a port number */ 361#ifdef CONFIG_FEATURE_TELNETD_INETD
362 "f:l:";
363#else /* CONFIG_EATURE_TELNETD_INETD */
364 "f:l:p:";
365#endif /* CONFIG_FEATURE_TELNETD_INETD */
335 366
336 for (;;) { 367 for (;;) {
337 c = getopt( argc, argv, "p:l:"); 368 c = getopt( argc, argv, options);
338 if (c == EOF) break; 369 if (c == EOF) break;
339 switch (c) { 370 switch (c) {
340 case 'p': 371 case 'f':
341 portnbr = atoi(optarg); 372 issuefile = strdup (optarg);
342 break; 373 break;
343 case 'l': 374 case 'l':
344 loginpath = strdup (optarg); 375 loginpath = strdup (optarg);
345 break; 376 break;
377#ifndef CONFIG_FEATURE_TELNETD_INETD
378 case 'p':
379 portnbr = atoi(optarg);
380 break;
381#endif /* CONFIG_FEATURE_TELNETD_INETD */
346 default: 382 default:
347 show_usage(); 383 show_usage();
348 } 384 }
@@ -353,6 +389,12 @@ telnetd_main(int argc, char **argv)
353 } 389 }
354 390
355 argv_init[0] = loginpath; 391 argv_init[0] = loginpath;
392
393#ifdef CONFIG_FEATURE_TELNETD_INETD
394 sessions = make_new_session();
395
396 maxfd = 1;
397#else /* CONFIG_EATURE_TELNETD_INETD */
356 sessions = 0; 398 sessions = 0;
357 399
358 /* Grab a TCP socket. */ 400 /* Grab a TCP socket. */
@@ -382,6 +424,7 @@ telnetd_main(int argc, char **argv)
382 424
383 425
384 maxfd = master_fd; 426 maxfd = master_fd;
427#endif /* CONFIG_FEATURE_TELNETD_INETD */
385 428
386 do { 429 do {
387 struct tsession *ts; 430 struct tsession *ts;
@@ -393,10 +436,14 @@ telnetd_main(int argc, char **argv)
393 * ptys if there is room in their respective session buffers. 436 * ptys if there is room in their respective session buffers.
394 */ 437 */
395 438
439#ifndef CONFIG_FEATURE_TELNETD_INETD
396 FD_SET(master_fd, &rdfdset); 440 FD_SET(master_fd, &rdfdset);
441#endif /* CONFIG_FEATURE_TELNETD_INETD */
397 442
398 ts = sessions; 443 ts = sessions;
444#ifndef CONFIG_FEATURE_TELNETD_INETD
399 while (ts) { 445 while (ts) {
446#endif /* CONFIG_FEATURE_TELNETD_INETD */
400 /* buf1 is used from socket to pty 447 /* buf1 is used from socket to pty
401 * buf2 is used from pty to socket 448 * buf2 is used from pty to socket
402 */ 449 */
@@ -404,22 +451,33 @@ telnetd_main(int argc, char **argv)
404 FD_SET(ts->ptyfd, &wrfdset); /* can write to pty */ 451 FD_SET(ts->ptyfd, &wrfdset); /* can write to pty */
405 } 452 }
406 if (ts->size1 < BUFSIZE) { 453 if (ts->size1 < BUFSIZE) {
454#ifdef CONFIG_FEATURE_TELNETD_INETD
455 FD_SET(ts->sockfd_read, &rdfdset); /* can read from socket */
456#else /* CONFIG_FEATURE_TELNETD_INETD */
407 FD_SET(ts->sockfd, &rdfdset); /* can read from socket */ 457 FD_SET(ts->sockfd, &rdfdset); /* can read from socket */
458#endif /* CONFIG_FEATURE_TELNETD_INETD */
408 } 459 }
409 if (ts->size2 > 0) { 460 if (ts->size2 > 0) {
461#ifdef CONFIG_FEATURE_TELNETD_INETD
462 FD_SET(ts->sockfd_write, &wrfdset); /* can write to socket */
463#else /* CONFIG_FEATURE_TELNETD_INETD */
410 FD_SET(ts->sockfd, &wrfdset); /* can write to socket */ 464 FD_SET(ts->sockfd, &wrfdset); /* can write to socket */
465#endif /* CONFIG_FEATURE_TELNETD_INETD */
411 } 466 }
412 if (ts->size2 < BUFSIZE) { 467 if (ts->size2 < BUFSIZE) {
413 FD_SET(ts->ptyfd, &rdfdset); /* can read from pty */ 468 FD_SET(ts->ptyfd, &rdfdset); /* can read from pty */
414 } 469 }
470#ifndef CONFIG_FEATURE_TELNETD_INETD
415 ts = ts->next; 471 ts = ts->next;
416 } 472 }
473#endif /* CONFIG_FEATURE_TELNETD_INETD */
417 474
418 selret = select(maxfd + 1, &rdfdset, &wrfdset, 0, 0); 475 selret = select(maxfd + 1, &rdfdset, &wrfdset, 0, 0);
419 476
420 if (!selret) 477 if (!selret)
421 break; 478 break;
422 479
480#ifndef CONFIG_FEATURE_TELNETD_INETD
423 /* First check for and accept new sessions. */ 481 /* First check for and accept new sessions. */
424 if (FD_ISSET(master_fd, &rdfdset)) { 482 if (FD_ISSET(master_fd, &rdfdset)) {
425 int fd, salen; 483 int fd, salen;
@@ -447,9 +505,12 @@ telnetd_main(int argc, char **argv)
447 505
448 ts = sessions; 506 ts = sessions;
449 while (ts) { /* For all sessions... */ 507 while (ts) { /* For all sessions... */
508#endif /* CONFIG_FEATURE_TELNETD_INETD */
450 int maxlen, w, r; 509 int maxlen, w, r;
510#ifndef CONFIG_FEATURE_TELNETD_INETD
451 struct tsession *next = ts->next; /* in case we free ts. */ 511 struct tsession *next = ts->next; /* in case we free ts. */
452 512#endif /* CONFIG_FEATURE_TELNETD_INETD */
513
453 if (ts->size1 && FD_ISSET(ts->ptyfd, &wrfdset)) { 514 if (ts->size1 && FD_ISSET(ts->ptyfd, &wrfdset)) {
454 int num_totty; 515 int num_totty;
455 char *ptr; 516 char *ptr;
@@ -459,9 +520,13 @@ telnetd_main(int argc, char **argv)
459 520
460 w = write(ts->ptyfd, ptr, num_totty); 521 w = write(ts->ptyfd, ptr, num_totty);
461 if (w < 0) { 522 if (w < 0) {
523#ifdef CONFIG_FEATURE_TELNETD_INETD
524 exit(0);
525#else /* CONFIG_FEATURE_TELNETD_INETD */
462 free_session(ts); 526 free_session(ts);
463 ts = next; 527 ts = next;
464 continue; 528 continue;
529#endif /* CONFIG_FEATURE_TELNETD_INETD */
465 } 530 }
466 ts->wridx1 += w; 531 ts->wridx1 += w;
467 ts->size1 -= w; 532 ts->size1 -= w;
@@ -469,31 +534,51 @@ telnetd_main(int argc, char **argv)
469 ts->wridx1 = 0; 534 ts->wridx1 = 0;
470 } 535 }
471 536
537#ifdef CONFIG_FEATURE_TELNETD_INETD
538 if (ts->size2 && FD_ISSET(ts->sockfd_write, &wrfdset)) {
539#else /* CONFIG_FEATURE_TELNETD_INETD */
472 if (ts->size2 && FD_ISSET(ts->sockfd, &wrfdset)) { 540 if (ts->size2 && FD_ISSET(ts->sockfd, &wrfdset)) {
541#endif /* CONFIG_FEATURE_TELNETD_INETD */
473 /* Write to socket from buffer 2. */ 542 /* Write to socket from buffer 2. */
474 maxlen = MIN(BUFSIZE - ts->wridx2, ts->size2); 543 maxlen = MIN(BUFSIZE - ts->wridx2, ts->size2);
544#ifdef CONFIG_FEATURE_TELNETD_INETD
545 w = write(ts->sockfd_write, ts->buf2 + ts->wridx2, maxlen);
546 if (w < 0)
547 exit(0);
548#else /* CONFIG_FEATURE_TELNETD_INETD */
475 w = write(ts->sockfd, ts->buf2 + ts->wridx2, maxlen); 549 w = write(ts->sockfd, ts->buf2 + ts->wridx2, maxlen);
476 if (w < 0) { 550 if (w < 0) {
477 free_session(ts); 551 free_session(ts);
478 ts = next; 552 ts = next;
479 continue; 553 continue;
480 } 554 }
555#endif /* CONFIG_FEATURE_TELNETD_INETD */
481 ts->wridx2 += w; 556 ts->wridx2 += w;
482 ts->size2 -= w; 557 ts->size2 -= w;
483 if (ts->wridx2 == BUFSIZE) 558 if (ts->wridx2 == BUFSIZE)
484 ts->wridx2 = 0; 559 ts->wridx2 = 0;
485 } 560 }
486 561
562#ifdef CONFIG_FEATURE_TELNETD_INETD
563 if (ts->size1 < BUFSIZE && FD_ISSET(ts->sockfd_read, &rdfdset)) {
564#else /* CONFIG_FEATURE_TELNETD_INETD */
487 if (ts->size1 < BUFSIZE && FD_ISSET(ts->sockfd, &rdfdset)) { 565 if (ts->size1 < BUFSIZE && FD_ISSET(ts->sockfd, &rdfdset)) {
566#endif /* CONFIG_FEATURE_TELNETD_INETD */
488 /* Read from socket to buffer 1. */ 567 /* Read from socket to buffer 1. */
489 maxlen = MIN(BUFSIZE - ts->rdidx1, 568 maxlen = MIN(BUFSIZE - ts->rdidx1,
490 BUFSIZE - ts->size1); 569 BUFSIZE - ts->size1);
570#ifdef CONFIG_FEATURE_TELNETD_INETD
571 r = read(ts->sockfd_read, ts->buf1 + ts->rdidx1, maxlen);
572 if (!r || (r < 0 && errno != EINTR))
573 exit(0);
574#else /* CONFIG_FEATURE_TELNETD_INETD */
491 r = read(ts->sockfd, ts->buf1 + ts->rdidx1, maxlen); 575 r = read(ts->sockfd, ts->buf1 + ts->rdidx1, maxlen);
492 if (!r || (r < 0 && errno != EINTR)) { 576 if (!r || (r < 0 && errno != EINTR)) {
493 free_session(ts); 577 free_session(ts);
494 ts = next; 578 ts = next;
495 continue; 579 continue;
496 } 580 }
581#endif /* CONFIG_FEATURE_TELNETD_INETD */
497 if(!*(ts->buf1 + ts->rdidx1 + r - 1)) { 582 if(!*(ts->buf1 + ts->rdidx1 + r - 1)) {
498 r--; 583 r--;
499 if(!r) 584 if(!r)
@@ -511,9 +596,13 @@ telnetd_main(int argc, char **argv)
511 BUFSIZE - ts->size2); 596 BUFSIZE - ts->size2);
512 r = read(ts->ptyfd, ts->buf2 + ts->rdidx2, maxlen); 597 r = read(ts->ptyfd, ts->buf2 + ts->rdidx2, maxlen);
513 if (!r || (r < 0 && errno != EINTR)) { 598 if (!r || (r < 0 && errno != EINTR)) {
599#ifdef CONFIG_FEATURE_TELNETD_INETD
600 exit(0);
601#else /* CONFIG_FEATURE_TELNETD_INETD */
514 free_session(ts); 602 free_session(ts);
515 ts = next; 603 ts = next;
516 continue; 604 continue;
605#endif /* CONFIG_FEATURE_TELNETD_INETD */
517 } 606 }
518 ts->rdidx2 += r; 607 ts->rdidx2 += r;
519 ts->size2 += r; 608 ts->size2 += r;
@@ -529,8 +618,10 @@ telnetd_main(int argc, char **argv)
529 ts->rdidx2 = 0; 618 ts->rdidx2 = 0;
530 ts->wridx2 = 0; 619 ts->wridx2 = 0;
531 } 620 }
621#ifndef CONFIG_FEATURE_TELNETD_INETD
532 ts = next; 622 ts = next;
533 } 623 }
624#endif /* CONFIG_FEATURE_TELNETD_INETD */
534 625
535 } while (1); 626 } while (1);
536 627