2 * Server-side pipe management
4 * Copyright (C) 1998 Alexandre Julliard
14 #ifdef HAVE_SYS_ERRNO_H
15 #include <sys/errno.h>
18 #include <sys/types.h>
28 enum side { READ_SIDE, WRITE_SIDE };
32 struct object obj; /* object header */
33 struct pipe *other; /* the pipe other end */
34 enum side side; /* which side of the pipe is this */
37 static void pipe_dump( struct object *obj, int verbose );
38 static int pipe_get_poll_events( struct object *obj );
39 static int pipe_get_fd( struct object *obj );
40 static int pipe_get_info( struct object *obj, struct get_file_info_request *req );
41 static void pipe_destroy( struct object *obj );
43 static const struct object_ops pipe_ops =
45 sizeof(struct pipe), /* size */
47 default_poll_add_queue, /* add_queue */
48 default_poll_remove_queue, /* remove_queue */
49 default_poll_signaled, /* signaled */
50 no_satisfied, /* satisfied */
51 pipe_get_poll_events, /* get_poll_events */
52 default_poll_event, /* poll_event */
53 pipe_get_fd, /* get_fd */
55 pipe_get_info, /* get_file_info */
56 pipe_destroy /* destroy */
60 static struct pipe *create_pipe_side( int fd, int side )
64 if ((pipe = alloc_object( &pipe_ops, fd )))
72 static int create_pipe( struct object *obj[2] )
74 struct pipe *read_pipe;
75 struct pipe *write_pipe;
83 if ((read_pipe = create_pipe_side( fd[0], READ_SIDE )))
85 if ((write_pipe = create_pipe_side( fd[1], WRITE_SIDE )))
87 write_pipe->other = read_pipe;
88 read_pipe->other = write_pipe;
89 obj[0] = &read_pipe->obj;
90 obj[1] = &write_pipe->obj;
93 release_object( read_pipe );
99 static void pipe_dump( struct object *obj, int verbose )
101 struct pipe *pipe = (struct pipe *)obj;
102 assert( obj->ops == &pipe_ops );
103 fprintf( stderr, "Pipe %s-side fd=%d\n",
104 (pipe->side == READ_SIDE) ? "read" : "write", pipe->obj.fd );
107 static int pipe_get_poll_events( struct object *obj )
109 struct pipe *pipe = (struct pipe *)obj;
110 assert( obj->ops == &pipe_ops );
111 return (pipe->side == READ_SIDE) ? POLLIN : POLLOUT;
114 static int pipe_get_fd( struct object *obj )
116 struct pipe *pipe = (struct pipe *)obj;
117 assert( obj->ops == &pipe_ops );
121 set_error( STATUS_PIPE_BROKEN );
127 static int pipe_get_info( struct object *obj, struct get_file_info_request *req )
129 req->type = FILE_TYPE_PIPE;
131 req->access_time = 0;
142 static void pipe_destroy( struct object *obj )
144 struct pipe *pipe = (struct pipe *)obj;
145 assert( obj->ops == &pipe_ops );
147 if (pipe->other) pipe->other->other = NULL;
150 /* create an anonymous pipe */
151 DECL_HANDLER(create_pipe)
153 struct object *obj[2];
154 handle_t hread = 0, hwrite = 0;
156 if (create_pipe( obj ))
158 hread = alloc_handle( current->process, obj[0],
159 STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|GENERIC_READ,
163 hwrite = alloc_handle( current->process, obj[1],
164 STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|GENERIC_WRITE,
166 if (!hwrite) close_handle( current->process, hread, NULL );
168 release_object( obj[0] );
169 release_object( obj[1] );
171 req->handle_read = hread;
172 req->handle_write = hwrite;