Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/io.c

    r6afc9d7 r6fa9a99d  
    231231        if (stream->buf == NULL) {
    232232                errno = ENOMEM;
    233                 return EOF;
     233                return -1;
    234234        }
    235235       
     
    299299}
    300300
    301 
    302 static int _fclose_nofree(FILE *stream)
     301int fclose(FILE *stream)
    303302{
    304303        int rc = 0;
     
    313312       
    314313        list_remove(&stream->link);
    315        
    316         if (rc != 0) {
    317                 /* errno was set by close() */
    318                 return EOF;
    319         }
    320        
    321         return 0;
    322 }
    323 
    324 int fclose(FILE *stream)
    325 {
    326         int rc = _fclose_nofree(stream);
    327314       
    328315        if ((stream != &stdin_null)
     
    331318                free(stream);
    332319       
    333         return rc;
    334 }
    335 
    336 FILE *freopen(const char *path, const char *mode, FILE *stream)
    337 {
    338         FILE *nstr;
    339        
    340         if (path == NULL) {
    341                 /* Changing mode is not supported */
    342                 return NULL;
    343         }
    344        
    345         (void) _fclose_nofree(stream);
    346         nstr = fopen(path, mode);
    347         if (nstr == NULL) {
    348                 free(stream);
    349                 return NULL;
    350         }
    351        
    352         list_remove(&nstr->link);
    353         *stream = *nstr;
    354         list_append(&stream->link, &files);
    355        
    356         free(nstr);
    357        
    358         return stream;
     320        stream = NULL;
     321       
     322        if (rc != 0) {
     323                /* errno was set by close() */
     324                return EOF;
     325        }
     326       
     327        return 0;
    359328}
    360329
     
    365334 * @param nmemb  Number of records to read.
    366335 * @param stream Pointer to the stream.
    367  *
    368  * @return Number of elements successfully read. On error this is less than
    369  *         nmemb, stream error indicator is set and errno is set.
    370336 */
    371337static size_t _fread(void *buf, size_t size, size_t nmemb, FILE *stream)
     
    382348                ssize_t rd = read(stream->fd, buf + done, left);
    383349               
    384                 if (rd < 0) {
    385                         /* errno was set by read() */
     350                if (rd < 0)
    386351                        stream->error = true;
    387                 } else if (rd == 0) {
     352                else if (rd == 0)
    388353                        stream->eof = true;
    389                 } else {
     354                else {
    390355                        left -= rd;
    391356                        done += rd;
     
    402367 * @param nmemb  Number of records to write.
    403368 * @param stream Pointer to the stream.
    404  *
    405  * @return Number of elements successfully written. On error this is less than
    406  *         nmemb, stream error indicator is set and errno is set.
    407369 */
    408370static size_t _fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream)
     
    410372        size_t left;
    411373        size_t done;
    412         int rc;
    413374
    414375        if (size == 0 || nmemb == 0)
     
    420381        while ((left > 0) && (!stream->error)) {
    421382                ssize_t wr;
    422                 size_t uwr;
    423                
    424                 if (stream->kio) {
    425                         uwr = 0;
    426                         rc = kio_write(buf + done, left, &uwr);
    427                         if (rc != EOK)
    428                                 errno = rc;
    429                 } else {
     383               
     384                if (stream->kio)
     385                        wr = kio_write(buf + done, left);
     386                else
    430387                        wr = write(stream->fd, buf + done, left);
    431                         if (wr >= 0) {
    432                                 uwr = (size_t)wr;
    433                                 rc = EOK;
    434                         } else {
    435                                 /* errno was set by write */
    436                                 uwr = 0;
    437                                 rc = errno;
    438                         }
    439                 }
    440                
    441                 if (rc != EOK) {
    442                         /* errno was set above */
     388               
     389                if (wr <= 0)
    443390                        stream->error = true;
    444                 } else {
    445                         left -= uwr;
    446                         done += uwr;
     391                else {
     392                        left -= wr;
     393                        done += wr;
    447394                }
    448395        }
     
    454401}
    455402
    456 /** Read some data in stream buffer.
    457  *
    458  * On error, stream error indicator is set and errno is set.
    459  */
     403/** Read some data in stream buffer. */
    460404static void _ffillbuf(FILE *stream)
    461405{
     
    466410        rc = read(stream->fd, stream->buf, stream->buf_size);
    467411        if (rc < 0) {
    468                 /* errno was set by read() */
    469412                stream->error = true;
    470413                return;
     
    491434
    492435        /* If buffer has prefetched read data, we need to seek back. */
    493         if (bytes_used > 0 && stream->buf_state == _bs_read) {
    494                 off64_t rc;
    495                 rc = lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR);
    496                 if (rc == (off64_t)-1) {
    497                         /* errno was set by lseek */
    498                         stream->error = 1;
    499                         return;
    500                 }
    501         }
     436        if (bytes_used > 0 && stream->buf_state == _bs_read)
     437                lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR);
    502438
    503439        /* If buffer has unwritten data, we need to write them out. */
    504         if (bytes_used > 0 && stream->buf_state == _bs_write) {
     440        if (bytes_used > 0 && stream->buf_state == _bs_write)
    505441                (void) _fwrite(stream->buf_tail, 1, bytes_used, stream);
    506                 /* On error stream error indicator and errno are set by _fwrite */
    507                 if (stream->error)
    508                         return;
    509         }
    510442
    511443        stream->buf_head = stream->buf;
     
    534466                return 0;
    535467
    536         bytes_left = size * nmemb;
    537         total_read = 0;
    538         dp = (uint8_t *) dest;
    539 
    540         /* Bytes from ungetc() buffer */
    541         while (stream->ungetc_chars > 0 && bytes_left > 0) {
    542                 *dp++ = stream->ungetc_buf[--stream->ungetc_chars];
    543                 ++total_read;
    544                 --bytes_left;
    545         }
    546 
    547468        /* If not buffered stream, read in directly. */
    548469        if (stream->btype == _IONBF) {
    549                 total_read += _fread(dest, 1, bytes_left, stream);
    550                 return total_read / size;
     470                now = _fread(dest, size, nmemb, stream);
     471                return now;
    551472        }
    552473
     
    561482        }
    562483
     484        bytes_left = size * nmemb;
     485        total_read = 0;
     486        dp = (uint8_t *) dest;
     487
    563488        while ((!stream->error) && (!stream->eof) && (bytes_left > 0)) {
    564489                if (stream->buf_head == stream->buf_tail)
    565490                        _ffillbuf(stream);
    566491
    567                 if (stream->error || stream->eof) {
    568                         /* On error errno was set by _ffillbuf() */
     492                if (stream->error || stream->eof)
    569493                        break;
    570                 }
    571494
    572495                data_avail = stream->buf_head - stream->buf_tail;
     
    624547                _fflushbuf(stream);
    625548
     549
    626550        /* Perform lazy allocation of stream buffer. */
    627551        if (stream->buf == NULL) {
     
    660584                        /* Only need to drain buffer. */
    661585                        _fflushbuf(stream);
    662                         if (!stream->error)
    663                                 need_flush = false;
     586                        need_flush = false;
    664587                }
    665588        }
     
    695618int fputs(const char *str, FILE *stream)
    696619{
    697         (void) fwrite(str, str_size(str), 1, stream);
    698         if (ferror(stream))
    699                 return EOF;
    700         return 0;
     620        return fwrite(str, str_size(str), 1, stream);
    701621}
    702622
     
    754674}
    755675
    756 int ungetc(int c, FILE *stream)
    757 {
    758         if (c == EOF)
    759                 return EOF;
    760 
    761         if (stream->ungetc_chars >= UNGETC_MAX)
    762                 return EOF;
    763 
    764         stream->ungetc_buf[stream->ungetc_chars++] =
    765             (uint8_t)c;
    766 
    767         stream->eof = false;
    768         return (uint8_t)c;
    769 }
    770 
    771676int fseek(FILE *stream, off64_t offset, int whence)
    772677{
    773678        off64_t rc;
    774679
    775         if (stream->error)
    776                 return EOF;
    777 
    778680        _fflushbuf(stream);
    779         if (stream->error) {
    780                 /* errno was set by _fflushbuf() */
    781                 return EOF;
    782         }
    783 
    784         stream->ungetc_chars = 0;
    785681
    786682        rc = lseek(stream->fd, offset, whence);
    787683        if (rc == (off64_t) (-1)) {
    788                 /* errno has been set by lseek() */
    789                 return EOF;
     684                /* errno has been set by lseek64. */
     685                return -1;
    790686        }
    791687
     
    796692off64_t ftell(FILE *stream)
    797693{
    798         off64_t pos;
    799        
    800         if (stream->error)
    801                 return EOF;
    802        
    803694        _fflushbuf(stream);
    804         if (stream->error) {
    805                 /* errno was set by _fflushbuf() */
    806                 return EOF;
    807         }
    808 
    809         pos = lseek(stream->fd, 0, SEEK_CUR);
    810         if (pos == (off64_t) -1) {
    811                 /* errno was set by lseek */
    812                 return (off64_t) -1;
    813         }
    814        
    815         return pos - stream->ungetc_chars;
     695        return lseek(stream->fd, 0, SEEK_CUR);
    816696}
    817697
     
    823703int fflush(FILE *stream)
    824704{
    825         if (stream->error)
    826                 return EOF;
    827        
    828705        _fflushbuf(stream);
    829         if (stream->error) {
    830                 /* errno was set by _fflushbuf() */
    831                 return EOF;
    832         }
    833706       
    834707        if (stream->kio) {
    835708                kio_update();
    836                 return 0;
     709                return EOK;
    837710        }
    838711       
     
    843716                 */
    844717                stream->need_sync = false;
    845                 if (fsync(stream->fd) != 0) {
    846                         /* errno was set by fsync() */
    847                         return EOF;
    848                 }
    849 
    850                 return 0;
    851         }
    852        
    853         return 0;
     718                return fsync(stream->fd);
     719        }
     720       
     721        return ENOENT;
    854722}
    855723
     
    874742        if (stream->kio) {
    875743                errno = EBADF;
    876                 return EOF;
     744                return -1;
    877745        }
    878746       
     
    880748}
    881749
    882 async_sess_t *vfs_fsession(FILE *stream, iface_t iface)
     750async_sess_t *fsession(exch_mgmt_t mgmt, FILE *stream)
    883751{
    884752        if (stream->fd >= 0) {
    885753                if (stream->sess == NULL)
    886                         stream->sess = vfs_fd_session(stream->fd, iface);
     754                        stream->sess = fd_session(mgmt, stream->fd);
    887755               
    888756                return stream->sess;
     
    892760}
    893761
    894 int vfs_fhandle(FILE *stream, int *handle)
     762int fhandle(FILE *stream, int *handle)
    895763{
    896764        if (stream->fd >= 0) {
Note: See TracChangeset for help on using the changeset viewer.