1 #include <net-snmp/net-snmp-config.h> /* local SNMP configuration details */
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>
19 #include "util_funcs.h" /* utility function declarations */
20 #include "memory.h" /* the module-specific header */
21 #include "memory_solaris2.h" /* the module-specific header */
31 static char errmsg[300];
32 /****************************
33 * Kstat specific variables *
34 ****************************/
35 extern kstat_ctl_t *kstat_fd; /* defined in kernel_sunos5.c */
37 kstat_named_t *kn, *kn2;
39 static FindVarMethod var_extensible_mem;
40 static long getFreeSwap(void);
41 static long getTotalFree(void);
42 static long getTotalSwap(void);
45 init_memory_solaris2(void)
48 struct variable2 extensible_mem_variables[] = {
49 {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}},
50 {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
52 {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
54 {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
56 {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
58 {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
60 {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
62 {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
64 {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
66 {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
68 {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
70 {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
72 {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
74 {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
76 {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
78 {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
80 {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}}
84 * Define the OID pointer to the top of the mib tree that we're
85 * registering underneath
87 oid mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
90 * register ourselves with the agent to handle our mib tree
92 REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2,
95 snmpd_register_config_handler("swap", memory_parse_config,
96 memory_free_config, "min-avail");
99 kstat_fd = kstat_open();
101 snmp_log(LOG_ERR, "kstat_open(): failed\n");
107 var_extensible_mem(struct variable *vp,
111 size_t * var_len, WriteMethod ** write_method)
113 static long long_ret;
116 * Initialize the return value to 0
120 if (header_generic(vp, name, length, exact, var_len, write_method))
126 return ((u_char *) (&long_ret));
127 case ERRORNAME: /* dummy name */
128 sprintf(errmsg, "swap");
129 *var_len = strlen(errmsg);
130 return ((u_char *) (errmsg));
132 long_ret = getTotalSwap() * (getpagesize() / 1024);
133 return ((u_char *) (&long_ret));
135 long_ret = getFreeSwap() * (getpagesize() / 1024);
136 return ((u_char *) (&long_ret));
138 long_ret = minimumswap;
139 return ((u_char *) (&long_ret));
141 #ifdef _SC_PHYS_PAGES
142 long_ret = sysconf(_SC_PHYS_PAGES) * (getpagesize()/1024);
144 ksp1 = kstat_lookup(kstat_fd, "unix", 0, "system_pages");
145 kstat_read(kstat_fd, ksp1, 0);
146 kn = kstat_data_lookup(ksp1, "physmem");
148 long_ret = kn->value.ul * (getpagesize() / 1024);
150 return ((u_char *) (&long_ret));
152 #ifdef _SC_AVPHYS_PAGES
153 long_ret = sysconf(_SC_AVPHYS_PAGES) * (getpagesize()/1024);
156 (getTotalFree() - getFreeSwap()) * (getpagesize() / 1024);
158 return ((u_char *) (&long_ret));
160 long_ret = getTotalFree() * (getpagesize() / 1024);
161 return ((u_char *) (&long_ret));
164 long_ret = getTotalFree() * (getpagesize() / 1024);
165 long_ret = (long_ret > minimumswap) ? 0 : 1;
166 return ((u_char *) (&long_ret));
169 long_ret = getTotalFree() * (getpagesize() / 1024);
170 if ((long_ret > minimumswap) ? 0 : 1)
171 sprintf(errmsg, "Running out of swap space (%ld)", long_ret);
174 *var_len = strlen(errmsg);
175 return ((u_char *) (errmsg));
182 #define DEFAULTMINIMUMSWAP 16000 /* kilobytes */
185 memory_parse_config(const char *token, char *cptr)
187 minimumswap = atoi(cptr);
191 memory_free_config(void)
193 minimumswap = DEFAULTMINIMUMSWAP;
208 num = swapctl(SC_GETNSWP, 0);
209 s = malloc(num * sizeof(swapent_t) + sizeof(struct swaptable));
211 strtab = (char *) malloc((num + 1) * MAXSTRSIZE);
213 for (i = 0; i < (num + 1); i++) {
214 s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
217 n = swapctl(SC_LIST, s);
219 for (i = 0; i < n; i++)
220 total_mem += s->swt_ent[i].ste_pages;
231 * returns -1 if malloc fails.
243 num = swapctl(SC_GETNSWP, 0);
244 s = malloc(num * sizeof(swapent_t) + sizeof(struct swaptable));
246 strtab = (char *) malloc((num + 1) * MAXSTRSIZE);
249 for (i = 0; i < (num + 1); i++) {
250 s->swt_ent[i].ste_path = strtab + (i * MAXSTRSIZE);
253 n = swapctl(SC_LIST, s);
255 for (i = 0; i < n; i++)
256 free_mem += s->swt_ent[i].ste_free;
269 unsigned long free_mem, allocated, reserved, available, used_size;
272 if (-1 == swapctl(SC_AINFO, &ai)) {
273 snmp_log(LOG_ERR, "error swapctl\n");
275 allocated = ai.ani_max - ai.ani_free;
276 reserved = (ai.ani_resv - allocated);
277 available = (ai.ani_max - ai.ani_resv); /* K-byte */
278 free_mem = used_size = reserved + allocated;
279 free_mem = available;