Hilfe für Funktion mount(...) Übergabeparameter
-
Hi !!!
ich versuche jetzt seit mehreren Stunden meinLaufwerk zu mounten, aber vergebenst....
in meinem SourceCode sieht es so aus:
int nRes = 0; errno = 0; nRes = mount( "//IP/sharename", "/home/user/mountpoint", "smbfs", 0, "username=ImUser,password=ImUser,uid=User,gid=users");
ich bekomme:
[b]EINVAL[/b] source had an invalid superblock. Or, a remount was attempted, while source was not already mounted on target. Or, a move was attempted, while source was not a mount point, or was '/'. Or, an umount was attempted, while target was not a mount point.
ich weis es nicht, was ich falsch mache ...
-
Ist schon länger her, dass ich mit mount gearbeitet habe. Aber vll solltest du dir mittels man: strace mal anschauen, welche Parameter das mount-Programm an man: mount(2) übergibt.
-
rüdiger schrieb:
Ist schon länger her, dass ich mit mount gearbeitet habe. Aber vll solltest du dir mittels man: strace mal anschauen, welche Parameter das mount-Programm an man: mount(2) übergibt.
Danke für den Tip!
Ich wollte es heut ausprobieren, aber bin nicht dazugekommen. Morge wirds gemacht...
-
Hi !!
ich bin langsam am Zweifeln...
hier sind meine strace Ausgaben:[i][b]mount("//IP/sharename", "./MountPoint", "smbfs", MS_SYNCHRONOUS|MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0xec0000, 0x8165880) = -1 EINVAL (Invalid argument)[/b][/i]
Was mache ich falsch???
Quellcode sieht so aus:#include <sys/mount.h> ... #ifndef MS_SYNC #define MS_SYNC 16 #endif int nRes = 0; errno = 0; nRes = mount( "//IP/sharename", "./MountPoint", "smbfs", MS_MGC_VAL|MS_SYNC, "username=ImUser,password=ImUser,uid=User,gid=users"); if( ( nRes != -1 ) && ( errno != EBUSY ) ) { .. } else { // error .. }
Vielleicht untterstützt mount(2) kein "smbfs" ???
Für jnede Hilfe bin ich sehr dankbar !!!
-
check doch mal ob du mount.smbfs am start hast
man mount:
-t vfstype
The argument following the -t is used to indicate the file sys‐
tem type. The file system types which are currently supported
include: adfs, affs, autofs, cifs, coda, coherent, cramfs,
debugfs, devpts, efs, ext, ext2, ext3, hfs, hfsplus, hpfs,
iso9660, jfs, minix, msdos, ncpfs, nfs, nfs4, ntfs, proc, qnx4,
ramfs, reiserfs, romfs, smbfs, sysv, tmpfs, udf, ufs, umsdos,
usbfs, vfat, xenix, xfs, xiafs. Note that coherent, sysv and
xenix are equivalent and that xenix and coherent will be removed
at some point in the future — use sysv instead. Since kernel
version 2.1.21 the types ext and xiafs do not exist anymore.
Earlier, usbfs was known as usbdevfs. Note, the real list of
all supported filesystems depends on your kernel.For most types all the mount program has to do is issue a simple
mount(2) system call, and no detailed knowledge of the filesys‐
tem type is required. For a few types however (like nfs, nfs4,
cifs, smbfs, ncpfs) ad hoc code is necessary. The nfs, nfs4,
cifs, smbfs, and ncpfs have a separate mount program. In order
to make it possible to treat all types in a uniform way, mount
will execute the program /sbin/mount.TYPE (if that exists) when
called with type TYPE. Since various versions of the smbmount
program have different calling conventions, /sbin/mount.smbfs
may have to be a shell script that sets up the desired call.
-
atomfish schrieb:
check doch mal ob du mount.smbfs am start hast ...
was meinst Du damit ?
Wenn die Konsoleneingabe "mount.smbfs", dann ja, ich habe es...
-
funktionierts denn eigentlich aus der kommandozeile mit den gleichen parametern ?
-
atomfish schrieb:
funktionierts denn eigentlich aus der kommandozeile mit den gleichen parametern ?
Ja, das hier:
mount -t smbfs -o username=ImUser,password=ImUser,uid=User,gid=users //IP/Sharepoint /home/User/mountpoint
funktioniert aus der Kommandozeile
und das hier aus der *.cpp - Datei:
system("mount -t smbfs -o username=ImUser,password=ImUser,uid=User,gid=users //IP/Sharepoint /home/User/mountpoint");
ich will bloss richtige Funktion aufrufen.
-
Kaif_and_Kaif schrieb:
Hi !!
ich bin langsam am Zweifeln...
hier sind meine strace Ausgaben:[i][b]mount("//IP/sharename", "./MountPoint", "smbfs", MS_SYNCHRONOUS|MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0xec0000, 0x8165880) = -1 EINVAL (Invalid argument)[/b][/i]
Was mache ich falsch???
Quellcode sieht so aus:[cpp]#include <sys/mount.h>
...#ifndef MS_SYNC
#define MS_SYNC 16
#endifint nRes = 0;
errno = 0;
nRes = mount( "//IP/sharename", "./MountPoint", "smbfs", MS_MGC_VAL|MS_SYNC, "username=ImUser,password=ImUser,uid=User,gid=users");
)
ähm hast du da wirklich "//IP/Sharename" drinstehen ? denke mal das wird für mount() schwierig den zugehörigen host ausfindig zu machen ...
ausserdem sieht die Ausgabe der flags von strace auch ein wenig komisch aus.
was ist denn das da am schluss, dieses 0xec0000 ?MS_SYNCHRONOUS|MS_POSIXACL|MS_ACTIVE|MS_NOUSER|0xec0000
MS_MGC_VAL kannst du dir auch sparen. das wird nur von sehr alten kernel versionen noch ausgewertet.
-
atomfish schrieb:
ähm hast du da wirklich "//IP/Sharename" drinstehen ?
Wo drinen ??? Sorry aber es ist mein erstes Linux Programm ...
atomfish schrieb:
ausserdem sieht die Ausgabe der flags von strace auch ein wenig komisch aus.
was ist denn das da am schluss, dieses 0xec0000 ?das weis ich auch nicht ... ich setze nur "MS_MGC_VAL|MS_SYNC|MS_NOSUID" ...
Ich habe vermutet, dass es von diesem Flag kommt: MS_MGC_VAL
-
Kaif_and_Kaif schrieb:
atomfish schrieb:
ähm hast du da wirklich "//IP/Sharename" drinstehen ?
Wo drinen ???
In Deinem Programm, da wo "//IP/Sharename" steht?!?!?!?!?!
Du weisst aber schon, was im Zusammenhang mit Samba/Windows-Freigaben "//IP/Sharename" für eine Bedeutung hat, oder?
-
Hi!
"//IP/Sharename"
das sind Symbolischen Namen.
Tatsächlich habe ich einen folgendes stehen:
const char* loc_SharePoint = {"//192.168.12.21/ShareData"}; const char* loc_MountPoint = {"./MountPoint"}; const char* loc_FileSystemType = {"smbfs"}; const char* loc_Data = {"username=ImUser,password=XXXX,uid=User,gid=users"};
der ShareData-Ordner unter Windows ist auch freigegeben.
In meiner Funktion gibt es dann folgender Aufruf:
nRes = mount( loc_SharePoint, loc_MountPoint, loc_FileSystemType, MS_SYNC|MS_NOSUID, loc_Data);
-
Tja woher soll man das wissen, wenn du das hier als "code" gettagtes postest...
aber was ist eigentlich das hier:
#ifndef MS_SYNC
#define MS_SYNC 16
#endifin man2 mount steht am ende irgendwo:
The original MS_SYNC flag was renamed MS_SYNCHRONOUS in 1.1.69 when a different MS_SYNC was added to <mman.h>.
warum also nimmst du nicht gleich MS_SYNCHRONOUS ( == 16 )
wenn nämlich MS_SYNC vorher schon in <mman.h> defined ist, dann hat es womöglich
oder sicher einen falschen value ...
-
atomfish schrieb:
...
aber was ist eigentlich das hier:#ifndef MS_SYNC
#define MS_SYNC 16
#endifin man2 mount steht am ende irgendwo:
The original MS_SYNC flag was renamed MS_SYNCHRONOUS in 1.1.69 when a different MS_SYNC was added to <mman.h>.
warum also nimmst du nicht gleich MS_SYNCHRONOUS ( == 16 )
wenn nämlich MS_SYNC vorher schon in <mman.h> defined ist, dann hat es womöglich
oder sicher einen falschen value ...HI!
Da hast Du natürlich Recht...
Aber ich habe im Endeffekt doch noch die 16 verwendet, dacher war der Flag schon richtig.
Ich verwende jetzt natürlich MS_SYNCHRONOUS, aber weiter bringt mich das auch nicht... Was für ein ...
-
Siehe einfach den von atomfish geposteten Teil aus der manpage
For most types all the mount program has to do is issue a simple
mount(2) system call, and no detailed knowledge of the filesys‐
tem type is required. For a few types however (like nfs, nfs4,
cifs, smbfs, ncpfs) ad hoc code is necessary. The nfs, nfs4,
cifs, smbfs, and ncpfs have a separate mount program. In order
to make it possible to treat all types in a uniform way, mount
will execute the program /sbin/mount.TYPE (if that exists) when
called with type TYPE. Since various versions of the smbmount
program have different calling conventions, /sbin/mount.smbfs
may have to be a shell script that sets up the desired call.Mit einem einfachen Aufruf von mount(2) ist es bei smbfs nicht getan. Ich kenne mich mit dem smbfs-Zeugs nicht aus, aber bei NFS muss man zB irgend welche SUNRPC-Aufrufe vorher durchführen. Das wird bei smbfs wohl ähnlich sein. Am besten rufst du einfach /sbin/mount.smbfs auf. Das selbst zu implementieren hätte vor allem den großen Nachteil, dass du den Code immer updaten musst, wenn MS mal wieder SMB ändert.
Du musst (solltest) ja nicht system(2) nehmen. Du kannst ja auch fork/man: execlp(3) nehmen.
-
Das Problem scheint mal wieder in Anzahl und Richtung der Slashes zu liegen ...
Das hat funktioniert :
mount( "\\\\192.168.0.36\\Public_0001", ".//test", "cifs", MS_MGC_VAL | MS_SILENT, "username=guest,password=,workgroup=xxxxx");
Allerdings mußte das Verzeichnis "test" vorher als Unterverzeichnis des Programms angelegt werden.
Es ist erbärmlich, wie steinzeitmäßig all das immer noch ist. Und man findet leider auch gar nicht so einfach irgendein funktionierendes Beispiel, daher dieser Post.
-
jim75 schrieb:
Das Problem scheint mal wieder in Anzahl und Richtung der Slashes zu liegen ...
Das hat funktioniert :
mount( "\\\\192.168.0.36\\Public_0001", ".//test", "cifs", MS_MGC_VAL | MS_SILENT, "username=guest,password=,workgroup=xxxxx");
Allerdings mußte das Verzeichnis "test" vorher als Unterverzeichnis des Programms angelegt werden.
Es ist erbärmlich, wie steinzeitmäßig all das immer noch ist. Und man findet leider auch gar nicht so einfach irgendein funktionierendes Beispiel, daher dieser Post.
Öhn nicht nwirklich das format für Netzwerk shares ist nunmal \<hostname/ip>\<sharename>
und dass man in c++ in string literale "\" für ein '\' schreiben muss sollte auch bekannt sein, da ein einzelnes '\' den begin einer escape sequenz darstellt (z.b.\n für neue zeile)Und das zweite '/' bei ".//test" kannst du dir auch sparen