71 #define MCAST 1 /* поддержка многоадресной передачи */
Г.3. Стандартные функции обработки ошибок
В этой книге мы определяем набор своих собственных функций для обработки ошибок. Причина, по который мы создаем эти функции, заключается в том, что они позволяют нам обрабатывать ошибки с помощью одной строки кода, как, например, показано ниже:
if ( условие ошибки)
err_sys( формат printf с любым количеством аргументов);
вместо
if ( условие ошибки) {
char buff[200];
snprintf(buff, sizeof(buff), формат printf с любым количеством аргументов);
perror(buff);
exit(1);
}
Наши функции обработки ошибок используют следующую возможность ANSI С: список аргументов может иметь переменную длину. Более подробную информацию об этом вы найдете в разделе 7.3 книги [68].
В табл. Г.1 показано, в чем заключаются различия между функциями обработки ошибок. Если глобальная целочисленная переменная
daemon_proc
отлична от нуля, то сообщение об ошибке передается функции
syslog
с указанным уровнем, в противном случае оно отправляется в стандартный поток вывода сообщений об ошибках.
Таблица Г.1. Стандартные функции обработки ошибок
Функция
strerror (errno ?)
Завершение ?
Уровень syslog
err_dump
Да
abort;
LOG_ERR
err_msg
Нет
return;
LOG_INFO
err_quit
Нет
exit(1);
LOG_ERR
err_ret
Да
return;
LOG_INFO
err_sys
Да
exit(1);
LOG_ERR
В листинге Г.3 показаны первые пять функций из табл. Г.1.
Листинг Г.3. Стандартные функции обработки ошибок
//lib/error.c
1 #include "unp.h"
2 #include <stdarg.h> /* заголовочный файл ANSI С */
3 #include <syslog.h> /* для syslog */
4 int daemon_proc; /* устанавливается в ненулевое значение с