#ifndef __EIGHDR
#define __EIGHDR

#include  <sys/types.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <unistd.h>
#include  <ctype.h>

#define   MAX_ZEICHEN	4096
#define   WARNUNG	0
#define   WARNUNG_SYS	1
#define   FATAL		2
#define   FATAL_SYS	3
#define   DUMP		4

/* Aufrufer von log_meld oder log_open muss debug setzen: */
/* 0, wenn interaktiv und 1, wenn Daemon-Prozess.         */
extern int debug;

/* IMO nuetzliche Macros */
#define min(x,y)	((x) < (y) ? (x) : (y))
#define max(x,y)	((x) > (y) ? (x) : (y))

/* Eigene Typdefinitionen */
typedef enum	{ FALSE=0, TRUE=1 } bool;
typedef void	sigfunk(int); /* Datentyp fuer Signalhandler */

/* Zentrale Fehlerroutinen */
extern void	fehler_meld(int kennung, const char *fmt,...);
extern void	log_meld(int kennung, const char *fmt,...);

/* log_open (initialisiert syslog() bei einem Daemon-Prozess) */
extern void	log_open(const char *kennung, int option, int facility);

/* Synchronisationsroutinen */
extern void	INIT_SYNC(void);	/* Synchronisation initialisieren */
extern void	HALLO_PAPA(pid_t pid);	/* Kind signalisiert Elternprozess das es fertig ist */
extern void	WARTE_AUF_PAPA(void);	/* Kind wartet auf Signal vom Elternprozess */
extern void	HALLO_KIND(pid_t pid);	/* Elternprozess signalisiert Kind das es fertig ist */
extern void	WARTE_AUF_KIND(void);	/* Elternprozess waret auf Signal vom Kind */

/* Funktionen aus sperre.c */
extern int	sperre_einaus(int fd, int kdo, int sperr_typ, off_t offset, int wie, off_t laenge);
extern pid_t	sperre_testen(int fd, int sperr_typ, off_t offset, int wie, off_t laenge);

/* Einrichten der Sperre */
#define lese_sperre(fd,offset,wie,laenge) \
    sperre_einaus(fd, F_SETLK, F_RDLCK, offset, wie, laenge)
#define lesewarte_sperre(fd,offset,wie,laenge) \
    sperre_einaus(fd, F_SETLKW, F_RDLCK, offset, wie, laenge)
#define schreib_sperre(fd,offset,wie,laenge) \
    sperre_einaus(fd, F_SETLK, F_WRLCK, offset, wie, laenge)
#define schreibwarte_sperre(fd,offset,wie,laenge) \
    sperre_einaus(fd, F_SETLKW, F_WRLCK, offset, wie, laenge)

/* Aufheben der Sperre */
#define sperre_aufheben(fd,offset,wie,laenge) \
    sperre_einaus(fd, F_SETLK, F_UNLCK, offset, wie, laenge)

/* Testen einer Sperre */
#define lesesperre_vorhanden(fd,offset,wie,laenge) \
    sperre_testen(fd, F_RDLCK, offset, wie, laenge)
#define schreibsperre_vorhanden(fd,offset,wie,laenge) \
    sperre_testen(fd, F_WRLCK, offset, wie, laenge)
#endif
