X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2Fstdio%2Ffreopen.c;h=7868c95207052b3ac47f97abe79559640872aa5d;hb=84d648157e22cecc65902ecfdd4e3a1b88d5e53f;hp=682e3c6c1e8f4eee7e1839cf6e60ba2fb7f724dd;hpb=fce9a8538009ea5c113b03c608cedf036ce4a364;p=pdclib.old diff --git a/functions/stdio/freopen.c b/functions/stdio/freopen.c index 682e3c6..7868c95 100644 --- a/functions/stdio/freopen.c +++ b/functions/stdio/freopen.c @@ -14,8 +14,13 @@ #include #include -struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +struct _PDCLIB_file_t * freopen( + const char * _PDCLIB_restrict filename, + const char * _PDCLIB_restrict mode, + struct _PDCLIB_file_t * _PDCLIB_restrict stream ) { + flockfile( stream ); + unsigned int status = stream->status & ( _IONBF | _IOLBF | _IOFBF | _PDCLIB_FREEBUFFER | _PDCLIB_DELONCLOSE ); /* TODO: This function can change wide orientation of a stream */ if ( stream->status & _PDCLIB_FWRITE ) @@ -25,6 +30,7 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c if ( ( filename == NULL ) && ( stream->filename == NULL ) ) { /* TODO: Special handling for mode changes on std-streams */ + funlockfile( stream ); return NULL; } _PDCLIB_close( stream->handle ); @@ -49,16 +55,19 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c /* Allocate new buffer */ if ( ( stream->filename = (char *)malloc( strlen( filename ) ) ) == NULL ) { + funlockfile( stream ); return NULL; } strcpy( stream->filename, filename ); } if ( ( mode == NULL ) || ( filename[0] == '\0' ) ) { + funlockfile( stream ); return NULL; } if ( ( stream->status = _PDCLIB_filemode( mode ) ) == 0 ) { + funlockfile( stream ); return NULL; } /* Re-add the flags we saved above */ @@ -69,8 +78,10 @@ struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const c /* TODO: Setting mbstate */ if ( ( stream->handle = _PDCLIB_open( filename, stream->status ) ) == _PDCLIB_NOHANDLE ) { + funlockfile( stream ); return NULL; } + funlockfile( stream ); return stream; }