/* $Id$ * $URL$ * * plugin for /proc/diskstats parsing * * Copyright (C) 2003 Michael Reinelt * Copyright (C) 2004 The LCD4Linux Team * * This file is part of LCD4Linux. * * LCD4Linux is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * LCD4Linux is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /* * exported functions: * * int plugin_init_diskstats (void) * adds functions to access /proc/stat * */ #include "config.h" #include #include #include #include #include #include "debug.h" #include "plugin.h" #include "hash.h" static HASH DISKSTATS; static FILE *stream = NULL; static int parse_diskstats(void) { int age; /* reread every 10 msec only */ age = hash_age(&DISKSTATS, NULL); if (age > 0 && age <= 10) return 0; if (stream == NULL) stream = fopen("/proc/diskstats", "r"); if (stream == NULL) { error("fopen(/proc/diskstats) failed: %s", strerror(errno)); return -1; } rewind(stream); while (!feof(stream)) { char buffer[1024]; char dev[64]; char *beg, *end; unsigned int num, len; if (fgets(buffer, sizeof(buffer), stream) == NULL) break; /* fetch device name (3rd column) as key */ num = 0; beg = buffer; end = beg; while (*beg) { while (*beg == ' ') beg++; end = beg + 1; while (*end && *end != ' ') end++; if (num++ == 2) break; beg = end ? end + 1 : NULL; } len = end ? (unsigned) (end - beg) : strlen(beg); if (len >= sizeof(dev)) len = sizeof(dev) - 1; strncpy(dev, beg, len); dev[len] = '\0'; hash_put_delta(&DISKSTATS, dev, buffer); } return 0; } static void my_diskstats(RESULT * result, RESULT * arg1, RESULT * arg2, RESULT * arg3) { char *dev, *key; int delay; double value; if (parse_diskstats() < 0) { SetResult(&result, R_STRING, ""); return; } dev = R2S(arg1); key = R2S(arg2); delay = R2N(arg3); value = hash_get_regex(&DISKSTATS, dev, key, delay); SetResult(&result, R_NUMBER, &value); } int plugin_init_diskstats(void) { int i; char *header[] = { "major", "minor", "name", "reads", "read_merges", "read_sectors", "read_ticks", "writes", "write_merges", "write_sectors", "write_ticks", "in_flight", "io_ticks", "time_in_queue", "" }; hash_create(&DISKSTATS); hash_set_delimiter(&DISKSTATS, " \n"); for (i = 0; *header[i] != '\0'; i++) { hash_set_column(&DISKSTATS, i, header[i]); } AddFunction("diskstats", 3, my_diskstats); return 0; } void plugin_exit_diskstats(void) { if (stream != NULL) { fclose(stream); stream = NULL; } hash_destroy(&DISKSTATS); } a>reinelt4-49/+128 2004-01-16[lcd4linux @ 2004-01-16 10:09:49 by mkeil]mkeil1-12/+29 2004-01-16[lcd4linux @ 2004-01-16 07:26:25 by reinelt]reinelt5-196/+146 2004-01-16[lcd4linux @ 2004-01-16 05:04:53 by reinelt]reinelt10-32/+326 2004-01-15[lcd4linux @ 2004-01-15 07:47:02 by reinelt]reinelt7-100/+210 2004-01-15[lcd4linux @ 2004-01-15 04:32:14 by reinelt]reinelt1-0/+101 2004-01-15[lcd4linux @ 2004-01-15 04:29:45 by reinelt]reinelt10-335/+719 2004-01-14[lcd4linux @ 2004-01-14 11:33:00 by reinelt]reinelt15-160/+607 2004-01-13[lcd4linux @ 2004-01-13 10:03:01 by reinelt]reinelt8-23/+458 2004-01-13[lcd4linux @ 2004-01-13 08:18:07 by reinelt]reinelt12-154/+469 2004-01-12[lcd4linux @ 2004-01-12 03:51:01 by reinelt]reinelt5-15/+44 2004-01-11[lcd4linux @ 2004-01-11 18:26:02 by reinelt]reinelt10-79/+158 2004-01-11[lcd4linux @ 2004-01-11 09:26:15 by reinelt]reinelt4-19/+67 2004-01-10[lcd4linux @ 2004-01-10 20:22:33 by reinelt]reinelt13-210/+554 2004-01-10[lcd4linux @ 2004-01-10 17:45:26 by reinelt]reinelt2-5/+15 2004-01-10[lcd4linux @ 2004-01-10 17:36:56 by reinelt]reinelt4-10/+207 2004-01-10[lcd4linux @ 2004-01-10 17:34:40 by reinelt]reinelt3-176/+138 2004-01-10[lcd4linux @ 2004-01-10 10:20:22 by reinelt]reinelt2-14/+605 2004-01-09[lcd4linux @ 2004-01-09 17:03:06 by reinelt]reinelt10-51/+420 2004-01-09[lcd4linux @ 2004-01-09 04:16:06 by reinelt]reinelt28-193/+332 2004-01-08[lcd4linux @ 2004-01-08 06:00:28 by reinelt]reinelt1-8/+14 2004-01-08[lcd4linux @ 2004-01-08 05:28:12 by reinelt]reinelt3-42/+198 2004-01-07[lcd4linux @ 2004-01-07 10:15:41 by reinelt]reinelt4-184/+436 2004-01-06[lcd4linux @ 2004-01-06 23:01:37 by reinelt]reinelt3-4/+7 2004-01-06[lcd4linux @ 2004-01-06 22:33:13 by reinelt]reinelt14-472/+542 2004-01-06[lcd4linux @ 2004-01-06 21:14:51 by reinelt]reinelt4-14/+7 2004-01-06[lcd4linux @ 2004-01-06 18:22:41 by reinelt]reinelt1-3/+13 2004-01-06[lcd4linux @ 2004-01-06 17:56:43 by reinelt]reinelt3-1000/+2045 2004-01-06[lcd4linux @ 2004-01-06 17:37:00 by reinelt]reinelt1-0/+20 2004-01-06[lcd4linux @ 2004-01-06 17:33:45 by reinelt]reinelt6-28/+298 2004-01-06[lcd4linux @ 2004-01-06 15:19:12 by reinelt]reinelt2-104/+136 2004-01-05[lcd4linux @ 2004-01-05 11:57:38 by reinelt]reinelt7-8/+168 2004-01-02[lcd4linux @ 2004-01-02 14:20:15 by reinelt]reinelt10-0/+201 2004-01-02[lcd4linux @ 2004-01-02 14:18:54 by reinelt]reinelt2-0/+101 2003-12-19[lcd4linux @ 2003-12-19 06:27:33 by reinelt]reinelt4-8/+119