nxt_perl_psgi_layer.c (528:5b2cb5212d75) nxt_perl_psgi_layer.c (2060:a1991578c62e)
1
2/*
3 * Copyright (C) Alexander Borisov
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <perl/nxt_perl_psgi_layer.h>
8
9
10typedef struct {
11 struct _PerlIO base;
12
13 SV *var;
14} nxt_perl_psgi_layer_stream_t;
15
16
17static IV nxt_perl_psgi_layer_stream_pushed(pTHX_ PerlIO *f, const char *mode,
18 SV *arg, PerlIO_funcs *tab);
19static IV nxt_perl_psgi_layer_stream_popped(pTHX_ PerlIO *f);
20
21static PerlIO *nxt_perl_psgi_layer_stream_open(pTHX_ PerlIO_funcs *self,
22 PerlIO_list_t *layers, IV n,
23 const char *mode, int fd, int imode, int perm,
24 PerlIO *f, int narg, SV **args);
25
26static IV nxt_perl_psgi_layer_stream_close(pTHX_ PerlIO *f);
27
28static SSize_t nxt_perl_psgi_layer_stream_read(pTHX_ PerlIO *f,
29 void *vbuf, Size_t count);
30static SSize_t nxt_perl_psgi_layer_stream_write(pTHX_ PerlIO *f,
31 const void *vbuf, Size_t count);
32
33static IV nxt_perl_psgi_layer_stream_fileno(pTHX_ PerlIO *f);
34static IV nxt_perl_psgi_layer_stream_seek(pTHX_ PerlIO *f,
35 Off_t offset, int whence);
36static Off_t nxt_perl_psgi_layer_stream_tell(pTHX_ PerlIO *f);
37static IV nxt_perl_psgi_layer_stream_fill(pTHX_ PerlIO *f);
38static IV nxt_perl_psgi_layer_stream_flush(pTHX_ PerlIO *f);
39
40static SV *nxt_perl_psgi_layer_stream_arg(pTHX_ PerlIO *f,
41 CLONE_PARAMS *param, int flags);
42
43static PerlIO *nxt_perl_psgi_layer_stream_dup(pTHX_ PerlIO *f, PerlIO *o,
44 CLONE_PARAMS *param, int flags);
45static IV nxt_perl_psgi_layer_stream_eof(pTHX_ PerlIO *f);
46
47static STDCHAR *nxt_perl_psgi_layer_stream_get_base(pTHX_ PerlIO *f);
48static STDCHAR *nxt_perl_psgi_layer_stream_get_ptr(pTHX_ PerlIO *f);
49static SSize_t nxt_perl_psgi_layer_stream_get_cnt(pTHX_ PerlIO *f);
50static Size_t nxt_perl_psgi_layer_stream_buffersize(pTHX_ PerlIO *f);
51static void nxt_perl_psgi_layer_stream_set_ptrcnt(pTHX_ PerlIO *f,
52 STDCHAR *ptr, SSize_t cnt);
53
54
55static PERLIO_FUNCS_DECL(PerlIO_NGINX_Unit) = {
56 sizeof(PerlIO_funcs),
57 "NGINX_Unit_PSGI_Layer_Stream",
58 sizeof(nxt_perl_psgi_layer_stream_t),
59 PERLIO_K_BUFFERED | PERLIO_K_RAW,
60 nxt_perl_psgi_layer_stream_pushed,
61 nxt_perl_psgi_layer_stream_popped,
62 nxt_perl_psgi_layer_stream_open,
63 PerlIOBase_binmode,
64 nxt_perl_psgi_layer_stream_arg,
65 nxt_perl_psgi_layer_stream_fileno,
66 nxt_perl_psgi_layer_stream_dup,
67 nxt_perl_psgi_layer_stream_read,
68 NULL,
69 nxt_perl_psgi_layer_stream_write,
70 nxt_perl_psgi_layer_stream_seek,
71 nxt_perl_psgi_layer_stream_tell,
72 nxt_perl_psgi_layer_stream_close,
73 nxt_perl_psgi_layer_stream_flush,
74 nxt_perl_psgi_layer_stream_fill,
75 nxt_perl_psgi_layer_stream_eof,
76 PerlIOBase_error,
77 PerlIOBase_clearerr,
78 PerlIOBase_setlinebuf,
79 nxt_perl_psgi_layer_stream_get_base,
80 nxt_perl_psgi_layer_stream_buffersize,
81 nxt_perl_psgi_layer_stream_get_ptr,
82 nxt_perl_psgi_layer_stream_get_cnt,
83 nxt_perl_psgi_layer_stream_set_ptrcnt,
84};
85
86
87static IV
88nxt_perl_psgi_layer_stream_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
89 PerlIO_funcs *tab)
90{
91 nxt_perl_psgi_layer_stream_t *unit_stream;
92
93 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
94
95 if (arg != NULL && SvOK(arg)) {
1
2/*
3 * Copyright (C) Alexander Borisov
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <perl/nxt_perl_psgi_layer.h>
8
9
10typedef struct {
11 struct _PerlIO base;
12
13 SV *var;
14} nxt_perl_psgi_layer_stream_t;
15
16
17static IV nxt_perl_psgi_layer_stream_pushed(pTHX_ PerlIO *f, const char *mode,
18 SV *arg, PerlIO_funcs *tab);
19static IV nxt_perl_psgi_layer_stream_popped(pTHX_ PerlIO *f);
20
21static PerlIO *nxt_perl_psgi_layer_stream_open(pTHX_ PerlIO_funcs *self,
22 PerlIO_list_t *layers, IV n,
23 const char *mode, int fd, int imode, int perm,
24 PerlIO *f, int narg, SV **args);
25
26static IV nxt_perl_psgi_layer_stream_close(pTHX_ PerlIO *f);
27
28static SSize_t nxt_perl_psgi_layer_stream_read(pTHX_ PerlIO *f,
29 void *vbuf, Size_t count);
30static SSize_t nxt_perl_psgi_layer_stream_write(pTHX_ PerlIO *f,
31 const void *vbuf, Size_t count);
32
33static IV nxt_perl_psgi_layer_stream_fileno(pTHX_ PerlIO *f);
34static IV nxt_perl_psgi_layer_stream_seek(pTHX_ PerlIO *f,
35 Off_t offset, int whence);
36static Off_t nxt_perl_psgi_layer_stream_tell(pTHX_ PerlIO *f);
37static IV nxt_perl_psgi_layer_stream_fill(pTHX_ PerlIO *f);
38static IV nxt_perl_psgi_layer_stream_flush(pTHX_ PerlIO *f);
39
40static SV *nxt_perl_psgi_layer_stream_arg(pTHX_ PerlIO *f,
41 CLONE_PARAMS *param, int flags);
42
43static PerlIO *nxt_perl_psgi_layer_stream_dup(pTHX_ PerlIO *f, PerlIO *o,
44 CLONE_PARAMS *param, int flags);
45static IV nxt_perl_psgi_layer_stream_eof(pTHX_ PerlIO *f);
46
47static STDCHAR *nxt_perl_psgi_layer_stream_get_base(pTHX_ PerlIO *f);
48static STDCHAR *nxt_perl_psgi_layer_stream_get_ptr(pTHX_ PerlIO *f);
49static SSize_t nxt_perl_psgi_layer_stream_get_cnt(pTHX_ PerlIO *f);
50static Size_t nxt_perl_psgi_layer_stream_buffersize(pTHX_ PerlIO *f);
51static void nxt_perl_psgi_layer_stream_set_ptrcnt(pTHX_ PerlIO *f,
52 STDCHAR *ptr, SSize_t cnt);
53
54
55static PERLIO_FUNCS_DECL(PerlIO_NGINX_Unit) = {
56 sizeof(PerlIO_funcs),
57 "NGINX_Unit_PSGI_Layer_Stream",
58 sizeof(nxt_perl_psgi_layer_stream_t),
59 PERLIO_K_BUFFERED | PERLIO_K_RAW,
60 nxt_perl_psgi_layer_stream_pushed,
61 nxt_perl_psgi_layer_stream_popped,
62 nxt_perl_psgi_layer_stream_open,
63 PerlIOBase_binmode,
64 nxt_perl_psgi_layer_stream_arg,
65 nxt_perl_psgi_layer_stream_fileno,
66 nxt_perl_psgi_layer_stream_dup,
67 nxt_perl_psgi_layer_stream_read,
68 NULL,
69 nxt_perl_psgi_layer_stream_write,
70 nxt_perl_psgi_layer_stream_seek,
71 nxt_perl_psgi_layer_stream_tell,
72 nxt_perl_psgi_layer_stream_close,
73 nxt_perl_psgi_layer_stream_flush,
74 nxt_perl_psgi_layer_stream_fill,
75 nxt_perl_psgi_layer_stream_eof,
76 PerlIOBase_error,
77 PerlIOBase_clearerr,
78 PerlIOBase_setlinebuf,
79 nxt_perl_psgi_layer_stream_get_base,
80 nxt_perl_psgi_layer_stream_buffersize,
81 nxt_perl_psgi_layer_stream_get_ptr,
82 nxt_perl_psgi_layer_stream_get_cnt,
83 nxt_perl_psgi_layer_stream_set_ptrcnt,
84};
85
86
87static IV
88nxt_perl_psgi_layer_stream_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg,
89 PerlIO_funcs *tab)
90{
91 nxt_perl_psgi_layer_stream_t *unit_stream;
92
93 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
94
95 if (arg != NULL && SvOK(arg)) {
96 unit_stream->var = arg;
96 unit_stream->var = SvREFCNT_inc(arg);
97 }
98
97 }
98
99 SvSETMAGIC(unit_stream->var);
100
101 return PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
102}
103
104
105static IV
106nxt_perl_psgi_layer_stream_popped(pTHX_ PerlIO *f)
107{
99 return PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
100}
101
102
103static IV
104nxt_perl_psgi_layer_stream_popped(pTHX_ PerlIO *f)
105{
106 nxt_perl_psgi_io_arg_t *arg;
108 nxt_perl_psgi_layer_stream_t *unit_stream;
109
110 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
111
112 if (unit_stream->var != NULL) {
107 nxt_perl_psgi_layer_stream_t *unit_stream;
108
109 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
110
111 if (unit_stream->var != NULL) {
112 arg = (void *) (intptr_t) SvIV(SvRV(unit_stream->var));
113
114 arg->io = NULL;
115 arg->fp = NULL;
116
113 SvREFCNT_dec(unit_stream->var);
114 unit_stream->var = Nullsv;
115 }
116
117 return 0;
118}
119
120
121static PerlIO *
122nxt_perl_psgi_layer_stream_open(pTHX_ PerlIO_funcs *self,
123 PerlIO_list_t *layers, IV n,
124 const char *mode, int fd, int imode, int perm,
125 PerlIO *f, int narg, SV **args)
126{
127 SV *arg;
128
129 arg = (narg > 0) ? *args : PerlIOArg;
130
131 PERL_UNUSED_ARG(fd);
132 PERL_UNUSED_ARG(imode);
133 PERL_UNUSED_ARG(perm);
134
135 if (SvROK(arg) || SvPOK(arg)) {
136
137 if (f == NULL) {
138 f = PerlIO_allocate(aTHX);
139 }
140
141 f = PerlIO_push(aTHX_ f, self, mode, arg);
142
143 if (f != NULL) {
144 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
145 }
146
147 return f;
148 }
149
150 return NULL;
151}
152
153
154static IV
155nxt_perl_psgi_layer_stream_close(pTHX_ PerlIO *f)
156{
157 IV code;
158
159 code = PerlIOBase_close(aTHX_ f);
160 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
161
162 return code;
163}
164
165
166static IV
167nxt_perl_psgi_layer_stream_fileno(pTHX_ PerlIO *f)
168{
169 PERL_UNUSED_ARG(f);
170 return -1;
171}
172
173
174static SSize_t
175nxt_perl_psgi_layer_stream_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
176{
177 nxt_perl_psgi_io_arg_t *arg;
178 nxt_perl_psgi_layer_stream_t *unit_stream;
179
180 if (f == NULL) {
181 return 0;
182 }
183
117 SvREFCNT_dec(unit_stream->var);
118 unit_stream->var = Nullsv;
119 }
120
121 return 0;
122}
123
124
125static PerlIO *
126nxt_perl_psgi_layer_stream_open(pTHX_ PerlIO_funcs *self,
127 PerlIO_list_t *layers, IV n,
128 const char *mode, int fd, int imode, int perm,
129 PerlIO *f, int narg, SV **args)
130{
131 SV *arg;
132
133 arg = (narg > 0) ? *args : PerlIOArg;
134
135 PERL_UNUSED_ARG(fd);
136 PERL_UNUSED_ARG(imode);
137 PERL_UNUSED_ARG(perm);
138
139 if (SvROK(arg) || SvPOK(arg)) {
140
141 if (f == NULL) {
142 f = PerlIO_allocate(aTHX);
143 }
144
145 f = PerlIO_push(aTHX_ f, self, mode, arg);
146
147 if (f != NULL) {
148 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
149 }
150
151 return f;
152 }
153
154 return NULL;
155}
156
157
158static IV
159nxt_perl_psgi_layer_stream_close(pTHX_ PerlIO *f)
160{
161 IV code;
162
163 code = PerlIOBase_close(aTHX_ f);
164 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
165
166 return code;
167}
168
169
170static IV
171nxt_perl_psgi_layer_stream_fileno(pTHX_ PerlIO *f)
172{
173 PERL_UNUSED_ARG(f);
174 return -1;
175}
176
177
178static SSize_t
179nxt_perl_psgi_layer_stream_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
180{
181 nxt_perl_psgi_io_arg_t *arg;
182 nxt_perl_psgi_layer_stream_t *unit_stream;
183
184 if (f == NULL) {
185 return 0;
186 }
187
184 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
185 arg = (nxt_perl_psgi_io_arg_t *) (intptr_t) SvIV(SvRV(unit_stream->var));
186
187 if ((PerlIOBase(f)->flags & PERLIO_F_CANREAD) == 0) {
188 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
189
190 SETERRNO(EBADF, SS_IVCHAN);
191
192 return 0;
193 }
194
188 if ((PerlIOBase(f)->flags & PERLIO_F_CANREAD) == 0) {
189 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
190
191 SETERRNO(EBADF, SS_IVCHAN);
192
193 return 0;
194 }
195
195 return (SSize_t) arg->read(PERL_GET_CONTEXT, arg, vbuf, count);
196 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
197 arg = (void *) (intptr_t) SvIV(SvRV(unit_stream->var));
198
199 return arg->io_tab->read(PERL_GET_CONTEXT, arg, vbuf, count);
196}
197
198
199static SSize_t
200nxt_perl_psgi_layer_stream_write(pTHX_ PerlIO *f,
201 const void *vbuf, Size_t count)
202{
203 nxt_perl_psgi_io_arg_t *arg;
204 nxt_perl_psgi_layer_stream_t *unit_stream;
205
206 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
200}
201
202
203static SSize_t
204nxt_perl_psgi_layer_stream_write(pTHX_ PerlIO *f,
205 const void *vbuf, Size_t count)
206{
207 nxt_perl_psgi_io_arg_t *arg;
208 nxt_perl_psgi_layer_stream_t *unit_stream;
209
210 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
207
208 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
211 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
212 arg = (void *) (intptr_t) SvIV(SvRV(unit_stream->var));
209
213
210 arg = (nxt_perl_psgi_io_arg_t *)
211 (intptr_t) SvIV(SvRV(unit_stream->var));
212
213 return (SSize_t) arg->write(PERL_GET_CONTEXT, arg, vbuf, count);
214 return arg->io_tab->write(PERL_GET_CONTEXT, arg, vbuf, count);
214 }
215
216 return 0;
217}
218
219
220static IV
221nxt_perl_psgi_layer_stream_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
222{
223 PERL_UNUSED_ARG(f);
224 return 0;
225}
226
227
228static Off_t
229nxt_perl_psgi_layer_stream_tell(pTHX_ PerlIO *f)
230{
231 PERL_UNUSED_ARG(f);
232 return 0;
233}
234
235
236static IV
237nxt_perl_psgi_layer_stream_fill(pTHX_ PerlIO *f)
238{
239 PERL_UNUSED_ARG(f);
240 return -1;
241}
242
243
244static IV
245nxt_perl_psgi_layer_stream_flush(pTHX_ PerlIO *f)
246{
215 }
216
217 return 0;
218}
219
220
221static IV
222nxt_perl_psgi_layer_stream_seek(pTHX_ PerlIO *f, Off_t offset, int whence)
223{
224 PERL_UNUSED_ARG(f);
225 return 0;
226}
227
228
229static Off_t
230nxt_perl_psgi_layer_stream_tell(pTHX_ PerlIO *f)
231{
232 PERL_UNUSED_ARG(f);
233 return 0;
234}
235
236
237static IV
238nxt_perl_psgi_layer_stream_fill(pTHX_ PerlIO *f)
239{
240 PERL_UNUSED_ARG(f);
241 return -1;
242}
243
244
245static IV
246nxt_perl_psgi_layer_stream_flush(pTHX_ PerlIO *f)
247{
247 nxt_perl_psgi_io_arg_t *arg;
248 nxt_perl_psgi_layer_stream_t *unit_stream;
249
250 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
251 arg = (nxt_perl_psgi_io_arg_t *) (intptr_t) SvIV(SvRV(unit_stream->var));
252
253 return (IV) arg->flush(PERL_GET_CONTEXT, arg);
248 return 0;
254}
255
256
257static SV *
258nxt_perl_psgi_layer_stream_arg(pTHX_ PerlIO * f,
259 CLONE_PARAMS *param, int flags)
260{
261 SV *var;
262 nxt_perl_psgi_layer_stream_t *unit_stream;
263
264 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
265 var = unit_stream->var;
266
267 if (flags & PERLIO_DUP_CLONE) {
268 var = PerlIO_sv_dup(aTHX_ var, param);
269
270 } else if (flags & PERLIO_DUP_FD) {
271 var = newSVsv(var);
272
273 } else {
274 var = SvREFCNT_inc(var);
275 }
276
277 return var;
278}
279
280
281static PerlIO *
282nxt_perl_psgi_layer_stream_dup(pTHX_ PerlIO *f, PerlIO *o,
283 CLONE_PARAMS *param, int flags)
284{
285 nxt_perl_psgi_layer_stream_t *fs;
286
287 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
288
289 if (f != NULL) {
290 fs = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
291 fs->var = nxt_perl_psgi_layer_stream_arg(aTHX_ o, param, flags);
292 }
293
294 return f;
295}
296
297
298static IV
299nxt_perl_psgi_layer_stream_eof(pTHX_ PerlIO *f)
300{
301 return 1;
302}
303
304
305static STDCHAR *
306nxt_perl_psgi_layer_stream_get_base(pTHX_ PerlIO *f)
307{
308 return (STDCHAR *) NULL;
309}
310
311
312static STDCHAR *
313nxt_perl_psgi_layer_stream_get_ptr(pTHX_ PerlIO *f)
314{
315 return (STDCHAR *) NULL;
316}
317
318
319static SSize_t
320nxt_perl_psgi_layer_stream_get_cnt(pTHX_ PerlIO *f)
321{
322 return 0;
323}
324
325
326static Size_t
327nxt_perl_psgi_layer_stream_buffersize(pTHX_ PerlIO *f)
328{
329 return 0;
330}
331
332
333static void
334nxt_perl_psgi_layer_stream_set_ptrcnt(pTHX_ PerlIO *f,
335 STDCHAR *ptr, SSize_t cnt)
336{
337 /* Need some code. */
338}
339
340
341void
342nxt_perl_psgi_layer_stream_init(pTHX)
343{
344 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_NGINX_Unit));
345}
346
347
348PerlIO *
249}
250
251
252static SV *
253nxt_perl_psgi_layer_stream_arg(pTHX_ PerlIO * f,
254 CLONE_PARAMS *param, int flags)
255{
256 SV *var;
257 nxt_perl_psgi_layer_stream_t *unit_stream;
258
259 unit_stream = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
260 var = unit_stream->var;
261
262 if (flags & PERLIO_DUP_CLONE) {
263 var = PerlIO_sv_dup(aTHX_ var, param);
264
265 } else if (flags & PERLIO_DUP_FD) {
266 var = newSVsv(var);
267
268 } else {
269 var = SvREFCNT_inc(var);
270 }
271
272 return var;
273}
274
275
276static PerlIO *
277nxt_perl_psgi_layer_stream_dup(pTHX_ PerlIO *f, PerlIO *o,
278 CLONE_PARAMS *param, int flags)
279{
280 nxt_perl_psgi_layer_stream_t *fs;
281
282 f = PerlIOBase_dup(aTHX_ f, o, param, flags);
283
284 if (f != NULL) {
285 fs = PerlIOSelf(f, nxt_perl_psgi_layer_stream_t);
286 fs->var = nxt_perl_psgi_layer_stream_arg(aTHX_ o, param, flags);
287 }
288
289 return f;
290}
291
292
293static IV
294nxt_perl_psgi_layer_stream_eof(pTHX_ PerlIO *f)
295{
296 return 1;
297}
298
299
300static STDCHAR *
301nxt_perl_psgi_layer_stream_get_base(pTHX_ PerlIO *f)
302{
303 return (STDCHAR *) NULL;
304}
305
306
307static STDCHAR *
308nxt_perl_psgi_layer_stream_get_ptr(pTHX_ PerlIO *f)
309{
310 return (STDCHAR *) NULL;
311}
312
313
314static SSize_t
315nxt_perl_psgi_layer_stream_get_cnt(pTHX_ PerlIO *f)
316{
317 return 0;
318}
319
320
321static Size_t
322nxt_perl_psgi_layer_stream_buffersize(pTHX_ PerlIO *f)
323{
324 return 0;
325}
326
327
328static void
329nxt_perl_psgi_layer_stream_set_ptrcnt(pTHX_ PerlIO *f,
330 STDCHAR *ptr, SSize_t cnt)
331{
332 /* Need some code. */
333}
334
335
336void
337nxt_perl_psgi_layer_stream_init(pTHX)
338{
339 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_NGINX_Unit));
340}
341
342
343PerlIO *
349nxt_perl_psgi_layer_stream_fp_create(pTHX_ nxt_perl_psgi_io_arg_t *arg,
344nxt_perl_psgi_layer_stream_fp_create(pTHX_ SV *arg_rv,
350 const char *mode)
351{
345 const char *mode)
346{
352 SV *arg_rv;
353 PerlIO *fp;
354
355 arg_rv = newSV_type(SVt_RV);
356
357 if (arg_rv == NULL) {
358 return NULL;
359 }
360
361 sv_setptrref(arg_rv, arg);
362
363 fp = PerlIO_openn(aTHX_ "NGINX_Unit_PSGI_Layer_Stream",
364 mode, 0, 0, 0, NULL, 1, &arg_rv);
365
366 if (fp == NULL) {
367 SvREFCNT_dec(arg_rv);
368 return NULL;
369 }
370
371 return fp;
347 return PerlIO_openn(aTHX_ "NGINX_Unit_PSGI_Layer_Stream",
348 mode, 0, 0, 0, NULL, 1, &arg_rv);
372}
373
374
375void
376nxt_perl_psgi_layer_stream_fp_destroy(pTHX_ PerlIO *io)
377{
378 PerlIO_close(io);
379}
380
381
382SV *
383nxt_perl_psgi_layer_stream_io_create(pTHX_ PerlIO *fp)
384{
385 SV *rvio;
386 IO *thatio;
387
388 thatio = newIO();
389
390 if (thatio == NULL) {
391 return NULL;
392 }
393
394 IoOFP(thatio) = fp;
395 IoIFP(thatio) = fp;
396
397 rvio = newRV_noinc((SV *) thatio);
398
399 if (rvio == NULL) {
400 SvREFCNT_dec(thatio);
401 return NULL;
402 }
403
404 return rvio;
405}
349}
350
351
352void
353nxt_perl_psgi_layer_stream_fp_destroy(pTHX_ PerlIO *io)
354{
355 PerlIO_close(io);
356}
357
358
359SV *
360nxt_perl_psgi_layer_stream_io_create(pTHX_ PerlIO *fp)
361{
362 SV *rvio;
363 IO *thatio;
364
365 thatio = newIO();
366
367 if (thatio == NULL) {
368 return NULL;
369 }
370
371 IoOFP(thatio) = fp;
372 IoIFP(thatio) = fp;
373
374 rvio = newRV_noinc((SV *) thatio);
375
376 if (rvio == NULL) {
377 SvREFCNT_dec(thatio);
378 return NULL;
379 }
380
381 return rvio;
382}
406
407
408void
409nxt_perl_psgi_layer_stream_io_destroy(pTHX_ SV *rvio)
410{
411 SvREFCNT_dec(rvio);
412}