Mercurial > hg > nginx
comparison src/http/modules/perl/nginx.xs @ 1739:5b7baef2e11e
copy return values to perl's allocated memory
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 16 Dec 2007 11:57:27 +0000 |
parents | 43747661804d |
children | 0b8dc0e7616d |
comparison
equal
deleted
inserted
replaced
1738:e8cef87413a0 | 1739:5b7baef2e11e |
---|---|
11 #include <ngx_http.h> | 11 #include <ngx_http.h> |
12 #include <ngx_http_perl_module.h> | 12 #include <ngx_http_perl_module.h> |
13 | 13 |
14 #include "XSUB.h" | 14 #include "XSUB.h" |
15 | 15 |
16 | |
16 #define ngx_http_perl_set_request(r) \ | 17 #define ngx_http_perl_set_request(r) \ |
17 r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0)))) | 18 r = INT2PTR(ngx_http_request_t *, SvIV((SV *) SvRV(ST(0)))) |
18 | 19 |
19 | 20 |
20 #define ngx_http_perl_set_targ(p, len, z) \ | 21 #define ngx_http_perl_set_targ(p, len) \ |
21 \ | 22 \ |
22 sv_upgrade(TARG, SVt_PV); \ | 23 SvUPGRADE(TARG, SVt_PV); \ |
23 SvPOK_on(TARG); \ | 24 SvPOK_on(TARG); \ |
24 SvPV_set(TARG, (char *) p); \ | 25 sv_setpvn(TARG, (char *) p, len) |
25 SvLEN_set(TARG, len + z); \ | |
26 SvCUR_set(TARG, len); \ | |
27 SvFAKE_on(TARG); \ | |
28 SvREADONLY_on(TARG); \ | |
29 | 26 |
30 | 27 |
31 static ngx_int_t | 28 static ngx_int_t |
32 ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv) | 29 ngx_http_perl_sv2str(pTHX_ ngx_http_request_t *r, ngx_str_t *s, SV *sv) |
33 { | 30 { |
170 | 167 |
171 dXSTARG; | 168 dXSTARG; |
172 ngx_http_request_t *r; | 169 ngx_http_request_t *r; |
173 | 170 |
174 ngx_http_perl_set_request(r); | 171 ngx_http_perl_set_request(r); |
175 ngx_http_perl_set_targ(r->uri.data, r->uri.len, 0); | 172 ngx_http_perl_set_targ(r->uri.data, r->uri.len); |
176 | 173 |
177 ST(0) = TARG; | 174 ST(0) = TARG; |
178 | 175 |
179 | 176 |
180 void | 177 void |
183 | 180 |
184 dXSTARG; | 181 dXSTARG; |
185 ngx_http_request_t *r; | 182 ngx_http_request_t *r; |
186 | 183 |
187 ngx_http_perl_set_request(r); | 184 ngx_http_perl_set_request(r); |
188 ngx_http_perl_set_targ(r->args.data, r->args.len, 0); | 185 ngx_http_perl_set_targ(r->args.data, r->args.len); |
189 | 186 |
190 ST(0) = TARG; | 187 ST(0) = TARG; |
191 | 188 |
192 | 189 |
193 void | 190 void |
196 | 193 |
197 dXSTARG; | 194 dXSTARG; |
198 ngx_http_request_t *r; | 195 ngx_http_request_t *r; |
199 | 196 |
200 ngx_http_perl_set_request(r); | 197 ngx_http_perl_set_request(r); |
201 ngx_http_perl_set_targ(r->method_name.data, r->method_name.len, 0); | 198 ngx_http_perl_set_targ(r->method_name.data, r->method_name.len); |
202 | 199 |
203 ST(0) = TARG; | 200 ST(0) = TARG; |
204 | 201 |
205 | 202 |
206 void | 203 void |
210 dXSTARG; | 207 dXSTARG; |
211 ngx_http_request_t *r; | 208 ngx_http_request_t *r; |
212 | 209 |
213 ngx_http_perl_set_request(r); | 210 ngx_http_perl_set_request(r); |
214 ngx_http_perl_set_targ(r->connection->addr_text.data, | 211 ngx_http_perl_set_targ(r->connection->addr_text.data, |
215 r->connection->addr_text.len, 1); | 212 r->connection->addr_text.len); |
216 | 213 |
217 ST(0) = TARG; | 214 ST(0) = TARG; |
218 | 215 |
219 | 216 |
220 void | 217 void |
264 if (hh->offset) { | 261 if (hh->offset) { |
265 | 262 |
266 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset); | 263 ph = (ngx_table_elt_t **) ((char *) &r->headers_in + hh->offset); |
267 | 264 |
268 if (*ph) { | 265 if (*ph) { |
269 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0); | 266 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len); |
270 | 267 |
271 goto done; | 268 goto done; |
272 } | 269 } |
273 | 270 |
274 XSRETURN_UNDEF; | 271 XSRETURN_UNDEF; |
283 } | 280 } |
284 | 281 |
285 ph = r->headers_in.cookies.elts; | 282 ph = r->headers_in.cookies.elts; |
286 | 283 |
287 if (n == 1) { | 284 if (n == 1) { |
288 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len, 0); | 285 ngx_http_perl_set_targ((*ph)->value.data, (*ph)->value.len); |
289 | 286 |
290 goto done; | 287 goto done; |
291 } | 288 } |
292 | 289 |
293 size = - (ssize_t) (sizeof("; ") - 1); | 290 size = - (ssize_t) (sizeof("; ") - 1); |
311 } | 308 } |
312 | 309 |
313 *p++ = ';'; *p++ = ' '; | 310 *p++ = ';'; *p++ = ' '; |
314 } | 311 } |
315 | 312 |
316 ngx_http_perl_set_targ(cookie, size, 0); | 313 ngx_http_perl_set_targ(cookie, size); |
317 | 314 |
318 goto done; | 315 goto done; |
319 } | 316 } |
320 | 317 |
321 /* iterate over all headers */ | 318 /* iterate over all headers */ |
339 || ngx_strcasecmp(p, h[i].key.data) != 0) | 336 || ngx_strcasecmp(p, h[i].key.data) != 0) |
340 { | 337 { |
341 continue; | 338 continue; |
342 } | 339 } |
343 | 340 |
344 ngx_http_perl_set_targ(h[i].value.data, h[i].value.len, 0); | 341 ngx_http_perl_set_targ(h[i].value.data, h[i].value.len); |
345 | 342 |
346 goto done; | 343 goto done; |
347 } | 344 } |
348 | 345 |
349 XSRETURN_UNDEF; | 346 XSRETURN_UNDEF; |
407 | 404 |
408 if (len == 0) { | 405 if (len == 0) { |
409 XSRETURN_UNDEF; | 406 XSRETURN_UNDEF; |
410 } | 407 } |
411 | 408 |
412 ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len, 0); | 409 ngx_http_perl_set_targ(r->request_body->bufs->buf->pos, len); |
413 | 410 |
414 ST(0) = TARG; | 411 ST(0) = TARG; |
415 | 412 |
416 | 413 |
417 void | 414 void |
426 if (r->request_body == NULL || r->request_body->temp_file == NULL) { | 423 if (r->request_body == NULL || r->request_body->temp_file == NULL) { |
427 XSRETURN_UNDEF; | 424 XSRETURN_UNDEF; |
428 } | 425 } |
429 | 426 |
430 ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data, | 427 ngx_http_perl_set_targ(r->request_body->temp_file->file.name.data, |
431 r->request_body->temp_file->file.name.len, 1); | 428 r->request_body->temp_file->file.name.len); |
432 | 429 |
433 ST(0) = TARG; | 430 ST(0) = TARG; |
434 | 431 |
435 | 432 |
436 void | 433 void |
505 ctx->filename.len--; | 502 ctx->filename.len--; |
506 sv_setpv(PL_statname, (char *) ctx->filename.data); | 503 sv_setpv(PL_statname, (char *) ctx->filename.data); |
507 | 504 |
508 done: | 505 done: |
509 | 506 |
510 ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len, 1); | 507 ngx_http_perl_set_targ(ctx->filename.data, ctx->filename.len); |
511 | 508 |
512 ST(0) = TARG; | 509 ST(0) = TARG; |
513 | 510 |
514 | 511 |
515 void | 512 void |
783 type = items < 3 ? 0 : SvIV(ST(2)); | 780 type = items < 3 ? 0 : SvIV(ST(2)); |
784 | 781 |
785 ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type); | 782 ngx_unescape_uri(&dst, &src, len, (ngx_uint_t) type); |
786 *dst = '\0'; | 783 *dst = '\0'; |
787 | 784 |
788 ngx_http_perl_set_targ(p, dst - p, 1); | 785 ngx_http_perl_set_targ(p, dst - p); |
789 | 786 |
790 ST(0) = TARG; | 787 ST(0) = TARG; |
791 | 788 |
792 | 789 |
793 void | 790 void |
880 if (value) { | 877 if (value) { |
881 v[i].value = val; | 878 v[i].value = val; |
882 XSRETURN_UNDEF; | 879 XSRETURN_UNDEF; |
883 } | 880 } |
884 | 881 |
885 ngx_http_perl_set_targ(v[i].value.data, v[i].value.len, 0); | 882 ngx_http_perl_set_targ(v[i].value.data, v[i].value.len); |
886 | 883 |
887 goto done; | 884 goto done; |
888 } | 885 } |
889 } | 886 } |
890 | 887 |
924 vv->data = val.data; | 921 vv->data = val.data; |
925 | 922 |
926 XSRETURN_UNDEF; | 923 XSRETURN_UNDEF; |
927 } | 924 } |
928 | 925 |
929 ngx_http_perl_set_targ(vv->data, vv->len, 0); | 926 ngx_http_perl_set_targ(vv->data, vv->len); |
930 | 927 |
931 done: | 928 done: |
932 | 929 |
933 ST(0) = TARG; | 930 ST(0) = TARG; |
934 | 931 |