]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/serf/buckets/barrier_buckets.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / serf / buckets / barrier_buckets.c
1 /* Copyright 2002-2004 Justin Erenkrantz and Greg Stein
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <apr_pools.h>
17
18 #include "serf.h"
19 #include "serf_bucket_util.h"
20
21
22 typedef struct {
23     serf_bucket_t *stream;
24 } barrier_context_t;
25
26
27 serf_bucket_t *serf_bucket_barrier_create(
28     serf_bucket_t *stream,
29     serf_bucket_alloc_t *allocator)
30 {
31     barrier_context_t *ctx;
32
33     ctx = serf_bucket_mem_alloc(allocator, sizeof(*ctx));
34     ctx->stream = stream;
35
36     return serf_bucket_create(&serf_bucket_type_barrier, allocator, ctx);
37 }
38
39 static apr_status_t serf_barrier_read(serf_bucket_t *bucket,
40                                      apr_size_t requested,
41                                      const char **data, apr_size_t *len)
42 {
43     barrier_context_t *ctx = bucket->data;
44
45     return serf_bucket_read(ctx->stream, requested, data, len);
46 }
47
48 static apr_status_t serf_barrier_read_iovec(serf_bucket_t *bucket,
49                                             apr_size_t requested,
50                                             int vecs_size, struct iovec *vecs,
51                                             int *vecs_used)
52 {
53     barrier_context_t *ctx = bucket->data;
54
55     return serf_bucket_read_iovec(ctx->stream, requested, vecs_size, vecs,
56                                   vecs_used);
57 }
58
59 static apr_status_t serf_barrier_readline(serf_bucket_t *bucket,
60                                          int acceptable, int *found,
61                                          const char **data, apr_size_t *len)
62 {
63     barrier_context_t *ctx = bucket->data;
64
65     return serf_bucket_readline(ctx->stream, acceptable, found, data, len);
66 }
67
68 static apr_status_t serf_barrier_peek(serf_bucket_t *bucket,
69                                      const char **data,
70                                      apr_size_t *len)
71 {
72     barrier_context_t *ctx = bucket->data;
73
74     return serf_bucket_peek(ctx->stream, data, len);
75 }
76
77 static void serf_barrier_destroy(serf_bucket_t *bucket)
78 {
79     /* The intent of this bucket is not to let our wrapped buckets be
80      * destroyed. */
81
82     /* The option is for us to go ahead and 'eat' this bucket now,
83      * or just ignore the deletion entirely.
84      */
85     serf_default_destroy_and_data(bucket);
86 }
87
88 const serf_bucket_type_t serf_bucket_type_barrier = {
89     "BARRIER",
90     serf_barrier_read,
91     serf_barrier_readline,
92     serf_barrier_read_iovec,
93     serf_default_read_for_sendfile,
94     serf_default_read_bucket,
95     serf_barrier_peek,
96     serf_barrier_destroy,
97 };