1 /* ISC license. */
2 
3 #include <sys/uio.h>
4 #include <string.h>
5 #include <errno.h>
6 #include <unistd.h>
7 #include <stdio.h>
8 #include <skalibs/djbunix.h>
9 
openwritevnclose_suffix_internal(char const * fn,struct iovec const * v,unsigned int n,dev_t * dev,ino_t * ino,int dosync,char const * suffix)10 int openwritevnclose_suffix_internal (char const *fn, struct iovec const *v, unsigned int n, dev_t *dev, ino_t *ino, int dosync, char const *suffix)
11 {
12   dev_t tmpdev ;
13   ino_t tmpino ;
14   size_t len = strlen(fn) ;
15   size_t suffixlen = strlen(suffix) ;
16   char tmp[len + suffixlen + 1] ;
17   memcpy(tmp, fn, len) ;
18   memcpy(tmp + len, suffix, suffixlen + 1) ;
19   if (!openwritevnclose_unsafe_internal(tmp, v, n, dev ? &tmpdev : 0, ino ? &tmpino : 0, dosync)) return 0 ;
20   if (rename(tmp, fn) < 0)
21   {
22     int e = errno ;
23     unlink(tmp) ;
24     errno = e ;
25     return 0 ;
26   }
27   if (dev) *dev = tmpdev ;
28   if (ino) *ino = tmpino ;
29   return 1 ;
30 }
31