text: #include	<errno.h>		/* for definition of errno */
  #include	<stdarg.h>		/* ANSI C header file */
  #include	"ourhdr.h"
  
  static void	err_doit(int, const char *, va_list);
  
  char	*pname = NULL;		/* caller can set this from argv[0] */
  
  /* Nonfatal error related to a system call.
   * Print a message and return. */
  
  void
  /* $f err_ret $ */
  err_ret(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, fmt, ap);
  	va_end(ap);
  	return;
  }
  
  /* Fatal error related to a system call.
   * Print a message and terminate. */
  
  void
  /* $f err_sys $ */
  err_sys(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, fmt, ap);
  	va_end(ap);
  	exit(1);
  }
  
  /* Fatal error related to a system call.
   * Print a message, dump core, and terminate. */
  
  void
  /* $f err_dump $ */
  err_dump(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(1, 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. */
  
  void
  /* $f err_msg $ */
  err_msg(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(0, fmt, ap);
  	va_end(ap);
  	return;
  }
  
  /* Fatal error unrelated to a system call.
   * Print a message and terminate. */
  
  void
  /* $f err_quit $ */
  err_quit(const char *fmt, ...)
  {
  	va_list		ap;
  
  	va_start(ap, fmt);
  	err_doit(0, fmt, ap);
  	va_end(ap);
  	exit(1);
  }
  
  /* Print a message and return to caller.
   * Caller specifies "errnoflag". */
  
  static void
  err_doit(int errnoflag, const char *fmt, va_list ap)
  {
  	int		errno_save;
  	char	buf[MAXLINE];
  
  	errno_save = errno;		/* value caller might want printed */
  	vsprintf(buf, fmt, ap);
  	if (errnoflag)
  		sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
  	strcat(buf, "\n");
  	fflush(stdout);		/* in case stdout and stderr are the same */
  	fputs(buf, stderr);
  	fflush(stderr);		/* SunOS 4.1.* doesn't grok NULL argument */
  	return;
  }
  