os: syscalls
parent
80da2341aa
commit
f9cc419dba
|
@ -3,8 +3,34 @@
|
||||||
// that can be found in the LICENSE file.
|
// that can be found in the LICENSE file.
|
||||||
module builtin
|
module builtin
|
||||||
|
|
||||||
|
|
||||||
|
//pub fn vsyscall(id int
|
||||||
|
//
|
||||||
|
|
||||||
|
/*
|
||||||
|
pub const (
|
||||||
|
sys_write = 1
|
||||||
|
sys_mkdir = 83
|
||||||
|
)
|
||||||
|
const (
|
||||||
|
stdin_value = 0
|
||||||
|
stdout_value = 1
|
||||||
|
stderr_value = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
fn C.puts(charptr)
|
||||||
|
*/
|
||||||
|
|
||||||
pub fn println(s string) {
|
pub fn println(s string) {
|
||||||
C.printf('%.*s\n', s.len, s.str)
|
/*
|
||||||
|
$if linux {
|
||||||
|
snl := s + '\n'
|
||||||
|
C.syscall(sys_write, stdout_value, snl.str, s.len+1)
|
||||||
|
}
|
||||||
|
$else {
|
||||||
|
*/
|
||||||
|
C.printf('%.*s\n', s.len, s.str)
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_backtrace_skipping_top_frames_msvc(skipframes int) bool {
|
fn print_backtrace_skipping_top_frames_msvc(skipframes int) bool {
|
||||||
|
@ -96,8 +122,8 @@ fn print_backtrace_skipping_top_frames_linux(skipframes int) bool {
|
||||||
// C.backtrace_symbols_fd(*voidptr(&buffer[skipframes]), nr_actual_frames, 1)
|
// C.backtrace_symbols_fd(*voidptr(&buffer[skipframes]), nr_actual_frames, 1)
|
||||||
return true
|
return true
|
||||||
} $else {
|
} $else {
|
||||||
C.printf('backtrace_symbols_fd is missing, so printing backtraces is not available.\n')
|
println('backtrace_symbols_fd is missing, so printing backtraces is not available.\n')
|
||||||
C.printf('Some libc implementations like musl simply do not provide it.\n')
|
println('Some libc implementations like musl simply do not provide it.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|
63
vlib/os/os.v
63
vlib/os/os.v
|
@ -31,6 +31,7 @@ pub const (
|
||||||
|
|
||||||
pub struct File {
|
pub struct File {
|
||||||
cfile voidptr // Using void* instead of FILE*
|
cfile voidptr // Using void* instead of FILE*
|
||||||
|
fd int
|
||||||
mut:
|
mut:
|
||||||
opened bool
|
opened bool
|
||||||
}
|
}
|
||||||
|
@ -269,49 +270,6 @@ fn read_ulines(path string) ?[]ustring {
|
||||||
return ulines
|
return ulines
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn open(path string) ?File {
|
|
||||||
mut file := File{}
|
|
||||||
$if windows {
|
|
||||||
wpath := path.to_wide()
|
|
||||||
mode := 'rb'
|
|
||||||
file = File{
|
|
||||||
cfile: C._wfopen(wpath, mode.to_wide())
|
|
||||||
}
|
|
||||||
} $else {
|
|
||||||
cpath := path.str
|
|
||||||
file = File{
|
|
||||||
cfile: C.fopen(charptr(cpath), 'rb')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isnil(file.cfile) {
|
|
||||||
return error('failed to open file "$path"')
|
|
||||||
}
|
|
||||||
file.opened = true
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
|
|
||||||
// create creates a file at a specified location and returns a writable `File` object.
|
|
||||||
pub fn create(path string) ?File {
|
|
||||||
mut file := File{}
|
|
||||||
$if windows {
|
|
||||||
wpath := path.replace('/', '\\').to_wide()
|
|
||||||
mode := 'wb'
|
|
||||||
file = File{
|
|
||||||
cfile: C._wfopen(wpath, mode.to_wide())
|
|
||||||
}
|
|
||||||
} $else {
|
|
||||||
cpath := path.str
|
|
||||||
file = File{
|
|
||||||
cfile: C.fopen(charptr(cpath), 'wb')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isnil(file.cfile) {
|
|
||||||
return error('failed to create file "$path"')
|
|
||||||
}
|
|
||||||
file.opened = true
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn open_append(path string) ?File {
|
pub fn open_append(path string) ?File {
|
||||||
mut file := File{}
|
mut file := File{}
|
||||||
$if windows {
|
$if windows {
|
||||||
|
@ -333,10 +291,6 @@ pub fn open_append(path string) ?File {
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (f mut File) write(s string) {
|
|
||||||
C.fputs(s.str, f.cfile)
|
|
||||||
// C.fwrite(s.str, 1, s.len, f.cfile)
|
|
||||||
}
|
|
||||||
// convert any value to []byte (LittleEndian) and write it
|
// convert any value to []byte (LittleEndian) and write it
|
||||||
// for example if we have write(7, 4), "07 00 00 00" gets written
|
// for example if we have write(7, 4), "07 00 00 00" gets written
|
||||||
// write(0x1234, 2) => "34 12"
|
// write(0x1234, 2) => "34 12"
|
||||||
|
@ -350,17 +304,6 @@ pub fn (f mut File) write_bytes_at(data voidptr, size, pos int) {
|
||||||
C.fseek(f.cfile, 0, C.SEEK_END)
|
C.fseek(f.cfile, 0, C.SEEK_END)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (f mut File) writeln(s string) {
|
|
||||||
if !f.opened {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// C.fwrite(s.str, 1, s.len, f.cfile)
|
|
||||||
// ss := s.clone()
|
|
||||||
// TODO perf
|
|
||||||
C.fputs(s.str, f.cfile)
|
|
||||||
// ss.free()
|
|
||||||
C.fputs('\n', f.cfile)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (f mut File) flush() {
|
pub fn (f mut File) flush() {
|
||||||
if !f.opened {
|
if !f.opened {
|
||||||
|
@ -374,6 +317,10 @@ pub fn (f mut File) close() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.opened = false
|
f.opened = false
|
||||||
|
$if linux {
|
||||||
|
C.syscall(sys_close, f.fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
C.fflush(f.cfile)
|
C.fflush(f.cfile)
|
||||||
C.fclose(f.cfile)
|
C.fclose(f.cfile)
|
||||||
}
|
}
|
||||||
|
|
103
vlib/os/os_nix.v
103
vlib/os/os_nix.v
|
@ -6,6 +6,20 @@ pub const (
|
||||||
path_separator = '/'
|
path_separator = '/'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
pub const (
|
||||||
|
sys_write = 1
|
||||||
|
sys_open = 2
|
||||||
|
sys_close = 3
|
||||||
|
sys_mkdir = 83
|
||||||
|
sys_creat = 85
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
stdin_value = 0
|
||||||
|
stdout_value = 1
|
||||||
|
stderr_value = 2
|
||||||
|
)
|
||||||
|
|
||||||
fn C.symlink(charptr, charptr) int
|
fn C.symlink(charptr, charptr) int
|
||||||
|
|
||||||
pub fn init_os_args(argc int, argv &byteptr) []string {
|
pub fn init_os_args(argc int, argv &byteptr) []string {
|
||||||
|
@ -61,12 +75,101 @@ pub fn is_dir(path string) bool {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
pub fn open(path string) ?File {
|
||||||
|
$if linux {
|
||||||
|
fd := C.syscall(sys_open, path.str, 511)
|
||||||
|
if fd == -1 {
|
||||||
|
return error('failed to open file "$path"')
|
||||||
|
}
|
||||||
|
return File{
|
||||||
|
fd: fd
|
||||||
|
opened: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$else {
|
||||||
|
cpath := path.str
|
||||||
|
file := File{
|
||||||
|
cfile: C.fopen(charptr(cpath), 'rb')
|
||||||
|
opened: true
|
||||||
|
}
|
||||||
|
if isnil(file.cfile) {
|
||||||
|
return error('failed to open file "$path"')
|
||||||
|
}
|
||||||
|
return file
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// create creates a file at a specified location and returns a writable `File` object.
|
||||||
|
pub fn create(path string) ?File {
|
||||||
|
$if linux {
|
||||||
|
fd := C.syscall(sys_creat, path.str, 511)
|
||||||
|
//////println('Fd=$fd')
|
||||||
|
if fd == -1 {
|
||||||
|
return error('failed to create file "$path"')
|
||||||
|
}
|
||||||
|
return File{
|
||||||
|
fd: fd
|
||||||
|
opened: true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
mut file := File{
|
||||||
|
cfile: C.fopen(charptr(path.str), 'wb')
|
||||||
|
opened: true
|
||||||
|
}
|
||||||
|
if isnil(file.cfile) {
|
||||||
|
return error('failed to create file "$path"')
|
||||||
|
}
|
||||||
|
return file
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (f mut File) write(s string) {
|
||||||
|
if !f.opened {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$if linux {
|
||||||
|
C.syscall(sys_write, f.fd, s.str, s.len)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
C.fputs(s.str, f.cfile)
|
||||||
|
// C.fwrite(s.str, 1, s.len, f.cfile)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (f mut File) writeln(s string) {
|
||||||
|
if !f.opened {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
$if linux {
|
||||||
|
snl := s + '\n'
|
||||||
|
C.syscall(sys_write, f.fd, snl.str, snl.len)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// C.fwrite(s.str, 1, s.len, f.cfile)
|
||||||
|
// ss := s.clone()
|
||||||
|
// TODO perf
|
||||||
|
C.fputs(s.str, f.cfile)
|
||||||
|
// ss.free()
|
||||||
|
C.fputs('\n', f.cfile)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// mkdir creates a new directory with the specified path.
|
// mkdir creates a new directory with the specified path.
|
||||||
pub fn mkdir(path string) ?bool {
|
pub fn mkdir(path string) ?bool {
|
||||||
if path == '.' {
|
if path == '.' {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
apath := os.realpath(path)
|
apath := os.realpath(path)
|
||||||
|
$if linux {
|
||||||
|
ret := C.syscall(sys_mkdir, apath.str, 511)
|
||||||
|
if ret == -1 {
|
||||||
|
return error(get_error_msg(C.errno))
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
r := C.mkdir(apath.str, 511)
|
r := C.mkdir(apath.str, 511)
|
||||||
if r == -1 {
|
if r == -1 {
|
||||||
return error(get_error_msg(C.errno))
|
return error(get_error_msg(C.errno))
|
||||||
|
|
|
@ -128,6 +128,51 @@ pub fn is_dir(path string) bool {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
pub fn open(path string) ?File {
|
||||||
|
mut file := File{}
|
||||||
|
wpath := path.to_wide()
|
||||||
|
mode := 'rb'
|
||||||
|
file = File{
|
||||||
|
cfile: C._wfopen(wpath, mode.to_wide())
|
||||||
|
}
|
||||||
|
if isnil(file.cfile) {
|
||||||
|
return error('failed to open file "$path"')
|
||||||
|
}
|
||||||
|
file.opened = true
|
||||||
|
return file
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// create creates a file at a specified location and returns a writable `File` object.
|
||||||
|
pub fn create(path string) ?File {
|
||||||
|
wpath := path.replace('/', '\\').to_wide()
|
||||||
|
mode := 'wb'
|
||||||
|
file := File{
|
||||||
|
cfile: C._wfopen(wpath, mode.to_wide())
|
||||||
|
opened: true
|
||||||
|
}
|
||||||
|
if isnil(file.cfile) {
|
||||||
|
return error('failed to create file "$path"')
|
||||||
|
}
|
||||||
|
return file
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (f mut File) write(s string) {
|
||||||
|
if !f.opened {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
C.fputs(s.str, f.cfile)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (f mut File) writeln(s string) {
|
||||||
|
if !f.opened {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// TODO perf
|
||||||
|
C.fputs(s.str, f.cfile)
|
||||||
|
C.fputs('\n', f.cfile)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// mkdir creates a new directory with the specified path.
|
// mkdir creates a new directory with the specified path.
|
||||||
|
|
Loading…
Reference in New Issue