]> git.stg.codes - stg.git/blob - libs/smux/include/stg/OBJECT_IDENTIFIER.h
c2c6373e3bc26ff9e6efcf1227525b2a75fc8f6e
[stg.git] / libs / smux / include / stg / OBJECT_IDENTIFIER.h
1 /*-
2  * Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
3  *      All rights reserved.
4  * Redistribution and modifications are permitted subject to BSD license.
5  */
6 #ifndef _OBJECT_IDENTIFIER_H_
7 #define _OBJECT_IDENTIFIER_H_
8
9 #include <asn_application.h>
10 #include <asn_codecs_prim.h>
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
17
18 extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER;
19
20 asn_struct_print_f OBJECT_IDENTIFIER_print;
21 asn_constr_check_f OBJECT_IDENTIFIER_constraint;
22 der_type_encoder_f OBJECT_IDENTIFIER_encode_der;
23 xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer;
24 xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer;
25
26 /**********************************
27  * Some handy conversion routines *
28  **********************************/
29
30 /*
31  * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs
32  * up to specified (_arc_slots) elements.
33  * 
34  * EXAMPLE:
35  *      void print_arcs(OBJECT_IDENTIFIER_t *oid) {
36  *              unsigned long fixed_arcs[10];   // Try with fixed space first
37  *              unsigned long *arcs = fixed_arcs;
38  *              int arc_type_size = sizeof(fixed_arcs[0]);      // sizeof(long)
39  *              int arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10
40  *              int count;      // Real number of arcs.
41  *              int i;
42  * 
43  *              count = OBJECT_IDENTIFIER_get_arcs(oid, arcs,
44  *                      arc_type_size, arc_slots);
45  *              // If necessary, reallocate arcs array and try again.
46  *              if(count > arc_slots) {
47  *                      arc_slots = count;
48  *                      arcs = malloc(arc_type_size * arc_slots);
49  *                      if(!arcs) return;
50  *                      count = OBJECT_IDENTIFIER_get_arcs(oid, arcs,
51  *                              arc_type_size, arc_slots);
52  *                      assert(count == arc_slots);
53  *              }
54  * 
55  *              // Print the contents of the arcs array.
56  *              for(i = 0; i < count; i++)
57  *                      printf("%d\n", arcs[i]);
58  * 
59  *              // Avoid memory leak.
60  *              if(arcs != fixed_arcs) free(arcs);
61  *      }
62  * 
63  * RETURN VALUES:
64  * -1/EINVAL:   Invalid arguments (oid is missing)
65  * -1/ERANGE:   One or more arcs have value out of array cell type range.
66  * >=0:         Number of arcs contained in the OBJECT IDENTIFIER
67  * 
68  * WARNING: The function always returns the real number of arcs,
69  * even if there is no sufficient (_arc_slots) provided.
70  */
71 int OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *_oid,
72         void *_arcs,                    /* e.g., unsigned int arcs[N] */
73         unsigned int _arc_type_size,    /* e.g., sizeof(arcs[0]) */
74         unsigned int _arc_slots         /* e.g., N */);
75
76 /*
77  * This functions initializes the OBJECT IDENTIFIER object with
78  * the given set of arcs.
79  * The minimum of two arcs must be present; some restrictions apply.
80  * RETURN VALUES:
81  * -1/EINVAL:   Invalid arguments
82  * -1/ERANGE:   The first two arcs do not conform to ASN.1 restrictions.
83  * -1/ENOMEM:   Memory allocation failed
84  * 0:           The object was initialized with new arcs.
85  */
86 int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *_oid,
87         const void *_arcs,              /* e.g., unsigned int arcs[N] */
88         unsigned int _arc_type_size,    /* e.g., sizeof(arcs[0]) */
89         unsigned int _arc_slots         /* e.g., N */);
90
91 /*
92  * Print the specified OBJECT IDENTIFIER arc.
93  */
94 int OBJECT_IDENTIFIER_print_arc(const uint8_t *arcbuf, int arclen,
95         int add, /* Arbitrary offset, required to process the first two arcs */
96         asn_app_consume_bytes_f *cb, void *app_key);
97
98 /* Same as above, but returns the number of written digits, instead of 0 */
99 ssize_t OBJECT_IDENTIFIER__dump_arc(const uint8_t *arcbuf, int arclen, int add,
100         asn_app_consume_bytes_f *cb, void *app_key);
101
102 /*
103  * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363").
104  * No arc can exceed the (0..signed_long_max) range (typically, 0..2G if L32).
105  * This function is not specific to OBJECT IDENTIFIER, it may be used to parse
106  * the RELATIVE-OID data, or any other data consisting of dot-separated
107  * series of numeric values.
108  *
109  * If (oid_txt_length == -1), the strlen() will be invoked to determine the
110  * size of the (oid_text) string.
111  * 
112  * After return, the optional (opt_oid_text_end) is set to the character after
113  * the last parsed one. (opt_oid_text_end) is never less than (oid_text).
114  * 
115  * RETURN VALUES:
116  *   -1:        Parse error.
117  * >= 0:        Number of arcs contained in the OBJECT IDENTIFIER.
118  * 
119  * WARNING: The function always returns the real number of arcs,
120  * even if there is no sufficient (_arc_slots) provided.
121  * This is useful for (_arc_slots) value estimation.
122  */
123 int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
124         long arcs[], unsigned int arcs_slots, const char **opt_oid_text_end);
125
126 /*
127  * Internal functions.
128  * Used by RELATIVE-OID implementation in particular.
129  */
130 int OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen,
131         signed int add, void *value, unsigned int value_size);
132 int OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf,
133         const void *arcval, unsigned int arcval_size, int _prepared_order);
134
135 #ifdef __cplusplus
136 }
137 #endif
138
139 #endif  /* _OBJECT_IDENTIFIER_H_ */