#include <sys/types.h>
#include <sys/stream.h>
#include <sys/cmn_err.h>
#include <sys/errno.h>
#include <sys/sysmacros.h>
#define NULL ((char *)(0))
extern nulldev();
static int lpbkwrite(), lpbkopen(), lpbkclose(), lpbkserv();
static struct module_info modinfo =
/* A stream queue jellemzoit irja le */
{ 0, /* Modulazonosito szam */
(char *)0, /* Modul neve */
0, /* Minimalis message-meret */
INFPSZ, /* Maximalis message-meret */
1024, 512 /* High; low water mark; 0=nincs ellenorzes */
};
static struct qinit lpbkwinit =
/* "write" queue - lefele halado uzenetek queueja */
{ putq, /* A message megy a service rutinnak */
lpbkserv, /* Service procedure */
lpbkopen, /* open-nel meghivott rutin */
lpbkclose, /* utolso close-nal lesz vegrehajtva */
nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat */
};
static struct qinit lpbkrinit =
/* "read" queue */
{ nulldev, /* Message feldolgozasa */
lpbkserv, /* Service procedure */
lpbkopen, /* open-nel meghivott rutin */
lpbkclose, /* utolso close-nal meghivott rutin */
nulldev, /* admin bejegyzes */
&modinfo, /* Modulinformacios struktura */
NULL /* Statisztikakat tartalmazo tablazat cime */
};
struct streamtab lpbkinfo =
/* A kernel ez alapjan tud tajekozodni a driverben */
{ &lpbkrinit, /* Read queue-rol informaciok */
&lpbkwinit, /* Write queue-rol informaciok */
NULL, /* Multiplexer read queue */
NULL /* Multiplexer write queue */
};
Itt érdemes megjegyezni azt, hogy ha a driver valamelyik queueja
tartalmaz service rutint, és a put rutin azon a queuen nem
csinálna semmit az üzenettel, csak továbbadná, akkor az ahhoz a sorhoz
tartozó qinit strukturában put rutinként jegyezzük be a
putq() kernel segédrutint. Itt kihasználtuk azt, hogy a putq()
egy függvény, és nem makro, ezért a memóriabeli címére hivatkozhatunk.