diff options
| author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-01-21 20:55:56 +0000 |
|---|---|---|
| committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-01-21 20:55:56 +0000 |
| commit | 9e5d6c002ca589fb2e767fc8bafd6ceddaa12d39 (patch) | |
| tree | cc4bb2d87b27a82c93e46d0abc3f9ab8a3f3a232 | |
| parent | 4c51202b9dfe3df38e0a50bef9b66bd4cae39277 (diff) | |
| download | busybox-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.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 | ||
