Ignore:
File:
1 edited

Legend:

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

    r82582e4 r2f72c67a  
    4444#include <io/klog.h>
    4545#include <vfs/vfs.h>
    46 #include <ipc/devmap.h>
     46#include <vfs/vfs_sess.h>
     47#include <ipc/loc.h>
    4748#include <adt/list.h>
    4849#include "../private/io.h"
     50#include "../private/stdio.h"
    4951
    5052static void _ffillbuf(FILE *stream);
     
    5658        .eof = true,
    5759        .klog = false,
    58         .phone = -1,
     60        .sess = NULL,
    5961        .btype = _IONBF,
    6062        .buf = NULL,
     
    7072        .eof = false,
    7173        .klog = true,
    72         .phone = -1,
     74        .sess = NULL,
    7375        .btype = _IOLBF,
    7476        .buf = NULL,
     
    8486        .eof = false,
    8587        .klog = true,
    86         .phone = -1,
     88        .sess = NULL,
    8789        .btype = _IONBF,
    8890        .buf = NULL,
     
    99101static LIST_INITIALIZE(files);
    100102
    101 void __stdio_init(int filc, fdi_node_t *filv[])
     103void __stdio_init(int filc)
    102104{
    103105        if (filc > 0) {
    104                 stdin = fopen_node(filv[0], "r");
     106                stdin = fdopen(0, "r");
    105107        } else {
    106108                stdin = &stdin_null;
     
    109111       
    110112        if (filc > 1) {
    111                 stdout = fopen_node(filv[1], "w");
     113                stdout = fdopen(1, "w");
    112114        } else {
    113115                stdout = &stdout_klog;
     
    116118       
    117119        if (filc > 2) {
    118                 stderr = fopen_node(filv[2], "w");
     120                stderr = fdopen(2, "w");
    119121        } else {
    120122                stderr = &stderr_klog;
     
    125127void __stdio_done(void)
    126128{
    127         link_t *link = files.next;
    128        
    129         while (link != &files) {
    130                 FILE *file = list_get_instance(link, FILE, link);
     129        while (!list_empty(&files)) {
     130                FILE *file = list_get_instance(list_first(&files), FILE, link);
    131131                fclose(file);
    132                 link = files.next;
    133132        }
    134133}
     
    255254        stream->eof = false;
    256255        stream->klog = false;
    257         stream->phone = -1;
     256        stream->sess = NULL;
    258257        stream->need_sync = false;
    259258        _setvbuf(stream);
     
    277276        stream->eof = false;
    278277        stream->klog = false;
    279         stream->phone = -1;
     278        stream->sess = NULL;
    280279        stream->need_sync = false;
    281280        _setvbuf(stream);
     
    286285}
    287286
    288 FILE *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 
    320287int fclose(FILE *stream)
    321288{
     
    324291        fflush(stream);
    325292       
    326         if (stream->phone >= 0)
    327                 async_hangup(stream->phone);
     293        if (stream->sess != NULL)
     294                async_hangup(stream->sess);
    328295       
    329296        if (stream->fd >= 0)
     
    451418
    452419        bytes_used = stream->buf_head - stream->buf_tail;
    453         if (bytes_used == 0)
    454                 return;
    455420
    456421        /* If buffer has prefetched read data, we need to seek back. */
    457         if (stream->buf_state == _bs_read)
     422        if (bytes_used > 0 && stream->buf_state == _bs_read)
    458423                lseek(stream->fd, - (ssize_t) bytes_used, SEEK_CUR);
    459424
    460425        /* If buffer has unwritten data, we need to write them out. */
    461         if (stream->buf_state == _bs_write)
     426        if (bytes_used > 0 && stream->buf_state == _bs_write)
    462427                (void) _fwrite(stream->buf_tail, 1, bytes_used, stream);
    463428
     
    595560                }
    596561               
    597                 buf += now;
     562                data += now;
    598563                stream->buf_head += now;
    599564                buf_free -= now;
    600565                bytes_left -= now;
    601566                total_written += now;
     567                stream->buf_state = _bs_write;
    602568               
    603569                if (buf_free == 0) {
     
    607573                }
    608574        }
    609        
    610         if (total_written > 0)
    611                 stream->buf_state = _bs_write;
    612575
    613576        if (need_flush)
     
    715678off64_t ftell(FILE *stream)
    716679{
     680        _fflushbuf(stream);
    717681        return lseek(stream->fd, 0, SEEK_CUR);
    718682}
     
    732696        }
    733697       
    734         if (stream->fd >= 0 && stream->need_sync) {
     698        if ((stream->fd >= 0) && (stream->need_sync)) {
    735699                /**
    736700                 * Better than syncing always, but probably still not the
     
    770734}
    771735
    772 int fphone(FILE *stream)
     736async_sess_t *fsession(exch_mgmt_t mgmt, FILE *stream)
    773737{
    774738        if (stream->fd >= 0) {
    775                 if (stream->phone < 0)
    776                         stream->phone = fd_phone(stream->fd);
    777                
    778                 return stream->phone;
    779         }
    780        
    781         return -1;
    782 }
    783 
    784 int fnode(FILE *stream, fdi_node_t *node)
    785 {
    786         if (stream->fd >= 0)
    787                 return fd_node(stream->fd, node);
     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
     748int fhandle(FILE *stream, int *handle)
     749{
     750        if (stream->fd >= 0) {
     751                *handle = stream->fd;
     752                return EOK;
     753        }
    788754       
    789755        return ENOENT;
Note: See TracChangeset for help on using the changeset viewer.