diff options
| author | Ken Raeburn <raeburn@mit.edu> | 2008-10-15 16:27:46 +0000 |
|---|---|---|
| committer | Ken Raeburn <raeburn@mit.edu> | 2008-10-15 16:27:46 +0000 |
| commit | ec674671176ea46e5d20eff2ae923a21442573c3 (patch) | |
| tree | 37f611cd9af3b385191fbfcaab3d588b90032ee3 /src/util/support | |
| parent | b31c98166098b3da7324672df17e9908bac60e73 (diff) | |
| download | krb5-ec674671176ea46e5d20eff2ae923a21442573c3.tar.gz krb5-ec674671176ea46e5d20eff2ae923a21442573c3.tar.xz krb5-ec674671176ea46e5d20eff2ae923a21442573c3.zip | |
Now that we have support for conditionally exporting symbols from the support
library, use that for the [v]asprintf replacement functions when needed.
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@20871 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/util/support')
| -rw-r--r-- | src/util/support/Makefile.in | 9 | ||||
| -rw-r--r-- | src/util/support/printf.c | 101 |
2 files changed, 110 insertions, 0 deletions
diff --git a/src/util/support/Makefile.in b/src/util/support/Makefile.in index dfd642c2c1..4fc6b1d69a 100644 --- a/src/util/support/Makefile.in +++ b/src/util/support/Makefile.in @@ -30,6 +30,9 @@ MKSTEMP_OBJ= @MKSTEMP_OBJ@ ##DOS##MKSTEMP_ST_OBJ= mkstemp.o ##DOS##MKSTEMP_OBJ= $(OUTPRE)mkstemp.$(OBJEXT) +PRINTF_ST_OBJ= @PRINTF_ST_OBJ@ +PRINTF_OBJ= @PRINTF_OBJ@ + STLIBOBJS= \ threads.o \ init-addrinfo.o \ @@ -37,6 +40,7 @@ STLIBOBJS= \ errors.o \ gmt_mktime.o \ fake-addrinfo.o \ + $(PRINTF_ST_OBJ) \ $(MKSTEMP_ST_OBJ) LIBOBJS= \ @@ -46,6 +50,7 @@ LIBOBJS= \ $(OUTPRE)errors.$(OBJEXT) \ $(OUTPRE)gmt_mktime.$(OBJEXT) \ $(OUTPRE)fake-addrinfo.$(OBJEXT) \ + $(PRINTF_OBJ) \ $(MKSTEMP_OBJ) STOBJLISTS=OBJS.ST @@ -60,6 +65,7 @@ SRCS=\ $(srcdir)/errors.c \ $(srcdir)/gmt_mktime.c \ $(srcdir)/fake-addrinfo.c \ + $(srcdir)/printf.c \ $(srcdir)/mkstemp.c SHLIB_EXPDEPS = @@ -134,6 +140,9 @@ fake-addrinfo.so fake-addrinfo.po $(OUTPRE)fake-addrinfo.$(OBJEXT): \ $(SRCTOP)/include/k5-platform.h $(SRCTOP)/include/k5-thread.h \ $(SRCTOP)/include/port-sockets.h $(SRCTOP)/include/socket-utils.h \ cache-addrinfo.h fake-addrinfo.c supp-int.h +printf.so printf.po $(OUTPRE)printf.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ + $(SRCTOP)/include/k5-platform.h $(SRCTOP)/include/k5-thread.h \ + printf.c mkstemp.so mkstemp.po $(OUTPRE)mkstemp.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \ $(SRCTOP)/include/k5-platform.h $(SRCTOP)/include/k5-thread.h \ mkstemp.c diff --git a/src/util/support/printf.c b/src/util/support/printf.c new file mode 100644 index 0000000000..0df8c84ca3 --- /dev/null +++ b/src/util/support/printf.c @@ -0,0 +1,101 @@ +/* + * printf.c + * + * Copyright 2003, 2004, 2005, 2007, 2008 Massachusetts Institute of Technology. + * All Rights Reserved. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of M.I.T. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * + * Provide {,v}asprintf for platforms that don't have them. + */ + +#include "k5-platform.h" + +/* On error: BSD: Set *ret to NULL. GNU: *ret is undefined. + + Since we want to be able to use the GNU version directly, we need + provide only the weaker guarantee in this version. */ +int +krb5int_vasprintf(char **ret, const char *format, va_list ap) +{ + va_list ap2; + char *str = NULL, *nstr; + size_t len = 80; + int len2; + + while (1) { + if (len >= INT_MAX || len == 0) + goto fail; + nstr = realloc(str, len); + if (nstr == NULL) + goto fail; + str = nstr; + va_copy(ap2, ap); + len2 = vsnprintf(str, len, format, ap2); + va_end(ap2); + /* ISO C vsnprintf returns the needed length. Some old + vsnprintf implementations return -1 on truncation. */ + if (len2 < 0) { + /* Don't know how much space we need, just that we didn't + supply enough; get a bigger buffer and try again. */ + if (len <= SIZE_MAX/2) + len *= 2; + else if (len < SIZE_MAX) + len = SIZE_MAX; + else + goto fail; + } else if ((unsigned int) len2 >= SIZE_MAX) { + /* Need more space than we can request. */ + goto fail; + } else if ((size_t) len2 >= len) { + /* Need more space, but we know how much. */ + len = (size_t) len2 + 1; + } else { + /* Success! */ + break; + } + } + /* We might've allocated more than we need, if we're still using + the initial guess, or we got here by doubling. */ + if ((size_t) len2 < len - 1) { + nstr = realloc(str, (size_t) len2 + 1); + if (nstr) + str = nstr; + } + *ret = str; + return len2; + +fail: + free(str); + return -1; +} + +int +krb5int_asprintf(char **ret, const char *format, ...) +{ + va_list ap; + int n; + + va_start(ap, format); + n = krb5int_vasprintf(ret, format, ap); + va_end(ap); + return n; +} |
