Программирование для Linux. Профессиональный подход
Шрифт:
extern int verbose;
/* Напоминает функцию malloc, не прерывает работу программы,
если выделить память не удалось. */
extern void* xmalloc(size_t size);
/* Напоминает функцию realloc, но прерывает работу программы,
если выделить память не удалось */
extern void* xrealloc(void* ptr, size_t size);
/* Напоминает функцию strdup, но
прерывает работу программы,
если выделить память не удалось. */
extern char* xstrdup(const char* s);
/* Выводит сообщение об ошибке заданного системного вызова
и завершает работу программы. */
extern void system_error(const char* operation);
/* Выводит сообщение об ошибке и завершает работу программы. */
extern void error(const char* cause, const char* message);
/* Возвращает имя каталога, содержащего исполняемый файл
программы. Поскольку возвращается указатель на область памяти,
вызывающая подпрограмма должна удалить ее с помощью
функции free. В случае неудачи выполнение программы
завершается. */
extern char* get_self_executable_directory;
/*** Символические константы файла module.с *********************/
/* Экземпляр загруженного серверного модуля. */
struct server_module {
/* Дескриптор библиотеки, в которой находится модуль. */
void* handle;
/* Описательное имя модуля. */
const char* name;
/* Функция, генерирующая HTML-код для модуля. */
void (*generatе_function)(int);
};
/* Каталог, из которого загружаются модули. */
extern char* module_dir;
/* Функция, пытающаяся загрузить указанный серверный модуль.
Если модуль существует, возвращается структура
с его описанием, в противном случае возвращается NULL. */
extern struct server_module* module_open(const char* module_path);
/* Закрытие модуля и удаление объекта MODULE. */
extern void module_close(struct server_module* module);
/*** Символические константы файла server.c. ********************/
/* Запуск сервера по адресу LOCAL_ADDRESS и порту PORT. */
extern void server_run(struct in_addr local_address, uint16_t port);
#endif /* SERVER_H */
11.2.1. Общие функции
Файл
common.c
(листинг 11.2)
содержит функции общего назначения, используемые в разных частях программы. Листинг 11.2. (common.c) Функции общего назначения
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "server.h"
const char* program_name;
int verbose;
void* xmalloc(size_t size) {
void* ptr = malloc(size);
/* Аварийное завершение, если выделить память не удалось. */
if (ptr == NULL)
abort;
else
return ptr;
}
void* xrealloc(void* ptr, size_t size) {
ptr = realloc(ptr, size);
/* Аварийное завершение, если выделить память не удалось. */
if (ptr == NULL)
abort;
else
return ptr;
}
char* xstrdup(const char* s) {
char* copy = strdup(s);
/* Аварийное завершение, если выделить память не удалось. */
if (сору == NULL)
abort;
else
return copy;
}
void system_error(const char* operation) {
/* Вывод сообщения об ошибке на основании значения
переменной errno. */
error(operation, strerror(errno));
}
void error(const char* cause, const char* message) {
/* Запись сообщения об ошибке в поток stderr. */
fprintf(stderr, "%s: error: (%s) %s\n", program_name,
cause, message);
/* Завершение программы */
exit(1);
}
char* get_self_executable_directory {
int rval;
char link_target[1024];
char* last_slash;
size_t result_length;
char* result;
/* Чтение содержимого символической ссылки /proc/self/exe. */
rval =
readlink("/proc/self/exe", link_target,
Поделиться с друзьями: