Thread overview
Can I make system calls directly from D?
Jul 09, 2021
rempas
Jul 09, 2021
Ferhat Kurtulmuş
Jul 09, 2021
rempas
Jul 09, 2021
Dennis
Jul 09, 2021
rempas
July 09, 2021

I just wonder if I'm able to do system calls directly from D or If I have to create bindings from "unistd.h" from C

July 09, 2021

On Friday, 9 July 2021 at 08:08:57 UTC, rempas wrote:

>

I just wonder if I'm able to do system calls directly from D or If I have to create bindings from "unistd.h" from C

I don't know if it covers what you want but, druntime has those definitions:

https://github.com/dlang/druntime/blob/master/src/core/sys/posix/unistd.d

import core.sys.posix.unistd;

... do stuff

July 09, 2021

On Friday, 9 July 2021 at 08:08:57 UTC, rempas wrote:

>

I just wonder if I'm able to do system calls directly from D or If I have to create bindings from "unistd.h" from C

If with directly means 'without calling any C function' you can use inline assembly:

version(linux)
void rt_sigreturn() {
     version(D_InlineAsm_X86_64) asm {
        naked;
        mov EAX, 15;
        syscall;
    }
}
July 09, 2021

On Friday, 9 July 2021 at 08:18:51 UTC, Ferhat Kurtulmuş wrote:

>

On Friday, 9 July 2021 at 08:08:57 UTC, rempas wrote:

>

I just wonder if I'm able to do system calls directly from D or If I have to create bindings from "unistd.h" from C

I don't know if it covers what you want but, druntime has those definitions:

https://github.com/dlang/druntime/blob/master/src/core/sys/posix/unistd.d

import core.sys.posix.unistd;

... do stuff

Yep! From my understanding, this is binding from C so at least I don't have to make them on my own. Thanks a lot for your time, have an amazing day!

July 09, 2021

On Friday, 9 July 2021 at 08:28:25 UTC, Dennis wrote:

>

On Friday, 9 July 2021 at 08:08:57 UTC, rempas wrote:

>

I just wonder if I'm able to do system calls directly from D or If I have to create bindings from "unistd.h" from C

If with directly means 'without calling any C function' you can use inline assembly:

version(linux)
void rt_sigreturn() {
     version(D_InlineAsm_X86_64) asm {
        naked;
        mov EAX, 15;
        syscall;
    }
}

This is the most "direct" way possible. However I should probably not mess with assembly at this point and use the built-in D header file for unistd. Thanks a lot for your time tho, have a great day!