text: #include	<sys/types.h>	/* basic system data types */
  #include	<sys/time.h>	/* timeval{} for select() */
  #include	<time.h>		/* timespec{} for pselect() */
  #include	<errno.h>
  #include	<fcntl.h>		/* for nonblocking */
  #include	<limits.h>		/* PIPE_BUF */
  #include	<signal.h>
  #include	<stdio.h>
  #include	<stdlib.h>
  #include	<string.h>
  #include	<sys/stat.h>	/* for S_xxx file mode constants */
  #include	<unistd.h>
  #include	<sys/wait.h>
  #include	<stdarg.h>		/* ANSI C header file */
  #include	<syslog.h>		/* for syslog() *
  
  #define	MAX_PATH	1024
  /* $$.ix [MAX_PATH]~constant,~definition~of$$ */
  #define	MAXLINE		4096	/* max text line length */
  /* $$.ix [MAXLINE]~constant,~definition~of$$ */
  /* $$.ix [BUFFSIZE]~constant,~definition~of$$ */
  #define	BUFFSIZE	8192	/* buffer size for reads and writes */
  
  #define	FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  					/* default permissions for new files */
  /* $$.ix [FILE_MODE]~constant,~definition~of$$ */
  #define	DIR_MODE	(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
  					/* default permissions for new directories */
  /* $$.ix [DIR_MODE]~constant,~definition~of$$ */
  
  #define	SVMSG_MODE	(MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)
  					/* default permissions for new SV message queues */
  /* $$.ix [SVMSG_MODE]~constant,~definition~of$$ */
  
  static void	err_doit(int, int, const char *, va_list);
  
  
  /* Nonfatal error related to a system call.
   * Print a message and return. */
  
  /* $$.ix [err_ret]~function,~source~code$$ */
  void
  err_ret(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, LOG_INFO, fmt, ap);
  	va_end(ap);
  	return;
  }
  
  /* Fatal error related to a system call.
   * Print a message and terminate. */
  
  /* $$.ix [err_sys]~function,~source~code$$ */
  void
  err_sys(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, LOG_ERR, fmt, ap);
  	va_end(ap);
  	exit(1);
  }
  
  /* Fatal error related to a system call.
   * Print a message, dump core, and terminate. */
  
  /* $$.ix [err_dump]~function,~source~code$$ */
  void
  err_dump(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, LOG_ERR, fmt, ap);
  	va_end(ap);
  	abort();		/* dump core and terminate */
  	exit(1);		/* shouldn't get here */
  }
  
  /* Nonfatal error unrelated to a system call.
   * Print a message and return. */
  
  /* $$.ix [err_msg]~function,~source~code$$ */
  void
  err_msg(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(0, LOG_INFO, fmt, ap);
  	va_end(ap);
  	return;
  }
  
  /* Fatal error unrelated to a system call.
   * Print a message and terminate. */
  
  /* $$.ix [err_quit]~function,~source~code$$ */
  void
  err_quit(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(0, LOG_ERR, fmt, ap);
  	va_end(ap);
  	exit(1);
  }
  
  /* Print a message and return to caller.
   * Caller specifies "errnoflag" and "level". */
  
  /* $$.ix [err_doit]~function,~source~code$$ */
  static void
  err_doit(int errnoflag, int level, const char *fmt, va_list ap)
  {
  	int		errno_save, n;
  	char	buf[MAXLINE];
  
  	errno_save = errno;		/* value caller might want printed */
  #ifdef	HAVE_VSNPRINTF
  	vsnprintf(buf, sizeof(buf), fmt, ap);	/* this is safe */
  #else
  	vsprintf(buf, fmt, ap);					/* this is not safe */
  #endif
  	n = strlen(buf);
  	if (errnoflag)
  		snprintf(buf+n, sizeof(buf)-n, ": %s", strerror(errno_save));
  	strcat(buf, "\n");
  
  	if (0) {
  		syslog(level, buf);
  	} else {
  		fflush(stdout);		/* in case stdout and stderr are the same */
  		fputs(buf, stderr);
  		fflush(stderr);
  	}
  	return;
  }
  