Ignore:
File:
1 edited

Legend:

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

    r2f72c67a rb72efe8  
    4545#include <vfs/vfs.h>
    4646#include <vfs/vfs_sess.h>
    47 #include <ipc/loc.h>
     47#include <ipc/devmap.h>
    4848#include <adt/list.h>
    4949#include "../private/io.h"
     
    101101static LIST_INITIALIZE(files);
    102102
    103 void __stdio_init(int filc)
     103void __stdio_init(int filc, fdi_node_t *filv[])
    104104{
    105105        if (filc > 0) {
    106                 stdin = fdopen(0, "r");
     106                stdin = fopen_node(filv[0], "r");
    107107        } else {
    108108                stdin = &stdin_null;
     
    111111       
    112112        if (filc > 1) {
    113                 stdout = fdopen(1, "w");
     113                stdout = fopen_node(filv[1], "w");
    114114        } else {
    115115                stdout = &stdout_klog;
     
    118118       
    119119        if (filc > 2) {
    120                 stderr = fdopen(2, "w");
     120                stderr = fopen_node(filv[2], "w");
    121121        } else {
    122122                stderr = &stderr_klog;
     
    285285}
    286286
     287FILE *fopen_node(fdi_node_t *node, const char *mode)
     288{
     289        int flags;
     290        if (!parse_mode(mode, &flags))
     291                return NULL;
     292       
     293        /* Open file. */
     294        FILE *stream = malloc(sizeof(FILE));
     295        if (stream == NULL) {
     296                errno = ENOMEM;
     297                return NULL;
     298        }
     299       
     300        stream->fd = open_node(node, flags);
     301        if (stream->fd < 0) {
     302                /* errno was set by open_node() */
     303                free(stream);
     304                return NULL;
     305        }
     306       
     307        stream->error = false;
     308        stream->eof = false;
     309        stream->klog = false;
     310        stream->sess = NULL;
     311        stream->need_sync = false;
     312        _setvbuf(stream);
     313       
     314        list_append(&stream->link, &files);
     315       
     316        return stream;
     317}
     318
    287319int fclose(FILE *stream)
    288320{
     
    418450
    419451        bytes_used = stream->buf_head - stream->buf_tail;
     452        if (bytes_used == 0)
     453                return;
    420454
    421455        /* If buffer has prefetched read data, we need to seek back. */
    422         if (bytes_used > 0 && stream->buf_state == _bs_read)
     456        if (stream->buf_state == _bs_read)
    423457                lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR);
    424458
    425459        /* If buffer has unwritten data, we need to write them out. */
    426         if (bytes_used > 0 && stream->buf_state == _bs_write)
     460        if (stream->buf_state == _bs_write)
    427461                (void) _fwrite(stream->buf_tail, 1, bytes_used, stream);
    428462
     
    560594                }
    561595               
    562                 data += now;
     596                buf += now;
    563597                stream->buf_head += now;
    564598                buf_free -= now;
    565599                bytes_left -= now;
    566600                total_written += now;
    567                 stream->buf_state = _bs_write;
    568601               
    569602                if (buf_free == 0) {
     
    573606                }
    574607        }
     608       
     609        if (total_written > 0)
     610                stream->buf_state = _bs_write;
    575611
    576612        if (need_flush)
     
    678714off64_t ftell(FILE *stream)
    679715{
    680         _fflushbuf(stream);
    681716        return lseek(stream->fd, 0, SEEK_CUR);
    682717}
     
    746781}
    747782
    748 int fhandle(FILE *stream, int *handle)
    749 {
    750         if (stream->fd >= 0) {
    751                 *handle = stream->fd;
    752                 return EOK;
    753         }
     783int fnode(FILE *stream, fdi_node_t *node)
     784{
     785        if (stream->fd >= 0)
     786                return fd_node(stream->fd, node);
    754787       
    755788        return ENOENT;
Note: See TracChangeset for help on using the changeset viewer.