Как использовать 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);