aboutsummaryrefslogtreecommitdiff
path: root/sbin/ipf/libipf/ipf_perror.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/ipf/libipf/ipf_perror.c')
-rw-r--r--sbin/ipf/libipf/ipf_perror.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/sbin/ipf/libipf/ipf_perror.c b/sbin/ipf/libipf/ipf_perror.c
new file mode 100644
index 000000000000..2c612afe2be3
--- /dev/null
+++ b/sbin/ipf/libipf/ipf_perror.c
@@ -0,0 +1,40 @@
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include "ipf.h"
+
+void
+ipf_perror(int err, char *string)
+{
+ if (err == 0)
+ fprintf(stderr, "%s\n", string);
+ else
+ fprintf(stderr, "%s: %s\n", string, ipf_strerror(err));
+}
+
+int
+ipf_perror_fd( int fd, ioctlfunc_t iocfunc, char *string)
+{
+ int save;
+ int realerr;
+
+ save = errno;
+ if ((*iocfunc)(fd, SIOCIPFINTERROR, &realerr) == -1)
+ realerr = 0;
+
+ errno = save;
+ fprintf(stderr, "%d:", realerr);
+ ipf_perror(realerr, string);
+ return (realerr ? realerr : save);
+
+}
+
+void
+ipferror(int fd, char *msg)
+{
+ if (fd >= 0) {
+ ipf_perror_fd(fd, ioctl, msg);
+ } else {
+ fprintf(stderr, "0:");
+ perror(msg);
+ }
+}