Программирование для Linux. Профессиональный подход
Шрифт:
program_name = argv[0];
/* Назначение стандартных установок. По умолчанию сервер
связан со всеми локальными адресами, и ему автоматически
назначается неиспользуемый порт. */
local_address.s_addr = INADDR_ANY;
port = 0;
/* He отображать развернутые сообщения. */
verbose = 0;
/* Загружать модули из каталога, в котором содержится
исполняемый файл. */
module_dir = get_self_executable_directory;
assert(module_dir != NULL);
/* Анализ опций. */
do {
next_option =
getopt_long(argc, argv, short_options,
long_options, NULL);
switch (next_option) {
case 'a':
/* Пользователь ввел -a или --address. */
{
struct hostent* local_host_name;
/* Поиск заданного адреса. */
local_host_name = gethostbyname(optarg);
if (local_host_name == NULL ||
local_host_name->h_length == 0)
/* He удалось распознать имя. */
error(optarg, "invalid host name");
else
/* Введено правильное имя */
local_address.s_addr =
*((int*)(local_host_name->h_addr_list[0]));
}
break;
case 'h':
/* Пользователь ввёл -h или --help. */
print_usage(0);
case 'm':
/* Пользователь ввел -m или --module-dir. */
{
struct stat dir_info;
/* Проверка существования каталога */
if (access(optarg, F_OK) != 0)
error(optarg, "module directory does not exist");
/* Проверка доступности каталога. */
if (access(optarg, R_OK | X_OK) != 0)
error(optarg, "module directory is not accessible");
/* Проверка того, что это каталог. */
if (stat(optarg, &dir_info) != 0 || !S_ISDIR(dir_info.st_mode))
error(optarg, "not a directory");
/* Все правильно. */
module_dir = strdup(optarg);
}
break;
case 'p':
/* Пользователь ввел -p или --port. */
{
long value;
char* end;
value = strtol(optarg, &end, 10);
if (*end != '\0')
/* В номере порта указаны не только цифры. */
print_usage(1);
/* Преобразуем номер порта в число с сетевым (обратным)
порядком следования байтов. */
port = (uint16_t)htons(value);
}
break;
case 'v':
/* Пользователь ввел -v или --verbose. */
verbose = 1;
break;
case '?':
/* Пользователь ввел непонятную опцию. */
print_usage(1);
case -1:
/* Обработка опций завершена. */
break;
default:
abort;
}
} while (next_option != -1);
/* Программа не принимает никаких дополнительных аргументов.
Если они есть, выдается сообщение об ошибке. */
if (optind != argc)
print_usage(1);
/* Отображение имени каталога, если программа работает в режиме
развернутых сообщений. */
if (verbose)
printf("modules will be loaded from %s\n", module_dir);
/* Запуск сервера. */
server_run(local_address, port);
return 0;
}
Файл
main.c
содержит следующие функции. ■ Функция
getopt_long
(см. раздел 21.3, "Функция getopt_long") вызывается для анализа опций командной строки. Опции могут задаваться в двух форматах: длинном и коротком. Описание длинных опций приведено в массиве long_options
, а коротких — в массиве short_options
. По умолчанию серверный порт имеет номер 0, а локальный адрес задан в виде константы
INADDR_ANY
. Эти установки можно переопределить с помощью опций – -port
(– p
) и -– address
(– a
) соответственно. Если пользователь ввел адрес, вызывается библиотечная функция gethostbyname
, преобразующая его в числовой Internet-адрес. [38] 38
При необходимости функция
gethostbyname
осуществляет поиск имен в DNS. Поделиться:
Популярные книги
Ботаник 2
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Дважды одаренный. Том II
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Интриганка
Приключения:
исторические приключения
9.24
рейтинг книги
Эволюционер из трущоб. Том 11
11. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Источник
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
На границе империй. Том 10. Часть 13
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 13
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сапер
1. Сапер
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.29
рейтинг книги
На границе империй. Том 6
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
Александр Агренев. Трилогия
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Путь к бессмертию 2
2. Девятихвостый Богатырь
Фантастика:
попаданцы
сказочная фантастика
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
На цепи
1. На цепи
Старинная литература:
прочая старинная литература
5.00