Вот фигня какая: есть у меня прога для монтирования/демонтирования самбашар с винды. Так вот, у нее серверная часть под линух. И вот добираемся до момента — над маунтить шары. Вот что делаю:
...... err_msg( "%s = %s", sip, sss ); command = "smbmount " + sss + " " + smp +" -o password=nopass" ; if ( system( command.c_str() ) != 0 ) { err_msg( "Unable to mount share %s ", sss); } else err_msg( "Share %s has been mounted succesfully!", sss ); } .....
Эт приводит к тому, что самба пишет 1681: tree connect failed: ERRDOS — ERRnoaccess (Access denied.)
Пробую такую же команду с консоли — все работает. Пробовал даже вывод полученной команды в файл и дальнейший запуск — шара маунтится. Вот например:
smbmount //keeper911/e /home/ftp/keeper -o password=nopass
Прога работает из под рута. В мане к system я прочитал, что эта ф-я глючит из под рута. Тогда я переписал этот код с использованием fork() + execvp(). Получаю ту же какашку. В чем дело? Причем эта прога работает нормальнор на одних системах и вот такие вот глюки на других :)
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Самая ботва в том, что на моем хосте ЭТО РАБОТАЕТ. А на другом — нет. Вот его данные:
Дистр реджопина
А почему вы решили, что именно из-за system?
А из за чего еще? Я делал вывод команды в лог:
err_msg («Doing \«%s\»», command.c_str());
Потом копирую команду из лога и пихаю в консоль — она работает
Подскажите, пожалуйста, как в баше сокет слушать и из сокета читать?
попробуй всесто system() использовать popen(). Я писал гуевый муантер шар с smb. Все работало.
А можешь им поделиться? А то времени нету :) Попрбовал popen() — та же бтв
не могу. уже похерил.
Еще предложение:
execve на bash с параметром выполнения твоей команды. И главное не забудь про переменные окружения.
а что с ними?
Вобщем на выходных буду дебажить smbmount, вызванный из проги и из консоли
Раскопал одну особенность:
system( «mount //keeper911/e /home/ftp/keeper -o password=nopass» )
приводит:
1) Из обычной проги — работает и все нормально
2) из моег демона унмаунтера — не работает (самба пишет 2564: tree connect failed: ERRDOS — ERRnoaccess (Access denied.)
)
Предполагаю что это связано с тем, что прога — демон :)
вот по этому я и говорю тебе запустить баш и из него свою команду. Ты же демон, у тя нет терминала, и нет всех переменных окружения.
Попробую либо так, либо с помощью сисколла mount()
Демон здесь вряд ли причем, скорее ошибка не в system, а просто что-то на нее влияет, так трудно сказать. Демон таже программа, что и другие, только в терминал не пишет, ну это все мелочи, по сути, то все одно и то же.
Попробуй что-нибудь другое через system запустить.
проблема в том, что демона поле fork похорошему нет управляющего терминала, соответственно резальтат запуска чего-либо чрез system() может быть очень странным.
Это все так, но почему связка fork() + execvp() приводит к тому же багу — загадка
Приводит к той же ошибки, потому что скорее всего system реализован через парочку exec* fork.
Вы говорили выше, что у вас под консолью без ошибок запускается. Может причина в графичес кой оболочки, может запускать через другую графическую оболочку, к примеру через гном (если вы запускаете через KDE). У меня на FreeBSD KDE глючноватая, может у вас такая же штука…