summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/tools.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/tools.h')
-rw-r--r--include/net-snmp/library/tools.h315
1 files changed, 315 insertions, 0 deletions
diff --git a/include/net-snmp/library/tools.h b/include/net-snmp/library/tools.h
new file mode 100644
index 0000000..b420c0f
--- /dev/null
+++ b/include/net-snmp/library/tools.h
@@ -0,0 +1,315 @@
+/**
+ * @file library/tools.h
+ * @defgroup util Memory Utility Routines
+ * @ingroup library
+ * @{
+ */
+
+#ifndef _TOOLS_H
+#define _TOOLS_H
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h> /* uintptr_t */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+ /*
+ * General acros and constants.
+ */
+#ifdef WIN32
+# define SNMP_MAXPATH MAX_PATH
+#else
+# ifdef PATH_MAX
+# define SNMP_MAXPATH PATH_MAX
+# else
+# ifdef MAXPATHLEN
+# define SNMP_MAXPATH MAXPATHLEN
+# else
+# define SNMP_MAXPATH 1024 /* Should be safe enough */
+# endif
+# endif
+#endif
+
+#define SNMP_MAXBUF (1024 * 4)
+#define SNMP_MAXBUF_MEDIUM 1024
+#define SNMP_MAXBUF_SMALL 512
+
+#define SNMP_MAXBUF_MESSAGE 1500
+
+#define SNMP_MAXOID 64
+#define SNMP_MAX_CMDLINE_OIDS 128
+
+#define SNMP_FILEMODE_CLOSED 0600
+#define SNMP_FILEMODE_OPEN 0644
+
+#define BYTESIZE(bitsize) ((bitsize + 7) >> 3)
+#define ROUNDUP8(x) ( ( (x+7) >> 3 ) * 8 )
+
+#define SNMP_STRORNULL(x) ( x ? x : "(null)")
+
+/** @def SNMP_FREE(s)
+ Frees a pointer only if it is !NULL and sets its value to NULL */
+#define SNMP_FREE(s) do { if (s) { free((void *)s); s=NULL; } } while(0)
+
+/** @def SNMP_SWIPE_MEM(n, s)
+ Frees pointer n only if it is !NULL, sets n to s and sets s to NULL */
+#define SNMP_SWIPE_MEM(n,s) do { if (n) free((void *)n); n = s; s=NULL; } while(0)
+
+ /*
+ * XXX Not optimal everywhere.
+ */
+/** @def SNMP_MALLOC_STRUCT(s)
+ Mallocs memory of sizeof(struct s), zeros it and returns a pointer to it. */
+#define SNMP_MALLOC_STRUCT(s) (struct s *) calloc(1, sizeof(struct s))
+
+/** @def SNMP_MALLOC_TYPEDEF(t)
+ Mallocs memory of sizeof(t), zeros it and returns a pointer to it. */
+#define SNMP_MALLOC_TYPEDEF(td) (td *) calloc(1, sizeof(td))
+
+/** @def SNMP_ZERO(s,l)
+ Zeros l bytes of memory starting at s. */
+#define SNMP_ZERO(s,l) do { if (s) memset(s, 0, l); } while(0)
+
+
+/**
+ * @def NETSNMP_REMOVE_CONST(t, e)
+ *
+ * Cast away constness without that gcc -Wcast-qual prints a compiler warning,
+ * similar to const_cast<> in C++.
+ *
+ * @param[in] t A pointer type.
+ * @param[in] e An expression of a type that can be assigned to the type (const t).
+ */
+#if defined(__GNUC__)
+#define NETSNMP_REMOVE_CONST(t, e) \
+ (__extension__ ({ const t tmp = (e); (t)(uintptr_t)tmp; }))
+#else
+#define NETSNMP_REMOVE_CONST(t, e) ((t)(uintptr_t)(e))
+#endif
+
+
+#define TOUPPER(c) (c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c)
+#define TOLOWER(c) (c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c)
+
+#define HEX2VAL(s) \
+ ((isalpha(s) ? (TOLOWER(s)-'a'+10) : (TOLOWER(s)-'0')) & 0xf)
+#define VAL2HEX(s) ( (s) + (((s) >= 10) ? ('a'-10) : '0') )
+
+
+/** @def SNMP_MAX(a, b)
+ Computers the maximum of a and b. */
+#define SNMP_MAX(a,b) ((a) > (b) ? (a) : (b))
+
+/** @def SNMP_MIN(a, b)
+ Computers the minimum of a and b. */
+#define SNMP_MIN(a,b) ((a) > (b) ? (b) : (a))
+
+/** @def SNMP_MACRO_VAL_TO_STR(s)
+ * Expands to string with value of the s.
+ * If s is macro, the resulting string is value of the macro.
+ * Example:
+ * \#define TEST 1234
+ * SNMP_MACRO_VAL_TO_STR(TEST) expands to "1234"
+ * SNMP_MACRO_VAL_TO_STR(TEST+1) expands to "1234+1"
+ */
+#define SNMP_MACRO_VAL_TO_STR(s) SNMP_MACRO_VAL_TO_STR_PRIV(s)
+#define SNMP_MACRO_VAL_TO_STR_PRIV(s) #s
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+ /*
+ * QUIT the FUNction:
+ * e Error code variable
+ * l Label to goto to cleanup and get out of the function.
+ *
+ * XXX It would be nice if the label could be constructed by the
+ * preprocessor in context. Limited to a single error return value.
+ * Temporary hack at best.
+ */
+#define QUITFUN(e, l) \
+ if ( (e) != SNMPERR_SUCCESS) { \
+ rval = SNMPERR_GENERR; \
+ goto l ; \
+ }
+
+ /*
+ * DIFFTIMEVAL
+ * Set <diff> to the difference between <now> (current) and <then> (past).
+ *
+ * ASSUMES that all inputs are (struct timeval)'s.
+ * Cf. system.c:calculate_time_diff().
+ */
+#define DIFFTIMEVAL(now, then, diff) \
+{ \
+ now.tv_sec--; \
+ now.tv_usec += 1000000L; \
+ diff.tv_sec = now.tv_sec - then.tv_sec; \
+ diff.tv_usec = now.tv_usec - then.tv_usec; \
+ if (diff.tv_usec > 1000000L){ \
+ diff.tv_usec -= 1000000L; \
+ diff.tv_sec++; \
+ } \
+}
+
+/**
+ * Compute res = a + b.
+ *
+ * @pre a and b must be normalized 'struct timeval' values.
+ *
+ * @note res may be the same variable as one of the operands. In other
+ * words, &a == &res || &b == &res may hold.
+ */
+#define NETSNMP_TIMERADD(a, b, res) \
+{ \
+ (res)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
+ (res)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
+ if ((res)->tv_usec >= 1000000L) { \
+ (res)->tv_usec -= 1000000L; \
+ (res)->tv_sec++; \
+ } \
+}
+
+/**
+ * Compute res = a - b.
+ *
+ * @pre a and b must be normalized 'struct timeval' values.
+ *
+ * @note res may be the same variable as one of the operands. In other
+ * words, &a == &res || &b == &res may hold.
+ */
+#define NETSNMP_TIMERSUB(a, b, res) \
+{ \
+ (res)->tv_sec = (a)->tv_sec - (b)->tv_sec - 1; \
+ (res)->tv_usec = (a)->tv_usec - (b)->tv_usec + 1000000L; \
+ if ((res)->tv_usec >= 1000000L) { \
+ (res)->tv_usec -= 1000000L; \
+ (res)->tv_sec++; \
+ } \
+}
+
+
+ /*
+ * ISTRANSFORM
+ * ASSUMES the minimum length for ttype and toid.
+ */
+#define USM_LENGTH_OID_TRANSFORM 10
+
+#define ISTRANSFORM(ttype, toid) \
+ !snmp_oid_compare(ttype, USM_LENGTH_OID_TRANSFORM, \
+ usm ## toid ## Protocol, USM_LENGTH_OID_TRANSFORM)
+
+#define ENGINETIME_MAX 2147483647 /* ((2^31)-1) */
+#define ENGINEBOOT_MAX 2147483647 /* ((2^31)-1) */
+
+
+
+
+ /*
+ * Prototypes.
+ */
+
+ NETSNMP_IMPORT
+ int snmp_realloc(u_char ** buf, size_t * buf_len);
+
+ void free_zero(void *buf, size_t size);
+
+ u_char *malloc_random(size_t * size);
+ u_char *malloc_zero(size_t size);
+ NETSNMP_IMPORT
+ int memdup(u_char ** to, const void * from, size_t size);
+
+ void netsnmp_check_definedness(const void *packet,
+ size_t length);
+
+ NETSNMP_IMPORT
+ u_int netsnmp_binary_to_hex(u_char ** dest, size_t *dest_len,
+ int allow_realloc,
+ const u_char * input, size_t len);
+
+ NETSNMP_IMPORT
+ u_int binary_to_hex(const u_char * input, size_t len,
+ char **output);
+ /* preferred */
+ int netsnmp_hex_to_binary(u_char ** buf, size_t * buf_len,
+ size_t * offset, int allow_realloc,
+ const char *hex, const char *delim);
+ /* calls netsnmp_hex_to_binary w/delim of " " */
+ NETSNMP_IMPORT
+ int snmp_hex_to_binary(u_char ** buf, size_t * buf_len,
+ size_t * offset, int allow_realloc,
+ const char *hex);
+ /* handles odd lengths */
+ NETSNMP_IMPORT
+ int hex_to_binary2(const u_char * input, size_t len,
+ char **output);
+
+ NETSNMP_IMPORT
+ int snmp_decimal_to_binary(u_char ** buf, size_t * buf_len,
+ size_t * out_len,
+ int allow_realloc,
+ const char *decimal);
+#define snmp_cstrcat(b,l,o,a,s) snmp_strcat(b,l,o,a,(const u_char *)s)
+ NETSNMP_IMPORT
+ int snmp_strcat(u_char ** buf, size_t * buf_len,
+ size_t * out_len, int allow_realloc,
+ const u_char * s);
+ NETSNMP_IMPORT
+ char *netsnmp_strdup_and_null(const u_char * from,
+ size_t from_len);
+
+ NETSNMP_IMPORT
+ void dump_chunk(const char *debugtoken, const char *title,
+ const u_char * buf, int size);
+ char *dump_snmpEngineID(const u_char * buf, size_t * buflen);
+
+ /** A pointer to an opaque time marker value. */
+ typedef void *marker_t;
+ typedef const void* const_marker_t;
+
+ NETSNMP_IMPORT
+ marker_t atime_newMarker(void);
+ NETSNMP_IMPORT
+ void atime_setMarker(marker_t pm);
+ NETSNMP_IMPORT
+ void netsnmp_get_monotonic_clock(struct timeval* tv);
+ NETSNMP_IMPORT
+ void netsnmp_set_monotonic_marker(marker_t *pm);
+ NETSNMP_IMPORT
+ long atime_diff(const_marker_t first, const_marker_t second);
+ u_long uatime_diff(const_marker_t first, const_marker_t second); /* 1/1000th sec */
+ NETSNMP_IMPORT
+ u_long uatime_hdiff(const_marker_t first, const_marker_t second); /* 1/100th sec */
+ NETSNMP_IMPORT
+ int atime_ready(const_marker_t pm, int delta_ms);
+ NETSNMP_IMPORT
+ int netsnmp_ready_monotonic(const_marker_t pm, int delta_ms);
+ int uatime_ready(const_marker_t pm, unsigned int delta_ms);
+
+ int marker_tticks(const_marker_t pm);
+ int timeval_tticks(const struct timeval *tv);
+ NETSNMP_IMPORT
+ char *netsnmp_getenv(const char *name);
+ NETSNMP_IMPORT
+ int netsnmp_setenv(const char *envname, const char *envval,
+ int overwrite);
+
+ int netsnmp_addrstr_hton(char *ptr, size_t len);
+
+ NETSNMP_IMPORT
+ int netsnmp_string_time_to_secs(const char *time_string);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _TOOLS_H */
+/* @} */