Как использовать SIOCIFDESTROY во FreeBSD?

Мое приложение создает интерфейс крана, и все работает хорошо. Но на FreeBSD, когда он выходит, интерфейс крана остается. Чтобы удалить его, я должен вручную запустить эту команду:

sudo ifconfig tap0 destroy

Но я хотел бы сделать это программно в моем приложении. Где я могу найти документы для SIOCIFDESTROY? Вот что я пробовал, когда мое приложение закрывается:

struct ifreq ifr;
memset(&ifr, '\0', sizeof(ifr));
strcpy(ifr.ifr_name, "tap0");
int sock = socket(PF_INET, SOCK_STREAM, 0);
err = ioctl(sock, SIOCIFDESTROY, &ifr);

На этом этапе ошибка равна нулю, но интерфейс крана все еще существует, когда приложение заканчивается. Кто-нибудь знает, что еще мне не хватает?

1 ответ

Решение

Хитрая часть пыталась найти документацию, чтобы описать параметр для передачи в ioctl(). Я никогда не находил ничего приличного для чтения.

Получается, что совершенно пустой ifreq с указанным именем интерфейса - это все, что нужно. В дополнение к исходному коду, который я включил в вопрос, также обратите внимание, что я закрываю дескриптор файла устройства крана перед удалением фактического интерфейса крана. Я могу только предположить, что это также может быть актуально:

    close(device_fd);
    struct ifreq ifr;
    memset(&ifr, '\0', sizeof(ifr));
    strcpy(ifr.ifr_name, "tap0");
    int sock = socket(PF_INET, SOCK_STREAM, 0);
    err = ioctl(sock, SIOCIFDESTROY, &ifr);
Другие вопросы по тегам