Index: packages/infra/current/include/diag.h
===================================================================
--- packages/infra/current/include/diag.h	(.../etna/ecos/ecos-cvs/packages/infra/current)	(revision 1835)
+++ packages/infra/current/include/diag.h	(.../trunk/etna/ecos/ecos-cvs/packages/infra/current)	(revision 1861)
@@ -102,6 +102,8 @@
      CYGBLD_ATTRIB_PRINTF_FORMAT(3,4);
 externC int  diag_vsprintf(char *buf, const char *fmt, va_list ap)
      CYGBLD_ATTRIB_PRINTF_FORMAT(2,0);
+externC int  diag_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
+     CYGBLD_ATTRIB_PRINTF_FORMAT(3,0);
 externC int  diag_vprintf(const char *fmt, va_list ap)
      CYGBLD_ATTRIB_PRINTF_FORMAT(1,0);
 
Index: packages/infra/current/src/diag.cxx
===================================================================
--- packages/infra/current/src/diag.cxx	(.../etna/ecos/ecos-cvs/packages/infra/current)	(revision 1835)
+++ packages/infra/current/src/diag.cxx	(.../trunk/etna/ecos/ecos-cvs/packages/infra/current)	(revision 1861)
@@ -284,6 +284,11 @@
 
 #define is_digit(c) ((c >= '0') && (c <= '9'))
 
+struct _sputc_info {
+    char *ptr;
+    int max, len;
+};
+
 static int
 _vprintf(void (*putc)(char c, void **param), void **param, const char *fmt, va_list ap)
 {
@@ -501,14 +506,10 @@
             res++;
         }
     }
-    return (res);
+    
+    return (param ? ((struct _sputc_info *)param)->len : res);
 }
 
-struct _sputc_info {
-    char *ptr;
-    int max, len;
-};
-
 static void 
 _sputc(char c, void **param)
 {
@@ -566,6 +567,19 @@
     return (info.len);
 }
 
+int 
+diag_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
+{
+    int ret;
+    struct _sputc_info info;
+
+    info.ptr = buf;
+    info.max = len-1;
+    info.len = 0;
+    ret = _vprintf(_sputc, (void **)&info, fmt, ap);
+    return (info.len);
+}
+
 int
 diag_printf(const char *fmt, ...)
 {
