mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
rename: RENAME_NOREPLACE
This commit is contained in:
@@ -1871,6 +1871,12 @@ static int ext2_rename(vnode_t *sourcedir, vnode_t *source, char *oldname, vnode
|
|||||||
ext2node_t *ext2_replaced_node = (ext2node_t *)replaced_vnode;
|
ext2node_t *ext2_replaced_node = (ext2node_t *)replaced_vnode;
|
||||||
|
|
||||||
if (replaced_vnode) {
|
if (replaced_vnode) {
|
||||||
|
if (flags & RENAME_NOREPLACE) {
|
||||||
|
VOP_UNLOCK(replaced_vnode);
|
||||||
|
VOP_RELEASE(replaced_vnode);
|
||||||
|
return EEXIST;
|
||||||
|
}
|
||||||
|
|
||||||
// we are replacing an existing link
|
// we are replacing an existing link
|
||||||
// do some checks expected by posix
|
// do some checks expected by posix
|
||||||
if (source->type != V_TYPE_DIR && replaced_vnode->type == V_TYPE_DIR) {
|
if (source->type != V_TYPE_DIR && replaced_vnode->type == V_TYPE_DIR) {
|
||||||
|
|||||||
@@ -738,6 +738,12 @@ static int fatfs_rename(vnode_t *vsource_dir, vnode_t *vsource, char *old_name,
|
|||||||
target = (fatnode_t *)vtarget;
|
target = (fatnode_t *)vtarget;
|
||||||
|
|
||||||
if (target) {
|
if (target) {
|
||||||
|
if (flags & RENAME_NOREPLACE) {
|
||||||
|
VOP_UNLOCK(vtarget);
|
||||||
|
VOP_RELEASE(vtarget);
|
||||||
|
return EEXIST;
|
||||||
|
}
|
||||||
|
|
||||||
// we are replacing an existing link
|
// we are replacing an existing link
|
||||||
// do some checks expected by posix
|
// do some checks expected by posix
|
||||||
if (vsource->type != V_TYPE_DIR && vtarget->type == V_TYPE_DIR) {
|
if (vsource->type != V_TYPE_DIR && vtarget->type == V_TYPE_DIR) {
|
||||||
|
|||||||
@@ -352,6 +352,9 @@ static int tmpfs_rename(vnode_t *source, vnode_t *sourcefile, char *oldname, vno
|
|||||||
oldnode = v;
|
oldnode = v;
|
||||||
|
|
||||||
if (oldnode) {
|
if (oldnode) {
|
||||||
|
if (flags & RENAME_NOREPLACE)
|
||||||
|
return EEXIST;
|
||||||
|
|
||||||
// we are replacing an existing link
|
// we are replacing an existing link
|
||||||
// do some checks expected by posix
|
// do some checks expected by posix
|
||||||
if (sourcefile->type != V_TYPE_DIR && oldnode->type == V_TYPE_DIR)
|
if (sourcefile->type != V_TYPE_DIR && oldnode->type == V_TYPE_DIR)
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ typedef struct {
|
|||||||
#define AT_SYMLINK_NOFOLLOW 0x100
|
#define AT_SYMLINK_NOFOLLOW 0x100
|
||||||
#define AT_EMPTY_PATH 0x1000
|
#define AT_EMPTY_PATH 0x1000
|
||||||
|
|
||||||
|
#define RENAME_NOREPLACE 0x1
|
||||||
|
|
||||||
#define AF_LOCAL 1
|
#define AF_LOCAL 1
|
||||||
#define AF_INET 2
|
#define AF_INET 2
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,15 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
|
|
||||||
|
#define RENAMEAT_KNOWN_FLAGS RENAME_NOREPLACE
|
||||||
|
|
||||||
syscallret_t syscall_renameat(context_t *context, int olddirfd, char *uoldpath, int newdirfd, char *unewpath, unsigned int flags) {
|
syscallret_t syscall_renameat(context_t *context, int olddirfd, char *uoldpath, int newdirfd, char *unewpath, unsigned int flags) {
|
||||||
syscallret_t ret = {
|
syscallret_t ret = {
|
||||||
.ret = -1
|
.ret = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
if (flags)
|
if (flags & ~RENAMEAT_KNOWN_FLAGS)
|
||||||
printf("renameat: unknown %x\n", flags);
|
printf("renameat: unknown %x\n", flags & ~RENAMEAT_KNOWN_FLAGS);
|
||||||
|
|
||||||
size_t oldpathlen;
|
size_t oldpathlen;
|
||||||
size_t newpathlen;
|
size_t newpathlen;
|
||||||
|
|||||||
@@ -286,6 +286,23 @@ index 8592ea5..94ceba1 100644
|
|||||||
+ }
|
+ }
|
||||||
+ return 0;
|
+ return 0;
|
||||||
}
|
}
|
||||||
|
diff --git mlibc-clean/options/posix/include/bits/posix/posix_stdio.h mlibc-workdir/options/posix/include/bits/posix/posix_stdio.h
|
||||||
|
index f0d6edd..ab57b6b 100644
|
||||||
|
--- mlibc-clean/options/posix/include/bits/posix/posix_stdio.h
|
||||||
|
+++ mlibc-workdir/options/posix/include/bits/posix/posix_stdio.h
|
||||||
|
@@ -63,6 +63,7 @@ char *fgetln(FILE *__stream, size_t *__size);
|
||||||
|
#endif /* !__MLIBC_ABI_ONLY */
|
||||||
|
|
||||||
|
#if defined(_GNU_SOURCE)
|
||||||
|
+#define RENAME_NOREPLACE (1 << 0)
|
||||||
|
#define RENAME_EXCHANGE (1 << 1)
|
||||||
|
|
||||||
|
/* GNU extensions */
|
||||||
|
@@ -97,4 +98,3 @@ FILE *fopencookie(void *__restrict __cookie, const char *__restrict __mode, cook
|
||||||
|
|
||||||
|
#endif /* _MLIBC_POSIX_STDIO_H */
|
||||||
|
|
||||||
|
-
|
||||||
diff --git mlibc-clean/options/rtld/x86_64/runtime.S mlibc-workdir/options/rtld/x86_64/runtime.S
|
diff --git mlibc-clean/options/rtld/x86_64/runtime.S mlibc-workdir/options/rtld/x86_64/runtime.S
|
||||||
index ba9a520..b958ef3 100644
|
index ba9a520..b958ef3 100644
|
||||||
--- mlibc-clean/options/rtld/x86_64/runtime.S
|
--- mlibc-clean/options/rtld/x86_64/runtime.S
|
||||||
|
|||||||
Reference in New Issue
Block a user