#ifndef	__ACL_MASTER_PROTO_INCLUDE_H__
#define	__ACL_MASTER_PROTO_INCLUDE_H__

#ifdef	__cplusplus
extern "C" {
#endif

#include "stdlib/acl_define.h"
#ifdef ACL_UNIX

#include "stdlib/acl_vstream.h"

 /*
  * Well-known socket or FIFO directories. The main difference is in file
  * access permissions.
  */
#define ACL_MASTER_CLASS_PUBLIC		"public"
#define ACL_MASTER_CLASS_PRIVATE	"private"

 /*
  * Generic triggers.
  */
#define ACL_TRIGGER_REQ_WAKEUP		'W'	/* wakeup */

 /*
  * Transport names. The master passes the transport name on the command
  * line, and thus the name is part of the master to child protocol.
  */
#define ACL_MASTER_XPORT_NAME_UNIX	"unix"	/* local IPC */
#define ACL_MASTER_XPORT_NAME_FIFO	"fifo"	/* local IPC */
#define ACL_MASTER_XPORT_NAME_INET	"inet"	/* non-local IPC */
#define	ACL_MASTER_XPORT_NAME_SOCK	"sock"	/* inet/unix IPC */
#define	ACL_MASTER_XPORT_NAME_UDP	"udp"	/* udp IPC */
/*#define ACL_MASTER_XPORT_NAME_PASS	"pass"	  local IPC */

 /*
  * Format of a status message sent by a child process to the process
  * manager. Since this is between processes on the same machine we need not
  * worry about byte order and word length.
  */
typedef struct ACL_MASTER_STATUS {
	int     pid;			/* process ID */
	unsigned gen;			/* child generation number */
	int     avail;			/* availability */
} ACL_MASTER_STATUS;

#define ACL_MASTER_GEN_NAME	"GENERATION"	/* passed via environment */

#define ACL_MASTER_STAT_TAKEN	0	/* this one is occupied */
#define ACL_MASTER_STAT_AVAIL	1	/* this process is idle */

extern int acl_master_notify(int, unsigned, int);	/* encapsulate status msg */

 /*
  * File descriptors inherited from the master process. The flow control pipe
  * is read by receive processes and is written to by send processes. If
  * receive processes get too far ahead they will pause for a brief moment.
  */
#define ACL_MASTER_FLOW_READ	3
extern ACL_VSTREAM *ACL_MASTER_FLOW_READ_STREAM;

#define ACL_MASTER_FLOW_WRITE	4
extern ACL_VSTREAM *ACL_MASTER_FLOW_WRITE_STREAM;

 /*
  * File descriptors inherited from the master process. All processes that
  * provide a given service share the same status file descriptor, and listen
  * on the same service socket(s). The kernel decides what process gets the
  * next connection. Usually the number of listening processes is small, so
  * one connection will not cause a "thundering herd" effect. When no process
  * listens on a given socket, the master process will. ACL_MASTER_LISTEN_FD is
  * actually the lowest-numbered descriptor of a sequence of descriptors to
  * listen on.
  */
#define ACL_MASTER_STATUS_FD	5	/* shared channel to parent */
extern ACL_VSTREAM *ACL_MASTER_STAT_STREAM;

#define ACL_MASTER_LISTEN_FD	6	/* accept connections here */
extern ACL_VSTREAM *ACL_MASTER_LISTEN_STREAM;

#endif /* ACL_UNIX */

#ifdef	__cplusplus
}
#endif

#endif


