aboutsummaryrefslogtreecommitdiffstats
path: root/libdvb2/README
blob: 049acd6110ec03b7ff1c864fa662c3c2e7a9dba9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Late in 2003 the idea to create a simple DVB library from the code snippets
in the test/utility programs was discussed on the linux-dvb mailing list.
Hopefully someone will invest some time in this project to turn the idea into
reality...

Here is an outline of what libdvb2 should be, according to my recollection:
(For first hand information search the linux-dvb list archives for "libdvb2".)

- C
- small: The goal is to make the library usable in *any* DVB project, which
  is easier if the library sticks to the basics. Advanced stuff can be
  done in a second library. What exacty "basic" and "advanced" means
  is subject of discussion, but I want avoid to impose a certain programming
  model (e.g. multi-threaded vw. event-loop) on users of the library.
- a prime target is to establish a standard DVB config and service list
  format, to make this sharable between different applications
- LGPL

About the name: There already is a libdvb written by the Metzler Bros.,
but the main drawback is that it is written in C++ and thus rejected
by many projects.

Johannes Stezenbach <js@convergence.de>
or: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/* $Id: plugin_diskstats.c,v 1.6 2004/06/26 12:05:00 reinelt Exp $
 *
 * plugin for /proc/diskstats parsing
 *
 * Copyright 2003 Michael Reinelt <reinelt@eunet.at>
 * Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
 *
 * 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.
 *
 *
 * $Log: plugin_diskstats.c,v $
 * Revision 1.6  2004/06/26 12:05:00  reinelt
 *
 * uh-oh... the last CVS log message messed up things a lot...
 *
 * Revision 1.5  2004/06/26 09:27:21  reinelt
 *
 * added '-W' to CFLAGS
 * changed all C++ comments to C ones
 * cleaned up a lot of signed/unsigned mistakes
 *
 * Revision 1.4  2004/06/17 10:58:58  reinelt
 *
 * changed plugin_netdev to use the new fast hash model
 *
 * Revision 1.3  2004/06/17 06:23:43  reinelt
 *
 * hash handling rewritten to solve performance issues
 *
 * Revision 1.2  2004/05/29 01:07:56  reinelt
 * bug in plugin_diskstats fixed
 *
 * Revision 1.1  2004/05/29 00:27:23  reinelt
 *
 * added plugin_diskstats.c
 *
 */

/* 
 * exported functions:
 *
 * int plugin_init_diskstats (void)
 *  adds functions to access /proc/stat
 *
 */


#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>

#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);
}