diff options
| author | Eric Andersen <andersen@codepoet.org> | 1999-11-07 07:38:08 +0000 |
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 1999-11-07 07:38:08 +0000 |
| commit | 07e5297ca7707d2fd56ab2fa8e1ea0c9805035e3 (patch) | |
| tree | 67473f996e985a255afbb8d20cb1583fe09f0b14 | |
| parent | dc6301e7ca26457e413f1dfc88fca4d19e775970 (diff) | |
| download | busybox-w32-07e5297ca7707d2fd56ab2fa8e1ea0c9805035e3.tar.gz busybox-w32-07e5297ca7707d2fd56ab2fa8e1ea0c9805035e3.tar.bz2 busybox-w32-07e5297ca7707d2fd56ab2fa8e1ea0c9805035e3.zip | |
init and ls -l fixes
| -rw-r--r-- | Changelog | 8 | ||||
| -rw-r--r-- | coreutils/ls.c | 10 | ||||
| -rw-r--r-- | init.c | 64 | ||||
| -rw-r--r-- | init/init.c | 64 | ||||
| -rw-r--r-- | ls.c | 10 |
5 files changed, 110 insertions, 46 deletions
| @@ -1,3 +1,11 @@ | |||
| 1 | 0.34 | ||
| 2 | * ls -l now displays lnik names outside the current directory, | ||
| 3 | Patch thanks to Eric Delaunay | ||
| 4 | * init now properly handles sparc serial consoles and does a | ||
| 5 | better job of finding the real consol device rather than using | ||
| 6 | /dev/console which doesn't support job control. Patch also | ||
| 7 | thanks to Eric Delaunay. | ||
| 8 | |||
| 1 | 0.33 | 9 | 0.33 |
| 2 | * Fixed a bug where init could hang instead of rebooting. | 10 | * Fixed a bug where init could hang instead of rebooting. |
| 3 | * Removed some debugging noise from init.c | 11 | * Removed some debugging noise from init.c |
diff --git a/coreutils/ls.c b/coreutils/ls.c index 0cde1960f..4eb486f87 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c | |||
| @@ -206,7 +206,7 @@ static char append_char(mode_t mode) | |||
| 206 | ** | 206 | ** |
| 207 | **/ | 207 | **/ |
| 208 | 208 | ||
| 209 | static void list_single(const char *name, struct stat *info) | 209 | static void list_single(const char *name, struct stat *info, const char *fullname) |
| 210 | { | 210 | { |
| 211 | char scratch[PATH_MAX]; | 211 | char scratch[PATH_MAX]; |
| 212 | short len = strlen(name); | 212 | short len = strlen(name); |
| @@ -297,12 +297,12 @@ static void list_single(const char *name, struct stat *info) | |||
| 297 | wr(name, len); | 297 | wr(name, len); |
| 298 | if (S_ISLNK(mode)) { | 298 | if (S_ISLNK(mode)) { |
| 299 | wr(" -> ", 4); | 299 | wr(" -> ", 4); |
| 300 | len = readlink(name, scratch, sizeof scratch); | 300 | len = readlink(fullname, scratch, sizeof scratch); |
| 301 | if (len > 0) fwrite(scratch, 1, len, stdout); | 301 | if (len > 0) fwrite(scratch, 1, len, stdout); |
| 302 | #ifdef FEATURE_FILETYPECHAR | 302 | #ifdef FEATURE_FILETYPECHAR |
| 303 | /* show type of destination */ | 303 | /* show type of destination */ |
| 304 | if (opts & DISP_FTYPE) { | 304 | if (opts & DISP_FTYPE) { |
| 305 | if (!stat(name, info)) { | 305 | if (!stat(fullname, info)) { |
| 306 | append = append_char(info->st_mode); | 306 | append = append_char(info->st_mode); |
| 307 | if (append) | 307 | if (append) |
| 308 | fputc(append, stdout); | 308 | fputc(append, stdout); |
| @@ -372,7 +372,7 @@ static int list_item(const char *name) | |||
| 372 | 372 | ||
| 373 | if (!S_ISDIR(info.st_mode) || | 373 | if (!S_ISDIR(info.st_mode) || |
| 374 | (opts & DIR_NOLIST)) { | 374 | (opts & DIR_NOLIST)) { |
| 375 | list_single(name, &info); | 375 | list_single(name, &info, name); |
| 376 | return 0; | 376 | return 0; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| @@ -424,7 +424,7 @@ static int list_item(const char *name) | |||
| 424 | strcpy(fnend, entry->d_name); | 424 | strcpy(fnend, entry->d_name); |
| 425 | if (lstat(fullname, &info)) | 425 | if (lstat(fullname, &info)) |
| 426 | goto direrr; /* (shouldn't fail) */ | 426 | goto direrr; /* (shouldn't fail) */ |
| 427 | list_single(entry->d_name, &info); | 427 | list_single(entry->d_name, &info, fullname); |
| 428 | } | 428 | } |
| 429 | closedir(dir); | 429 | closedir(dir); |
| 430 | return 0; | 430 | return 0; |
| @@ -88,8 +88,14 @@ void message(int device, char *fmt, ...) | |||
| 88 | 88 | ||
| 89 | /* Take full control of the log tty, and never close it. | 89 | /* Take full control of the log tty, and never close it. |
| 90 | * It's mine, all mine! Muhahahaha! */ | 90 | * It's mine, all mine! Muhahahaha! */ |
| 91 | if (log_fd==-1) { | 91 | if (log_fd < 0) { |
| 92 | if ((log_fd = device_open(log, O_RDWR|O_NDELAY)) < 0) { | 92 | if (log == NULL) { |
| 93 | /* don't even try to log, because there is no such console */ | ||
| 94 | log_fd = -2; | ||
| 95 | /* log to main console instead */ | ||
| 96 | device = CONSOLE; | ||
| 97 | } | ||
| 98 | else if ((log_fd = device_open(log, O_RDWR|O_NDELAY)) < 0) { | ||
| 93 | log_fd=-1; | 99 | log_fd=-1; |
| 94 | fprintf(stderr, "Bummer, can't write to log on %s!\r\n", log); | 100 | fprintf(stderr, "Bummer, can't write to log on %s!\r\n", log); |
| 95 | fflush(stderr); | 101 | fflush(stderr); |
| @@ -97,7 +103,7 @@ void message(int device, char *fmt, ...) | |||
| 97 | } | 103 | } |
| 98 | } | 104 | } |
| 99 | 105 | ||
| 100 | if ( (device & LOG) && (log_fd != -1) ) { | 106 | if ( (device & LOG) && (log_fd >= 0) ) { |
| 101 | va_start(arguments, fmt); | 107 | va_start(arguments, fmt); |
| 102 | vdprintf(log_fd, fmt, arguments); | 108 | vdprintf(log_fd, fmt, arguments); |
| 103 | va_end(arguments); | 109 | va_end(arguments); |
| @@ -180,25 +186,40 @@ static void console_init() | |||
| 180 | int fd; | 186 | int fd; |
| 181 | int tried_devcons = 0; | 187 | int tried_devcons = 0; |
| 182 | int tried_vtprimary = 0; | 188 | int tried_vtprimary = 0; |
| 189 | struct serial_struct sr; | ||
| 183 | char *s; | 190 | char *s; |
| 184 | 191 | ||
| 185 | if ((s = getenv("CONSOLE")) != NULL) { | 192 | if ((s = getenv("CONSOLE")) != NULL) { |
| 186 | console = s; | 193 | console = s; |
| 187 | /* Apparently the sparc does wierd things... */ | 194 | } |
| 188 | #if defined (__sparc__) | 195 | #if defined (__sparc__) |
| 189 | if (strncmp( s, "/dev/tty", 8 )==0) { | 196 | /* sparc kernel supports console=tty[ab] parameter which is also |
| 190 | switch( s[8]) { | 197 | * passed to init, so catch it here */ |
| 191 | case 'a': | 198 | else if ((s = getenv("console")) != NULL) { |
| 192 | s=SERIAL_CON0; | 199 | /* remap tty[ab] to /dev/ttyS[01] */ |
| 193 | break; | 200 | if (strcmp( s, "ttya" )==0) |
| 194 | case 'b': | 201 | console = SERIAL_CON0; |
| 195 | s=SERIAL_CON1; | 202 | else if (strcmp( s, "ttyb" )==0) |
| 196 | } | 203 | console = SERIAL_CON1; |
| 197 | } | 204 | } |
| 198 | #endif | 205 | #endif |
| 199 | } else { | 206 | else { |
| 200 | console = VT_CONSOLE; | 207 | struct vt_stat vt; |
| 201 | tried_devcons++; | 208 | static char the_console[13]; |
| 209 | |||
| 210 | console = the_console; | ||
| 211 | /* 2.2 kernels: identify the real console backend and try to use it */ | ||
| 212 | if (ioctl(0,TIOCGSERIAL,&sr) == 0) { | ||
| 213 | /* this is a serial console */ | ||
| 214 | snprintf( the_console, sizeof the_console, "/dev/ttyS%d", sr.line ); | ||
| 215 | } | ||
| 216 | else if (ioctl(0, VT_GETSTATE, &vt) == 0) { | ||
| 217 | /* this is linux virtual tty */ | ||
| 218 | snprintf( the_console, sizeof the_console, "/dev/tty%d", vt.v_active ); | ||
| 219 | } else { | ||
| 220 | console = VT_CONSOLE; | ||
| 221 | tried_devcons++; | ||
| 222 | } | ||
| 202 | } | 223 | } |
| 203 | 224 | ||
| 204 | while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) { | 225 | while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) { |
| @@ -219,8 +240,15 @@ static void console_init() | |||
| 219 | if (fd < 0) | 240 | if (fd < 0) |
| 220 | /* Perhaps we should panic here? */ | 241 | /* Perhaps we should panic here? */ |
| 221 | console = "/dev/null"; | 242 | console = "/dev/null"; |
| 222 | else | 243 | else { |
| 244 | /* check for serial console and disable logging to tty3 & running a | ||
| 245 | * shell to tty2 */ | ||
| 246 | if (ioctl(0,TIOCGSERIAL,&sr) == 0) { | ||
| 247 | log = NULL; | ||
| 248 | second_console = NULL; | ||
| 249 | } | ||
| 223 | close(fd); | 250 | close(fd); |
| 251 | } | ||
| 224 | message(LOG, "console=%s\n", console ); | 252 | message(LOG, "console=%s\n", console ); |
| 225 | } | 253 | } |
| 226 | 254 | ||
| @@ -472,7 +500,7 @@ extern int init_main(int argc, char **argv) | |||
| 472 | if (pid1 == 0 && tty0_commands) { | 500 | if (pid1 == 0 && tty0_commands) { |
| 473 | pid1 = run(tty0_commands, console, wait_for_enter); | 501 | pid1 = run(tty0_commands, console, wait_for_enter); |
| 474 | } | 502 | } |
| 475 | if (pid2 == 0 && tty1_commands) { | 503 | if (pid2 == 0 && tty1_commands && second_console) { |
| 476 | pid2 = run(tty1_commands, second_console, TRUE); | 504 | pid2 = run(tty1_commands, second_console, TRUE); |
| 477 | } | 505 | } |
| 478 | wpid = wait(&status); | 506 | wpid = wait(&status); |
diff --git a/init/init.c b/init/init.c index bf97fe5d6..707b1916f 100644 --- a/init/init.c +++ b/init/init.c | |||
| @@ -88,8 +88,14 @@ void message(int device, char *fmt, ...) | |||
| 88 | 88 | ||
| 89 | /* Take full control of the log tty, and never close it. | 89 | /* Take full control of the log tty, and never close it. |
| 90 | * It's mine, all mine! Muhahahaha! */ | 90 | * It's mine, all mine! Muhahahaha! */ |
| 91 | if (log_fd==-1) { | 91 | if (log_fd < 0) { |
| 92 | if ((log_fd = device_open(log, O_RDWR|O_NDELAY)) < 0) { | 92 | if (log == NULL) { |
| 93 | /* don't even try to log, because there is no such console */ | ||
| 94 | log_fd = -2; | ||
| 95 | /* log to main console instead */ | ||
| 96 | device = CONSOLE; | ||
| 97 | } | ||
| 98 | else if ((log_fd = device_open(log, O_RDWR|O_NDELAY)) < 0) { | ||
| 93 | log_fd=-1; | 99 | log_fd=-1; |
| 94 | fprintf(stderr, "Bummer, can't write to log on %s!\r\n", log); | 100 | fprintf(stderr, "Bummer, can't write to log on %s!\r\n", log); |
| 95 | fflush(stderr); | 101 | fflush(stderr); |
| @@ -97,7 +103,7 @@ void message(int device, char *fmt, ...) | |||
| 97 | } | 103 | } |
| 98 | } | 104 | } |
| 99 | 105 | ||
| 100 | if ( (device & LOG) && (log_fd != -1) ) { | 106 | if ( (device & LOG) && (log_fd >= 0) ) { |
| 101 | va_start(arguments, fmt); | 107 | va_start(arguments, fmt); |
| 102 | vdprintf(log_fd, fmt, arguments); | 108 | vdprintf(log_fd, fmt, arguments); |
| 103 | va_end(arguments); | 109 | va_end(arguments); |
| @@ -180,25 +186,40 @@ static void console_init() | |||
| 180 | int fd; | 186 | int fd; |
| 181 | int tried_devcons = 0; | 187 | int tried_devcons = 0; |
| 182 | int tried_vtprimary = 0; | 188 | int tried_vtprimary = 0; |
| 189 | struct serial_struct sr; | ||
| 183 | char *s; | 190 | char *s; |
| 184 | 191 | ||
| 185 | if ((s = getenv("CONSOLE")) != NULL) { | 192 | if ((s = getenv("CONSOLE")) != NULL) { |
| 186 | console = s; | 193 | console = s; |
| 187 | /* Apparently the sparc does wierd things... */ | 194 | } |
| 188 | #if defined (__sparc__) | 195 | #if defined (__sparc__) |
| 189 | if (strncmp( s, "/dev/tty", 8 )==0) { | 196 | /* sparc kernel supports console=tty[ab] parameter which is also |
| 190 | switch( s[8]) { | 197 | * passed to init, so catch it here */ |
| 191 | case 'a': | 198 | else if ((s = getenv("console")) != NULL) { |
| 192 | s=SERIAL_CON0; | 199 | /* remap tty[ab] to /dev/ttyS[01] */ |
| 193 | break; | 200 | if (strcmp( s, "ttya" )==0) |
| 194 | case 'b': | 201 | console = SERIAL_CON0; |
| 195 | s=SERIAL_CON1; | 202 | else if (strcmp( s, "ttyb" )==0) |
| 196 | } | 203 | console = SERIAL_CON1; |
| 197 | } | 204 | } |
| 198 | #endif | 205 | #endif |
| 199 | } else { | 206 | else { |
| 200 | console = VT_CONSOLE; | 207 | struct vt_stat vt; |
| 201 | tried_devcons++; | 208 | static char the_console[13]; |
| 209 | |||
| 210 | console = the_console; | ||
| 211 | /* 2.2 kernels: identify the real console backend and try to use it */ | ||
| 212 | if (ioctl(0,TIOCGSERIAL,&sr) == 0) { | ||
| 213 | /* this is a serial console */ | ||
| 214 | snprintf( the_console, sizeof the_console, "/dev/ttyS%d", sr.line ); | ||
| 215 | } | ||
| 216 | else if (ioctl(0, VT_GETSTATE, &vt) == 0) { | ||
| 217 | /* this is linux virtual tty */ | ||
| 218 | snprintf( the_console, sizeof the_console, "/dev/tty%d", vt.v_active ); | ||
| 219 | } else { | ||
| 220 | console = VT_CONSOLE; | ||
| 221 | tried_devcons++; | ||
| 222 | } | ||
| 202 | } | 223 | } |
| 203 | 224 | ||
| 204 | while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) { | 225 | while ((fd = open(console, O_RDONLY | O_NONBLOCK)) < 0) { |
| @@ -219,8 +240,15 @@ static void console_init() | |||
| 219 | if (fd < 0) | 240 | if (fd < 0) |
| 220 | /* Perhaps we should panic here? */ | 241 | /* Perhaps we should panic here? */ |
| 221 | console = "/dev/null"; | 242 | console = "/dev/null"; |
| 222 | else | 243 | else { |
| 244 | /* check for serial console and disable logging to tty3 & running a | ||
| 245 | * shell to tty2 */ | ||
| 246 | if (ioctl(0,TIOCGSERIAL,&sr) == 0) { | ||
| 247 | log = NULL; | ||
| 248 | second_console = NULL; | ||
| 249 | } | ||
| 223 | close(fd); | 250 | close(fd); |
| 251 | } | ||
| 224 | message(LOG, "console=%s\n", console ); | 252 | message(LOG, "console=%s\n", console ); |
| 225 | } | 253 | } |
| 226 | 254 | ||
| @@ -472,7 +500,7 @@ extern int init_main(int argc, char **argv) | |||
| 472 | if (pid1 == 0 && tty0_commands) { | 500 | if (pid1 == 0 && tty0_commands) { |
| 473 | pid1 = run(tty0_commands, console, wait_for_enter); | 501 | pid1 = run(tty0_commands, console, wait_for_enter); |
| 474 | } | 502 | } |
| 475 | if (pid2 == 0 && tty1_commands) { | 503 | if (pid2 == 0 && tty1_commands && second_console) { |
| 476 | pid2 = run(tty1_commands, second_console, TRUE); | 504 | pid2 = run(tty1_commands, second_console, TRUE); |
| 477 | } | 505 | } |
| 478 | wpid = wait(&status); | 506 | wpid = wait(&status); |
| @@ -206,7 +206,7 @@ static char append_char(mode_t mode) | |||
| 206 | ** | 206 | ** |
| 207 | **/ | 207 | **/ |
| 208 | 208 | ||
| 209 | static void list_single(const char *name, struct stat *info) | 209 | static void list_single(const char *name, struct stat *info, const char *fullname) |
| 210 | { | 210 | { |
| 211 | char scratch[PATH_MAX]; | 211 | char scratch[PATH_MAX]; |
| 212 | short len = strlen(name); | 212 | short len = strlen(name); |
| @@ -297,12 +297,12 @@ static void list_single(const char *name, struct stat *info) | |||
| 297 | wr(name, len); | 297 | wr(name, len); |
| 298 | if (S_ISLNK(mode)) { | 298 | if (S_ISLNK(mode)) { |
| 299 | wr(" -> ", 4); | 299 | wr(" -> ", 4); |
| 300 | len = readlink(name, scratch, sizeof scratch); | 300 | len = readlink(fullname, scratch, sizeof scratch); |
| 301 | if (len > 0) fwrite(scratch, 1, len, stdout); | 301 | if (len > 0) fwrite(scratch, 1, len, stdout); |
| 302 | #ifdef FEATURE_FILETYPECHAR | 302 | #ifdef FEATURE_FILETYPECHAR |
| 303 | /* show type of destination */ | 303 | /* show type of destination */ |
| 304 | if (opts & DISP_FTYPE) { | 304 | if (opts & DISP_FTYPE) { |
| 305 | if (!stat(name, info)) { | 305 | if (!stat(fullname, info)) { |
| 306 | append = append_char(info->st_mode); | 306 | append = append_char(info->st_mode); |
| 307 | if (append) | 307 | if (append) |
| 308 | fputc(append, stdout); | 308 | fputc(append, stdout); |
| @@ -372,7 +372,7 @@ static int list_item(const char *name) | |||
| 372 | 372 | ||
| 373 | if (!S_ISDIR(info.st_mode) || | 373 | if (!S_ISDIR(info.st_mode) || |
| 374 | (opts & DIR_NOLIST)) { | 374 | (opts & DIR_NOLIST)) { |
| 375 | list_single(name, &info); | 375 | list_single(name, &info, name); |
| 376 | return 0; | 376 | return 0; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| @@ -424,7 +424,7 @@ static int list_item(const char *name) | |||
| 424 | strcpy(fnend, entry->d_name); | 424 | strcpy(fnend, entry->d_name); |
| 425 | if (lstat(fullname, &info)) | 425 | if (lstat(fullname, &info)) |
| 426 | goto direrr; /* (shouldn't fail) */ | 426 | goto direrr; /* (shouldn't fail) */ |
| 427 | list_single(entry->d_name, &info); | 427 | list_single(entry->d_name, &info, fullname); |
| 428 | } | 428 | } |
| 429 | closedir(dir); | 429 | closedir(dir); |
| 430 | return 0; | 430 | return 0; |
