diff options
author | Maxim Devaev <[email protected]> | 2022-06-24 03:23:23 +0300 |
---|---|---|
committer | Maxim Devaev <[email protected]> | 2022-06-24 03:23:23 +0300 |
commit | 3e5bcc752c9defc5d520ec313d4f7ae34b46afb3 (patch) | |
tree | 00604dcdba5c927d8fb6e791920b67751ba9f940 | |
parent | e51a35b28e21f148e2e1364894514b50c6645e53 (diff) |
exchange helper
-rw-r--r-- | kvmd/helpers/exchange/__init__.py | 55 | ||||
-rw-r--r-- | kvmd/helpers/exchange/__main__.py | 24 | ||||
-rwxr-xr-x | setup.py | 2 |
3 files changed, 81 insertions, 0 deletions
diff --git a/kvmd/helpers/exchange/__init__.py b/kvmd/helpers/exchange/__init__.py new file mode 100644 index 00000000..3675d709 --- /dev/null +++ b/kvmd/helpers/exchange/__init__.py @@ -0,0 +1,55 @@ +# ========================================================================== # +# # +# KVMD - The main PiKVM daemon. # +# # +# Copyright (C) 2018-2022 Maxim Devaev <[email protected]> # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see <https://www.gnu.org/licenses/>. # +# # +# ========================================================================== # + + +import sys +import os +import ctypes +import ctypes.util + +from ctypes import c_int +from ctypes import c_uint +from ctypes import c_char_p + + +# ===== +def main() -> None: + if len(sys.argv) != 3: + raise SystemExit(f"Usage: {sys.argv[0]} <file1> <file2>") + + path = ctypes.util.find_library("c") + if not path: + raise SystemExit("Where is libc?") + assert path + libc = ctypes.CDLL(path) + libc.renameat2.restype = c_int + libc.renameat2.argtypes = [c_int, c_char_p, c_int, c_char_p, c_uint] + + result = libc.renameat2( + -100, # AT_FDCWD + os.fsencode(sys.argv[1]), + -100, + os.fsencode(sys.argv[2]), + (1 << 1), # RENAME_EXCHANGE + ) + + if result != 0: + raise SystemExit(f"{sys.argv[0]}: {os.strerror(ctypes.get_errno())}") diff --git a/kvmd/helpers/exchange/__main__.py b/kvmd/helpers/exchange/__main__.py new file mode 100644 index 00000000..3849d1b9 --- /dev/null +++ b/kvmd/helpers/exchange/__main__.py @@ -0,0 +1,24 @@ +# ========================================================================== # +# # +# KVMD - The main PiKVM daemon. # +# # +# Copyright (C) 2018-2022 Maxim Devaev <[email protected]> # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see <https://www.gnu.org/licenses/>. # +# # +# ========================================================================== # + + +from . import main +main() @@ -112,6 +112,7 @@ def main() -> None: "kvmd.apps.watchdog", "kvmd.helpers", "kvmd.helpers.remount", + "kvmd.helpers.exchange", ], package_data={ @@ -136,6 +137,7 @@ def main() -> None: "kvmd-watchdog = kvmd.apps.watchdog:main", "kvmd-helper-pst-remount = kvmd.helpers.remount:main", "kvmd-helper-otgmsd-remount = kvmd.helpers.remount:main", + "kvmd-helper-exchange = kvmd.helpers.exchange:main", ], }, |