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,
sizeof(link_target));
if (rval == -1)
/* Π€ΡΠ½ΠΊΡΠΈΡ readlink() Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΡ ΠΎΠ΄ΠΈΠΌ
ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. */
abort();
else
/* ΠΠ°ΠΏΠΈΡΡ Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ. */
link_target[rval] = '\0';
/* Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°,
ΡΡΠΎΠ±Ρ ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°. */
last_slash = strrchr(link_target, '/');
if (last_slash == NULL || last_slash == link_target)
/* Π€ΠΎΡΠΌΠ°Ρ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½. */
abort();
/* ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ. */
result_length = last_slash - link_target;
result = (char*)xmalloc(result_length + 1);
/* ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°. */
strncpy(result, link_target, result_length);
result[result_length] = '\0';
return result;
}
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π·Π΄Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ .
β Π€ΡΠ½ΠΊΡΠΈΠΈ xmalloc(), xrealloc() ΠΈ xstrdup() ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ malloc(), realloc() ΠΈ strdup(), Π² ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΡΡΡΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΅ΡΠ»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠ°ΠΌΡΡΠΈ.
Π Π°Π½Π½Π΅Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅Ρ Π²Π°ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ β Ρ ΠΎΡΠΎΡΠ°Ρ ΠΈΠ΄Π΅Ρ. ΠΡΠ»ΠΈ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ, ΠΏΡΡΡΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π² ΡΠ°ΠΌΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π‘ΠΈΡΡΠ°ΡΠΈΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π½Π΅Ρ Π²Π°ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π΅ΠΏΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡ ΠΎΡΠ»Π°Π΄ΠΊΠ° Π±ΡΠ΄Π΅Ρ Π·Π°ΡΡΡΠ΄Π½Π΅Π½Π°. ΠΡΠΈΠ±ΠΊΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°ΠΊ ΡΡΠΎ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ΅ Π΅Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ β Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
β Π€ΡΠ½ΠΊΡΠΈΡ error() ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎ ΡΠ°ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠ΅ΠΉ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΡΠΈ ΡΡΠΎΠΌ Π² ΠΏΠΎΡΠΎΠΊ stderr Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΈ ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. ΠΠ»Ρ ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²Π°Ρ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ system_error(), ΠΊΠΎΡΠΎΡΠ°Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 2.2.3, "ΠΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ²").
β Π€ΡΠ½ΠΊΡΠΈΡ get_self_executable_directory() ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΡΠ²ΠΎΠΈ Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ /proc/self/exe (ΡΠΌ. ΡΠ°Π·Π΄Π΅Ρ 7.2.1, "Π€Π°ΠΉΠ» /proc/self).
Π ΡΠ°ΠΉΠ»Π΅ common.c ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π΄Π²Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
β ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ program_name ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 2.1.1, "Π‘ΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²").
β ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ verbose Π½Π΅ ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π²ΡΠ΄Π°ΡΠΈ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π² ΠΏΠΎΡΠΎΠΊ stdout ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎ Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ.
11.2.2. ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ
Π ΡΠ°ΠΉΠ»Π΅ module.c (Π»ΠΈΡΡΠΈΠ½Π³ 11.3) ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. ΠΠ°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΠ° ΡΠΈΠΏΠ° server_module, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ server.h.
ΠΠΈΡΡΠΈΠ½Π³ 11.3. (module.c) ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "server.h"
char* module_dir;
struct server_module* module_open(const char* module_name) {
char* module_path;
void* handle;
void (*module_generate)(int);
struct server_module* module;
/* Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΡΠ΅Π²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ
Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ. */
module_path =
(char*)xmalloc(strlen(module_dir) +
strlen(module_name) + 2);
sprintf(module_path, "%s/%s", module_dir, module_name);
/* ΠΠΎΠΏΡΡΠΊΠ° ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ» MODULE_PATH ΠΊΠ°ΠΊ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ. */
handle = dlopen(module_path, RTLD_NOW);
free (module_path);
if (handle == NULL) {
/* ΠΡΠΈΠ±ΠΊΠ°: Π»ΠΈΠ±ΠΎ ΠΏΡΡΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π»ΠΈΠ±ΠΎ ΡΠ°ΠΉΠ» Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ
ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ. */
return NULL;
}
/* Π§ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ module_generate ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. */
module_generatΠ΅ =
(void(*)int))dlsym(handle,
"module_generate");
/* ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π°ΠΉΠ΄Π΅Π½Π° Π»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°. */
if (module_generate == NULL) {
/* ΠΠΎΠ½ΡΡΠ°Π½ΡΠ° ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΠ°ΠΉΠ» Π½Π΅
ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ. */
dlclose(handle);
return NULL;
}
/* ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° server_module. */
module =
(struct server_module*)xmalloc
(sizeof (struct server_module));
module->handle = handle;
module->name = xstrdup(module_name);
module->generate_function = module_generate;
/* Π£ΡΠΏΠ΅ΡΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. */
return module;
}
void module_close(struct server_module* module) {
/* ΠΠ°ΠΊΡΡΡΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. */
dlclose(module->handle);
/* Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ. */
free((char*)module->name);
/* Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° module. */
free(module);
}
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 2.3.2, "Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ") ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ module_generate(). ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ HTML-ΠΊΠΎΠ΄ Web-ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π² ΡΠΎΠΊΠ΅Ρ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
Π ΡΠ°ΠΉΠ»Π΅ module.c ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
β Π€ΡΠ½ΠΊΡΠΈΡ module_open() ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π€Π°ΠΉΠ» ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ .so, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°. Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ dlopen() ΠΈ ΠΈΡΠ΅Ρ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ module_generate ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ dlsym() (ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 2.3.6, "ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ°"). ΠΡΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΎΡΠΊΡΡΡΡ ΠΈΠ»ΠΈ Π² Π½Π΅ΠΉ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π° ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° module_generate, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ NULL. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ module.
β Π€ΡΠ½ΠΊΡΠΈΡ module_close() Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ module.
Π ΡΠ°ΠΉΠ»Π΅ module.c ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠ°ΠΊΠΆΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ module_dir. Π Π½Π΅ΠΉ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΈΠΌΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΡ module_open() Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
11.2.3. Π‘Π΅ΡΠ²Π΅Ρ
Π€Π°ΠΉΠ» server.c (Π»ΠΈΡΡΠΈΠ½Π³ 11.4) ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅Π³ΠΎ HTTP-ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 11.4. (server.c) Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ HTTP-ΡΠ΅ΡΠ²Π΅ΡΠ°#include <arpa/inet.h>
#include <assert.h>
#include <errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include "server.h"
/* HTTP-ΠΎΡΠ²Π΅Ρ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π² ΡΠ»ΡΡΠ°Π΅
ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ°. */
static char* ok_response =
"HTTP/1.0 100 OK\n"
"Content-type: text/html\n"
"\n";
/* HTTP-ΠΎΡΠ²Π΅Ρ, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΡΠ΅Π»ΠΎ ΡΡΡΠ°Π½ΠΈΡΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉ
Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°. */
static char* bad_request_response =
"HTTP/1.0 400 Bad Reguest\n"
"Content-type: text/html\n"
"\n"
"<html>\n"
" <body>\n"
" <h1>Bad Request</h1>\n"
"
This server did not understand your request.
\n"