summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2010-02-11 20:18:50 +1100
committerKarolin Seeger <kseeger@samba.org>2012-12-14 10:01:37 +0100
commit043eb5e62ee89eae4f6dec5854aea3ed9925e3fb (patch)
tree114bcfdaf8327d9f0afc3dbdbda4b5f57d4ff50b
parent3f0c0217adae57cdc40537a34624f1c0b0179938 (diff)
downloadsamba-043eb5e62ee89eae4f6dec5854aea3ed9925e3fb.tar.gz
libreplace: added replacements for dprintf() and vdprintf()
these are very useful for writing files with formatted writes Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org> (cherry picked from commit d6fb64c51244529388b1f79ba8220ff608e1e4de) (cherry picked from commit 4bf8dc438318e06ee96dc1b6084dddd8700739e7)
-rw-r--r--lib/replace/libreplace.m42
-rw-r--r--lib/replace/replace.c31
2 files changed, 32 insertions, 1 deletions
diff --git a/lib/replace/libreplace.m4 b/lib/replace/libreplace.m4
index 1353c1f7d26..7a26deb6119 100644
--- a/lib/replace/libreplace.m4
+++ b/lib/replace/libreplace.m4
@@ -108,7 +108,7 @@ AC_CHECK_HEADERS(unix.h)
AC_CHECK_FUNCS(seteuid setresuid setegid setresgid chroot bzero strerror)
AC_CHECK_FUNCS(vsyslog setlinebuf mktime ftruncate chsize rename)
AC_CHECK_FUNCS(waitpid wait4 strlcpy strlcat initgroups memmove strdup)
-AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2)
+AC_CHECK_FUNCS(pread pwrite strndup strcasestr strtok_r mkdtemp dup2 dprintf vdprintf)
AC_CHECK_FUNCS(isatty chown lchown link readlink symlink realpath)
AC_HAVE_DECL(setresuid, [#include <unistd.h>])
AC_HAVE_DECL(setresgid, [#include <unistd.h>])
diff --git a/lib/replace/replace.c b/lib/replace/replace.c
index 17fd46bcc89..83966b1b1fe 100644
--- a/lib/replace/replace.c
+++ b/lib/replace/replace.c
@@ -704,3 +704,34 @@ void *rep_memmem(const void *haystack, size_t haystacklen,
}
#endif
+#ifndef HAVE_VDPRINTF
+int vdprintf(int fd, const char *format, va_list ap)
+{
+ char *s = NULL;
+ int ret;
+
+ vasprintf(&s, format, ap);
+ if (s == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+ ret = write(fd, s, strlen(s));
+ free(s);
+ return ret;
+}
+#endif
+
+#ifndef HAVE_DPRINTF
+int dprintf(int fd, const char *format, ...)
+{
+ int ret;
+ va_list ap;
+
+ va_start(ap, format);
+ ret = vdprintf(fd, format, ap);
+ va_end(ap);
+
+ return ret;
+}
+#endif
+