Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2669 → Rev 2670

/trunk/uspace/lib/libc/generic/io/io.c
47,8 → 47,8
return putnchars("(NULL)", 6);
for (count = 0; str[count] != 0; count++);
if (write(1, (void *) str, count) == count) {
if (write(1, &nl, 1) == 1)
if (write_stdout((void *) str, count) == count) {
if (write_stdout(&nl, 1) == 1)
return 0;
}
62,8 → 62,8
*/
int putnchars(const char *buf, size_t count)
{
if (write(1, (void *) buf, count) == count)
return 0;
if (write_stdout((void *) buf, count) == count)
return 0;
return EOF;
}
79,8 → 79,8
return putnchars("(NULL)", 6);
 
for (count = 0; str[count] != 0; count++);
if (write(1, (void *) str, count) == count)
return 0;
if (write_stdout((void *) str, count) == count)
return 0;
return EOF;
}
88,8 → 88,8
int putchar(int c)
{
unsigned char ch = c;
if (write(1, (void *) &ch, 1) == 1)
return c;
if (write_stdout((void *) &ch, 1) == 1)
return c;
return EOF;
}
97,8 → 97,8
int getchar(void)
{
unsigned char c;
if (read(0, (void *) &c, 1) == 1)
return c;
if (read_stdin((void *) &c, 1) == 1)
return c;
return EOF;
}
/trunk/uspace/lib/libc/generic/io/vprintf.c
43,7 → 43,7
 
static int vprintf_write(const char *str, size_t count, void *unused)
{
return write(1, str, count);
return write_stdout(str, count);
}
 
/** Print formatted text.
/trunk/uspace/lib/libc/generic/io/stream.c
47,30 → 47,20
#include <async.h>
#include <sys/types.h>
 
#define FDS 32
 
typedef struct stream_t {
pwritefn_t w;
preadfn_t r;
void * param;
int phone;
} stream_t;
 
static int console_phone = -1;
static stream_t streams[FDS];
 
static ssize_t write_stderr(void *param, const void *buf, size_t count)
ssize_t write_stderr(const void *buf, size_t count)
{
return count;
}
 
static ssize_t read_stdin(void *param, void *buf, size_t count)
ssize_t read_stdin(void *buf, size_t count)
{
ipcarg_t r0, r1;
size_t i = 0;
 
while (i < count) {
if (async_req_0_2(streams[0].phone, CONSOLE_GETCHAR, &r0,
if (async_req_0_2(console_phone, CONSOLE_GETCHAR, &r0,
&r1) < 0) {
return -1;
}
79,21 → 69,19
return i;
}
 
static ssize_t write_stdout(void *param, const void *buf, size_t count)
ssize_t write_stdout(const void *buf, size_t count)
{
int i;
 
for (i = 0; i < count; i++)
async_msg_1(streams[1].phone, CONSOLE_PUTCHAR,
async_msg_1(console_phone, CONSOLE_PUTCHAR,
((const char *) buf)[i]);
return count;
}
 
static stream_t open_stdin(void)
void open_stdin(void)
{
stream_t stream;
if (console_phone < 0) {
while ((console_phone = ipc_connect_me_to(PHONE_NS,
SERVICE_CONSOLE, 0, 0)) < 0) {
100,19 → 88,10
usleep(10000);
}
}
stream.r = read_stdin;
stream.w = NULL;
stream.param = 0;
stream.phone = console_phone;
return stream;
}
 
static stream_t open_stdout(void)
void open_stdout(void)
{
stream_t stream;
 
if (console_phone < 0) {
while ((console_phone = ipc_connect_me_to(PHONE_NS,
SERVICE_CONSOLE, 0, 0)) < 0) {
119,76 → 98,12
usleep(10000);
}
}
stream.r = NULL;
stream.w = write_stdout;
stream.phone = console_phone;
stream.param = 0;
return stream;
}
 
static ssize_t write_null(void *param, const void *buf, size_t count)
int get_cons_phone(void)
{
return count;
return console_phone;
}
 
fd_t open(const char *fname, int flags)
{
int c = 0;
 
while (((streams[c].w) || (streams[c].r)) && (c < FDS))
c++;
if (c == FDS)
return EMFILE;
if (!strcmp(fname, "stdin")) {
streams[c] = open_stdin();
return c;
}
if (!strcmp(fname, "stdout")) {
streams[c] = open_stdout();
return c;
}
if (!strcmp(fname, "stderr")) {
streams[c].w = write_stderr;
return c;
}
if (!strcmp(fname, "null")) {
streams[c].w = write_null;
return c;
}
return -1;
}
 
 
ssize_t write(int fd, const void *buf, size_t count)
{
if (fd < FDS && streams[fd].w)
return streams[fd].w(streams[fd].param, buf, count);
return 0;
}
 
ssize_t read(int fd, void *buf, size_t count)
{
if (fd < FDS && streams[fd].r)
return streams[fd].r(streams[fd].param, buf, count);
return 0;
}
 
int get_fd_phone(int fd)
{
if (fd >= FDS || fd < 0)
return -1;
return streams[fd].phone;
}
 
/** @}
*/