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}
| |
| |