Initial import of libucore
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include "iomux.h"
|
||||
|
||||
extern struct IOMuxFD s_fd;
|
||||
|
||||
void stdin_read_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event)
|
||||
{
|
||||
char buf[4096];
|
||||
ssize_t len = read(fd->fd, buf, sizeof buf);
|
||||
if(len <= 0) {
|
||||
perror("read");
|
||||
fprintf(stderr,"Unregister stdin fd %d\n", fd->fd);
|
||||
iomux_unregister_fd(mux, fd);
|
||||
close(fd->fd);
|
||||
close(fd->cookie_int);
|
||||
}
|
||||
else
|
||||
write(fd->cookie_int, buf, len);
|
||||
}
|
||||
|
||||
void pipe_read_cb(struct IOMux *mux, struct IOMuxFD *fd, unsigned int event)
|
||||
{
|
||||
char buf[4095];
|
||||
ssize_t len = read(fd->fd, buf, sizeof buf);
|
||||
if(len <= 0) {
|
||||
perror("pipe read");
|
||||
printf("Unregister pipe fd %d [stdout]\n", fd->fd);
|
||||
fprintf(stderr,"Unregister pipe fd %d[stderr]\n", fd->fd);
|
||||
iomux_unregister_fd(mux, fd);
|
||||
close(fd->cookie_int);
|
||||
fclose(fd->cookie_ptr);
|
||||
|
||||
} else {
|
||||
fwrite(buf, 1 , len, fd->cookie_ptr);
|
||||
fflush(fd->cookie_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
void *writer(void *arg)
|
||||
{
|
||||
struct IOMux *mux = arg;
|
||||
iomux_run(mux);
|
||||
printf("writer mux returned\n");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct IOMux *mux1 = iomux_create(IOMUX_TYPE_DEFAULT);
|
||||
struct IOMux *mux2 = iomux_create(IOMUX_TYPE_DEFAULT);
|
||||
int pfd[2];
|
||||
int rc;
|
||||
struct IOMuxFD fd1 = {0};
|
||||
struct IOMuxFD fd2 = {0};
|
||||
pthread_t tid;
|
||||
pipe(pfd);
|
||||
|
||||
fd1.fd = 0;
|
||||
fd1.what = MUX_EV_READ;
|
||||
fd1.cookie_int = pfd[1];
|
||||
fd1.callback = stdin_read_cb;
|
||||
|
||||
fd2.fd = pfd[0];
|
||||
fd2.what = MUX_EV_READ;
|
||||
fd2.cookie_ptr = fopen("out", "wb");
|
||||
fd2.callback = pipe_read_cb;
|
||||
|
||||
|
||||
rc = iomux_register_fd(mux1, &fd1);
|
||||
if(rc != 0)
|
||||
printf("Cannot register fd1: %s\n", strerror(rc));
|
||||
rc = iomux_register_fd(mux2, &fd2);
|
||||
if(rc != 0)
|
||||
printf("Cannot register fdw: %s\n", strerror(rc));
|
||||
pthread_create(&tid,NULL,writer,mux2);
|
||||
iomux_run(mux1);
|
||||
printf("reader mux returned\n");
|
||||
pthread_join(tid, NULL);
|
||||
iomux_delete(mux1);
|
||||
iomux_delete(mux2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user