sizeof(sa_family_t))
158 #else
159 #define _SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t))
160 #endif
161 #define __SS_PAD2SIZE (__SS_MAXSIZE — 2*__SS_ALIGNSIZE)
162 struct sockaddr_storage {
163 #ifdef HAVE_SOCKADDR_SA_LEN
164 u_char ss_len;
165 #endif
166 sa_family_t ss_family;
167 char __ss_pad1[__SS_PAD1SIZE];
168 int64_t ss_align;
169 char __ss_pad2[_SS_PAD2SIZE];
170 };
171 #endif
172 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
173 /* заданные по умолчанию разрешения на доступ для новых файлов */
174 #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
175 /* разрешения по умолчанию на доступ к файлам для новых каталогов */
176 typedef void Sigfunc(int); /* для обработчиков сигналов */
177 #define min(a, b) ((а) < (b) ? (a) : (b))
178 #define max(a, b) ((a) > (b) ? (a) : (b))
179 #ifndef HAVE_ADDRINFO_STRUCT
180 #include "../lib/addrinfo.h"
181 #endif
182 #ifndef HAVE_IF_NAMEINDEX_STRUCT
183 struct if_nameindex {
184 unsigned int if_index; /* 1, 2, ... */
185 char *if_name; /* имя, заканчивающееся нулем: "le0", ... */
186 };
187 #endif
188 #ifndef HAVE_TIMESPEC_STRUCT
189 struct timespec {
190 time_t tv_sec; /* секунды */
191 long tv_nsec; /* и наносекунды */
192 };
193 #endif
Г.2. Заголовочный файл config.h
Для обеспечения переносимости всего исходного кода, используемого в тексте книги, применялась утилита GNU
autoconf
. Ее можно загрузить по адресу
http://ftp.gnu.org/gnu/autoconf
. Эта программа генерирует сценарий интерпретатора с названием configure, который надо запустить после загрузки программного обеспечения в свою систему. Этот сценарий определяет, какие свойства обеспечивает ваша система Unix: имеется ли в структуре адреса сокета поле длины, поддерживается ли многоадресная передача, поддерживаются ли структуры адреса сокета канального уровня, и т.д. В результате получается файл с названием
config.h
. Этот файл — первый заголовочный файл, включенный в
unp.h
(см. предыдущий раздел). В листинге Г.2 показан заголовочный файл
config.h
для BSD/OS 3.0.
Строки, начинающиеся с
#define
, относятся к тем свойствам, которые обеспечены данной системой. Закомментированные строки и строки, начинающиеся с
#undef
, относятся к свойствам, данной системой не поддерживаемым.
Листинг Г.2. Заголовочный файл config.h для BSD/OS
i386-pc-bsdi3.0/config.h
1 /* config.h. Автоматически генерируется сценарием configure. */
2 /* Определяем константы, если имеется соответствующий заголовочный файл */
3 #define CPU_VENDOR_OS "i386-pc-bsdi3.0"
4 /* #undef HAVE_NETCONFIG_H */ /* <netconfig.h> */
5 /* #undef HAVE_NETDIR_H */ /* <netdir.h> */
6 #define HAVE_PTHREAD_H 1 /* <pthread.h> */
7 #define HAVE_STRINGS_H 1 /* <strings.h> */
8 /* #undef HAVE_XTI_INET_H */ /* <xti_inet.h> */
9 #define HAVE_SYS_FILIO_H 1 /* <sys/filio.h> */
10 #define HAVE_SYS_IOCTL_H 1 /* <sys/ioctl.h> */
11 #define HAVE_SYS_SELECT_H 1 /* <sys/select.h> */
12 #define HAVE_SYS_SOCKIO_H 1 /* <sys/sockio.h> */
13 #define HAVE_SYS_SYSCTL_H 1 /* <sys/sysctl.h> */
14 #define HAVE_SYS_TIME_H 1 /* <sys/time.h> */
15 /* Определена, если можно подключить <time.h> и <sys/time.h> */
16 #define TIME_WITH_SYS_TIME 1
17 /* Определены, если имеются соответствующие функции */
18 #define HAVE_BZERO 1
19 #define HAVE_GETHOSTBYNAME2 1
20 /* #undef HAVE_PSELECT */
21 #define HAVE_VSNPRINTF 1
22 /* Определены, если прототипы функций есть в заголовочном файле */
23 /* #undef HAVE_GETADDRINFO_PROTO */ /* <netdb.h> */
24 /* #undef HAVE_GETNAMEINFO_PROTO */ /* <netdb.h> */
25 #define HAVE_GETHOSTNAME_PROTO 1 /* <unistd.h> */
26 #define HAVE_GETRUSAGE_PROTO 1 /* <sys/resource.h> */
27 #define HAVE_HSTRERROR_PROTO 1 /* <netdb.h> */
28 /* #undef HAVE_IF_NAMETOINDEX_PROTO */ /* <net/if.h> */
29 #define HAVE_INET_ATON_PROTO 1 /* <arpa/inet.h> */