next up previous contents
Next: Multiplexer driverek Up: Egy STREAMS loopback Previous: Loopback driver service

Egy loopback drivert használó program

A következo program bemutatja a loopback driver használatát, és az egyes ioctl hívások eredményét is lehet vele tesztelni.

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stropts.h>

/* Loopback driverben is definialt konstansok */

#define I_NOARG       65
#define I_ERRNAK      66
#define I_ERROR       67
#define I_SETHANG     68

#define IOBS          1024

struct strioctl ioc; /* Ide kerulnek az ioctl hivas opcioi */

main()
{
   int fd, work;
   char buf[IOBS];

   if ((fd=open("/dev/lpbk", O_RDWR, 0777)) == -1) {
      perror("nem tudtam megnyitni a device drivert\n");
      exit(1);
   }
   printf("Milyen szoveget kuldjek el a loopback drivernek?");

   if ((fgets(buf,IOBS,stdin)) == NULL) {
      perror("fgets failed");
      exit(1);
   }
   /* devicera iras es onnan olvasas */
   lp_wrt(fd,buf);
   lp_read(fd);
   
   /* Device ioctl teszt */
   ioc.ic_cmd = I_ERRNAK;
   ioc.ic_timout = 0;
   ioc.ic_len = 0;
   ioc.ic_dp = NULL;
   if ((work = ioctl(fd,I_STR,&ioc)) < 0) {
      perror("Ioctl rendszerhivas sikertelen");
   }
   printf("Visszateresi ertek ioctl rendszerhivasbol: %d\n",work);
   lp_wrt(fd,buf);
   lp_read(fd);

   close(fd);
}

lp_wrt(fd, s)
  int fd;
  char *mit;
{
   if (write(fd,mit,IOBS) < 0) {
      perror("Hiba a wite rendszerhivasnal");
      exit(1);
   }
}

lp_read(fd)
int fd;
{
   char retbuf[IOBS];

   if (read(fd,retbuf,IOBS) < 0) {
      perror("Hiba a read rendszerhivasnal");
      exit(1);
   }
   printf("A beolvasott szoveg:%s\n",retbuf);
}
Megjegyzés: ne becsüljük le a loopback driver lehetoségeit! Ezzel lehetoség nyílik például arra, hogy egy exec rendszerhívás végrehajtása elott a rá elküldött adatokat az exec rendszerhívással végrehajtott új program megkapja. (Ez azon múlik, hogy az exec nem zár le minden filedeszkriptort automatikusan, és a STREAMS rendszer teljes egészében a UNIX kernelen belül helyezkedik el.) A STREAMS-nek ezt a tulajdonságát használták ki akkor, amikor az ATT UNIX System V rendszeren a Berkeley sockets-eket implementálták.
(STREAMS alapú device driverek fejlesztésénél ez a driver és a korábban bemutatott "debug" modul nagyon nagy segítség!)



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