ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-SNMP-XS/XS.xs
(Generate patch)

Comparing Net-SNMP-XS/XS.xs (file contents):
Revision 1.12 by root, Wed May 5 20:46:09 2010 UTC vs.
Revision 1.13 by root, Thu Jul 29 02:52:07 2010 UTC

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
26static SV *cur_bufobj; 26static SV *cur_bufobj;
27static SV *msg; 27static SV *msg, *bufsv;
28static int errflag, leading_dot; 28static int errflag, leading_dot;
29static U8 *buf, *cur; 29static U8 *buf, *cur;
30static STRLEN len, rem; 30static STRLEN len, rem;
31 31
32typedef SV *BUFOBJ; 32typedef SV *BUFOBJ;
45 buf = cur = (U8 *)""; 45 buf = cur = (U8 *)"";
46 len = rem = 0; 46 len = rem = 0;
47#endif 47#endif
48 48
49static void 49static void
50switch_bufobj (BUFOBJ neu) 50clear_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
64static void
65switch_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
76static SV * 86static 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
437void 447void
438set_type (int type, SV *cv) 448set_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
452void xxx(...)
453 CODE:
454 clear_bufobj ();
455
456MODULE = Net::SNMP::XS PACKAGE = Net::SNMP::Message
457
442void 458void
443set_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
446void 467 if (ix)
447clr_msg () 468 sv_insert (bufsv, 0, 0, vstr, vlen);
448 CODE: 469 else
470 sv_catpvn (bufsv, vstr, vlen);
449 471
450MODULE = 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
452void 483void
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)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines