about summary refs log tree commit diff
path: root/misc/subr.c
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-01-22 21:51:13 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-01-22 21:51:13 +0000
commit59bed6ca87c1297b0c0363c418dfd6f947977474 (patch)
treeca574214779cfb78fa7d5b597a0f8767a80402a2 /misc/subr.c
parentb2a877537a02b903e650bfe175b0894acf99256b (diff)
downloadbtpd-59bed6ca87c1297b0c0363c418dfd6f947977474.tar.gz
btpd-59bed6ca87c1297b0c0363c418dfd6f947977474.zip
Added vfsync and vfopen.
Diffstat (limited to 'misc/subr.c')
-rw-r--r--misc/subr.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/misc/subr.c b/misc/subr.c
index a6200f5..729d588 100644
--- a/misc/subr.c
+++ b/misc/subr.c
@@ -74,18 +74,13 @@ mkdirs(char *path)
 }
 
 int
-vopen(int *res, int flags, const char *fmt, ...)
+vaopen(int *res, int flags, const char *fmt, va_list ap)
 {
     int fd, didmkdirs;
     char path[PATH_MAX + 1];
-    va_list ap;
 
-    va_start(ap, fmt);
-    if (vsnprintf(path, PATH_MAX, fmt, ap) >= PATH_MAX) {
-        va_end(ap);
+    if (vsnprintf(path, PATH_MAX, fmt, ap) >= PATH_MAX)
         return ENAMETOOLONG;
-    }
-    va_end(ap);
 
     didmkdirs = 0;
 again:
@@ -106,6 +101,49 @@ again:
 }
 
 int
+vopen(int *res, int flags, const char *fmt, ...)
+{
+    int err;
+    va_list ap;
+    va_start(ap, fmt);
+    err = vaopen(res, flags, fmt, ap);
+    va_end(ap);
+    return err;
+}
+
+int
+vfsync(const char *fmt, ...)
+{
+    int err, fd;
+    va_list ap;
+    va_start(ap, fmt);
+    err = vaopen(&fd, O_RDONLY, fmt, ap);
+    va_end(ap);
+    if (err != 0)
+        return err;
+    if (fsync(fd) < 0)
+        err = errno;
+    close(fd);
+    return err;
+}
+
+int
+vfopen(FILE **ret, const char *mode, const char *fmt, ...)
+{
+    int err = 0;
+    char path[PATH_MAX + 1];
+    va_list ap;
+    va_start(ap, fmt);
+    if (vsnprintf(path, PATH_MAX, fmt, ap) >= PATH_MAX)
+        err = ENAMETOOLONG;
+    va_end(ap);
+    if (err == 0)
+        if ((*ret = fopen(path, mode)) == NULL)
+            err = errno;
+    return err;
+}
+
+int
 canon_path(const char *path, char **res)
 {
     char rp[PATH_MAX];