bpfloader: use non-overwriting rename

This is for better error reporting.

The target should never exist, unless somehow someone
managed to cause naming collision...

See: https://manpages.debian.org/testing/manpages-dev/renameat2.2.en.html
which mentions support was added for bpffs in Linux 4.9

Bug: 236707886
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ic69ff777bbd2e77a4605477c3196a234f04d3bde
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp
index ae2a60f..a8ef1a0 100644
--- a/libbpf_android/Loader.cpp
+++ b/libbpf_android/Loader.cpp
@@ -17,6 +17,7 @@
 #define LOG_TAG "LibBpfLoader"
 
 #include <errno.h>
+#include <fcntl.h>
 #include <linux/bpf.h>
 #include <linux/elf.h>
 #include <log/log.h>
@@ -901,7 +902,8 @@
                     ALOGE("create %s -> %d [%d:%s]", createLoc.c_str(), ret, err, strerror(err));
                     return -err;
                 }
-                ret = rename(createLoc.c_str(), mapPinLoc.c_str());
+                ret = renameat2(AT_FDCWD, createLoc.c_str(),
+                                AT_FDCWD, mapPinLoc.c_str(), RENAME_NOREPLACE);
                 if (ret) {
                     int err = errno;
                     ALOGE("rename %s %s -> %d [%d:%s]", createLoc.c_str(), mapPinLoc.c_str(), ret,
@@ -1153,7 +1155,8 @@
                     ALOGE("create %s -> %d [%d:%s]", createLoc.c_str(), ret, err, strerror(err));
                     return -err;
                 }
-                ret = rename(createLoc.c_str(), progPinLoc.c_str());
+                ret = renameat2(AT_FDCWD, createLoc.c_str(),
+                                AT_FDCWD, progPinLoc.c_str(), RENAME_NOREPLACE);
                 if (ret) {
                     int err = errno;
                     ALOGE("rename %s %s -> %d [%d:%s]", createLoc.c_str(), progPinLoc.c_str(), ret,