From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: from second.openwall.net (second.openwall.net [193.110.157.125]) by inbox.vuxu.org (Postfix) with SMTP id 07E7F23E2E for ; Tue, 23 Apr 2024 00:47:19 +0200 (CEST) Received: (qmail 9768 invoked by uid 550); 22 Apr 2024 22:47:14 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 9715 invoked from network); 22 Apr 2024 22:47:13 -0000 Date: Mon, 22 Apr 2024 18:47:26 -0400 From: Rich Felker To: Tony Ambardar Cc: musl@lists.openwall.com Message-ID: <20240422224726.GL4163@brightrain.aerifal.cx> References: <20240421153640.379015-1-Tony.Ambardar@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240421153640.379015-1-Tony.Ambardar@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Subject: Re: [musl] [PATCH v1] add renameat2 linux syscall wrapper On Sun, Apr 21, 2024 at 08:36:40AM -0700, Tony Ambardar wrote: > This syscall is available since Linux 3.15 and also implemented in glibc > from version 2.28. It is commonly used in filesystem or security contexts. > > Defines RENAME_NOREPLACE, RENAME_EXCHANGE, RENAME_WHITEOUT are guarded by > _GNU_SOURCE as with glibc. > > Signed-off-by: Tony Ambardar > --- > include/stdio.h | 7 +++++++ > src/linux/renameat2.c | 8 ++++++++ > 2 files changed, 15 insertions(+) > create mode 100644 src/linux/renameat2.c > > diff --git a/include/stdio.h b/include/stdio.h > index cb858618..8312c3bf 100644 > --- a/include/stdio.h > +++ b/include/stdio.h > @@ -158,6 +158,13 @@ char *ctermid(char *); > #define L_ctermid 20 > #endif > > +#if defined(_GNU_SOURCE) > +#define RENAME_NOREPLACE (1 << 0) > +#define RENAME_EXCHANGE (1 << 1) > +#define RENAME_WHITEOUT (1 << 2) > + > +int renameat2(int, const char *, int, const char *, unsigned int); > +#endif s/unsigned int/unsigned/ and maybe just write out the constants? I think that's the style musl uses most places. > #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ > || defined(_BSD_SOURCE) > diff --git a/src/linux/renameat2.c b/src/linux/renameat2.c > new file mode 100644 > index 00000000..3062aa15 > --- /dev/null > +++ b/src/linux/renameat2.c > @@ -0,0 +1,8 @@ > +#define _GNU_SOURCE > +#include > +#include "syscall.h" > + > +int renameat2(int oldfd, const char *old, int newfd, const char *new, unsigned int flags) > +{ > + return syscall(SYS_renameat2, oldfd, old, newfd, new, flags); > +} > -- > 2.34.1 This probably at least needs to support flags==0 on kernels without SYS_renameat2 by calling renameat in that case. Then I'm not sure if ENOSYS should be kept if the new syscall is missing, or just EINVAL or whatever is used to report unsupported flags. Rich