ref: 34d97453258079f514c3297f88663fc23ff6e080
parent: cfb284970e8c164d43d814496a5363b92782fb15
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jul 13 21:22:52 EDT 2019
Fix memory leak in bigparse. (Thanks, Mike)
diff -u a/lib/std/bigint.myr b/lib/std/bigint.myr
--- a/lib/std/bigint.myr
+++ b/lib/std/bigint.myr
@@ -284,6 +284,8 @@
bigadd(a, v)
;;
+ bigfree(b)
+ bigfree(v)
-> `Some a
}
--- a/lib/json/test/inputs/n_structure_whitespace_U+2060_word_joiner.json
+++ /dev/null
@@ -1,1 +1,0 @@
-[]
\ No newline at end of file
--- a/lib/json/test/inputs/y_number_negative_zero.json
+++ /dev/null
@@ -1,1 +1,0 @@
-[-0]
\ No newline at end of file
diff -u a/lib/std/bigint.myr b/lib/std/bigint.myr
--- a/lib/std/bigint.myr
+++ b/lib/std/bigint.myr
@@ -284,6 +284,8 @@
bigadd(a, v)
;;
+ bigfree(b)
+ bigfree(v)
-> `Some a
}
--- a/lib/std/bigint.myr
+++ b/lib/std/bigint.myr
@@ -284,6 +284,8 @@
bigadd(a, v)
;;
+ bigfree(b)
+ bigfree(v)
-> `Some a
}
--- a/lib/std/dir+openbsd.myr
+++ /dev/null
@@ -1,65 +1,0 @@
-use sys
-
-use "alloc"
-use "die"
-use "memops"
-use "option"
-use "result"
-use "slcp"
-use "sldup"
-use "types"
-
-pkg std =
- type dir = struct
- fd : sys.fd
- buf : byte[16384]
- len : int64
- off : int64
- ;;
-
- const diropen : (p : byte[:] -> std.result(dir#, byte[:]))
- const dirread : (d : dir# -> std.option(byte[:]))
- const dirclose : (d : dir# -> void)
-;;
-
-const diropen = {p
- var fd
- var dir
-
- fd = sys.open(p, sys.Ordonly | sys.Odir)
- if fd < 0
- -> `Err "couldn't open directory"
- ;;
- dir = zalloc()
- dir.fd = fd
- -> `Ok dir
-}
-
-const dirread = {d
- var len
- var dent
- var namelen
-
- if d.off >= d.len
- len = sys.getdents(d.fd, d.buf[:])
- if len <= 0
- -> `None
- ;;
- d.len = len
- d.off = 0
- ;;
-
- dent = (&d.buf[d.off] : sys.dirent#)
- namelen = 0
- d.off += (dent.reclen : int64)
- while dent.name[namelen] != 0
- namelen++
- ;;
- -> `Some sldup(dent.name[:namelen])
-}
-
-const dirclose = {d
- sys.close(d.fd)
- free(d)
-}
-
--- a/lib/std/syswrap-ss+openbsd.myr
+++ /dev/null
@@ -1,31 +1,0 @@
-use sys
-use "types"
-use "errno"
-use "cstrconv"
-use "slcp"
-use "die"
-
-pkg std =
- const nanosleep : (nsecs : uint64 -> errno)
- $noret const exit : (status:int -> void)
-
- pkglocal const bgetcwd : (buf : byte[:] -> errno)
-;;
-
-const exit = {status; sys.exit(status)}
-
-const bgetcwd = {buf
- -> (sys.__getcwd(buf) - 1 : errno)
-}
-
-const nanosleep = {nsecs
- var req, rem
- var s, ns
-
- s = (nsecs / 1_000_000_000 : int64)
- ns = (nsecs % 1_000_000_000 : int64)
- req = [.sec = s, .nsec = ns]
-
- -> (sys.nanosleep(&req, &rem) : errno)
-}
-
--- a/lib/sys/ifreq+netbsd.myr
+++ /dev/null
@@ -1,2 +1,0 @@
-pkg sys =
-;;
--- a/lib/sys/ifreq+openbsd.myr
+++ /dev/null
@@ -1,2 +1,0 @@
-pkg sys =
-;;
--- a/lib/sys/ifreq+plan9.myr
+++ /dev/null
@@ -1,2 +1,0 @@
-pkg sys =
-;;
--- a/lib/sys/syserrno+openbsd.myr
+++ /dev/null
@@ -1,123 +1,0 @@
-pkg sys =
- type errno = int
-
- const Eperm : errno = -1 /* Operation not permitted */
- const Enoent : errno = -2 /* No such file or directory */
- const Esrch : errno = -3 /* No such process */
- const Eintr : errno = -4 /* Interrupted system call */
- const Eio : errno = -5 /* Input/output error */
- const Enxio : errno = -6 /* Device not configured */
- const E2big : errno = -7 /* Argument list too long */
- const Enoexec : errno = -8 /* Exec format error */
- const Ebadf : errno = -9 /* Bad file descriptor */
- const Echild : errno = -10 /* No child processes */
- const Edeadlk : errno = -11 /* Resource deadlock avoided */
- /* 11 was EAGAIN */
- const Enomem : errno = -12 /* Cannot allocate memory */
- const Eacces : errno = -13 /* Permission denied */
- const Efault : errno = -14 /* Bad address */
- const Enotblk : errno = -15 /* Block device required */
- const Ebusy : errno = -16 /* Device busy */
- const Eexist : errno = -17 /* File exists */
- const Exdev : errno = -18 /* Cross-device link */
- const Enodev : errno = -19 /* Operation not supported by device */
- const Enotdir : errno = -20 /* Not a directory */
- const Eisdir : errno = -21 /* Is a directory */
- const Einval : errno = -22 /* Invalid argument */
- const Enfile : errno = -23 /* Too many open files in system */
- const Emfile : errno = -24 /* Too many open files */
- const Enotty : errno = -25 /* Inappropriate ioctl for device */
- const Etxtbsy : errno = -26 /* Text file busy */
- const Efbig : errno = -27 /* File too large */
- const Enospc : errno = -28 /* No space left on device */
- const Espipe : errno = -29 /* Illegal seek */
- const Erofs : errno = -30 /* Read-only filesystem */
- const Emlink : errno = -31 /* Too many links */
- const Epipe : errno = -32 /* Broken pipe */
-
- /* math software */
- const Edom : errno = -33 /* Numerical argument out of domain */
- const Erange : errno = -34 /* Result too large */
-
- /* non-blocking and interrupt i/o */
- const Eagain : errno = -35 /* Resource temporarily unavailable */
- const Einprogress : errno = -36 /* Operation now in progress */
- const Ealready : errno = -37 /* Operation already in progress */
-
- /* ipc/network software -- argument errors */
- const Enotsock : errno = -38 /* Socket operation on non-socket */
- const Edestaddrreq : errno = -39 /* Destination address required */
- const Emsgsize : errno = -40 /* Message too long */
- const Eprototype : errno = -41 /* Protocol wrong type for socket */
- const Enoprotoopt : errno = -42 /* Protocol not available */
- const Eprotonosupport : errno = -43 /* Protocol not supported */
- const Esocktnosupport : errno = -44 /* Socket type not supported */
- const Eopnotsupp : errno = -45 /* Operation not supported */
- const Epfnosupport : errno = -46 /* Protocol family not supported */
- const Eafnosupport : errno = -47 /* Address family not supported by protocol family */
- const Eaddrinuse : errno = -48 /* Address already in use */
- const Eaddrnotavail : errno = -49 /* Can't assign requested address */
-
- /* ipc/network software -- operational errors */
- const Enetdown : errno = -50 /* Network is down */
- const Enetunreach : errno = -51 /* Network is unreachable */
- const Enetreset : errno = -52 /* Network dropped connection on reset */
- const Econnaborted : errno = -53 /* Software caused connection abort */
- const Econnreset : errno = -54 /* Connection reset by peer */
- const Enobufs : errno = -55 /* No buffer space available */
- const Eisconn : errno = -56 /* Socket is already connected */
- const Enotconn : errno = -57 /* Socket is not connected */
- const Eshutdown : errno = -58 /* Can't send after socket shutdown */
- const Etoomanyrefs : errno = -59 /* Too many references: can't splice */
- const Etimedout : errno = -60 /* Operation timed out */
- const Econnrefused : errno = -61 /* Connection refused */
-
- const Eloop : errno = -62 /* Too many levels of symbolic links */
- const Enametoolong : errno = -63 /* File name too long */
-
- /* should be rearranged */
- const Ehostdown : errno = -64 /* Host is down */
- const Ehostunreach : errno = -65 /* No route to host */
- const Enotempty : errno = -66 /* Directory not empty */
-
- /* quotas & mush */
- const Eproclim : errno = -67 /* Too many processes */
- const Eusers : errno = -68 /* Too many users */
- const Edquot : errno = -69 /* Disc quota exceeded */
-
- /* Network File System */
- const Estale : errno = -70 /* Stale NFS file handle */
- const Eremote : errno = -71 /* Too many levels of remote in path */
- const Ebadrpc : errno = -72 /* RPC struct is bad */
- const Erpcmismatch : errno = -73 /* RPC version wrong */
- const Eprogunavail : errno = -74 /* RPC prog. not avail */
- const Eprogmismatch : errno = -75 /* Program version wrong */
- const Eprocunavail : errno = -76 /* Bad procedure for program */
-
- const Enolck : errno = -77 /* No locks available */
- const Enosys : errno = -78 /* Function not implemented */
-
- const Eftype : errno = -79 /* Inappropriate file type or format */
- const Eauth : errno = -80 /* Authentication error */
- const Eneedauth : errno = -81 /* Need authenticator */
- const Eidrm : errno = -82 /* Identifier removed */
- const Enomsg : errno = -83 /* No message of desired type */
- const Eoverflow : errno = -84 /* Value too large to be stored in data type */
- const Ecanceled : errno = -85 /* Operation canceled */
- const Eilseq : errno = -86 /* Illegal byte sequence */
- const Enoattr : errno = -87 /* Attribute not found */
-
- const Edoofus : errno = -88 /* Programming error */
-
- const Ebadmsg : errno = -89 /* Bad message */
- const Emultihop : errno = -90 /* Multihop attempted */
- const Enolink : errno = -91 /* Link has been severed */
- const Eproto : errno = -92 /* Protocol error */
-
- const Enotcapable : errno = -93 /* Capabilities insufficient */
- const Ecapmode : errno = -94 /* Not permitted in capability mode */
- const Enotrecoverable : errno = -95 /* State not recoverable */
- const Eownerdead : errno = -96 /* Previous owner died */
-
- const Elast : errno = -96 /* Must be equal largest errno */
-;;
--- a/lib/thread/ncpu+openbsd.myr
+++ /dev/null
@@ -1,23 +1,0 @@
-use std
-use sys
-
-pkg thread =
- const ncpu : (-> int)
-;;
-
-const ncpu = {
- var mib : int[2]
- var ncpu : int
- var ncpusz
- var res
-
- mib[0] = 6 /* CTL_HW */
- mib[1] = 3 /* HW_NCPU */
- ncpusz = sizeof(int)
-
- res = sys.sysctl(mib[:], (&ncpu : void#), &ncpusz, (0 : void#), (0 : sys.size#))
- if res < 0 || ncpu <= 0
- -> 1
- ;;
- -> ncpu
-}
--- a/rt/abort-netbsd.s
+++ /dev/null
@@ -1,42 +1,0 @@
-.text
-
-.globl _rt$abort_oob
-.globl __rt$abort_oob
-_rt$abort_oob:
-__rt$abort_oob:
- /* format pc */
- movq (%rsp),%rax
- movq $15,%rdx
- leaq .digitchars(%rip),%r8
- leaq .pcstr(%rip),%r9
-.loop:
- movq %rax, %rcx
- andq $0xf, %rcx
- movb (%r8,%rcx),%r10b
- movb %r10b,(%r9,%rdx)
- subq $1, %rdx
- shrq $4, %rax
- jnz .loop
- /* write abort message */
- movq $4, %rax /* write(fd=%rdi, msg=%rsi, len=%rdx) */
- movq $2, %rdi /* fd */
- leaq .msg(%rip), %rsi /* msg */
- movq $(.msgend-.msg), %rdx /* length */
- syscall
- /* kill self */
- movq $20,%rax /* getpid */
- syscall
- movq %rax, %rdi /* save pid */
- movq $37, %rax /* kill(pid=%rdi, sig=%rsi) */
- movq $6, %rsi
- syscall
-.data
-.msg: /* pc name: */
- .ascii "0x"
-.pcstr:
- .ascii "0000000000000000"
- .ascii ": out of bounds access\n"
-.msgend:
-
-.digitchars:
- .ascii "0123456789abcdef"
--- a/support/syscall-gen/specials+openbsd:6.2-x64.frag
+++ /dev/null
@@ -1,286 +1,0 @@
-/* process control */
-const exit : (status:int -> void)
-const getpid : ( -> pid)
-const kill : (pid:pid, sig:int64 -> int64)
-const fork : (-> pid)
-const wait4 : (pid:pid, loc:int32#, opt : int64, usage:rusage# -> int64)
-const waitpid : (pid:pid, 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)
-extern const __tfork_thread : (tfp : tforkparams#, sz : size, fn : void#, arg : void# -> pid)
-
-/* 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 unlink : (path:byte[:] -> int)
-const read : (fd:fd, buf:byte[:] -> size)
-const pread : (fd:fd, buf:byte[:], off : off -> size)
-const readv : (fd:fd, iov:iovec[:] -> size)
-const write : (fd:fd, buf:byte[:] -> size)
-const pwrite : (fd:fd, buf:byte[:], off : off -> size)
-const writev : (fd:fd, iov:iovec[:] -> size)
-const lseek : (fd:fd, off : off, whence : whence -> 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 getdents : (fd : fd, buf : byte[:] -> int64)
-const chdir : (p : byte[:] -> int64)
-const __getcwd : (buf : byte[:] -> int64)
-const poll : (pfd : pollfd[:], tm : int -> int)
-
-/* signals */
-const sigaction : (sig : signo, act : sigaction#, oact : sigaction# -> int)
-const sigprocmask : (how : int32, set : sigset#, oset : sigset# -> int)
-
-/* fd stuff */
-const pipe : (fds : fd[2]# -> int64)
-const dup : (fd : fd -> fd)
-const dup2 : (src : fd, dst : fd -> fd)
-/* NB: the C ABI uses '...' for the args. */
-const fcntl : (fd : fd, cmd : fcntlcmd, args : byte# -> 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)
-const setsockopt : (sock : fd, lev : sockproto, opt : sockopt, val : void#, len : size -> int)
-const getsockopt : (sock : fd, lev : sockproto, opt : sockopt, val : void#, 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 : void#, oldsz : size#, \
- new : void#, newsz : size# \
- -> 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 a cast to uint64
-*/
-generic a = {x : @t; -> (x : uint64)}
-
-extern const cstring : (str : byte[:] -> byte#)
-extern const alloca : (sz : size -> byte#)
-
-extern const __freebsd_pipe : (fds : fd[2]# -> int64)
-
-/* process management */
-const exit = {status; syscall(Sysexit, a(status))}
-const getpid = {; -> (syscall(Sysgetpid, 1) : pid)}
-const kill = {pid, sig; -> syscall(Syskill, pid, sig)}
-const fork = {; -> (syscall(Sysfork) : pid)}
-const wait4 = {pid, loc, opt, usage; -> syscall(Syswait4, pid, loc, opt, usage)}
-const waitpid = {pid, loc, opt;
- -> wait4(pid, loc, opt, (0 : 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 : byte##)[:args.len + 1]
- for i = 0; i < args.len; i++
- cargs[i] = cstring(args[i])
- ;;
- cargs[args.len] = (0 : 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 : byte##)[:args.len]
- for i = 0; i < args.len; i++
- cargs[i] = cstring(args[i])
- ;;
- cargs[args.len] = (0 : 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 : byte##)[:env.len]
- for i = 0; i < env.len; i++
- cenv[i] = cstring(env[i])
- ;;
- cenv[env.len] = (0 : byte#)
-
- -> syscall(Sysexecve, cstring(cmd), a(p), a(cenv))
-}
-
-/* fd manipulation */
-const open = {path, opts; -> (syscall(Sysopen, cstring(path), a(opts), a(0o777)) : fd)}
-const openmode = {path, opts, mode; -> (syscall(Sysopen, cstring(path), a(opts), a(mode)) : fd)}
-const close = {fd; -> syscall(Sysclose, a(fd))}
-const creat = {path, mode; -> (openmode(path, Ocreat | Otrunc | Owronly, mode) : fd)}
-const unlink = {path; -> (syscall(Sysunlink, cstring(path)) : int)}
-const read = {fd, buf; -> (syscall(Sysread, a(fd), (buf : byte#), a(buf.len)) : size)}
-const pread = {fd, buf, off; -> (syscall(Syspread, a(fd), (buf : byte#), a(buf.len), a(off)) : size)}
-const readv = {fd, vec; -> (syscall(Sysreadv, a(fd), (vec : iovec#), a(vec.len)) : size)}
-const write = {fd, buf; -> (syscall(Syswrite, a(fd), (buf : byte#), a(buf.len)) : size)}
-const pwrite = {fd, buf, off; -> (syscall(Syspwrite, a(fd), (buf : byte#), a(buf.len), a(off)) : size)}
-const writev = {fd, vec; -> (syscall(Syswritev, a(fd), (vec : iovec#), a(vec.len)) : 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)) : int64)}
-generic ioctl = {fd, req, arg; -> (syscall(Sysioctl, a(fd), a(req), a(arg)) : int64)}
-const chdir = {dir; -> syscall(Syschdir, cstring(dir))}
-const __getcwd = {buf; -> syscall(Sys__getcwd, a(buf), a(buf.len))}
-const getdents = {fd, buf; -> (syscall(Sysgetdents, a(fd), a(buf), a(buf.len)) : int64)}
-
-/* signals */
-const sigaction = {sig, act, oact; -> (syscall(Syssigaction, a(sig), a(act), a(oact)) : int)}
-const sigprocmask = {sig, act, oact; -> (syscall(Syssigprocmask, a(sig), a(act), a(oact)) : int)}
-
-/* file stuff */
-const pipe = {fds; -> syscall(Syspipe, fds)}
-const dup = {fd; -> (syscall(Sysdup, a(fd)) : fd)}
-const dup2 = {src, dst; -> (syscall(Sysdup2, a(src), a(dst)) : fd)}
-const fcntl = {fd, cmd, args; -> syscall(Sysfcntl, a(fd), a(cmd), a(args))}
-const poll = {pfd, tm; -> (syscall(Syspoll, (pfd : byte#), a(pfd.len), a(tm)) : int)}
-
-/* networking */
-const socket = {dom, stype, proto; -> (syscall(Syssocket, a(dom), a(stype), a(proto)) : fd)}
-const connect = {sock, addr, len; -> (syscall(Sysconnect, a(sock), a(addr), a(len)) : int)}
-const accept = {sock, addr, len; -> (syscall(Sysaccept, a(sock), a(addr), a(len)) : fd)}
-const listen = {sock, backlog; -> (syscall(Syslisten, a(sock), a(backlog)) : int)}
-const bind = {sock, addr, len; -> (syscall(Sysbind, a(sock), a(addr), a(len)) : int)}
-const setsockopt = {sock, lev, opt, val, len; -> (syscall(Syssetsockopt, a(sock), a(lev), a(opt), a(val), a(len)) : int)}
-const getsockopt = {sock, lev, opt, val, len; -> (syscall(Syssetsockopt, a(sock), a(lev), a(opt), a(val), a(len)) : int)}
-
-/* memory management */
-const munmap = {addr, len; -> syscall(Sysmunmap, a(addr), a(len))}
-const mmap = {addr, len, prot, flags, fd, off;
- /* the actual syscall has padding on the offset arg */
- -> (syscall(Sysmmap, a(addr), a(len), a(prot), a(flags), a(fd), a(0), a(off)) : byte#)
-}
-
-/* time */
-const clock_getres = {clk, ts; -> (syscall(Sysclock_getres, clockid(clk), a(ts)) : int32)}
-const clock_gettime = {clk, ts; -> (syscall(Sysclock_gettime, clockid(clk), a(ts)) : int32)}
-const clock_settime = {clk, ts; -> (syscall(Sysclock_settime, clockid(clk), a(ts)) : int32)}
-
-const sleep = {time
- var req, rem
- req = [.sec = (time : int64), .nsec = 0]
- -> nanosleep(&req, &rem)
-}
-
-const nanosleep = {req, rem; -> (syscall(Sysnanosleep, a(req), a(rem)) : int32)}
-
-
-/* system information */
-const uname = {buf
- var mib : int[2]
- var ret
- var sys, syssz
- var nod, nodsz
- var rel, relsz
- var ver, versz
- var mach, machsz
-
- ret = 0
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 1 /* KERN_OSTYPE */
- sys = (buf.system[:] : void#)
- syssz = buf.system.len
- ret = sysctl(mib[:], sys, &syssz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 10 /* KERN_HOSTNAME */
- nod = (buf.node[:] : void#)
- nodsz = buf.node.len
- ret = sysctl(mib[:], nod, &nodsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 2 /* KERN_OSRELEASE */
- rel = (buf.release[:] : void#)
- relsz = buf.release.len
- ret = sysctl(mib[:], rel, &relsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 27 /* KERN_OSVERSION */
- ver = (buf.version[:] : void#)
- versz = buf.version.len
- ret = sysctl(mib[:], ver, &versz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 6 /* CTL_HW */
- mib[1] = 1 /* HW_MACHINE */
- mach = (buf.machine[:] : void#)
- machsz = buf.machine.len
- ret = sysctl(mib[:], mach, &machsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- -> 0
-}
-
-const sysctl = {mib, old, oldsz, new, newsz
- /* all args already passed through a() or ar ptrs */
- -> (syscall(Syssysctl, \
- (mib : int#), a(mib.len), old, oldsz, new, newsz) : int)
-}
-
-const clockid = {clk
- match clk
- | `Clockrealtime: -> 0
- | `Clockproccputime: -> 2
- | `Clockmonotonic: -> 3
- | `Clockthreadcputime: -> 4
- | `Clockuptime: -> 5
- ;;
- -> -1
-}
-
-const waitstatus = {st
- if st < 0
- -> `Waitfail st
- ;;
- match st & 0o177
- | 0: -> `Waitexit (st >> 8)
- | 0x7f:-> `Waitstop (st >> 8)
- | sig: -> `Waitsig sig
- ;;
-}
-
--- a/support/syscall-gen/specials+openbsd:6.3-x64.frag
+++ /dev/null
@@ -1,286 +1,0 @@
-/* process control */
-const exit : (status:int -> void)
-const getpid : ( -> pid)
-const kill : (pid:pid, sig:int64 -> int64)
-const fork : (-> pid)
-const wait4 : (pid:pid, loc:int32#, opt : int64, usage:rusage# -> int64)
-const waitpid : (pid:pid, 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)
-extern const __tfork_thread : (tfp : tforkparams#, sz : size, fn : void#, arg : void# -> pid)
-
-/* 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 unlink : (path:byte[:] -> int)
-const read : (fd:fd, buf:byte[:] -> size)
-const pread : (fd:fd, buf:byte[:], off : off -> size)
-const readv : (fd:fd, iov:iovec[:] -> size)
-const write : (fd:fd, buf:byte[:] -> size)
-const pwrite : (fd:fd, buf:byte[:], off : off -> size)
-const writev : (fd:fd, iov:iovec[:] -> size)
-const lseek : (fd:fd, off : off, whence : whence -> 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 getdents : (fd : fd, buf : byte[:] -> int64)
-const chdir : (p : byte[:] -> int64)
-const __getcwd : (buf : byte[:] -> int64)
-const poll : (pfd : pollfd[:], tm : int -> int)
-
-/* signals */
-const sigaction : (sig : signo, act : sigaction#, oact : sigaction# -> int)
-const sigprocmask : (how : int32, set : sigset#, oset : sigset# -> int)
-
-/* fd stuff */
-const pipe : (fds : fd[2]# -> int64)
-const dup : (fd : fd -> fd)
-const dup2 : (src : fd, dst : fd -> fd)
-/* NB: the C ABI uses '...' for the args. */
-const fcntl : (fd : fd, cmd : fcntlcmd, args : byte# -> 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)
-const setsockopt : (sock : fd, lev : sockproto, opt : sockopt, val : void#, len : size -> int)
-const getsockopt : (sock : fd, lev : sockproto, opt : sockopt, val : void#, 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 : void#, oldsz : size#, \
- new : void#, newsz : size# \
- -> 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 a cast to uint64
-*/
-generic a = {x : @t; -> (x : uint64)}
-
-extern const cstring : (str : byte[:] -> byte#)
-extern const alloca : (sz : size -> byte#)
-
-extern const __freebsd_pipe : (fds : fd[2]# -> int64)
-
-/* process management */
-const exit = {status; syscall(Sysexit, a(status))}
-const getpid = {; -> (syscall(Sysgetpid, 1) : pid)}
-const kill = {pid, sig; -> syscall(Syskill, pid, sig)}
-const fork = {; -> (syscall(Sysfork) : pid)}
-const wait4 = {pid, loc, opt, usage; -> syscall(Syswait4, pid, loc, opt, usage)}
-const waitpid = {pid, loc, opt;
- -> wait4(pid, loc, opt, (0 : 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 : byte##)[:args.len + 1]
- for i = 0; i < args.len; i++
- cargs[i] = cstring(args[i])
- ;;
- cargs[args.len] = (0 : 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 : byte##)[:args.len]
- for i = 0; i < args.len; i++
- cargs[i] = cstring(args[i])
- ;;
- cargs[args.len] = (0 : 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 : byte##)[:env.len]
- for i = 0; i < env.len; i++
- cenv[i] = cstring(env[i])
- ;;
- cenv[env.len] = (0 : byte#)
-
- -> syscall(Sysexecve, cstring(cmd), a(p), a(cenv))
-}
-
-/* fd manipulation */
-const open = {path, opts; -> (syscall(Sysopen, cstring(path), a(opts), a(0o777)) : fd)}
-const openmode = {path, opts, mode; -> (syscall(Sysopen, cstring(path), a(opts), a(mode)) : fd)}
-const close = {fd; -> syscall(Sysclose, a(fd))}
-const creat = {path, mode; -> (openmode(path, Ocreat | Otrunc | Owronly, mode) : fd)}
-const unlink = {path; -> (syscall(Sysunlink, cstring(path)) : int)}
-const read = {fd, buf; -> (syscall(Sysread, a(fd), (buf : byte#), a(buf.len)) : size)}
-const pread = {fd, buf, off; -> (syscall(Syspread, a(fd), (buf : byte#), a(buf.len), a(off)) : size)}
-const readv = {fd, vec; -> (syscall(Sysreadv, a(fd), (vec : iovec#), a(vec.len)) : size)}
-const write = {fd, buf; -> (syscall(Syswrite, a(fd), (buf : byte#), a(buf.len)) : size)}
-const pwrite = {fd, buf, off; -> (syscall(Syspwrite, a(fd), (buf : byte#), a(buf.len), a(off)) : size)}
-const writev = {fd, vec; -> (syscall(Syswritev, a(fd), (vec : iovec#), a(vec.len)) : 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)) : int64)}
-generic ioctl = {fd, req, arg; -> (syscall(Sysioctl, a(fd), a(req), a(arg)) : int64)}
-const chdir = {dir; -> syscall(Syschdir, cstring(dir))}
-const __getcwd = {buf; -> syscall(Sys__getcwd, a(buf), a(buf.len))}
-const getdents = {fd, buf; -> (syscall(Sysgetdents, a(fd), a(buf), a(buf.len)) : int64)}
-
-/* signals */
-const sigaction = {sig, act, oact; -> (syscall(Syssigaction, a(sig), a(act), a(oact)) : int)}
-const sigprocmask = {sig, act, oact; -> (syscall(Syssigprocmask, a(sig), a(act), a(oact)) : int)}
-
-/* file stuff */
-const pipe = {fds; -> syscall(Syspipe, fds)}
-const dup = {fd; -> (syscall(Sysdup, a(fd)) : fd)}
-const dup2 = {src, dst; -> (syscall(Sysdup2, a(src), a(dst)) : fd)}
-const fcntl = {fd, cmd, args; -> syscall(Sysfcntl, a(fd), a(cmd), a(args))}
-const poll = {pfd, tm; -> (syscall(Syspoll, (pfd : byte#), a(pfd.len), a(tm)) : int)}
-
-/* networking */
-const socket = {dom, stype, proto; -> (syscall(Syssocket, a(dom), a(stype), a(proto)) : fd)}
-const connect = {sock, addr, len; -> (syscall(Sysconnect, a(sock), a(addr), a(len)) : int)}
-const accept = {sock, addr, len; -> (syscall(Sysaccept, a(sock), a(addr), a(len)) : fd)}
-const listen = {sock, backlog; -> (syscall(Syslisten, a(sock), a(backlog)) : int)}
-const bind = {sock, addr, len; -> (syscall(Sysbind, a(sock), a(addr), a(len)) : int)}
-const setsockopt = {sock, lev, opt, val, len; -> (syscall(Syssetsockopt, a(sock), a(lev), a(opt), a(val), a(len)) : int)}
-const getsockopt = {sock, lev, opt, val, len; -> (syscall(Syssetsockopt, a(sock), a(lev), a(opt), a(val), a(len)) : int)}
-
-/* memory management */
-const munmap = {addr, len; -> syscall(Sysmunmap, a(addr), a(len))}
-const mmap = {addr, len, prot, flags, fd, off;
- /* the actual syscall has padding on the offset arg */
- -> (syscall(Sysmmap, a(addr), a(len), a(prot), a(flags), a(fd), a(0), a(off)) : byte#)
-}
-
-/* time */
-const clock_getres = {clk, ts; -> (syscall(Sysclock_getres, clockid(clk), a(ts)) : int32)}
-const clock_gettime = {clk, ts; -> (syscall(Sysclock_gettime, clockid(clk), a(ts)) : int32)}
-const clock_settime = {clk, ts; -> (syscall(Sysclock_settime, clockid(clk), a(ts)) : int32)}
-
-const sleep = {time
- var req, rem
- req = [.sec = (time : int64), .nsec = 0]
- -> nanosleep(&req, &rem)
-}
-
-const nanosleep = {req, rem; -> (syscall(Sysnanosleep, a(req), a(rem)) : int32)}
-
-
-/* system information */
-const uname = {buf
- var mib : int[2]
- var ret
- var sys, syssz
- var nod, nodsz
- var rel, relsz
- var ver, versz
- var mach, machsz
-
- ret = 0
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 1 /* KERN_OSTYPE */
- sys = (buf.system[:] : void#)
- syssz = buf.system.len
- ret = sysctl(mib[:], sys, &syssz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 10 /* KERN_HOSTNAME */
- nod = (buf.node[:] : void#)
- nodsz = buf.node.len
- ret = sysctl(mib[:], nod, &nodsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 2 /* KERN_OSRELEASE */
- rel = (buf.release[:] : void#)
- relsz = buf.release.len
- ret = sysctl(mib[:], rel, &relsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 1 /* CTL_KERN */
- mib[1] = 27 /* KERN_OSVERSION */
- ver = (buf.version[:] : void#)
- versz = buf.version.len
- ret = sysctl(mib[:], ver, &versz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- mib[0] = 6 /* CTL_HW */
- mib[1] = 1 /* HW_MACHINE */
- mach = (buf.machine[:] : void#)
- machsz = buf.machine.len
- ret = sysctl(mib[:], mach, &machsz, (0 : void#), (0 : size#))
- if ret < 0
- -> ret
- ;;
-
- -> 0
-}
-
-const sysctl = {mib, old, oldsz, new, newsz
- /* all args already passed through a() or ar ptrs */
- -> (syscall(Syssysctl, \
- (mib : int#), a(mib.len), old, oldsz, new, newsz) : int)
-}
-
-const clockid = {clk
- match clk
- | `Clockrealtime: -> 0
- | `Clockproccputime: -> 2
- | `Clockmonotonic: -> 3
- | `Clockthreadcputime: -> 4
- | `Clockuptime: -> 5
- ;;
- -> -1
-}
-
-const waitstatus = {st
- if st < 0
- -> `Waitfail st
- ;;
- match st & 0o177
- | 0: -> `Waitexit (st >> 8)
- | 0x7f:-> `Waitstop (st >> 8)
- | sig: -> `Waitsig sig
- ;;
-}
-
--- a/test/data/catfile-in
+++ /dev/null
@@ -1,1 +1,0 @@
-Hello-世界