====== std.net.internal.syscalls_android ======
Android-Syscall-Wrapper (WP-AND-04): Stellt Netzwerk-Syscalls unter expliziten Android-Namen bereit. Auf ARM64 und x86_64 verwendet Android dieselben Syscall-Nummern wie upstream Linux — die Wrapper delegieren direkt an die entsprechenden Funktionen aus ''std.net.internal.syscalls_linux''. Für Syscalls, die Bionic oder SELinux in App-Prozessen blockiert, sind explizite ''_unsupported''-Stubs enthalten, die sofort ''−1'' zurückgeben.
→ [[lyx_-_programmiersprache:units:net:internal:types|std.net.internal.types]] · [[lyx_-_programmiersprache:units:net:internal:syscalls_linux|std.net.internal.syscalls_linux]] · [[lyx_-_programmiersprache:units|Standard Library]]
----
===== Netzwerk-Syscalls =====
Alle Wrapper delegieren 1:1 an die entsprechenden ''sys_*''-Funktionen. Rückgabewerte und Fehler-Semantik sind identisch mit Linux.
^ Signatur ^ Beschreibung ^
| ''sca_socket(domain: int64, socktype: int64, protocol: int64): int64'' | Erstellt einen Socket. Gibt fd zurück, < 0 bei Fehler. |
| ''sca_bind(sockfd: int64, addr: int64, addrlen: int64): int64'' | Bindet Socket an eine lokale Adresse. Gibt 0 bei Erfolg. |
| ''sca_listen(sockfd: int64, backlog: int64): int64'' | Markiert Socket als passiven Listener. Gibt 0 bei Erfolg. |
| ''sca_accept(sockfd: int64, addr: int64, addrlen: int64): int64'' | Akzeptiert eine eingehende Verbindung. Gibt neuen fd zurück. |
| ''sca_connect(sockfd: int64, addr: int64, addrlen: int64): int64'' | Verbindet Socket mit einer Remote-Adresse. Gibt 0 bei Erfolg. |
| ''sca_recvfrom(sockfd: int64, buf: int64, len: int64, flags: int64, src_addr: int64, addrlen: int64): int64'' | Empfängt Daten; füllt optional ''src_addr'' mit der Absenderadresse. |
| ''sca_sendto(sockfd: int64, buf: int64, len: int64, flags: int64, dest_addr: int64, addrlen: int64): int64'' | Sendet Daten; bei verbundenen Sockets ''dest_addr = 0''. |
| ''sca_close(sockfd: int64): int64'' | Schließt den Socket-fd. Gibt 0 bei Erfolg. |
| ''sca_setsockopt(sockfd: int64, level: int64, optname: int64, optval: int64, optlen: int64): int64'' | Setzt eine Socket-Option. Gibt 0 bei Erfolg. |
| ''sca_getsockopt(sockfd: int64, level: int64, optname: int64, optval: int64, optlen: int64): int64'' | Liest eine Socket-Option. Gibt 0 bei Erfolg. |
| ''sca_set_nonblock(sockfd: int64): int64'' | Setzt ''O_NONBLOCK'' via ''fcntl(F_GETFL/F_SETFL)''. Gibt 0 bei Erfolg. |
| ''sca_shutdown(sockfd: int64, how: int64): int64'' | Beendet einen Teil oder beide Seiten der Verbindung (''SHUT_RD=0'', ''SHUT_WR=1'', ''SHUT_RDWR=2''). |
----
===== Eingeschränkte Syscalls (Stubs) =====
Folgende Syscalls werden von SELinux in normalen Android-App-Prozessen blockiert. Die Stubs geben sofort ''−1'' zurück, statt den Kernel aufzurufen:
^ Funktion ^ Grund ^
| ''sca_fork_unsupported(): int64'' | ''fork'' ist in Bionic-basierten App-Prozessen nicht empfohlen; stattdessen ''std.thread'' (pthread/clone) verwenden |
| ''sca_vfork_unsupported(): int64'' | Wie ''fork'' — nicht unterstützt |
| ''sca_ptrace_unsupported(): int64'' | ''ptrace'' ist auf nicht-debuggbaren App-Prozessen durch SELinux blockiert; Android Trace API oder ''systrace'' verwenden |
| ''sca_personality_unsupported(): int64'' | ''personality()'' wird durch SELinux in der App-Domain abgelehnt |
| ''sca_reboot_unsupported(): int64'' | ''reboot()'' ist dem Power-Management-Daemon vorbehalten |
----
===== Verwendung =====
==== TCP-Client auf Android ====
import std.net.internal.syscalls_android;
import std.net.internal.types;
fn ConnectTCP(ip: int64, port: int64): int64 {
var fd := sca_socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) { return -1; }
// sockaddr_in aufbauen
var addr: int64 := alloc(SOCKADDR_IN_SIZE);
pokeSockaddrIn(addr, AF_INET, port, ip);
var r := sca_connect(fd, addr, SOCKADDR_IN_SIZE);
free(addr, SOCKADDR_IN_SIZE);
if (r < 0) { sca_close(fd); return -1; }
return fd;
}
==== Non-blocking UDP-Socket ====
import std.net.internal.syscalls_android;
fn OpenUDPNonblock(): int64 {
var fd := sca_socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) { return -1; }
sca_set_nonblock(fd);
return fd;
}
==== Senden und Empfangen ====
import std.net.internal.syscalls_android;
import std.alloc;
fn SendRecv(fd: int64, msg: int64, msglen: int64): int64 {
var sent := sca_sendto(fd, msg, msglen, 0, 0, 0);
if (sent < 0) { return -1; }
var buf: int64 := alloc(4096);
var n := sca_recvfrom(fd, buf, 4096, 0, 0, 0);
free(buf, 4096);
return n;
}
----
===== Hinweise =====
* **Syscall-Nummern**: ARM64 und x86_64 Android verwenden dieselben Nummern wie Linux; die ''sca_*''-Wrapper sind auf beiden Architekturen korrekt.
* **SELinux-Policies** variieren je nach Android-Version, ROM und App-Zertifizierung. Selbst unterstützte Syscalls können auf bestimmten Geräten durch herstellerspezifische SELinux-Regeln blockiert werden.
* **fork / Thread**: Statt ''fork'' auf Android ''std.thread'' (pthread-basiert) verwenden. Bionic erlaubt clone-basierte Threads ohne Einschränkungen.
* Die ''_unsupported''-Stubs liefern explizit ''−1'' (und nicht ''ENOSYS'' vom Kernel), damit Fehler in Userland-Logs sichtbar werden, bevor SELinux den Prozess beendet.
* Für höhere Abstraktionen (TCP/UDP, DNS, TLS) die übergeordneten Units ''[[lyx_-_programmiersprache:units:net:socket|std.net.socket]]'' (TCP/UDP), ''[[lyx_-_programmiersprache:units:net:dns|std.net.dns]]'' und ''[[lyx_-_programmiersprache:units:net:tls|std.net.tls]]'' verwenden.
----
===== Verwandte Units =====
* ''[[lyx_-_programmiersprache:units:net:internal:syscalls_linux|std.net.internal.syscalls_linux]]'' — die Linux-Syscall-Basis, auf die alle ''sca_*''-Wrapper delegieren
* ''[[lyx_-_programmiersprache:units:net:internal:types|std.net.internal.types]]'' — ''sockaddr_in'', ''AF_INET'', ''SOCK_STREAM'' etc.
* ''[[lyx_-_programmiersprache:units:net:socket|std.net.socket]]'' — TCP/UDP-Verbindungen (High-Level)
* ''[[lyx_-_programmiersprache:units:thread|std.thread]]'' — Threads (Android-Alternative zu fork)
Letzte Aktualisierung: 2026-06-05