Hilfe für Funktion mount(...) Übergabeparameter



  • 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
    #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");

    )

    ä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
    #endif

    in 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
    #endif

    in 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


Anmelden zum Antworten