… | |
… | |
72 | BER_TYPE_OID, |
72 | BER_TYPE_OID, |
73 | BER_TYPE_RELOID, |
73 | BER_TYPE_RELOID, |
74 | BER_TYPE_NULL, |
74 | BER_TYPE_NULL, |
75 | BER_TYPE_BOOL, |
75 | BER_TYPE_BOOL, |
76 | BER_TYPE_REAL, |
76 | BER_TYPE_REAL, |
|
|
77 | BER_TYPE_IPADDRESS, |
77 | BER_TYPE_CROAK, |
78 | BER_TYPE_CROAK, |
78 | }; |
79 | }; |
79 | |
80 | |
80 | enum { |
81 | enum { |
81 | BER_CLASS = 0, |
82 | BER_CLASS = 0, |
… | |
… | |
129 | |
130 | |
130 | static profile_type * |
131 | static profile_type * |
131 | SvPROFILE (SV *profile) |
132 | SvPROFILE (SV *profile) |
132 | { |
133 | { |
133 | if (!SvOK (profile)) |
134 | if (!SvOK (profile)) |
134 | profile = default_profile; |
135 | return default_profile; |
135 | |
136 | |
136 | if (!SvROK (profile)) |
137 | if (!SvROK (profile)) |
137 | croak ("invalid profile"); |
138 | croak ("invalid profile"); |
138 | |
139 | |
139 | profile = SvRV (profile); |
140 | profile = SvRV (profile); |
… | |
… | |
194 | { ASN_UNIVERSAL, ASN_UTF8_STRING , BER_TYPE_UTF8 }, |
195 | { ASN_UNIVERSAL, ASN_UTF8_STRING , BER_TYPE_UTF8 }, |
195 | { ASN_UNIVERSAL, ASN_BMP_STRING , BER_TYPE_UCS2 }, |
196 | { ASN_UNIVERSAL, ASN_BMP_STRING , BER_TYPE_UCS2 }, |
196 | { ASN_UNIVERSAL, ASN_UNIVERSAL_STRING , BER_TYPE_UCS4 }, |
197 | { ASN_UNIVERSAL, ASN_UNIVERSAL_STRING , BER_TYPE_UCS4 }, |
197 | }; |
198 | }; |
198 | |
199 | |
199 | //const_iv (SNMP_IPADDRESS) |
|
|
200 | //const_iv (SNMP_COUNTER32) |
|
|
201 | //const_iv (SNMP_UNSIGNED32) |
|
|
202 | //const_iv (SNMP_TIMETICKS) |
|
|
203 | //const_iv (SNMP_OPAQUE) |
|
|
204 | //const_iv (SNMP_COUNTER64) |
|
|
205 | |
|
|
206 | for (celem = default_map + sizeof (default_map) / sizeof (default_map [0]); celem > default_map; celem--) |
200 | for (celem = default_map + sizeof (default_map) / sizeof (default_map [0]); celem > default_map; celem--) |
207 | profile_set ((void *)sv, celem->klass, celem->tag, celem->type); |
201 | profile_set ((void *)sv, celem->klass, celem->tag, celem->type); |
208 | |
202 | |
209 | return sv_bless (newRV_noinc (sv), profile_stash); |
203 | return sv_bless (newRV_noinc (sv), profile_stash); |
210 | } |
204 | } |
… | |
… | |
313 | |
307 | |
314 | do |
308 | do |
315 | val = (val << 8) | *data++; |
309 | val = (val << 8) | *data++; |
316 | while (--len); |
310 | while (--len); |
317 | |
311 | |
318 | // the cats to IV relies on implementation-defined behaviour (two's complement cast) |
312 | // the cast to IV relies on implementation-defined behaviour (two's complement cast) |
319 | // but that's ok, as perl relies on it as well. |
313 | // but that's ok, as perl relies on it as well. |
320 | return negative ? newSViv ((IV)val) : newSVuv (val); |
314 | return negative ? newSViv ((IV)val) : newSVuv (val); |
321 | } |
315 | } |
322 | |
316 | |
323 | static SV * |
317 | static SV * |
… | |
… | |
436 | case BER_TYPE_BOOL: |
430 | case BER_TYPE_BOOL: |
437 | { |
431 | { |
438 | U32 len = get_length (); |
432 | U32 len = get_length (); |
439 | |
433 | |
440 | if (len != 1) |
434 | if (len != 1) |
441 | croak ("BOOLEAN type with invalid length %d encountered", len); |
435 | croak ("BER_TYPE_BOOLEAN type with invalid length %d encountered", len); |
442 | |
436 | |
443 | res = newSVcacheint (get_u8 () ? 0 : 1); |
437 | res = newSVcacheint (get_u8 () ? 0 : 1); |
444 | } |
438 | } |
445 | break; |
439 | break; |
446 | |
440 | |
… | |
… | |
461 | SvUTF8_on (res); |
455 | SvUTF8_on (res); |
462 | break; |
456 | break; |
463 | |
457 | |
464 | case BER_TYPE_BYTES: |
458 | case BER_TYPE_BYTES: |
465 | res = decode_data (); |
459 | res = decode_data (); |
|
|
460 | break; |
|
|
461 | |
|
|
462 | case BER_TYPE_IPADDRESS: |
|
|
463 | { |
|
|
464 | U32 len = get_length (); |
|
|
465 | |
|
|
466 | if (len != 4) |
|
|
467 | croak ("BER_TYPE_IPADDRESS type with invalid length %d encountered", len); |
|
|
468 | |
|
|
469 | U8 c1 = get_u8 (); |
|
|
470 | U8 c2 = get_u8 (); |
|
|
471 | U8 c3 = get_u8 (); |
|
|
472 | U8 c4 = get_u8 (); |
|
|
473 | |
|
|
474 | res = newSVpvf ("%d.%d.%d.%d", c1, c2, c3, c4); |
|
|
475 | } |
466 | break; |
476 | break; |
467 | |
477 | |
468 | case BER_TYPE_REAL: |
478 | case BER_TYPE_REAL: |
469 | case BER_TYPE_UCS2: |
479 | case BER_TYPE_UCS2: |
470 | case BER_TYPE_UCS4: |
480 | case BER_TYPE_UCS4: |
… | |
… | |
828 | case BER_TYPE_UTF8: |
838 | case BER_TYPE_UTF8: |
829 | { |
839 | { |
830 | STRLEN len; |
840 | STRLEN len; |
831 | const char *ptr = SvPVutf8 (data, len); |
841 | const char *ptr = SvPVutf8 (data, len); |
832 | encode_data (ptr, len); |
842 | encode_data (ptr, len); |
|
|
843 | } |
|
|
844 | break; |
|
|
845 | |
|
|
846 | case BER_TYPE_IPADDRESS: |
|
|
847 | { |
|
|
848 | U8 ip[4]; |
|
|
849 | sscanf (SvPV_nolen (data), "%hhu.%hhu.%hhu.%hhu", ip + 0, ip + 1, ip + 2, ip + 3); |
|
|
850 | encode_data ((const char *)ip, sizeof (ip)); |
833 | } |
851 | } |
834 | break; |
852 | break; |
835 | |
853 | |
836 | case BER_TYPE_REAL: |
854 | case BER_TYPE_REAL: |
837 | case BER_TYPE_UCS2: |
855 | case BER_TYPE_UCS2: |
… | |
… | |
911 | const_iv (BER_TYPE_OID) |
929 | const_iv (BER_TYPE_OID) |
912 | const_iv (BER_TYPE_RELOID) |
930 | const_iv (BER_TYPE_RELOID) |
913 | const_iv (BER_TYPE_NULL) |
931 | const_iv (BER_TYPE_NULL) |
914 | const_iv (BER_TYPE_BOOL) |
932 | const_iv (BER_TYPE_BOOL) |
915 | const_iv (BER_TYPE_REAL) |
933 | const_iv (BER_TYPE_REAL) |
|
|
934 | const_iv (BER_TYPE_IPADDRESS) |
916 | const_iv (BER_TYPE_CROAK) |
935 | const_iv (BER_TYPE_CROAK) |
917 | |
936 | |
918 | const_iv (SNMP_IPADDRESS) |
937 | const_iv (SNMP_IPADDRESS) |
919 | const_iv (SNMP_COUNTER32) |
938 | const_iv (SNMP_COUNTER32) |
920 | const_iv (SNMP_UNSIGNED32) |
939 | const_iv (SNMP_UNSIGNED32) |
921 | const_iv (SNMP_TIMETICKS) |
940 | const_iv (SNMP_TIMETICKS) |
922 | const_iv (SNMP_OPAQUE) |
941 | const_iv (SNMP_OPAQUE) |
923 | const_iv (SNMP_COUNTER64) |
942 | const_iv (SNMP_COUNTER64) |
924 | |
|
|
925 | }; |
943 | }; |
926 | |
944 | |
927 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--) |
945 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ > const_iv; civ--) |
928 | newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); |
946 | newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); |
929 | |
|
|
930 | default_profile = profile_new (); |
|
|
931 | } |
947 | } |
932 | |
948 | |
933 | SV * |
949 | SV * |
934 | ber_decode (SV *ber, SV *profile = &PL_sv_undef) |
950 | ber_decode (SV *ber, SV *profile = &PL_sv_undef) |
935 | CODE: |
951 | CODE: |
… | |
… | |
1069 | new (SV *klass) |
1085 | new (SV *klass) |
1070 | CODE: |
1086 | CODE: |
1071 | RETVAL = profile_new (); |
1087 | RETVAL = profile_new (); |
1072 | OUTPUT: RETVAL |
1088 | OUTPUT: RETVAL |
1073 | |
1089 | |
|
|
1090 | void |
|
|
1091 | set (SV *profile, int klass, int tag, int type) |
|
|
1092 | CODE: |
|
|
1093 | profile_set (SvPROFILE (profile), klass, tag, type); |
|
|
1094 | |
|
|
1095 | IV |
|
|
1096 | get (SV *profile, int klass, int tag) |
|
|
1097 | CODE: |
|
|
1098 | RETVAL = profile_lookup (SvPROFILE (profile), klass, tag); |
|
|
1099 | OUTPUT: RETVAL |
|
|
1100 | |
|
|
1101 | void |
|
|
1102 | _set_default (SV *profile) |
|
|
1103 | CODE: |
|
|
1104 | default_profile = SvPROFILE (profile); |
|
|
1105 | |
|
|
1106 | |