Я изучаю код инструмента netstat (Linux), который AFAIK в основном читает / proc / net / tcp
файл и dowa красиво распечатывает его. (Сейчас я сосредоточен на режиме -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» и могла ли быть (или до сих пор есть) причина для такого странного стиля кодирования?
Если вам интересно узнать об их использовании, полный граф зависимостей выглядит следующим образом:
# /---> INFO_GUTS1 <---\
# INFO_GUTS --* INFO_GUTS2 <----*---- INFO_GUTS6
# î \---> INFO_GUTS3 <---/ î
# | |
# unix_info() igmp_info(), tcp_info(), udp_info(), raw_info()