about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2015-08-25 23:12:11 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2015-08-25 23:12:11 +0000
commit6363f5c76f236303c13e714d451ccd2b1208ebca (patch)
tree2e881b4c870fc1d20f5d684d9952c72f3ddc9574
parent65d71ab4b780a5d18a8146eb4567eb8a9105f4fe (diff)
downloadskalibs-6363f5c76f236303c13e714d451ccd2b1208ebca.tar.gz
skalibs-6363f5c76f236303c13e714d451ccd2b1208ebca.tar.xz
skalibs-6363f5c76f236303c13e714d451ccd2b1208ebca.zip
Add touch, filecopy_unsafe, filecopy_suffix
-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 ;
+}