none
.Net Core Interoperabilität/Systemaufruf statvfs RRS feed

  • Allgemeine Diskussion

  • Hallo Zusammen,

    Ich bin dabei ein POSIX Systemcall statvfs mittels .Net Core anzusprechen, dafür nutze ich nach dem Beispiel von Microsoft die Implementierung von Interoperabilität. Das Beispiel von Microsoft funktioniert auch soweit, wenn ich das allerdings auf statvfs portieren möchte ruft er meine DisplayEntry Funktion nach dem Systemcall nicht auf. Allerdings scheint er irgendetwas gemacht zu haben, da ich im strace den Systemaufruf sehe. Die Variable Success wird auch auf 0 gesetzte, also scheint der Aufruf der statvfs in der libc.so.6 soweit gelaufen zu sein.

    Der Quellcode ist mit angehängt. Ich habe schon einiges Versucht, allerdings funktioniert nichts so wirklich. Es wäre super wenn jemand eine Idee hat.

    Strace der dotnet Programmierung

    

    using System;
    using System.Runtime.InteropServices;
    
    
    namespace ServerEye_LinuxClient.Sensorhub.Disk
    {
        class systemfs
        {
            delegate int DirClbk(string dPath, StatClass stat);
            [DllImport("libc.so.6")]
            static extern int statvfs(string dirpath, DirClbk cl);
            int DisplayEntry(string dPathe, StatClass stat)
            {
                Console.WriteLine(stat.f_bfree);
                return 0;
            }
    
    
            public systemfs()
            {
                DirClbk displayEntry = new DirClbk(DisplayEntry);
    
                int success = 50;
                success = statvfs("/etc", displayEntry);          
                
            }
        }
    
        public enum MountFlags : uint
        {
            ST_RDONLY = 1,  // Mount read-only
            ST_NOSUID = 2,  // Ignore suid and sgid bits
            ST_NODEV = 4,  // Disallow access to device special files
            ST_NOEXEC = 8,  // Disallow program execution
            ST_SYNCHRONOUS = 16,  // Writes are synced at once
            ST_REMOUNT = 32,  // Alter flags of a mounted FS
            ST_MANDLOCK = 64,  // Allow mandatory locks on an FS
            ST_WRITE = 128,  // Write on file/directory/symlink
            ST_APPEND = 256,  // Append-only file
            ST_IMMUTABLE = 512,  // Immutable file
            ST_NOATIME = 1024,  // Do not update access times
            ST_NODIRATIME = 2048,  // Do not update directory access times
            ST_BIND = 4096,  // Bind directory at different place
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public class StatClass
        {
            public uint f_bsize;    /* file system block size */
            public uint f_frsize;   /* fragment size */
            public uint f_blocks;   /* size of fs in f_frsize units */
            public uint f_bfree;    /* # free blocks */
            public uint f_bavail;   /* # free blocks for unprivileged users */
            public uint f_files;    /* # inodes */
            public uint f_ffree;    /* # free inodes */
            public uint f_favail;   /* # free inodes for unprivileged users */
            public uint f_fsid;     /* file system ID */
            public uint f_flag;     /* mount flags */
            public uint f_namemax;  /* maximum filename length */
    
    
        }
    
    
    }
    

    Danke für jede Hilfe!

    Dienstag, 26. Dezember 2017 22:30

Alle Antworten

  • Hallo kernsche,

    Ändert sich etwas, wenn Du die Definition von systemfs wie folgt anpasst?

            public systemfs()
            {
                int success = 50;
                success = statvfs("/etc", DisplayEntry);   
            }

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 29. Dezember 2017 10:59
    Moderator