diff options
Diffstat (limited to 'libc/stdio/stdio.c')
-rw-r--r-- | libc/stdio/stdio.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c index f290260ae..c2486a7a4 100644 --- a/libc/stdio/stdio.c +++ b/libc/stdio/stdio.c @@ -121,9 +121,16 @@ void __stdio_close_all(void) void __init_stdio(void) { + static int stdio_initialized = 0; #if FIXED_BUFFERS > 2 int i; +#endif + + if (stdio_initialized!=0) + return; + stdio_initialized++; +#if FIXED_BUFFERS > 2 for ( i = 2 ; i < FIXED_BUFFERS ; i++ ) { _fixed_buffers[i].used = 0; } @@ -135,7 +142,7 @@ void __init_stdio(void) if (isatty(1)) { stdout->mode |= _IOLBF; } -#if 0 +#if 1 /* Taken care of in _start.S and atexit.c now. */ atexit(__stdio_close_all); #endif @@ -149,6 +156,8 @@ FILE *fp; { register int v; + __init_stdio(); + v = fp->mode; /* If last op was a read ... */ if ((v & __MODE_READING) && fflush(fp)) @@ -194,6 +203,8 @@ FILE *fp; { int ch; + __init_stdio(); + if (fp->mode & __MODE_WRITING) fflush(fp); @@ -236,6 +247,8 @@ FILE *fp; int len, cc, rv = 0; char *bstart; + __init_stdio(); + if (fp == NULL) { /* On NULL flush the lot. */ if (fflush(stdin)) return EOF; @@ -314,6 +327,8 @@ FILE *f; register size_t i; register int ch; + __init_stdio(); + ret = s; for (i = count-1; i > 0; i--) { ch = getc(f); @@ -343,6 +358,8 @@ char *str; register char *p = str; register int c; + __init_stdio(); + while (((c = getc(stdin)) != EOF) && (c != '\n')) *p++ = c; *p = '\0'; @@ -357,6 +374,8 @@ FILE *fp; { register int n = 0; + __init_stdio(); + while (*str) { if (putc(*str++, fp) == EOF) return (EOF); @@ -372,6 +391,8 @@ const char *str; { register int n; + __init_stdio(); + if (((n = fputs(str, stdout)) == EOF) || (putc('\n', stdout) == EOF)) return (EOF); @@ -397,6 +418,8 @@ FILE *fp; int len, v; unsigned bytes, got = 0; + __init_stdio(); + v = fp->mode; /* Want to do this to bring the file pointer up to date */ @@ -453,6 +476,8 @@ FILE *fp; int len; unsigned bytes, put; + __init_stdio(); + #ifdef STUB_FWRITE bytes = size * nelm; while (bytes > 0) { @@ -524,6 +549,8 @@ FILE *fp; void rewind(fp) FILE *fp; { + __init_stdio(); + fseek(fp, (long) 0, 0); clearerr(fp); } @@ -600,6 +627,8 @@ const char *mode; int fopen_mode = 0; FILE *nfp = 0; + __init_stdio(); + /* If we've got an fp close the old one (freopen) */ if (fp) { /* Careful, don't de-allocate it */ @@ -710,6 +739,8 @@ FILE *fp; { int rv = 0; + __init_stdio(); + if (fp == 0) { errno = EINVAL; return EOF; @@ -817,6 +848,8 @@ int ungetc(c, fp) int c; FILE *fp; { + __init_stdio(); + if (fp->mode & __MODE_WRITING) fflush(fp); |