Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2007-09-18 23:32:43 +0400
committerJeff Johnston <jjohnstn@redhat.com>2007-09-18 23:32:43 +0400
commit3908c985922d653fa47775dfbf5d2d29ff7c4fa0 (patch)
treebf5fac0245666188665bcb55719e2000e288ab3f /newlib/libc/reent/renamer.c
parent4090f565a839d8e846cf9c6249a5ebbfd8ad9790 (diff)
2007-09-18 Jeff Johnston <jjohnstn@redhat.com>
* libc/reent/renamer.c: New file. * libc/reent/Makefile.am: Add new file. * libc/reent/Makefile.in: Regenerated. * libc/stdio/rename.c: Break out _rename_r code into reent/renamer.c and add check for rename syscall.
Diffstat (limited to 'newlib/libc/reent/renamer.c')
-rw-r--r--newlib/libc/reent/renamer.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/newlib/libc/reent/renamer.c b/newlib/libc/reent/renamer.c
new file mode 100644
index 000000000..0467ae93c
--- /dev/null
+++ b/newlib/libc/reent/renamer.c
@@ -0,0 +1,74 @@
+/* Reentrant version of rename system call. */
+
+#include <reent.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <_syslist.h>
+
+/* Some targets provides their own versions of these functions. Those
+ targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */
+
+#ifdef _REENT_ONLY
+#ifndef REENTRANT_SYSCALLS_PROVIDED
+#define REENTRANT_SYSCALLS_PROVIDED
+#endif
+#endif
+
+#ifndef REENTRANT_SYSCALLS_PROVIDED
+
+/* We use the errno variable used by the system dependent layer. */
+#undef errno
+extern int errno;
+
+/*
+FUNCTION
+ <<_rename_r>>---Reentrant version of rename
+
+INDEX
+ _rename_r
+
+ANSI_SYNOPSIS
+ #include <reent.h>
+ int _rename_r(struct _reent *<[ptr]>,
+ int <[fd]>, int <[cmd]>, <[arg]>);
+
+TRAD_SYNOPSIS
+ #include <reent.h>
+ int _rename_r(<[ptr]>, <[fd]>, <[cmd]>, <[arg]>)
+ struct _reent *<[ptr]>;
+ int <[fd]>;
+ int <[cmd]>;
+ int <[arg]>;
+
+DESCRIPTION
+ This is a reentrant version of <<rename>>. It
+ takes a pointer to the global data block, which holds
+ <<errno>>.
+*/
+
+int
+_DEFUN (_rename_r, (ptr, old, new),
+ struct _reent *ptr _AND
+ _CONST char *old _AND
+ _CONST char *new)
+{
+ int ret = 0;
+
+#ifdef HAVE_RENAME
+ errno = 0;
+ if ((ret = _rename (old, new)) == -1 && errno != 0)
+ ptr->_errno = errno;
+#else
+ if (_link_r (ptr, old, new) == -1)
+ return -1;
+
+ if (_unlink_r (ptr, old) == -1)
+ {
+ /* ??? Should we unlink new? (rhetorical question) */
+ return -1;
+ }
+#endif
+ return ret;
+}
+
+#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */