omo obter a tabela de roteamento no MACOSX (programaticament

A questão é como posso obter a tabela de roteamento no MACOSX? Não quero dizernetstat -nr. Quero dizer como fazê-lo programaticamente usandoC. Primeiro, baixei os códigos-fonte do netstat no opensource.apple.com. Eu encontreivoid mroutepr (vazio) função em mroute.c.
Esta função se parece com a função que obtém a tabela de roteamento, mas não tenho certez

Há uma declaração de matriz:struct vif viftable [CONFIG_MAXVIFS];

Mas quando tentei compilar o mroutepr, revelei que struct vif não é declarado em / usr / include / netinet / ip_mroute.h Eu adicionei todas as inclusões necessárias. Eu o verifiquei sete vezes:))

Então eu verifico o código fonte do kernel xnu. Eu encontrei essa estrutura no kernel xnu, neste arquivo: xnu / bsd / netinet / ip_mroute.h. Havia uma definição completa de struct vif.

arece que essa estrutura está disponível apenas no modo kerne

Estou confuso
Como o struct vif pode ser declarado apenas para o código do kernel? Como netstat utilitário funciona?

Todos os itens acima estão incorretos :))) A solução está no arquivo route.
ntreestuff (vazio) função @ é o ponto de entrada para obter a tabela de roteamento. Então emnp_rtentry (rtm) função imprimimos tabela no consol

static void ntreestuff(void)
{
    size_t needed;
    int mib[6];
    char *buf, *next, *lim;
    struct rt_msghdr2 *rtm;

    mib[0] = CTL_NET;
    mib[1] = PF_ROUTE;
    mib[2] = 0;
    mib[3] = 0;
    mib[4] = NET_RT_DUMP2;
    mib[5] = 0;

    if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) 
    {
        err(1, "sysctl: net.route.0.0.dump estimate");
    }

    if ((buf = malloc(needed)) == 0) 
    {
        err(2, "malloc(%lu)", (unsigned long)needed);
    }

    if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) 
    {
        err(1, "sysctl: net.route.0.0.dump");
    }

    lim  = buf + needed;
    for (next = buf; next < lim; next += rtm->rtm_msglen) 
    {
        rtm = (struct rt_msghdr2 *)next;
        np_rtentry(rtm);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion