diff options
-rw-r--r-- | include/libbb.h | 4 | ||||
-rw-r--r-- | libbb/Makefile.in | 2 | ||||
-rw-r--r-- | loginutils/getty.c | 138 | ||||
-rw-r--r-- | loginutils/login.c | 20 | ||||
-rw-r--r-- | networking/Config.in | 7 | ||||
-rw-r--r-- | networking/telnetd.c | 107 |
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; | |||
277 | extern const char * const group_file; | 277 | extern const char * const group_file; |
278 | extern const char * const securetty_file; | 278 | extern const char * const securetty_file; |
279 | extern const char * const motd_file; | 279 | extern const char * const motd_file; |
280 | extern const char * const issue_file; | ||
281 | extern const char * const _path_login; | 280 | extern 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; |
366 | extern llist_t *llist_add_to(llist_t *old_head, char *new_item); | 365 | extern llist_t *llist_add_to(llist_t *old_head, char *new_item); |
367 | 366 | ||
367 | void print_login_issue(const char *issue_file, const char *tty); | ||
368 | void 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 */ |
753 | static void do_prompt(struct options *op, struct termio *tp) | 751 | static 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 | ||
318 | config 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 | |||
318 | config CONFIG_TFTP | 325 | config 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 | ||
51 | static const char *loginpath = "/bin/sh"; | 51 | static const char *loginpath = |
52 | #ifdef CONFIG_LOGIN | ||
53 | "/bin/login"; | ||
54 | #else | ||
55 | "/bin/sh"; | ||
56 | #endif | ||
57 | static 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 | ||
59 | struct tsession { | 65 | struct 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 | ||
206 | static struct tsession * | 216 | static struct tsession * |
217 | #ifdef CONFIG_FEATURE_TELNETD_INETD | ||
218 | make_new_session(void) | ||
219 | #else /* CONFIG_FEATURE_TELNETD_INETD */ | ||
207 | make_new_session(int sockfd) | 220 | make_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 | ||
294 | static void | 316 | static void |
295 | free_session(struct tsession *ts) | 317 | free_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 | ||
323 | int | 346 | int |
324 | telnetd_main(int argc, char **argv) | 347 | telnetd_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 | ||