… | |
… | |
22 | #define MAX_OID_STRLEN 4096 |
22 | #define MAX_OID_STRLEN 4096 |
23 | |
23 | |
24 | #define HAVE_VERSIONSORT defined (_GNU_SOURCE) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1 |
24 | #define HAVE_VERSIONSORT defined (_GNU_SOURCE) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1 |
25 | |
25 | |
26 | static SV *cur_bufobj; |
26 | static SV *cur_bufobj; |
27 | static SV *msg; |
27 | static SV *msg, *bufsv; |
28 | static int errflag, leading_dot; |
28 | static int errflag, leading_dot; |
29 | static U8 *buf, *cur; |
29 | static U8 *buf, *cur; |
30 | static STRLEN len, rem; |
30 | static STRLEN len, rem; |
31 | |
31 | |
32 | typedef SV *BUFOBJ; |
32 | typedef SV *BUFOBJ; |
… | |
… | |
45 | buf = cur = (U8 *)""; |
45 | buf = cur = (U8 *)""; |
46 | len = rem = 0; |
46 | len = rem = 0; |
47 | #endif |
47 | #endif |
48 | |
48 | |
49 | static void |
49 | static void |
50 | switch_bufobj (BUFOBJ neu) |
50 | clear_bufobj (void) |
51 | { |
51 | { |
52 | // serialise our state back |
52 | // serialise our state back |
53 | if (msg && SvROK (msg)) |
53 | if (msg && SvROK (msg)) |
54 | { |
54 | { |
55 | SV *idx_sv = *hv_fetch ((HV *)cur_bufobj, "_index" , sizeof ("_index" ) - 1, 1); |
55 | SV *idx_sv = *hv_fetch ((HV *)cur_bufobj, "_index" , sizeof ("_index" ) - 1, 1); |
56 | sv_setiv (idx_sv, cur - buf); |
56 | sv_setiv (idx_sv, cur - buf); |
57 | } |
|
|
58 | |
57 | |
59 | SvREFCNT_dec (msg); |
58 | SvREFCNT_dec (msg); |
|
|
59 | msg = 0; |
|
|
60 | cur_bufobj = 0; |
|
|
61 | } |
|
|
62 | } |
|
|
63 | |
|
|
64 | static void |
|
|
65 | switch_bufobj (BUFOBJ neu) |
|
|
66 | { |
|
|
67 | clear_bufobj (); |
|
|
68 | |
60 | msg = newSVsv (neu); |
69 | msg = newSVsv (neu); |
61 | cur_bufobj = SvRV (msg); |
70 | cur_bufobj = SvRV (msg); |
62 | sv_rvweaken (msg); |
71 | sv_rvweaken (msg); |
63 | |
72 | |
64 | SV *bufsv = *hv_fetch ((HV *)cur_bufobj, "_buffer", sizeof ("_buffer") - 1, 1); |
|
|
65 | IV index = SvIV (*hv_fetch ((HV *)cur_bufobj, "_index" , sizeof ("_index" ) - 1, 1)); |
|
|
66 | |
|
|
67 | errflag = 0; |
73 | errflag = 0; |
68 | leading_dot = -1; |
74 | leading_dot = -1; |
|
|
75 | |
|
|
76 | IV index = SvIV (*hv_fetch ((HV *)cur_bufobj, "_index" , sizeof ("_index" ) - 1, 1)); |
|
|
77 | bufsv = *hv_fetch ((HV *)cur_bufobj, "_buffer", sizeof ("_buffer") - 1, 1); |
|
|
78 | |
69 | buf = SvPVbyte (bufsv, len); |
79 | buf = SvPVbyte (bufsv, len); |
70 | cur = buf + index; |
80 | cur = buf + index; |
71 | rem = len - index; |
81 | rem = len - index; |
72 | } |
82 | } |
73 | |
83 | |
74 | ///////////////////////////////////////////////////////////////////////////// |
84 | ///////////////////////////////////////////////////////////////////////////// |
75 | |
85 | |
76 | static SV * |
86 | static SV * |
… | |
… | |
386 | res = process_octet_string_sv (); |
396 | res = process_octet_string_sv (); |
387 | break; |
397 | break; |
388 | |
398 | |
389 | default: |
399 | default: |
390 | { |
400 | { |
391 | if (type > AvFILLp (av_type) || !SvTYPE (AvARRAY (av_type)[type]) == SVt_PVCV) |
401 | if (type > AvFILLp (av_type) || SvTYPE (AvARRAY (av_type)[type]) != SVt_PVCV) |
392 | { |
402 | { |
393 | error ("Unknown ASN.1 type"); |
403 | error ("Unknown ASN.1 type"); |
394 | return &PL_sv_undef; |
404 | return &PL_sv_undef; |
395 | } |
405 | } |
396 | |
406 | |
… | |
… | |
437 | void |
447 | void |
438 | set_type (int type, SV *cv) |
448 | set_type (int type, SV *cv) |
439 | CODE: |
449 | CODE: |
440 | av_store (av_type, type, SvREFCNT_inc (x_get_cv (cv))); |
450 | av_store (av_type, type, SvREFCNT_inc (x_get_cv (cv))); |
441 | |
451 | |
|
|
452 | void xxx(...) |
|
|
453 | CODE: |
|
|
454 | clear_bufobj (); |
|
|
455 | |
|
|
456 | MODULE = Net::SNMP::XS PACKAGE = Net::SNMP::Message |
|
|
457 | |
442 | void |
458 | void |
443 | set_msg (SV *msg_, SV *buf_) |
459 | _buffer_append (BUFOBJ self, SV *value) |
|
|
460 | ALIAS: |
|
|
461 | _buffer_put = 1 |
444 | CODE: |
462 | PPCODE: |
|
|
463 | { |
|
|
464 | STRLEN vlen; |
|
|
465 | const char *vstr = SvPVbyte (value, vlen); |
445 | |
466 | |
446 | void |
467 | if (ix) |
447 | clr_msg () |
468 | sv_insert (bufsv, 0, 0, vstr, vlen); |
448 | CODE: |
469 | else |
|
|
470 | sv_catpvn (bufsv, vstr, vlen); |
449 | |
471 | |
450 | MODULE = Net::SNMP::XS PACKAGE = Net::SNMP::Message |
472 | buf = SvPVbyte (bufsv, len); |
|
|
473 | cur = buf; |
|
|
474 | rem = len; |
|
|
475 | |
|
|
476 | SV *len_sv = *hv_fetch ((HV *)cur_bufobj, "_length", sizeof ("_length") - 1, 1); |
|
|
477 | sv_setiv (len_sv, len); |
|
|
478 | |
|
|
479 | // some callers test for defined'ness of the returnvalue. *sigh* |
|
|
480 | XPUSHs (&PL_sv_yes); |
|
|
481 | } |
451 | |
482 | |
452 | void |
483 | void |
453 | _buffer_get (BUFOBJ self, int count = -1) |
484 | _buffer_get (BUFOBJ self, int count = -1) |
454 | PPCODE: |
485 | PPCODE: |
455 | { |
486 | { |
456 | // grrr. |
487 | // grrr. |
457 | if (count < 0) |
488 | if (count < 0) |
458 | { |
489 | { |
459 | hv_delete ((HV *)SvRV (self), "_index" , 6, G_DISCARD); |
490 | hv_delete ((HV *)SvRV (self), "_index" , 6, G_DISCARD); |
460 | hv_delete ((HV *)SvRV (self), "_length", 7, G_DISCARD); |
491 | hv_delete ((HV *)SvRV (self), "_length", 7, G_DISCARD); |
461 | SV **svp = hv_fetch ((HV *)SvRV (self), "_buffer", 7, 1); |
|
|
462 | XPUSHs (sv_2mortal (newSVsv (*svp))); |
492 | XPUSHs (sv_2mortal (newSVsv (bufsv))); |
463 | sv_setpvn (*svp, "", 0); |
493 | sv_setpvn (bufsv, "", 0); |
|
|
494 | |
|
|
495 | buf = ""; |
|
|
496 | cur = buf; |
|
|
497 | rem = 0; |
|
|
498 | |
464 | XSRETURN (1); |
499 | XSRETURN (1); |
465 | } |
500 | } |
466 | |
501 | |
467 | char *data = getn (count, 0); |
502 | char *data = getn (count, 0); |
468 | |
503 | |
… | |
… | |
638 | { |
673 | { |
639 | if (!SvOK (base_) || !SvOK (oid_)) |
674 | if (!SvOK (base_) || !SvOK (oid_)) |
640 | XSRETURN_NO; |
675 | XSRETURN_NO; |
641 | |
676 | |
642 | STRLEN blen, olen; |
677 | STRLEN blen, olen; |
643 | char *base = SvPV (base_, blen); |
678 | char *base = SvPVbyte (base_, blen); |
644 | char *oid = SvPV (oid_ , olen); |
679 | char *oid = SvPVbyte (oid_ , olen); |
645 | |
680 | |
646 | blen -= *base == '.'; base += *base == '.'; |
681 | blen -= *base == '.'; base += *base == '.'; |
647 | olen -= *base == '.'; oid += *oid == '.'; |
682 | olen -= *base == '.'; oid += *oid == '.'; |
648 | |
683 | |
649 | if (olen < blen) |
684 | if (olen < blen) |