mirror of
https://framagit.org/bortzmeyer/echoping
synced 2024-11-18 15:26:17 +00:00
111 lines
2.3 KiB
C
111 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 1996 W. Richard Stevens. All rights reserved.
|
|
* Permission to use or modify this software and its documentation only for
|
|
* educational purposes and without fee is hereby granted, provided that
|
|
* the above copyright notice appear in all copies. The author makes no
|
|
* representations about the suitability of this software for any purpose.
|
|
* It is provided "as is" without express or implied warranty.
|
|
*/
|
|
|
|
#include <errno.h> /* for definition of errno */
|
|
#include <stdarg.h> /* ANSI C header file */
|
|
#include <stdio.h> /* ANSI C header file */
|
|
#include <stdlib.h> /* ANSI C header file */
|
|
#include <string.h> /* ANSI C header file */
|
|
#include <unistd.h> /* ANSI C header file */
|
|
|
|
#define MAXLINE 4096
|
|
|
|
static void err_doit(int, const char *, va_list);
|
|
|
|
/* Nonfatal error related to a system call.
|
|
* Print a message and return. */
|
|
|
|
void
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
}
|