#include <stdio.h>
#include <errno.h>
#include <sys/mman.h>
#define SYS_SOCKETCALL_I386 102
#define SYS_SOCKET 1
#define AF_ALG 38
#define SOCK_SEQPACKET 5
int main() {
/*
* The int $0x80 ia32 compat path truncates all registers to 32 bits.
* The args pointer must live below 4 GB, so allocate it with MAP_32BIT.
*/
unsigned int *args = mmap(NULL, 4096,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT,
-1, 0);
if (args == MAP_FAILED) {
perror("mmap");
return 2;
}
args[0] = AF_ALG;
args[1] = SOCK_SEQPACKET;
args[2] = 0;
int ret;
asm volatile (
"int $0x80"
: "=a"(ret)
: "a"(SYS_SOCKETCALL_I386), "b"(SYS_SOCKET), "c"(args)
: "memory"
);
if (ret < 0) {
errno = -ret;
perror("socket");
return 1;
}
printf("AF_ALG socket created via socketcall\n");
return 0;
}