- return;
-}
-
-static void tape_write (char *host, char *inst, char *val)
-{
- char file[512];
- int status;
-
- status = snprintf (file, 512, tape_filename_template, inst);
- if (status < 1)
- return;
- else if (status >= 512)
- return;
-
- rrd_update_file (host, file, val, tape_ds_def, tape_ds_num);
-}
-
-
-#if TAPE_HAVE_READ
-#define BUFSIZE 512
-static void tape_submit (char *tape_name,
- unsigned long long read_count,
- unsigned long long read_merged,
- unsigned long long read_bytes,
- unsigned long long read_time,
- unsigned long long write_count,
- unsigned long long write_merged,
- unsigned long long write_bytes,
- unsigned long long write_time)
-
-{
- char buf[BUFSIZE];
-
- if (snprintf (buf, BUFSIZE, "%u:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu",
- (unsigned int) curtime,
- read_count, read_merged, read_bytes, read_time,
- write_count, write_merged, write_bytes,
- write_time) >= BUFSIZE)
- return;
-
- plugin_submit (MODULE_NAME, tape_name, buf);
-}
-
-#undef BUFSIZE
+static int tape_init(void) {
+ kstat_t *ksp_chain;
+
+ numtape = 0;
+
+ if (kc == NULL)
+ return (-1);
+
+ for (numtape = 0, ksp_chain = kc->kc_chain;
+ (numtape < MAX_NUMTAPE) && (ksp_chain != NULL);
+ ksp_chain = ksp_chain->ks_next) {
+ if (strncmp(ksp_chain->ks_class, "tape", 4))
+ continue;
+ if (ksp_chain->ks_type != KSTAT_TYPE_IO)
+ continue;
+ ksp[numtape++] = ksp_chain;
+ }
+
+ return (0);
+} /* int tape_init */
+
+static void tape_submit(const char *plugin_instance, const char *type,
+ derive_t read, derive_t write) {
+ value_list_t vl = VALUE_LIST_INIT;
+ value_t values[] = {
+ {.derive = read}, {.derive = write},
+ };
+
+ vl.values = values;
+ vl.values_len = STATIC_ARRAY_SIZE(values);
+ sstrncpy(vl.plugin, "tape", sizeof(vl.plugin));
+ sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
+ sstrncpy(vl.type, type, sizeof(vl.type));
+
+ plugin_dispatch_values(&vl);
+} /* void tape_submit */
+
+static int tape_read(void) {
+
+#if HAVE_KSTAT_IO_T_WRITES && HAVE_KSTAT_IO_T_NWRITES && HAVE_KSTAT_IO_T_WTIME
+#define KIO_ROCTETS reads
+#define KIO_WOCTETS writes
+#define KIO_ROPS nreads
+#define KIO_WOPS nwrites
+#define KIO_RTIME rtime
+#define KIO_WTIME wtime
+#elif HAVE_KSTAT_IO_T_NWRITTEN && HAVE_KSTAT_IO_T_WRITES && \
+ HAVE_KSTAT_IO_T_WTIME
+#define KIO_ROCTETS nread
+#define KIO_WOCTETS nwritten
+#define KIO_ROPS reads
+#define KIO_WOPS writes
+#define KIO_RTIME rtime
+#define KIO_WTIME wtime
+#else
+#error "kstat_io_t does not have the required members"
+#endif
+ static kstat_io_t kio;