Чтение онлайн

ЖАНРЫ

Программирование для 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,

Поделиться с друзьями: