Изрядно почесав репу и вспомнив полученные когда-то навыки программирования я взялся-таки за исправление этого глюка. Итак, излагаю ход решения задачи.
1. Правка исходников и пересборка Самбы:
cd /usr/ports/net/samba3
make clean extract patch
cd work/samba-3.0.14a/source/smbd # может быть и другая версия
vi chgpasswd.c # или ваш любимый редактор
- ищем функцию findpty,
- в ней дорисовываем локальную переменную "int i;",
- весь кусок кода, начинающийся со строки "fstrcpy(line, "/dev/ptyXX");" и заканчивающийся "closedir(dirp);" включительно, берём в комментарии или удаляем,
- вместо него пишем следующее:
fstrcpy(line, "/dev/ptypX");
for (i = 0; i < 32; i++)
{
if (i > 9) line[9] = 'a' + i - 10; else line[9] = '0' + i;
DEBUG(3, ("findpty: try to open %s\n", line));
if ((master = sys_open(line, O_RDWR, 0)) >= 0)
{
DEBUG(3, ("findpty: opened %s\n", line));
line[5] = 't';
*slave = line;
return (master);
}
}
- сохраняем, выходим.
cd ../../../..
make build deinstall reinstall clean
2. Дальше встаёт ещё проблема, связанная с тем, что штатная FreeBSD'шная программа passwd не сообщает об успешном своём завершении, а Samba этого ждёт.
Решение этой проблемы описано здесь:
http://www.freebsd.org/cgi/query-pr.cgi?pr=76494
cd /usr/src/usr.bin/passwd
vi passwd.c
правим, добавляя после метки "end:" строку
if (pam_err == PAM_SUCCESS) fprintf(stderr, "Password Changed\n");
make install clean
3. Правка smb.conf:
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = "*New*Password*" "%n\n" "*Retype*New*Password*" "%n\n" "*Password*Changed*"
4. Запуск Самбы, проверка:
от рута:
# /usr/local/etc/rc.d/samba start
от пользователя:
% smbpasswd
Old SMB password:
New SMB password:
Retype new SMB password:
Password changed for user <имя>
Если всё так, то отлично, если нет, пишите - поглядим вместе.