Ignore:
File:
1 edited

Legend:

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

    r2f72c67a r82582e4  
    4444#include <io/klog.h>
    4545#include <vfs/vfs.h>
    46 #include <vfs/vfs_sess.h>
    47 #include <ipc/loc.h>
     46#include <ipc/devmap.h>
    4847#include <adt/list.h>
    4948#include "../private/io.h"
    50 #include "../private/stdio.h"
    5149
    5250static void _ffillbuf(FILE *stream);
     
    5856        .eof = true,
    5957        .klog = false,
    60         .sess = NULL,
     58        .phone = -1,
    6159        .btype = _IONBF,
    6260        .buf = NULL,
     
    7270        .eof = false,
    7371        .klog = true,
    74         .sess = NULL,
     72        .phone = -1,
    7573        .btype = _IOLBF,
    7674        .buf = NULL,
     
    8684        .eof = false,
    8785        .klog = true,
    88         .sess = NULL,
     86        .phone = -1,
    8987        .btype = _IONBF,
    9088        .buf = NULL,
     
    10199static LIST_INITIALIZE(files);
    102100
    103 void __stdio_init(int filc)
     101void __stdio_init(int filc, fdi_node_t *filv[])
    104102{
    105103        if (filc > 0) {
    106                 stdin = fdopen(0, "r");
     104                stdin = fopen_node(filv[0], "r");
    107105        } else {
    108106                stdin = &stdin_null;
     
    111109       
    112110        if (filc > 1) {
    113                 stdout = fdopen(1, "w");
     111                stdout = fopen_node(filv[1], "w");
    114112        } else {
    115113                stdout = &stdout_klog;
     
    118116       
    119117        if (filc > 2) {
    120                 stderr = fdopen(2, "w");
     118                stderr = fopen_node(filv[2], "w");
    121119        } else {
    122120                stderr = &stderr_klog;
     
    127125void __stdio_done(void)
    128126{
    129         while (!list_empty(&files)) {
    130                 FILE *file = list_get_instance(list_first(&files), FILE, link);
     127        link_t *link = files.next;
     128       
     129        while (link != &files) {
     130                FILE *file = list_get_instance(link, FILE, link);
    131131                fclose(file);
     132                link = files.next;
    132133        }
    133134}
     
    254255        stream->eof = false;
    255256        stream->klog = false;
    256         stream->sess = NULL;
     257        stream->phone = -1;
    257258        stream->need_sync = false;
    258259        _setvbuf(stream);
     
    276277        stream->eof = false;
    277278        stream->klog = false;
    278         stream->sess = NULL;
     279        stream->phone = -1;
    279280        stream->need_sync = false;
    280281        _setvbuf(stream);
     
    285286}
    286287
     288FILE *fopen_node(fdi_node_t *node, const char *mode)
     289{
     290        int flags;
     291        if (!parse_mode(mode, &flags))
     292                return NULL;
     293       
     294        /* Open file. */
     295        FILE *stream = malloc(sizeof(FILE));
     296        if (stream == NULL) {
     297                errno = ENOMEM;
     298                return NULL;
     299        }
     300       
     301        stream->fd = open_node(node, flags);
     302        if (stream->fd < 0) {
     303                /* errno was set by open_node() */
     304                free(stream);
     305                return NULL;
     306        }
     307       
     308        stream->error = false;
     309        stream->eof = false;
     310        stream->klog = false;
     311        stream->phone = -1;
     312        stream->need_sync = false;
     313        _setvbuf(stream);
     314       
     315        list_append(&stream->link, &files);
     316       
     317        return stream;
     318}
     319
    287320int fclose(FILE *stream)
    288321{
     
    291324        fflush(stream);
    292325       
    293         if (stream->sess != NULL)
    294                 async_hangup(stream->sess);
     326        if (stream->phone >= 0)
     327                async_hangup(stream->phone);
    295328       
    296329        if (stream->fd >= 0)
     
    418451
    419452        bytes_used = stream->buf_head - stream->buf_tail;
     453        if (bytes_used == 0)
     454                return;
    420455
    421456        /* If buffer has prefetched read data, we need to seek back. */
    422         if (bytes_used > 0 && stream->buf_state == _bs_read)
     457        if (stream->buf_state == _bs_read)
    423458                lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR);
    424459
    425460        /* If buffer has unwritten data, we need to write them out. */
    426         if (bytes_used > 0 && stream->buf_state == _bs_write)
     461        if (stream->buf_state == _bs_write)
    427462                (void) _fwrite(stream->buf_tail, 1, bytes_used, stream);
    428463
     
    560595                }
    561596               
    562                 data += now;
     597                buf += now;
    563598                stream->buf_head += now;
    564599                buf_free -= now;
    565600                bytes_left -= now;
    566601                total_written += now;
    567                 stream->buf_state = _bs_write;
    568602               
    569603                if (buf_free == 0) {
     
    573607                }
    574608        }
     609       
     610        if (total_written > 0)
     611                stream->buf_state = _bs_write;
    575612
    576613        if (need_flush)
     
    678715off64_t ftell(FILE *stream)
    679716{
    680         _fflushbuf(stream);
    681717        return lseek(stream->fd, 0, SEEK_CUR);
    682718}
     
    696732        }
    697733       
    698         if ((stream->fd >= 0) && (stream->need_sync)) {
     734        if (stream->fd >= 0 && stream->need_sync) {
    699735                /**
    700736                 * Better than syncing always, but probably still not the
     
    734770}
    735771
    736 async_sess_t *fsession(exch_mgmt_t mgmt, FILE *stream)
     772int fphone(FILE *stream)
    737773{
    738774        if (stream->fd >= 0) {
    739                 if (stream->sess == NULL)
    740                         stream->sess = fd_session(mgmt, stream->fd);
    741                
    742                 return stream->sess;
    743         }
    744        
    745         return NULL;
    746 }
    747 
    748 int fhandle(FILE *stream, int *handle)
    749 {
    750         if (stream->fd >= 0) {
    751                 *handle = stream->fd;
    752                 return EOK;
    753         }
     775                if (stream->phone < 0)
     776                        stream->phone = fd_phone(stream->fd);
     777               
     778                return stream->phone;
     779        }
     780       
     781        return -1;
     782}
     783
     784int fnode(FILE *stream, fdi_node_t *node)
     785{
     786        if (stream->fd >= 0)
     787                return fd_node(stream->fd, node);
    754788       
    755789        return ENOENT;
Note: See TracChangeset for help on using the changeset viewer.