summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/skalibs/djbunix.h3
-rw-r--r--src/libstddjb/filecopy_suffix.c25
-rw-r--r--src/libstddjb/filecopy_unsafe.c32
-rw-r--r--src/libstddjb/hiercopy_tmp.c28
-rw-r--r--src/libstddjb/touch.c11
5 files changed, 72 insertions, 27 deletions
diff --git a/src/include/skalibs/djbunix.h b/src/include/skalibs/djbunix.h
index 40065ce..0a1a2c4 100644
--- a/src/include/skalibs/djbunix.h
+++ b/src/include/skalibs/djbunix.h
@@ -143,6 +143,9 @@ extern int rm_rf_in_tmp (stralloc *, unsigned int) ; /* caution ! */
extern int rmstar (char const *) ;
extern int rmstar_tmp (char const *, stralloc *) ;
+extern int touch (char const *) ;
+extern int filecopy_unsafe (char const *, char const *, unsigned int) ;
+extern int filecopy_suffix (char const *, char const *, unsigned int, char const *) ;
extern int hiercopy (char const *, char const *) ;
extern int hiercopy_tmp (char const *, char const *, stralloc *) ;
diff --git a/src/libstddjb/filecopy_suffix.c b/src/libstddjb/filecopy_suffix.c
new file mode 100644
index 0000000..70673ea
--- /dev/null
+++ b/src/libstddjb/filecopy_suffix.c
@@ -0,0 +1,25 @@
+/* ISC license. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <skalibs/bytestr.h>
+#include <skalibs/djbunix.h>
+
+int filecopy_suffix (char const *src, char const *dst, unsigned int mode, char const *suffix)
+{
+ unsigned int dstlen = str_len(dst) ;
+ unsigned int suffixlen = str_len(suffix) ;
+ char tmp[dstlen + suffixlen + 1] ;
+ byte_copy(tmp, dstlen, dst) ;
+ byte_copy(tmp + dstlen, suffixlen + 1, suffix) ;
+ if (!filecopy_unsafe(src, tmp, mode)) return 0 ;
+ if (rename(tmp, dst) < 0)
+ {
+ register int e = errno ;
+ unlink(tmp) ;
+ errno = e ;
+ return 0 ;
+ }
+ return 1 ;
+}
diff --git a/src/libstddjb/filecopy_unsafe.c b/src/libstddjb/filecopy_unsafe.c
new file mode 100644
index 0000000..b60c783
--- /dev/null
+++ b/src/libstddjb/filecopy_unsafe.c
@@ -0,0 +1,32 @@
+/* ISC license. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <skalibs/djbunix.h>
+
+int filecopy_unsafe (char const *src, char const *dst, unsigned int mode)
+{
+ int d ;
+ int s = open2(src, O_RDONLY) ;
+ if (s < 0) return 0 ;
+ d = open3(dst, O_WRONLY | O_CREAT | O_TRUNC, mode) ;
+ if (d < 0)
+ {
+ register int e = errno ;
+ fd_close(s) ;
+ errno = e ;
+ return 0 ;
+ }
+ if (fd_cat(s, d) < 0)
+ {
+ register int e = errno ;
+ fd_close(d) ;
+ fd_close(s) ;
+ errno = e ;
+ return 0 ;
+ }
+ fd_close(d) ;
+ fd_close(s) ;
+ return 1 ;
+}
+
diff --git a/src/libstddjb/hiercopy_tmp.c b/src/libstddjb/hiercopy_tmp.c
index ce2282f..bcff2b2 100644
--- a/src/libstddjb/hiercopy_tmp.c
+++ b/src/libstddjb/hiercopy_tmp.c
@@ -11,32 +11,6 @@
#include <skalibs/direntry.h>
#include <skalibs/djbunix.h>
-static int filecopy (char const *src, char const *dst, mode_t mode)
-{
- int d ;
- int s = open_readb(src) ;
- if (s < 0) return 0 ;
- d = open3(dst, O_WRONLY | O_CREAT | O_TRUNC, mode) ;
- if (d < 0)
- {
- fd_close(s) ;
- return 0 ;
- }
- if (fd_cat(s, d) < 0) goto err ;
- fd_close(s) ;
- fd_close(d) ;
- return 1 ;
-
-err:
- {
- register int e = errno ;
- fd_close(s) ;
- fd_close(d) ;
- errno = e ;
- }
- return 0 ;
-}
-
static int dircopy (char const *src, char const *dst, mode_t mode, stralloc *tmp)
{
unsigned int tmpbase = tmp->len ;
@@ -108,7 +82,7 @@ int hiercopy_tmp (char const *src, char const *dst, stralloc *tmp)
if (lstat(src, &st) < 0) return 0 ;
if (S_ISREG(st.st_mode))
{
- if (!filecopy(src, dst, st.st_mode)) return 0 ;
+ if (!filecopy_unsafe(src, dst, st.st_mode)) return 0 ;
}
else if (S_ISDIR(st.st_mode))
{
diff --git a/src/libstddjb/touch.c b/src/libstddjb/touch.c
new file mode 100644
index 0000000..45a8d2c
--- /dev/null
+++ b/src/libstddjb/touch.c
@@ -0,0 +1,11 @@
+/* ISC license. */
+
+#include <skalibs/djbunix.h>
+
+int touch (char const *file)
+{
+ register int fd = open_create(file) ;
+ if (fd < 0) return 0 ;
+ fd_close(fd) ;
+ return 1 ;
+}