next up previous contents
Next: Egy egyszeru debug Up: A STREAMS driverek Previous: Driver installálás ISC

Még egy példa: a birka modul

A következo lista egy "birka" modul listáját tartalmazza. A modul nem bánt semmit, ami rajta átmegy (innen ered a neve is). A modul az üzenet továbbításához a putnext() kernel makrot használja.


#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
#define NULL   ((char *)(0))

extern nulldev();
static int birkwrite(), birkopen(), birkclose();

static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
  { 0xa0,      /* Modulazonosito szam */
    "birk",    /* Modul neve */
    0,         /* Minimalis message-meret */
    INFPSZ,    /* Maximalis message-meret - INFPSZ=vegtelen */
    0, 0       /* High; low water mark; 0=nincs ellenorzes */
  };

static struct qinit birkwinit =
  /* "write" queue */
  { birkwrite, /* A message feldolgozasat vegzo eljaras */
    nulldev,   /* Service procedure - itt nincs */
    birkopen,  /* open-nel ill. PUSH-nal meghivott rutin - comment */
    birkclose, /* utolso close-nal vagy pop-nal vegrehajtva - comment*/
    nulldev,   /* admin bejegyzes (csak a 3bnet-hez kell) */
    &modinfo,  /* Modulinformacios struktura */
    NULL       /* Statisztikakat tartalmazo tablazat */
  };

static struct qinit birkrinit =
  /* "read" queue */
  { birkwrite, /* Message feldolgozasa */
    nulldev,   /* Service proc. nincs */
    birkopen,  /* open-nel, PUSH-nal meghivott rutin */
    birkclose, /* utolso close-nal vagy pop-nal meghivott r. */
    nulldev,   /* admin bejegyzes */
    &modinfo,  /* Modulinformacios struktura */
    NULL       /* Statisztikakat tartalmazo tablazat cime */
  };

struct streamtab birkinfo =
  /* A kernel ez alapjan tud tajekozodni a driverben */
  { &birkrinit, /* Read queue-rol informaciok */
    &birkwinit, /* Write queue-rol informaciok */
    NULL,       /* Multiplex. read queue */
    NULL        /* Multiplex write queue */
  };

static int birkwrite(q,mp)     /* "put" rutin */
  queue_t *q;   /* Pointer a WRITE-queue-ra */
  mblk_t *mp;   /* Az adatra pointer */
{
  putnext(q, mp); /* A megkapott uzenet tovabbitasa */
  /*
     Ha a fenti sor helyett csak egy
  freemsg(mp);
     sor lenne, akkor ez a korabbi driver modul megfeleloje lenne
  */
}

static int birkopen(q, dev, flag, sflag)
  queue_t *q;
  dev_t   dev;
  int     flag,sflag;
{
  /*
     Mivel minden queuen egyforman nem csinal semmit a modul, ezert
     nem kell semmi informaciot elrakni
  */
  return 0; /* Minden O.K. */
}

static int birkclose(q)
  queue_t *q;
{
  return 0; /* Minden O.K. */
}



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996