Строки 13-20. Подпрограмма change_privileges (). Эта подпрограмма принимает имена, а не числовые идентификаторы пользователя и группы, а также предпринимает попытку изменить действующие привилегии в соответствии с ними. Выполнение подпрограммы начинается с вызова функций getpwnam () и getgrnam() для получения числовых значений UID и GID, соответствующих заданным именам пользователя и группы. Если какой-либо из этих вызовов оканчивается неудачей, вызывается функция die с сообщением об ошибке (в результате выполнения подпрограммы init_log ( ) эти ошибки появятся в системном журнале). Вначале осуществляется изменение реального и действующего идентификаторов группы путем установки значений переменных $.
Список дополнительных групп устанавливается равным пустому значению с использованием общей схемы, описанной ранее, что исключает для сервера возможность наследовать членство в дополнительных группах от пользователя, который запустил его на выполнение. Затем изменяется действующий UID процесса путем присвоения заданного UID переменной $>. Важно изменить членство в группе перед изменением действующего UID, поскольку процессу разрешено изменять членство в группе только во время его работы с правами суперпользователя. Следует также отметить, что здесь не изменяется реальный UID. Это позволяет процессу снова приобрести привилегии суперпользователя, если это потребуется.