X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=includes%2Fstdio.h;h=b10891ffe9b23a7191effab0432ba4bb9fccb5f9;hb=8043770b1c45834065232d158d40174fa72d0444;hp=74413330a0824a907630955a01f1f614ee99c3a7;hpb=fa0737b4368052d0e61a726d13ee7e659993f052;p=pdclib.old diff --git a/includes/stdio.h b/includes/stdio.h index 7441333..b10891f 100644 --- a/includes/stdio.h +++ b/includes/stdio.h @@ -27,8 +27,8 @@ typedef _PDCLIB_size_t size_t; #define _IONBF 4 /* The following are platform-dependant, and defined in _PDCLIB_config.h. */ -typedef struct _PDCLIB_fpos_t fpos_t; -typedef struct _PDCLIB_file_t FILE; +typedef _PDCLIB_fpos_t fpos_t; +typedef _PDCLIB_file_t FILE; #define EOF -1 #define BUFSIZ _PDCLIB_BUFSIZ #define FOPEN_MAX _PDCLIB_FOPEN_MAX @@ -171,12 +171,14 @@ int fflush( FILE * stream ) _PDCLIB_nothrow; Returns a pointer to the stream handle if successfull, NULL otherwise. */ -FILE * fopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode ) _PDCLIB_nothrow; +FILE * fopen( const char * _PDCLIB_restrict filename, + const char * _PDCLIB_restrict mode ) _PDCLIB_nothrow; /* Creates a stream connected to the file descriptor \p fd with mode \p mode. Mode must match the mode with which the file descriptor was opened. */ -FILE * _PDCLIB_fdopen( _PDCLIB_fd_t fd, int mode, const char* filename ) _PDCLIB_nothrow; +FILE * _PDCLIB_fvopen( _PDCLIB_fd_t fd, const _PDCLIB_fileops_t * ops, + int mode, const char * filename ) _PDCLIB_nothrow; /* Close any file currently associated with the given stream. Open the file identified by the given filename with the given mode (equivalent to fopen()), @@ -682,13 +684,18 @@ int getc( FILE * stream ) _PDCLIB_nothrow; /* Equivalent to fgetc( stdin ). */ int getchar( void ) _PDCLIB_nothrow; +#if _PDCLIB_C_MAX(1999) /* Read characters from given stream into the array s, stopping at \n or EOF. The string read is terminated with \0. Returns s if successful. If EOF is encountered before any characters are read, the contents of s are unchanged, and NULL is returned. If a read error occurs, the contents of s are indeter- minate, and NULL is returned. + + This function is dangerous and has been a great source of security + vulnerabilities. Do not use it. It was removed by C11. */ -char * gets( char * s ) _PDCLIB_nothrow; +char * gets( char * s ) _PDCLIB_DEPRECATED _PDCLIB_nothrow; +#endif /* Equivalent to fputc( c, stream ), but may be overloaded by a macro that evaluates its parameter more than once. @@ -788,7 +795,6 @@ int fsetpos( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow; TODO: Implementation-defined errno setting for ftell(). */ long int ftell( FILE * stream ) _PDCLIB_nothrow; -_PDCLIB_uint_fast64_t _PDCLIB_ftell64( FILE * stream ) _PDCLIB_nothrow; /* Equivalent to (void)fseek( stream, 0L, SEEK_SET ), except that the error indicator for the stream is also cleared. @@ -817,5 +823,74 @@ int ferror( FILE * stream ) _PDCLIB_nothrow; */ void perror( const char * s ) _PDCLIB_nothrow; +/* Unlocked I/O + * + * Since threading was introduced in C11, FILE objects have had implicit locks + * to prevent data races and inconsistent output. + * + * PDCLib provides these functions from POSIX as an extension in order to enable + * users to access the underlying unlocked functions. + * + * For each function defined in C11 where an _unlocked variant is defined below, + * the behaviour of the _unlocked variant is the same except that it will not + * take the lock associated with the stream. + * + * flockfile, ftrylockfile and funlockfile can be used to manually manipulate + * the stream locks. The behaviour of the _unlocked functions if called when the + * stream isn't locked by the calling thread is implementation defined. + */ +#if _PDCLIB_POSIX_MIN(200112L) || _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE +void flockfile(FILE *file) _PDCLIB_nothrow; +int ftrylockfile(FILE *file) _PDCLIB_nothrow; +void funlockfile(FILE *file) _PDCLIB_nothrow; + +int getc_unlocked(FILE *stream) _PDCLIB_nothrow; +int getchar_unlocked(void) _PDCLIB_nothrow; +int putc_unlocked(int c, FILE *stream) _PDCLIB_nothrow; +int putchar_unlocked(int c) _PDCLIB_nothrow; +#endif + +#if _PDCLIB_BSD_SOURCE || _PDCLIB_SVID_SOURCE +void clearerr_unlocked(FILE *stream) _PDCLIB_nothrow; +int feof_unlocked(FILE *stream) _PDCLIB_nothrow; +int ferror_unlocked(FILE *stream) _PDCLIB_nothrow; +int fflush_unlocked(FILE *stream) _PDCLIB_nothrow; +int fgetc_unlocked(FILE *stream) _PDCLIB_nothrow; +int fputc_unlocked(int c, FILE *stream) _PDCLIB_nothrow; +size_t fread_unlocked(void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow; +size_t fwrite_unlocked(const void *ptr, size_t size, size_t n, FILE *stream) _PDCLIB_nothrow; +#endif + +#if _PDCLIB_GNU_SOURCE +char *fgets_unlocked(char *s, int n, FILE *stream) _PDCLIB_nothrow; +int fputs_unlocked(const char *s, FILE *stream) _PDCLIB_nothrow; +#endif + +#if defined(_PDCLIB_EXTENSIONS) +int fgetpos_unlocked( FILE * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ) _PDCLIB_nothrow; +int fsetpos_unlocked( FILE * stream, const fpos_t * pos ) _PDCLIB_nothrow; +long int ftell_unlocked( FILE * stream ) _PDCLIB_nothrow; +int fseek_unlocked( FILE * stream, long int offset, int whence ) _PDCLIB_nothrow; +void rewind_unlocked( FILE * stream ) _PDCLIB_nothrow; + +int puts_unlocked( const char * s ) _PDCLIB_nothrow; +int ungetc_unlocked( int c, FILE * stream ) _PDCLIB_nothrow; + + +int printf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; +int vprintf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; +int fprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; +int vfprintf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; +int scanf_unlocked( const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; +int vscanf_unlocked( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; +int fscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) _PDCLIB_nothrow; +int vfscanf_unlocked( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) _PDCLIB_nothrow; + + +// Todo: remove prefix? +_PDCLIB_uint_fast64_t _PDCLIB_ftell64( FILE * stream ) _PDCLIB_nothrow; +_PDCLIB_uint_fast64_t _PDCLIB_ftell64_unlocked( FILE * stream ) _PDCLIB_nothrow; +#endif + _PDCLIB_END_EXTERN_C #endif