Я изучаю код инструмента netstat (Linux), который AFAIK в основном читает файл /proc/net/tcp
и довольно мило печатает из него.(Сейчас я сосредоточен на режиме -t.)
Я немного озадачен стилем кодирования, выбранным авторами:
static int tcp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)", tcp_do_one);
}
, где
#define INFO_GUTS6(file,file6,name,proc) \
char buffer[8192]; \
int rc = 0; \
int lnr = 0; \
if (!flag_arg || flag_inet) { \
INFO_GUTS1(file,name,proc) \
} \
if (!flag_arg || flag_inet6) { \
INFO_GUTS2(file6,proc) \
} \
INFO_GUTS3
где
#define INFO_GUTS3 \
return rc;
и
#if HAVE_AFINET6
#define INFO_GUTS2(file,proc) \
lnr = 0; \
procinfo = fopen((file), "r"); \
if (procinfo != NULL) { \
do { \
if (fgets(buffer, sizeof(buffer), procinfo)) \
(proc)(lnr++, buffer); \
} while (!feof(procinfo)); \
fclose(procinfo); \
}
#else
#define INFO_GUTS2(file,proc)
#endif
и т. Д.
Ясно, что мой смысл кодирования наклоняется и говорит: «Это должны быть функции».Я не вижу никакой пользы от этих макросов.Это убивает читабельность и т. Д.
Кто-нибудь знаком с этим кодом, может пролить некоторый свет на то, что здесь происходит с «INFO_GUTS», и могла ли быть (или остается) причина такой странной кодировкиstyle?
Если вам интересно их использование, полный график зависимостей выглядит следующим образом:
# /---> INFO_GUTS1 <---\
# INFO_GUTS --* INFO_GUTS2 <----*---- INFO_GUTS6
# î \---> INFO_GUTS3 <---/ î
# | |
# unix_info() igmp_info(), tcp_info(), udp_info(), raw_info()