1*67d8ab44Smartijn /* $OpenBSD: agentx.h,v 1.7 2022/10/14 15:26:58 martijn Exp $ */ 29dbe2cd1Smartijn /* 39dbe2cd1Smartijn * Copyright (c) 2019 Martijn van Duren <martijn@openbsd.org> 49dbe2cd1Smartijn * 59dbe2cd1Smartijn * Permission to use, copy, modify, and distribute this software for any 69dbe2cd1Smartijn * purpose with or without fee is hereby granted, provided that the above 79dbe2cd1Smartijn * copyright notice and this permission notice appear in all copies. 89dbe2cd1Smartijn * 99dbe2cd1Smartijn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 109dbe2cd1Smartijn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 119dbe2cd1Smartijn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 129dbe2cd1Smartijn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 139dbe2cd1Smartijn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 149dbe2cd1Smartijn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 159dbe2cd1Smartijn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 169dbe2cd1Smartijn */ 179dbe2cd1Smartijn 1881180db9Smartijn #include <netinet/in.h> 1981180db9Smartijn 209dbe2cd1Smartijn #include <stdint.h> 2181180db9Smartijn #include <stddef.h> 229dbe2cd1Smartijn 2381180db9Smartijn struct agentx; 2481180db9Smartijn struct agentx_session; 2581180db9Smartijn struct agentx_context; 2681180db9Smartijn struct agentx_agentcaps; 2781180db9Smartijn struct agentx_region; 2881180db9Smartijn struct agentx_index; 2981180db9Smartijn struct agentx_object; 3081180db9Smartijn struct agentx_varbind; 319dbe2cd1Smartijn 3281180db9Smartijn enum agentx_request_type { 3381180db9Smartijn AGENTX_REQUEST_TYPE_GET, 3481180db9Smartijn AGENTX_REQUEST_TYPE_GETNEXT, 3581180db9Smartijn AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE 369dbe2cd1Smartijn }; 379dbe2cd1Smartijn 3881180db9Smartijn #define AGENTX_MASTER_PATH "/var/agentx/master" 399c70cf54Smartijn #define AGENTX_OID_MIN_LEN 2 409dbe2cd1Smartijn #define AGENTX_OID_MAX_LEN 128 4181180db9Smartijn #define AGENTX_OID_INDEX_MAX_LEN 10 4281180db9Smartijn #define AGENTX_MIB2 1, 3, 6, 1, 2, 1 4381180db9Smartijn #define AGENTX_ENTERPRISES 1, 3, 6, 1, 4, 1 4481180db9Smartijn #define AGENTX_OID(...) (uint32_t []) { __VA_ARGS__ }, \ 4581180db9Smartijn (sizeof((uint32_t []) { __VA_ARGS__ }) / sizeof(uint32_t)) 469dbe2cd1Smartijn 4781180db9Smartijn extern void (*agentx_log_fatal)(const char *, ...) 4881180db9Smartijn __attribute__((__format__ (printf, 1, 2))); 4981180db9Smartijn extern void (*agentx_log_warn)(const char *, ...) 5081180db9Smartijn __attribute__((__format__ (printf, 1, 2))); 5181180db9Smartijn extern void (*agentx_log_info)(const char *, ...) 5281180db9Smartijn __attribute__((__format__ (printf, 1, 2))); 5381180db9Smartijn extern void (*agentx_log_debug)(const char *, ...) 5481180db9Smartijn __attribute__((__format__ (printf, 1, 2))); 559dbe2cd1Smartijn 5681180db9Smartijn struct agentx *agentx(void (*)(struct agentx *, void *, int), void *); 5781180db9Smartijn void agentx_connect(struct agentx *, int); 58*67d8ab44Smartijn void agentx_retry(struct agentx *); 5981180db9Smartijn void agentx_read(struct agentx *); 6081180db9Smartijn void agentx_write(struct agentx *); 6181180db9Smartijn extern void (*agentx_wantwrite)(struct agentx *, int); 629dbe2cd1Smartijn void agentx_free(struct agentx *); 6381180db9Smartijn struct agentx_session *agentx_session(struct agentx *, 6481180db9Smartijn uint32_t[], size_t, const char *, uint8_t); 6581180db9Smartijn void agentx_session_free(struct agentx_session *); 6681180db9Smartijn struct agentx_context *agentx_context(struct agentx_session *, 6781180db9Smartijn const char *); 6881180db9Smartijn struct agentx_object *agentx_context_object_find( 6981180db9Smartijn struct agentx_context *, const uint32_t[], size_t, int, int); 7081180db9Smartijn struct agentx_object *agentx_context_object_nfind( 7181180db9Smartijn struct agentx_context *, const uint32_t[], size_t, int, int); 7281180db9Smartijn uint32_t agentx_context_uptime(struct agentx_context *); 7381180db9Smartijn void agentx_context_free(struct agentx_context *); 7481180db9Smartijn struct agentx_agentcaps *agentx_agentcaps(struct agentx_context *, 7581180db9Smartijn uint32_t[], size_t, const char *); 7681180db9Smartijn void agentx_agentcaps_free(struct agentx_agentcaps *); 7781180db9Smartijn struct agentx_region *agentx_region(struct agentx_context *, 7881180db9Smartijn uint32_t[], size_t, uint8_t); 7981180db9Smartijn void agentx_region_free(struct agentx_region *); 8081180db9Smartijn struct agentx_index *agentx_index_integer_new(struct agentx_region *, 8181180db9Smartijn uint32_t[], size_t); 8281180db9Smartijn struct agentx_index *agentx_index_integer_any(struct agentx_region *, 8381180db9Smartijn uint32_t[], size_t); 8481180db9Smartijn struct agentx_index *agentx_index_integer_value(struct agentx_region *, 851b6ededeSmartijn uint32_t[], size_t, int32_t); 8681180db9Smartijn struct agentx_index *agentx_index_integer_dynamic( 8781180db9Smartijn struct agentx_region *, uint32_t[], size_t); 8881180db9Smartijn struct agentx_index *agentx_index_string_dynamic( 8981180db9Smartijn struct agentx_region *, uint32_t[], size_t); 9081180db9Smartijn struct agentx_index *agentx_index_nstring_dynamic( 9181180db9Smartijn struct agentx_region *, uint32_t[], size_t, size_t); 9281180db9Smartijn struct agentx_index *agentx_index_oid_dynamic(struct agentx_region *, 9381180db9Smartijn uint32_t[], size_t); 9481180db9Smartijn struct agentx_index *agentx_index_noid_dynamic(struct agentx_region *, 9581180db9Smartijn uint32_t[], size_t, size_t); 9681180db9Smartijn struct agentx_index *agentx_index_ipaddress_dynamic( 9781180db9Smartijn struct agentx_region *, uint32_t[], size_t); 9881180db9Smartijn void agentx_index_free(struct agentx_index *); 9981180db9Smartijn struct agentx_object *agentx_object(struct agentx_region *, uint32_t[], 10081180db9Smartijn size_t, struct agentx_index *[], size_t, int, 10181180db9Smartijn void (*)(struct agentx_varbind *)); 10281180db9Smartijn void agentx_object_free(struct agentx_object *); 10381180db9Smartijn 1041b6ededeSmartijn void agentx_varbind_integer(struct agentx_varbind *, int32_t); 10581180db9Smartijn void agentx_varbind_string(struct agentx_varbind *, const char *); 10681180db9Smartijn void agentx_varbind_nstring(struct agentx_varbind *, 10781180db9Smartijn const unsigned char *, size_t); 10881180db9Smartijn void agentx_varbind_printf(struct agentx_varbind *, const char *, ...) 10981180db9Smartijn __attribute__((__format__ (printf, 2, 3))); 11081180db9Smartijn void agentx_varbind_null(struct agentx_varbind *); 11181180db9Smartijn void agentx_varbind_oid(struct agentx_varbind *, const uint32_t[], 11281180db9Smartijn size_t); 11381180db9Smartijn void agentx_varbind_object(struct agentx_varbind *, 11481180db9Smartijn struct agentx_object *); 11581180db9Smartijn void agentx_varbind_index(struct agentx_varbind *, 11681180db9Smartijn struct agentx_index *); 11781180db9Smartijn void agentx_varbind_ipaddress(struct agentx_varbind *, 11881180db9Smartijn const struct in_addr *); 11981180db9Smartijn void agentx_varbind_counter32(struct agentx_varbind *, uint32_t); 12081180db9Smartijn void agentx_varbind_gauge32(struct agentx_varbind *, uint32_t); 121036f0da0Smartijn void agentx_varbind_unsigned32(struct agentx_varbind *, uint32_t); 12281180db9Smartijn void agentx_varbind_timeticks(struct agentx_varbind *, uint32_t); 12381180db9Smartijn void agentx_varbind_opaque(struct agentx_varbind *, const char *, size_t); 12481180db9Smartijn void agentx_varbind_counter64(struct agentx_varbind *, uint64_t); 12581180db9Smartijn void agentx_varbind_notfound(struct agentx_varbind *); 12681180db9Smartijn void agentx_varbind_error(struct agentx_varbind *); 12781180db9Smartijn 12881180db9Smartijn enum agentx_request_type agentx_varbind_request( 12981180db9Smartijn struct agentx_varbind *); 13081180db9Smartijn struct agentx_object * 13181180db9Smartijn agentx_varbind_get_object(struct agentx_varbind *); 1321b6ededeSmartijn int32_t agentx_varbind_get_index_integer(struct agentx_varbind *, 13381180db9Smartijn struct agentx_index *); 13481180db9Smartijn const unsigned char *agentx_varbind_get_index_string( 13581180db9Smartijn struct agentx_varbind *, struct agentx_index *, size_t *, int *); 13681180db9Smartijn const uint32_t *agentx_varbind_get_index_oid(struct agentx_varbind *, 13781180db9Smartijn struct agentx_index *, size_t *, int *); 13881180db9Smartijn const struct in_addr *agentx_varbind_get_index_ipaddress( 13981180db9Smartijn struct agentx_varbind *, struct agentx_index *); 14081180db9Smartijn void agentx_varbind_set_index_integer(struct agentx_varbind *, 1411b6ededeSmartijn struct agentx_index *, int32_t); 14281180db9Smartijn void agentx_varbind_set_index_string(struct agentx_varbind *, 14381180db9Smartijn struct agentx_index *, const char *); 14481180db9Smartijn void agentx_varbind_set_index_nstring(struct agentx_varbind *, 14581180db9Smartijn struct agentx_index *, const unsigned char *, size_t); 14681180db9Smartijn void agentx_varbind_set_index_oid(struct agentx_varbind *, 14781180db9Smartijn struct agentx_index *, const uint32_t *, size_t); 14881180db9Smartijn void agentx_varbind_set_index_object(struct agentx_varbind *, 14981180db9Smartijn struct agentx_index *, struct agentx_object *); 15081180db9Smartijn void agentx_varbind_set_index_ipaddress(struct agentx_varbind *, 15181180db9Smartijn struct agentx_index *, const struct in_addr *); 152