#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUF 8192

void an_den_drucker(char *text)
{
 FILE *p;
/*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/
 p=popen("lpr","w");
 if(p == NULL)
  {
    fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n");
    exit(0);
  }
 /*An den Drucker schreiben*/
 printf("Sende Auftrag an den Drucker......\n");
 fprintf(p, "%s", text);
 fflush(p);
 pclose(p);
}


int main()
{
  char puffer[BUF], inhalt[BUF],antwort[BUF],pid[6];
  int r_fd,w_fd,n,i;
  inhalt[0]='\0';

  if(mkfifo("fifo1.1", O_RDWR) < 0)
   {
    fprintf(stderr,"Konnte keine FIFO erzeugen!!\n");
    exit(0);
   }
  /*Empfänger ließt nur aus der FIFO*/
  r_fd=open("fifo1.1", O_RDONLY);
  if(r_fd == -1)
   {
     perror("open : ");
     exit(0);
   }

  while(1) /*Endlosschleife*/
   {
    if(n=read(r_fd,puffer,BUF)!=0){
      an_den_drucker(puffer);
      /*Pid des Aufrufenden Prozesses ermitteln*/
      n=0,i=0;
      while(puffer[n] != '\n')
          pid[i++]=puffer[n++];
      pid[++i]='\n';
      strcpy(antwort,"fifo.");
      strncat(antwort,pid,i);

      w_fd=open(antwort,O_WRONLY);
      if(w_fd==-1)
       { perror("open :"); exit(0); }
      write(w_fd,"Habe Ihre Anfrage soeben erhalten\n", sizeof("Habe Ihre Anfrage soeben erhalten\n"));
      close(w_fd);
      }
   }

 return 0;
}