Я сижу под юзером. Из консоли (mount) диски монтирую без проблем.
Но когда пытаюсь монтировать их "программно", то получаю все время код 1.
Вот тестовая прорамма и результат:
were@home ~/temp $ umount /dev/cdrom
were@home ~/temp $ ls
1.cpp 1.png a.out
were@home ~/temp $ cat ./1.cpp
#include <sys/mount.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(){
char *dev=new char [255], *point=new char [255], *fs=new char[255];
strcpy(dev, "/dev/cdrom");
strcpy(point, "/mnt/cdrom");
strcpy(fs, "iso9660");
if ((mount(dev, point, fs, 0, 0)==-1))
printf("\n%i - %s\n", errno, strerror(errno));
}
were@home ~/temp $ ./a.out
1 - Operation not permitted
were@home ~/temp $
Только не говорите, что я забыл передать флаг readonly:
were@home ~/temp $ su
Password:
home temp # ./a.out
30 - Read-only file system
home temp #
Тоже самое и с флопиком.
Функция mount() (точнее системный вызов mount) доступен только руту, все остальные обламываются (если не стоит какой-либо специфической модели безопасности в ядре) - но еще раз повторю В БОЛЬШИНСТВЕ СЛУЧАЕВ mount МОЖЕТ ВЫЗВАТЬ ТОЛЬКО ROOT!!!!
И если сейчас кто-нибудь вякнет про /bin/mount, он получит в лоб командой ls -la /bin/mount, которая говорит, что mount имеет установленый бит set UID, вследствие чего запускается С EUID == 0(ROOT)!!! Соотвтетственно, даже если вы вызываете /bin/mount из-под юзера, она действует как root.
Соответественно, для монтирования-размонтирования нужно иметь одно из трех - либо EUID=0, либо иметь SUID'ный враппер на mount() (например /bin/mount таковым является), либо иметь в ядре некую нестандартную security model.