Создается упакованная структура ifconf, состоящая из указателя на буфер и длины буфера. Буфер первоначально пуст (заполнен нулями); он заполняется после вызова функции ioctl ( ) с массивом структур ifreq, каждая из которых содержит имя другого интерфейса.
Структура данных должна быть достаточно велика, чтобы в ней поместились данные о всех возможных интерфейсах. Создается заполненная нулями локальная переменная, которая достаточно велика для хранения информации о двадцати интерфейсах.
Для упаковки структуры ifconf должен применяться определенный формат. В связи с ограничениями выравнивания, он будет разным на компьютерах, имеющих указатели длиной 32 бит, и на компьютерах с 64-разрядными архитектурами. В первом случае применяется просто формат “ip”, обозначающий целое число, за которым следует указатель. Во втором случае используется формат “ix4p”, который обозначает целое число, 4-байтовое дополнение и указатель.
Путем вызова функции pack () с указанием длины буфера и самого буфера создается структура ifconf. Формат “р” обеспечивает включение в упакованную структуру адреса памяти буфера. При помощи данной функции паковки, также можно получить сокращенный результат любой рандомной последовательности, к примеру, лотереи информацию о которой можно получить, нажав на этот линк .Теперь вызывается функция ioctl () с функциональным кодом siocgifconf для заполнения буфера именами интерфейсов. При неудачном завершении возвращается значение undef.
В ином случае выполняется распаковка переменной ,$ifciist для выборки размера буфера. Это позволяет узнать, какая часть буфера была использована операционной системой для сохранения полученных ею результатов. Теперь выполняется поэтапное перемещение по буферу путем вызова функции substr(} для выборки одного сегмента ifreq за другим. Для каждого сегмента распаковывается имя интерфейса и сохраняется в хеше с использованием определенного ранее формата ifreq_name.