Subversion Repositories HelenOS-historic

Rev

Rev 1451 | Rev 1465 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1363 vana 1
#include <io/io.h>
2
#include <io/stream.h>
3
#include <string.h>
4
#include <malloc.h>
5
#include <libc.h>
6
#include <ipc/ipc.h>
7
#include <ipc/ns.h>
8
#include <ipc/fb.h>
9
#include <ipc/services.h>
1451 cejka 10
#include <console.h>
1363 vana 11
 
12
#define FDS 32
13
 
1366 decky 14
typedef struct stream_t {
1363 vana 15
    pwritefn_t w;
16
    preadfn_t r;
17
    void * param;
1366 decky 18
} stream_t;
1363 vana 19
 
1451 cejka 20
int console_phone = -1;
1363 vana 21
 
1366 decky 22
stream_t streams[FDS] = {{0, 0, 0}};
1363 vana 23
 
24
/*
25
ssize_t write_stdout(void *param, const void * buf, size_t count);
26
ssize_t write_stdout(void *param, const void * buf, size_t count)
27
{
28
    return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
29
}*/
30
 
1451 cejka 31
static ssize_t write_stderr(void *param, const void *buf, size_t count)
1363 vana 32
{
1451 cejka 33
    return count;
34
    //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
35
}
36
 
37
static char read_stdin(void)
38
{
1363 vana 39
    ipcarg_t r0,r1;
1451 cejka 40
    ipc_call_sync_2(console_phone, CONSOLE_GETCHAR, 0, 0, &r0, &r1);
41
 
42
    return r0;
43
    //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
1363 vana 44
}
1451 cejka 45
static ssize_t write_stdout(void *param, const void *buf, size_t count)
1363 vana 46
{
47
    int i;
1451 cejka 48
    ipcarg_t r0,r1;
49
 
1366 decky 50
    for (i = 0; i < count; i++)
1451 cejka 51
        ipc_call_sync_2(console_phone, CONSOLE_PUTCHAR, 0, ((const char *)buf)[i], &r0, &r1);
1363 vana 52
 
53
    return count;
54
    //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
55
}
56
 
57
 
58
 
1451 cejka 59
static stream_t open_stdin(void)
1363 vana 60
{
61
    stream_t stream;
62
    int phoneid;
63
    int res;
64
 
1451 cejka 65
    if (console_phone < 0) {
66
        while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) {
1452 palkovsky 67
            usleep(10000);
1451 cejka 68
        }
1363 vana 69
    }
70
 
1451 cejka 71
    stream.r = read_stdin;
72
    stream.param = 0;
73
    return stream;
74
}
75
 
76
static stream_t open_stdout(void)
77
{
78
    stream_t stream;
79
    int res;
1363 vana 80
 
1451 cejka 81
    if (console_phone < 0) {
82
        while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) {
83
            volatile int a;
84
            for (a = 0; a < 1048576; a++);
85
        }
86
    }
1363 vana 87
 
1451 cejka 88
    stream.w = write_stdout;
89
    stream.param = 0;
1363 vana 90
    return stream;
91
}
92
 
1366 decky 93
fd_t open(const char *fname, int flags)
1363 vana 94
{
1366 decky 95
    int c = 0;
96
 
97
    while (((streams[c].w) || (streams[c].r)) && (c < FDS))
98
        c++;
99
    if (c == FDS)
100
        return EMFILE;
101
 
102
    if (!strcmp(fname, "stdin")) {
1451 cejka 103
        streams[c] = open_stdin();
1363 vana 104
        return c;
105
    }
106
 
1366 decky 107
    if (!strcmp(fname, "stdout")) {
108
        //streams[c].w = write_stdout;
1363 vana 109
        //return c;
1451 cejka 110
        streams[c] = open_stdout();
1363 vana 111
        return c;
112
    }
113
 
1366 decky 114
    if (!strcmp(fname, "stderr")) {
115
        streams[c].w = write_stderr;
1363 vana 116
        return c;
117
    }
118
}
119
 
120
 
1366 decky 121
ssize_t write(int fd, const void *buf, size_t count)
1363 vana 122
{
1366 decky 123
    if (fd < FDS)
124
        return streams[fd].w(streams[fd].param, buf, count);
125
 
1363 vana 126
    return 0;
127
}