class EL_FILE_LOCK_C_API
Unix file C API
note
description: "Unix file C API"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2024-08-26 17:02:52 GMT (Monday 26th August 2024)"
revision: "16"
class
EL_FILE_LOCK_C_API
inherit
EL_C_API
EL_UNIX_IMPLEMENTATION
feature {NONE} -- C Externals
frozen c_create_write_only (a_path: POINTER; a_error: TYPED_POINTER [INTEGER]): INTEGER
require
not_null_pointer: is_attached (a_path)
external
"C inline use <fcntl.h>"
alias
"[
int result = open ((const char *)$a_path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (result < 0) *((int*)$a_error) = errno;
return result;
]"
end
frozen c_aquire_lock (descriptor: INTEGER; fl: POINTER): INTEGER
require
valid_descriptor: descriptor /= -1
not_null_pointer: is_attached (fl)
external
"C inline use <fcntl.h>"
alias
"fcntl((int)$descriptor, F_SETLK, (struct flock*)$fl)"
end
frozen c_close (descriptor: INTEGER): INTEGER
require
valid_descriptor: descriptor /= -1
external
"C (int): EIF_INTEGER | <fcntl.h>"
alias
"close"
end
frozen c_file_truncate (descriptor, count: INTEGER): INTEGER
-- int ftruncate(int fildes, off_t length);
-- The ftruncate() function causes the regular file referenced by fildes to have a size of `count' bytes.
-- Upon successful completion, ftruncate() and truncate() return 0.
-- Otherwise a -1 is returned, and errno is set to indicate the error.
require
valid_descriptor: descriptor /= -1
external
"C (int, off_t): EIF_INTEGER | <fcntl.h>"
alias
"ftruncate"
end
frozen c_write (
descriptor: INTEGER; data: POINTER; byte_count: INTEGER; a_error: TYPED_POINTER [INTEGER]
): INTEGER
-- ssize_t write(int fildes, const void *buf, size_t nbyte);
-- The write() function attempts to write nbyte bytes from the buffer pointed to by buf to the file
-- associated with the open file descriptor, fildes. If nbyte is 0, write() will return 0 and have no
-- other results if the file is a regular file; otherwise, the results are unspecified.
-- https://pubs.opengroup.org/onlinepubs/7908799/xsh/write.html
external
"C inline use <fcntl.h>"
alias
"[
int result = write ((int)$descriptor, (const void *)$data, (size_t)$byte_count);
if (result < 0) *((int*)$a_error) = errno;
return result;
]"
end
feature {NONE} -- C struct flock
frozen c_flock_struct_size: INTEGER
external
"C [macro <fcntl.h>]"
alias
"sizeof(struct flock)"
end
frozen c_set_flock_type (p: POINTER; type: INTEGER)
--
external
"C [struct <fcntl.h>] (struct flock, int)"
alias
"l_type"
end
frozen c_set_flock_whence (p: POINTER; v: INTEGER)
--
external
"C [struct <fcntl.h>] (struct flock, int)"
alias
"l_whence"
end
frozen c_set_flock_start (p: POINTER; v: INTEGER)
--
external
"C [struct <fcntl.h>] (struct flock, int)"
alias
"l_start"
end
frozen c_set_flock_length (p: POINTER; v: INTEGER)
--
external
"C [struct <fcntl.h>] (struct flock, int)"
alias
"l_len"
end
feature {NONE} -- C macro constants
frozen c_file_write_lock: INTEGER
external
"C [macro <fcntl.h>]"
alias
"F_WRLCK"
end
frozen c_file_unlock: INTEGER
external
"C [macro <fcntl.h>]"
alias
"F_UNLCK"
end
frozen c_seek_set: INTEGER
external
"C [macro <fcntl.h>]"
alias
"SEEK_SET"
end
end