Subversion Repositories HelenOS

Rev

Rev 4345 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4345 Rev 4347
Line 41... Line 41...
41
#include <ipc/ipc.h>
41
#include <ipc/ipc.h>
42
#include <ipc/ns.h>
42
#include <ipc/ns.h>
43
#include <ipc/fb.h>
43
#include <ipc/fb.h>
44
#include <ipc/services.h>
44
#include <ipc/services.h>
45
#include <ipc/console.h>
45
#include <ipc/console.h>
-
 
46
#include <console.h>
46
#include <kbd/kbd.h>
47
#include <kbd/kbd.h>
47
#include <unistd.h>
48
#include <unistd.h>
48
#include <async.h>
49
#include <async.h>
49
#include <sys/types.h>
50
#include <sys/types.h>
50
 
51
 
51
static int console_phone = -1;
-
 
52
 
-
 
53
ssize_t write_stderr(const void *buf, size_t count)
52
ssize_t write_stderr(const void *buf, size_t count)
54
{
53
{
55
    return count;
54
    return count;
56
}
55
}
57
 
56
 
58
ssize_t read_stdin(void *buf, size_t count)
57
ssize_t read_stdin(void *buf, size_t count)
59
{
58
{
60
    open_console();
59
    int cons_phone = console_phone_get(false);
-
 
60
 
61
    if (console_phone >= 0) {
61
    if (cons_phone >= 0) {
62
        kbd_event_t ev;
62
        kbd_event_t ev;
63
        int rc;
63
        int rc;
64
        size_t i = 0;
64
        size_t i = 0;
65
   
65
   
66
        while (i < count) {
66
        while (i < count) {
Line 77... Line 77...
77
    }
77
    }
78
}
78
}
79
 
79
 
80
ssize_t write_stdout(const void *buf, size_t count)
80
ssize_t write_stdout(const void *buf, size_t count)
81
{
81
{
-
 
82
    int cons_phone = console_phone_get(false);
82
    open_console();
83
    int left, rc;
-
 
84
 
83
    if (console_phone >= 0) {
85
    if (cons_phone >= 0) {
84
        int i;
86
        int i;
85
   
87
 
86
        for (i = 0; i < count; i++)
88
        left = count;
-
 
89
        while (left > 0) {
87
            async_msg_1(console_phone, CONSOLE_PUTCHAR,
90
            rc = console_write(buf, left);
88
                ((const char *) buf)[i]);
91
            if (rc < 0)
-
 
92
                break;
-
 
93
            buf += rc;
-
 
94
            left -= rc;
89
       
95
        }
-
 
96
 
90
        return count;
97
        return count;
91
    } else
98
    } else
92
        return __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, count);
99
        return __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, count);
93
}
100
}
94
 
101
 
95
void open_console(void)
-
 
96
{
-
 
97
    if (console_phone < 0) {
-
 
98
        int phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0, 0);
-
 
99
        if (phone >= 0)
-
 
100
            console_phone = phone;
-
 
101
    }
-
 
102
}
-
 
103
 
-
 
104
void close_console(void)
102
int flush_stdout(void)
105
{
103
{
106
    if (console_phone >= 0) {
-
 
107
        if (ipc_hangup(console_phone) == 0) {
-
 
108
            console_phone = -1;
104
    console_flush();
109
        }
105
    return 0;
110
    }
-
 
111
}
106
}
112
 
107
 
113
void klog_update(void)
108
void klog_update(void)
114
{
109
{
115
    (void) __SYSCALL3(SYS_KLOG, 1, NULL, 0);
110
    (void) __SYSCALL3(SYS_KLOG, 1, NULL, 0);
116
}
111
}
117
 
112
 
118
int get_console_phone(void)
-
 
119
{
-
 
120
    if (console_phone < 0)
-
 
121
        console_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_CONSOLE, 0, 0);
-
 
122
   
-
 
123
    return console_phone;
-
 
124
}
-
 
125
 
-
 
126
void console_wait(void)
-
 
127
{
-
 
128
    while (console_phone < 0)
-
 
129
        get_console_phone();
-
 
130
}
-
 
131
 
-
 
132
/** @}
113
/** @}
133
 */
114
 */