1 #include <net-snmp/net-snmp-config.h>
4 # ifdef HAVE_SYS_SWAP_H
7 # ifdef HAVE_SYS_PARAM_H
8 # include <sys/param.h>
15 #include <net-snmp/net-snmp-includes.h>
16 #include <net-snmp/agent/net-snmp-agent-includes.h>
17 #include <net-snmp/agent/auto_nlist.h>
20 #include "util_funcs.h" /* utility function declarations */
21 #include "memory.h" /* the module-specific header */
22 #include "memory_dynix.h" /* the module-specific header */
25 static char errmsg[300];
27 static FindVarMethod var_extensible_mem;
28 static long getFreeSwap(void);
29 static long getTotalSwap(void);
30 static long getTotalFree(void);
33 init_memory_dynix(void)
36 struct variable2 extensible_mem_variables[] = {
37 {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}},
38 {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
40 {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
42 {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
44 {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
46 {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
48 {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
50 {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
52 {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
54 {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
56 {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
58 {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
60 {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
62 {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
64 {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
66 {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
68 {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}}
72 * Define the OID pointer to the top of the mib tree that we're
73 * registering underneath
75 oid mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
78 * register ourselves with the agent to handle our mib tree
80 REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2,
83 snmpd_register_config_handler("swap", memory_parse_config,
84 memory_free_config, "min-avail");
89 var_extensible_mem(struct variable *vp,
93 size_t * var_len, WriteMethod ** write_method)
98 * Initialize the return value to 0
102 if (header_generic(vp, name, length, exact, var_len, write_method))
108 return ((u_char *) (&long_ret));
109 case ERRORNAME: /* dummy name */
110 sprintf(errmsg, "swap");
111 *var_len = strlen(errmsg);
112 return ((u_char *) (errmsg));
114 long_ret = S2KB(getTotalSwap());
115 return ((u_char *) (&long_ret));
117 long_ret = S2KB(getFreeSwap());
118 return ((u_char *) (&long_ret));
120 long_ret = minimumswap;
121 return ((u_char *) (&long_ret));
123 long_ret = P2KB(sysconf(_SC_PHYSMEM));
124 return ((u_char *) (&long_ret));
126 long_ret = P2KB(sysconf(_SC_FREEMEM));
127 return ((u_char *) (&long_ret));
129 long_ret = getTotalFree();
130 return ((u_char *) (&long_ret));
133 long_ret = getTotalFree();
134 long_ret = (long_ret > minimumswap) ? 0 : 1;
135 return ((u_char *) (&long_ret));
138 long_ret = getTotalFree();
139 if ((long_ret > minimumswap) ? 0 : 1)
140 sprintf(errmsg, "Running out of swap space (%ld)", long_ret);
143 *var_len = strlen(errmsg);
144 return ((u_char *) (errmsg));
151 #define DEFAULTMINIMUMSWAP 16384 /* kilobytes */
154 memory_parse_config(const char *token, char *cptr)
156 minimumswap = atoi(cptr);
160 memory_free_config(void)
162 minimumswap = DEFAULTMINIMUMSWAP;
168 * return is in sectors
173 long total_swp_sectors = -1;
175 size_t max_elements = MAXSWAPDEVS;
176 swapsize_t swap_dblks[MAXSWAPDEVS];
177 swapstat_t swap_status;
181 getswapstat(max_elements, swap_dblks, &swap_status) >= 0))
183 swap_dblks[0].sws_size * swap_dblks[0].sws_total;
185 return (total_swp_sectors);
189 * return is in sectors
194 long free_swp_sectors = -1;
196 size_t max_elements = MAXSWAPDEVS;
197 swapsize_t swap_dblks[MAXSWAPDEVS];
198 swapstat_t swap_status;
202 getswapstat(max_elements, swap_dblks, &swap_status) >= 0)) {
203 for (i = 0; i < swap_sizes; i++)
205 swap_dblks[0].sws_size * swap_dblks[i].sws_avail;
208 return (free_swp_sectors);
212 * return is in kilobytes
217 long free_swap = S2KB(getFreeSwap());
218 long free_mem = P2KB(sysconf(_SC_FREEMEM));
225 free_mem += free_swap;