shithub: mc

ref: 58d89cfed95d30bcd7fdfed4973237121803ad70
dir: /libstd/sys+freebsd-x64.myr/

View raw version
use "systypes.use"

pkg sys =
	type scno	= int64 /*syscall*/
	type fdopt	= int64	/* fd options */
	type fd		= int64	/* fd */
	type mprot	= int64	/* memory protection */
	type mopt	= int64	/* memory mapping options */
	type socktype	= int64	/* socket type */
	type sockproto	= int64	/* socket protocol */
	type sockfam	= uint8	/* socket family */
	type filemode	= uint16
	type filetype	= uint8

	type clock = union
		`Clockrealtime
		`Clockrealtime_precise
		`Clockrealtime_fast
		`Clockmonotonic
		`Clockmonotonic_precise     
		`Clockmonotonic_fast
		`Clockuptime
		`Clockuptime_precise
		`Clockuptime_fast
		`Clockvirtual
		`Clockprof
		`Clocksecond
	;;

	type waitstatus = union
		`Waitexit int32
		`Waitsig  int32
		`Waitstop int32
	;;

	type timespec = struct
		sec	: uint64
		nsec	: uint64 
	;;

	type timeval = struct
		sec	: uint64
		usec	: uint64
	;;

	type rusage = struct
		utime	: timeval /* user time */
		stime	: timeval /* system time */
		maxrss	: uint64 /* max resident set size*/
		ixrss	: uint64 /* shared text size */
		idrss	: uint64 /* unshared data size */
		isrss	: uint64 /* unshared stack size */
		minflt	: uint64 /* page reclaims */
		majflt	: uint64 /* page faults */
		nswap	: uint64 /* swaps */
		inblock	: uint64 /* block input ops */
		oublock	: uint64 /* block output ops */
		msgsnd	: uint64 /* messages sent */	
		msgrcv	: uint64 /* messages received */
		nsignals : uint64 /* signals received */
		nvcsw	: uint64 /* voluntary context switches */
		nivcsw	: uint64 /* involuntary context switches */
	;;

	type statbuf = struct
		dev	: uint32 
		ino	: uint32 
		mode	: filemode
		nlink	: uint16
		uid	: uint32
		gid	: uint32
		rdev	: uint32
		atim	: timespec
		mtim	: timespec
		ctim	: timespec
		size	: int64
		blocks	: int64
		blksize	: uint32
		flags	: uint32
		gen	: uint32
		lspare	: int32
		birthtim	: timespec 
	;;

	type utsname = struct
		system	: byte[256]
		node : byte[256] 
		release : byte[256]
		version : byte[256]
		machine : byte[256]
	;;

	type sockaddr = struct
		len	: byte
		fam	: sockfam
		data	: byte[14] /* what is the *actual* length? */
	;;

	type sockaddr_in = struct
		len	: byte
		fam	: sockfam
		port	: uint16
		addr	: byte[4]
		zero	: byte[8]
	;;

	type sockaddr_storage = struct
		len	: byte
		fam	: sockfam
		__pad1  : byte[6]
		__align : int64
		__pad2  : byte[112]
	;;	
	
	type dirent = struct
		fileno	: uint32
		reclen	: uint16
		ftype	: filetype
		namelen	: uint8
		name	: byte[256]	
	;;	

	/* open options */
	const Ordonly  	: fdopt = 0x0
	const Owronly  	: fdopt = 0x1
	const Ordwr    	: fdopt = 0x2
	const Oappend  	: fdopt = 0x8
	const Ocreat   	: fdopt = 0x200
	const Onofollow	: fdopt = 0x100
	const Ondelay  	: fdopt = 0x4
	const Otrunc   	: fdopt = 0x400
	const Odir	: fdopt = 0x20000

        /* stat modes */	
	const Sifmt	: filemode = 0xf000
	const Sififo	: filemode = 0x1000
	const Sifchr	: filemode = 0x2000
	const Sifdir	: filemode = 0x4000
	const Sifblk	: filemode = 0x6000
	const Sifreg	: filemode = 0x8000
	const Siflnk	: filemode = 0xa000
	const Sifsock 	: filemode = 0xc000

	/* mmap protection */
	const Mprotnone	: mprot = 0x0
	const Mprotrd	: mprot = 0x1
	const Mprotwr	: mprot = 0x2
	const Mprotexec	: mprot = 0x4
	const Mprotrw	: mprot = 0x3

	/* mmap options */
	const Mshared	: mopt = 0x1
	const Mpriv	: mopt = 0x2
	const Mfixed	: mopt = 0x10
	const Mfile	: mopt = 0x0
	const Manon	: mopt = 0x1000
	const M32bit	: mopt = 0x80000

	/* file types */
	const Dtunknown	: filetype = 0
	const Dtfifo	: filetype = 1
	const Dtchr	: filetype = 2
	const Dtdir	: filetype = 4
	const Dtblk	: filetype = 6
	const Dtreg	: filetype = 8
	const Dtlnk	: filetype = 10
	const Dtsock	: filetype = 12
	const Dtwht	: filetype = 14

	/* socket families. INCOMPLETE. */
	const Afunspec	: sockfam = 0
	const Afunix	: sockfam = 1
	const Afinet	: sockfam = 2
	const Afinet6	: sockfam = 28

	/* socket types. */
	const Sockstream	: socktype = 1
	const Sockdgram		: socktype = 2
	const Sockraw		: socktype = 3
	const Sockrdm		: socktype = 4
	const Sockseqpacket	: socktype = 5

	/* network protocols */
	const Ipproto_ip	: sockproto = 0
	const Ipproto_icmp	: sockproto = 1
	const Ipproto_tcp	: sockproto = 6
	const Ipproto_udp	: sockproto = 17
	const Ipproto_raw	: sockproto = 255

	/* return value for a failed mapping */
	const Mapbad	: byte# = -1 castto(byte#)

	/* syscalls */
	const Syssyscall                   : scno = 0
	const Sysexit                      : scno = 1
	const Sysfork                      : scno = 2
	const Sysread                      : scno = 3
	const Syswrite                     : scno = 4
	const Sysopen                      : scno = 5
	const Sysclose                     : scno = 6
	const Syswait4                     : scno = 7
	const Syslink                      : scno = 9
	const Sysunlink                    : scno = 10
	const Syschdir                     : scno = 12
	const Sysfchdir                    : scno = 13
	const Sysmknod                     : scno = 14
	const Syschmod                     : scno = 15
	const Syschown                     : scno = 16
	const Sysbreak                     : scno = 17
	const Sysfreebsd4_getfsstat        : scno = 18
	const Sysgetpid                    : scno = 20
	const Sysmount                     : scno = 21
	const Sysunmount                   : scno = 22
	const Syssetuid                    : scno = 23
	const Sysgetuid                    : scno = 24
	const Sysgeteuid                   : scno = 25
	const Sysptrace                    : scno = 26
	const Sysrecvmsg                   : scno = 27
	const Syssendmsg                   : scno = 28
	const Sysrecvfrom                  : scno = 29
	const Sysaccept                    : scno = 30
	const Sysgetpeername               : scno = 31
	const Sysgetsockname               : scno = 32
	const Sysaccess                    : scno = 33
	const Syschflags                   : scno = 34
	const Sysfchflags                  : scno = 35
	const Syssync                      : scno = 36
	const Syskill                      : scno = 37
	const Sysgetppid                   : scno = 39
	const Sysdup                       : scno = 41
	const Syspipe                      : scno = 42
	const Sysgetegid                   : scno = 43
	const Sysprofil                    : scno = 44
	const Sysktrace                    : scno = 45
	const Sysgetgid                    : scno = 47
	const Sysgetlogin                  : scno = 49
	const Syssetlogin                  : scno = 50
	const Sysacct                      : scno = 51
	const Syssigaltstack               : scno = 53
	const Sysioctl                     : scno = 54
	const Sysreboot                    : scno = 55
	const Sysrevoke                    : scno = 56
	const Syssymlink                   : scno = 57
	const Sysreadlink                  : scno = 58
	const Sysexecve                    : scno = 59
	const Sysumask                     : scno = 60
	const Syschroot                    : scno = 61
	const Sysmsync                     : scno = 65
	const Sysvfork                     : scno = 66
	const Syssbrk                      : scno = 69
	const Syssstk                      : scno = 70
	const Sysvadvise                   : scno = 72
	const Sysmunmap                    : scno = 73
	const Sysmprotect                  : scno = 74
	const Sysmadvise                   : scno = 75
	const Sysmincore                   : scno = 78
	const Sysgetgroups                 : scno = 79
	const Syssetgroups                 : scno = 80
	const Sysgetpgrp                   : scno = 81
	const Syssetpgid                   : scno = 82
	const Syssetitimer                 : scno = 83
	const Sysswapon                    : scno = 85
	const Sysgetitimer                 : scno = 86
	const Sysgetdtablesize             : scno = 89
	const Sysdup2                      : scno = 90
	const Sysfcntl                     : scno = 92
	const Sysselect                    : scno = 93
	const Sysfsync                     : scno = 95
	const Syssetpriority               : scno = 96
	const Syssocket                    : scno = 97
	const Sysconnect                   : scno = 98
	const Sysgetpriority               : scno = 100
	const Sysbind                      : scno = 104
	const Syssetsockopt                : scno = 105
	const Syslisten                    : scno = 106
	const Sysgettimeofday              : scno = 116
	const Sysgetrusage                 : scno = 117
	const Sysgetsockopt                : scno = 118
	const Sysreadv                     : scno = 120
	const Syswritev                    : scno = 121
	const Syssettimeofday              : scno = 122
	const Sysfchown                    : scno = 123
	const Sysfchmod                    : scno = 124
	const Syssetreuid                  : scno = 126
	const Syssetregid                  : scno = 127
	const Sysrename                    : scno = 128
	const Sysflock                     : scno = 131
	const Sysmkfifo                    : scno = 132
	const Syssendto                    : scno = 133
	const Sysshutdown                  : scno = 134
	const Syssocketpair                : scno = 135
	const Sysmkdir                     : scno = 136
	const Sysrmdir                     : scno = 137
	const Sysutimes                    : scno = 138
	const Sysadjtime                   : scno = 140
	const Syssetsid                    : scno = 147
	const Sysquotactl                  : scno = 148
	const Sysnlm_syscall               : scno = 154
	const Sysnfssvc                    : scno = 155
	const Sysfreebsd4_statfs           : scno = 157
	const Sysfreebsd4_fstatfs          : scno = 158
	const Syslgetfh                    : scno = 160
	const Sysgetfh                     : scno = 161
	const Sysfreebsd4_getdomainname    : scno = 162
	const Sysfreebsd4_setdomainname    : scno = 163
	const Sysfreebsd4_uname            : scno = 164
	const Syssysarch                   : scno = 165
	const Sysrtprio                    : scno = 166
	const Syssemsys                    : scno = 169
	const Sysmsgsys                    : scno = 170
	const Sysshmsys                    : scno = 171
	const Sysfreebsd6_pread            : scno = 173
	const Sysfreebsd6_pwrite           : scno = 174
	const Syssetfib                    : scno = 175
	const Sysntp_adjtime               : scno = 176
	const Syssetgid                    : scno = 181
	const Syssetegid                   : scno = 182
	const Sysseteuid                   : scno = 183
	const Sysstat                      : scno = 188
	const Sysfstat                     : scno = 189
	const Syslstat                     : scno = 190
	const Syspathconf                  : scno = 191
	const Sysfpathconf                 : scno = 192
	const Sysgetrlimit                 : scno = 194
	const Syssetrlimit                 : scno = 195
	const Sysgetdirentries             : scno = 196
	const Sysfreebsd6_mmap             : scno = 197
	const Sys__syscall                 : scno = 198
	const Sysfreebsd6_lseek            : scno = 199
	const Sysfreebsd6_truncate         : scno = 200
	const Sysfreebsd6_ftruncate        : scno = 201
	const Sys__sysctl                  : scno = 202
	const Sysmlock                     : scno = 203
	const Sysmunlock                   : scno = 204
	const Sysundelete                  : scno = 205
	const Sysfutimes                   : scno = 206
	const Sysgetpgid                   : scno = 207
	const Syspoll                      : scno = 209
	const Sysfreebsd7___semctl         : scno = 220
	const Syssemget                    : scno = 221
	const Syssemop                     : scno = 222
	const Sysfreebsd7_msgctl           : scno = 224
	const Sysmsgget                    : scno = 225
	const Sysmsgsnd                    : scno = 226
	const Sysmsgrcv                    : scno = 227
	const Sysshmat                     : scno = 228
	const Sysfreebsd7_shmctl           : scno = 229
	const Sysshmdt                     : scno = 230
	const Sysshmget                    : scno = 231
	const Sysclock_gettime             : scno = 232
	const Sysclock_settime             : scno = 233
	const Sysclock_getres              : scno = 234
	const Sysktimer_create             : scno = 235
	const Sysktimer_delete             : scno = 236
	const Sysktimer_settime            : scno = 237
	const Sysktimer_gettime            : scno = 238
	const Sysktimer_getoverrun         : scno = 239
	const Sysnanosleep                 : scno = 240
	const Sysffclock_getcounter        : scno = 241
	const Sysffclock_setestimate       : scno = 242
	const Sysffclock_getestimate       : scno = 243
	const Sysclock_getcpuclockid2      : scno = 247
	const Sysntp_gettime               : scno = 248
	const Sysminherit                  : scno = 250
	const Sysrfork                     : scno = 251
	const Sysopenbsd_poll              : scno = 252
	const Sysissetugid                 : scno = 253
	const Syslchown                    : scno = 254
	const Sysaio_read                  : scno = 255
	const Sysaio_write                 : scno = 256
	const Syslio_listio                : scno = 257
	const Sysgetdents                  : scno = 272
	const Syslchmod                    : scno = 274
	const Sysnetbsd_lchown             : scno = 275
	const Syslutimes                   : scno = 276
	const Sysnetbsd_msync              : scno = 277
	const Sysnstat                     : scno = 278
	const Sysnfstat                    : scno = 279
	const Sysnlstat                    : scno = 280
	const Syspreadv                    : scno = 289
	const Syspwritev                   : scno = 290
	const Sysfreebsd4_fhstatfs         : scno = 297
	const Sysfhopen                    : scno = 298
	const Sysfhstat                    : scno = 299
	const Sysmodnext                   : scno = 300
	const Sysmodstat                   : scno = 301
	const Sysmodfnext                  : scno = 302
	const Sysmodfind                   : scno = 303
	const Syskldload                   : scno = 304
	const Syskldunload                 : scno = 305
	const Syskldfind                   : scno = 306
	const Syskldnext                   : scno = 307
	const Syskldstat                   : scno = 308
	const Syskldfirstmod               : scno = 309
	const Sysgetsid                    : scno = 310
	const Syssetresuid                 : scno = 311
	const Syssetresgid                 : scno = 312
	const Sysaio_return                : scno = 314
	const Sysaio_suspend               : scno = 315
	const Sysaio_cancel                : scno = 316
	const Sysaio_error                 : scno = 317
	const Sysoaio_read                 : scno = 318
	const Sysoaio_write                : scno = 319
	const Sysolio_listio               : scno = 320
	const Sysyield                     : scno = 321
	const Sysmlockall                  : scno = 324
	const Sysmunlockall                : scno = 325
	const Sys__getcwd                  : scno = 326
	const Syssched_setparam            : scno = 327
	const Syssched_getparam            : scno = 328
	const Syssched_setscheduler        : scno = 329
	const Syssched_getscheduler        : scno = 330
	const Syssched_yield               : scno = 331
	const Syssched_get_priority_max    : scno = 332
	const Syssched_get_priority_min    : scno = 333
	const Syssched_rr_get_interval     : scno = 334
	const Sysutrace                    : scno = 335
	const Sysfreebsd4_sendfile         : scno = 336
	const Syskldsym                    : scno = 337
	const Sysjail                      : scno = 338
	const Sysnnpfs_syscall             : scno = 339
	const Syssigprocmask               : scno = 340
	const Syssigsuspend                : scno = 341
	const Sysfreebsd4_sigaction        : scno = 342
	const Syssigpending                : scno = 343
	const Sysfreebsd4_sigreturn        : scno = 344
	const Syssigtimedwait              : scno = 345
	const Syssigwaitinfo               : scno = 346
	const Sys__acl_get_file            : scno = 347
	const Sys__acl_set_file            : scno = 348
	const Sys__acl_get_fd              : scno = 349
	const Sys__acl_set_fd              : scno = 350
	const Sys__acl_delete_file         : scno = 351
	const Sys__acl_delete_fd           : scno = 352
	const Sys__acl_aclcheck_file       : scno = 353
	const Sys__acl_aclcheck_fd         : scno = 354
	const Sysextattrctl                : scno = 355
	const Sysextattr_set_file          : scno = 356
	const Sysextattr_get_file          : scno = 357
	const Sysextattr_delete_file       : scno = 358
	const Sysaio_waitcomplete          : scno = 359
	const Sysgetresuid                 : scno = 360
	const Sysgetresgid                 : scno = 361
	const Syskqueue                    : scno = 362
	const Syskevent                    : scno = 363
	const Sysextattr_set_fd            : scno = 371
	const Sysextattr_get_fd            : scno = 372
	const Sysextattr_delete_fd         : scno = 373
	const Sys__setugid                 : scno = 374
	const Syseaccess                   : scno = 376
	const Sysafs3_syscall              : scno = 377
	const Sysnmount                    : scno = 378
	const Sys__mac_get_proc            : scno = 384
	const Sys__mac_set_proc            : scno = 385
	const Sys__mac_get_fd              : scno = 386
	const Sys__mac_get_file            : scno = 387
	const Sys__mac_set_fd              : scno = 388
	const Sys__mac_set_file            : scno = 389
	const Syskenv                      : scno = 390
	const Syslchflags                  : scno = 391
	const Sysuuidgen                   : scno = 392
	const Syssendfile                  : scno = 393
	const Sysmac_syscall               : scno = 394
	const Sysgetfsstat                 : scno = 395
	const Sysstatfs                    : scno = 396
	const Sysfstatfs                   : scno = 397
	const Sysfhstatfs                  : scno = 398
	const Sysksem_close                : scno = 400
	const Sysksem_post                 : scno = 401
	const Sysksem_wait                 : scno = 402
	const Sysksem_trywait              : scno = 403
	const Sysksem_init                 : scno = 404
	const Sysksem_open                 : scno = 405
	const Sysksem_unlink               : scno = 406
	const Sysksem_getvalue             : scno = 407
	const Sysksem_destroy              : scno = 408
	const Sys__mac_get_pid             : scno = 409
	const Sys__mac_get_link            : scno = 410
	const Sys__mac_set_link            : scno = 411
	const Sysextattr_set_link          : scno = 412
	const Sysextattr_get_link          : scno = 413
	const Sysextattr_delete_link       : scno = 414
	const Sys__mac_execve              : scno = 415
	const Syssigaction                 : scno = 416
	const Syssigreturn                 : scno = 417
	const Sysgetcontext                : scno = 421
	const Syssetcontext                : scno = 422
	const Sysswapcontext               : scno = 423
	const Sysswapoff                   : scno = 424
	const Sys__acl_get_link            : scno = 425
	const Sys__acl_set_link            : scno = 426
	const Sys__acl_delete_link         : scno = 427
	const Sys__acl_aclcheck_link       : scno = 428
	const Syssigwait                   : scno = 429
	const Systhr_create                : scno = 430
	const Systhr_exit                  : scno = 431
	const Systhr_self                  : scno = 432
	const Systhr_kill                  : scno = 433
	const Sys_umtx_lock                : scno = 434
	const Sys_umtx_unlock              : scno = 435
	const Sysjail_attach               : scno = 436
	const Sysextattr_list_fd           : scno = 437
	const Sysextattr_list_file         : scno = 438
	const Sysextattr_list_link         : scno = 439
	const Sysksem_timedwait            : scno = 441
	const Systhr_suspend               : scno = 442
	const Systhr_wake                  : scno = 443
	const Syskldunloadf                : scno = 444
	const Sysaudit                     : scno = 445
	const Sysauditon                   : scno = 446
	const Sysgetauid                   : scno = 447
	const Syssetauid                   : scno = 448
	const Sysgetaudit                  : scno = 449
	const Syssetaudit                  : scno = 450
	const Sysgetaudit_addr             : scno = 451
	const Syssetaudit_addr             : scno = 452
	const Sysauditctl                  : scno = 453
	const Sys_umtx_op                  : scno = 454
	const Systhr_new                   : scno = 455
	const Syssigqueue                  : scno = 456
	const Syskmq_open                  : scno = 457
	const Syskmq_setattr               : scno = 458
	const Syskmq_timedreceive          : scno = 459
	const Syskmq_timedsend             : scno = 460
	const Syskmq_notify                : scno = 461
	const Syskmq_unlink                : scno = 462
	const Sysabort2                    : scno = 463
	const Systhr_set_name              : scno = 464
	const Sysaio_fsync                 : scno = 465
	const Sysrtprio_thread             : scno = 466
	const Syssctp_peeloff              : scno = 471
	const Syssctp_generic_sendmsg      : scno = 472
	const Syssctp_generic_sendmsg_iov  : scno = 473
	const Syssctp_generic_recvmsg      : scno = 474
	const Syspread                     : scno = 475
	const Syspwrite                    : scno = 476
	const Sysmmap                      : scno = 477
	const Syslseek                     : scno = 478
	const Systruncate                  : scno = 479
	const Sysftruncate                 : scno = 480
	const Systhr_kill2                 : scno = 481
	const Sysshm_open                  : scno = 482
	const Sysshm_unlink                : scno = 483
	const Syscpuset                    : scno = 484
	const Syscpuset_setid              : scno = 485
	const Syscpuset_getid              : scno = 486
	const Syscpuset_getaffinity        : scno = 487
	const Syscpuset_setaffinity        : scno = 488
	const Sysfaccessat                 : scno = 489
	const Sysfchmodat                  : scno = 490
	const Sysfchownat                  : scno = 491
	const Sysfexecve                   : scno = 492
	const Sysfstatat                   : scno = 493
	const Sysfutimesat                 : scno = 494
	const Syslinkat                    : scno = 495
	const Sysmkdirat                   : scno = 496
	const Sysmkfifoat                  : scno = 497
	const Sysmknodat                   : scno = 498
	const Sysopenat                    : scno = 499
	const Sysreadlinkat                : scno = 500
	const Sysrenameat                  : scno = 501
	const Syssymlinkat                 : scno = 502
	const Sysunlinkat                  : scno = 503
	const Sysposix_openpt              : scno = 504
	const Sysgssd_syscall              : scno = 505
	const Sysjail_get                  : scno = 506
	const Sysjail_set                  : scno = 507
	const Sysjail_remove               : scno = 508
	const Sysclosefrom                 : scno = 509
	const Sys__semctl                  : scno = 510
	const Sysmsgctl                    : scno = 511
	const Sysshmctl                    : scno = 512
	const Syslpathconf                 : scno = 513
	const Sys__cap_rights_get          : scno = 515
	const Syscap_enter                 : scno = 516
	const Syscap_getmode               : scno = 517
	const Syspdfork                    : scno = 518
	const Syspdkill                    : scno = 519
	const Syspdgetpid                  : scno = 520
	const Syspselect                   : scno = 522
	const Sysgetloginclass             : scno = 523
	const Syssetloginclass             : scno = 524
	const Sysrctl_get_racct            : scno = 525
	const Sysrctl_get_rules            : scno = 526
	const Sysrctl_get_limits           : scno = 527
	const Sysrctl_add_rule             : scno = 528
	const Sysrctl_remove_rule          : scno = 529
	const Sysposix_fallocate           : scno = 530
	const Sysposix_fadvise             : scno = 531
	const Syswait6                     : scno = 532
	const Syscap_rights_limit          : scno = 533
	const Syscap_ioctls_limit          : scno = 534
	const Syscap_ioctls_get            : scno = 535
	const Syscap_fcntls_limit          : scno = 536
	const Syscap_fcntls_get            : scno = 537
	const Sysbindat                    : scno = 538
	const Sysconnectat                 : scno = 539
	const Syschflagsat                 : scno = 540
	const Sysaccept4                   : scno = 541
	const Syspipe2                     : scno = 542
	const Sysaio_mlock                 : scno = 543
	const Sysprocctl                   : scno = 544

	extern const syscall : (sc:scno, args:... -> int64)

	/* process control */
	const exit	: (status:int -> void)
	const getpid	: ( -> int64)
	const kill	: (pid:int64, sig:int64 -> int64)
	const fork	: (-> int64)
	const wait4	: (pid:int64, loc:int32#, opt : int64, usage:rusage#	-> int64)
	const waitpid	: (pid:int64, loc:int32#, opt : int64	-> int64)
	const execv	: (cmd : byte[:], args : byte[:][:] -> int64)
	const execve	: (cmd : byte[:], args : byte[:][:], env : byte[:][:] -> int64)
	/* wrappers to extract wait status */
	const waitstatus	: (st : int32 -> waitstatus)

	/* fd manipulation */
	const open	: (path:byte[:], opts:fdopt -> fd)
	const openmode	: (path:byte[:], opts:fdopt, mode:int64 -> fd)
	const close	: (fd:fd -> int64)
	const creat	: (path:byte[:], mode:int64 -> fd)
	const read	: (fd:fd, buf:byte[:] -> size)
	const write	: (fd:fd, buf:byte[:] -> size)
	const lseek	: (fd:fd, off:uint64, whence:int64 -> int64)
	const stat	: (path:byte[:], sb:statbuf# -> int64)
	const lstat	: (path:byte[:], sb:statbuf# -> int64)
	const fstat	: (fd:fd, sb:statbuf# -> int64)
	const mkdir	: (path : byte[:], mode : int64	-> int64)
	generic ioctl	: (fd:fd, req : int64, arg:@a# -> int64)
	const getdirentries64	: (fd : fd, buf : byte[:], basep : uint64# -> int64)

	/* networking */
	const socket	: (dom : sockfam, stype : socktype, proto : sockproto	-> fd)
	const connect	: (sock	: fd, addr : sockaddr#, len : size -> int)
	const accept	: (sock : fd, addr : sockaddr#, len : size# -> fd)
	const listen	: (sock : fd, backlog : int	-> int)
	const bind	: (sock : fd, addr : sockaddr#, len : size -> int)

	/* memory mapping */
	const munmap	: (addr:byte#, len:size -> int64)
	const mmap	: (addr:byte#, len:size, prot:mprot, flags:mopt, fd:fd, off:off -> byte#)

	/* time - doublecheck if this is right */
	const clock_getres	: (clk : clock, ts : timespec# -> int32)
	const clock_gettime	: (clk : clock, ts : timespec# -> int32)
	const clock_settime	: (clk : clock, ts : timespec# -> int32)
	const sleep	: (time : uint64 -> int32)
	const nanosleep	: (req : timespec#, rem : timespec# -> int32)

	/* system information */
	const uname 	: (buf : utsname# -> int)
	const sysctl	: (mib : int[:], old : byte[:]#, new : byte[:] -> int)
;;

/* 
wraps a syscall argument, converting it to 64 bits for the syscall function. This is
the same as casting, but more concise than writing castto(int64)
*/
generic a = {x : @t
	-> a(x)
}

extern const cstring	: (str : byte[:] -> byte#)
extern const alloca	: (sz : size	-> byte#)
extern const __cenvp : byte##

/* process management */
const exit	= {status;		syscall(Sysexit, a(status))}
const getpid	= {;			-> syscall(Sysgetpid, 1)}
const kill	= {pid, sig;		-> syscall(Syskill, pid, sig)}
const fork	= {;			-> syscall(Sysfork)}
const wait4	= {pid, loc, opt, usage;	-> syscall(Syswait4, pid, loc, opt, usage)}
const waitpid	= {pid, loc, opt;
	-> wait4(pid, loc, opt, 0 castto(rusage#)) 
}

const execv	= {cmd, args
	var p, cargs, i

	/* of course we fucking have to duplicate this code everywhere,
	* since we want to stack allocate... */
	p = alloca((args.len + 1)*sizeof(byte#))
	cargs = (p castto(byte##))[:args.len]
	for i = 0; i < args.len; i++
		cargs[i] = cstring(args[i])
	;;
	cargs[args.len] = 0 castto(byte#)
	-> syscall(Sysexecve, cstring(cmd), a(p), a(__cenvp))
}

const execve	= {cmd, args, env
	var cargs, cenv, i
	var p

	/* copy the args */
	p = alloca((args.len + 1)*sizeof(byte#))
	cargs = (p castto(byte##))[:args.len]
	for i = 0; i < args.len; i++
		cargs[i] = cstring(args[i])
	;;
	cargs[args.len] = 0 castto(byte#)

	/*
	 copy the env.
	 of course we fucking have to duplicate this code everywhere,
	 since we want to stack allocate... 
	*/
	p = alloca((env.len + 1)*sizeof(byte#))
	cenv = (p castto(byte##))[:env.len]
	for i = 0; i < env.len; i++
		cenv[i] = cstring(env[i])
	;;
	cenv[env.len] = 0 castto(byte#)

	-> syscall(Sysexecve, cstring(cmd), a(p), a(cenv))
}

/* fd manipulation */
const open	= {path, opts;		-> syscall(Sysopen, cstring(path), a(opts), a(0o777)) castto(fd)}
const openmode	= {path, opts, mode;	-> syscall(Sysopen, cstring(path), a(opts), a(mode)) castto(fd)}
const close	= {fd;			-> syscall(Sysclose, a(fd))}
const creat	= {path, mode;		-> openmode(path, Ocreat | Otrunc | Owronly, mode) castto(fd)}
const read	= {fd, buf;		-> syscall(Sysread, a(fd), buf castto(byte#), a(buf.len)) castto(size)}
const write	= {fd, buf;		-> syscall(Syswrite, a(fd), buf castto(byte#), a(buf.len)) castto(size)}
const lseek	= {fd, off, whence;	-> syscall(Syslseek, a(fd), a(off), a(whence))}
const stat	= {path, sb;		-> syscall(Sysstat, cstring(path), a(sb))}
const lstat	= {path, sb;		-> syscall(Syslstat, cstring(path), a(sb))}
const fstat	= {fd, sb;		-> syscall(Sysfstat, a(fd), a(sb))}
const mkdir	= {path, mode;		-> syscall(Sysmkdir, cstring(path), a(mode)) castto(int64)}
generic ioctl	= {fd, req, arg;	-> syscall(Sysioctl, a(fd), a(req), a(arg)) castto(int64)
}
const getdirentries64	= {fd, buf, basep;	-> syscall(Sysgetdirentries, a(fd), buf castto(byte#), a(buf.len), a(basep))}

/* networking */
const socket	= {dom, stype, proto;	-> syscall(Syssocket, a(dom), a(stype), a(proto)) castto(fd) }
const connect	= {sock, addr, len;	-> syscall(Sysconnect, a(sock), a(addr), a(len)) castto(int)}
const accept	= {sock, addr, len;	-> syscall(Sysaccept, a(sock), a(addr), a(len)) castto(fd)}
const listen	= {sock, backlog;	-> syscall(Syslisten, a(sock), a(backlog)) castto(int)}
const bind	= {sock, addr, len;	-> syscall(Sysbind, a(sock), a(addr), a(len)) castto(int)}

/* memory management */
const munmap	= {addr, len;		-> syscall(Sysmunmap, a(addr), a(len))}
const mmap	= {addr, len, prot, flags, fd, off;
	-> syscall(Sysmmap, a(addr), a(len), a(prot), a(flags), a(fd), a(off)) castto(byte#)}

/* time */
const clock_getres = {clk, ts;	-> syscall(Sysclock_getres, clockid(clk), a(ts)) castto(int32)}
const clock_gettime = {clk, ts;	-> syscall(Sysclock_gettime, clockid(clk), a(ts)) castto(int32)}
const clock_settime = {clk, ts;	-> syscall(Sysclock_settime, clockid(clk), a(ts)) castto(int32)}

/* system information */
const uname	= {buf;	-> syscall(Sysfreebsd4_uname, a(buf)) castto(int)}

const sysctl = {mib, old, new
	var mibp
	var mibsz
	var o
	var oldp
	var oldsz
	var newp
	var newsz
	var ret

	mibp = mib castto(byte#)
	mibsz = a(mib.len)
	o = old#
	oldp = o castto(byte#)
	oldsz = a(o.len)
	newp = new castto(byte#)
	newsz = a(new.len)

	/* all args already passed through a() or ar  ptrs */
	ret = syscall(Sys__sysctl, mibp, mibsz, oldp, oldsz, newp, newsz) castto(int)

	old# = o[:oldsz]
	-> ret
}

const clockid = {clk
	match clk
	| `Clockrealtime:		-> 0
	| `Clockvirtual:		-> 1
	| `Clockprof:			-> 2
	| `Clockmonotonic:		-> 4
	| `Clockuptime:			-> 5
	| `Clockuptime_precise:		-> 7
	| `Clockuptime_fast:		-> 8
	| `Clockrealtime_precise:	-> 9
	| `Clockrealtime_fast:		-> 10
	| `Clockmonotonic_precise:	-> 11
	| `Clockmonotonic_fast:		-> 12
	| `Clocksecond:			-> 13
	;;
	-> a(-1)
}

const waitstatus = {st
	match st & 0o177
	| 0:    -> `Waitexit (st >> 8)
	| 0x7f:-> `Waitstop (st >> 8)
	| sig:  -> `Waitsig sig
	;;
}