summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/cbuf.c33
-rw-r--r--source3/lib/cbuf.h17
2 files changed, 49 insertions, 1 deletions
diff --git a/source3/lib/cbuf.c b/source3/lib/cbuf.c
index 16dd52c292..42353f8f64 100644
--- a/source3/lib/cbuf.c
+++ b/source3/lib/cbuf.c
@@ -286,3 +286,36 @@ int cbuf_print_quoted_string(cbuf* ost, const char* s)
s++;
}
}
+
+
+int cbuf_print_quoted(cbuf* ost, const char* s, size_t len)
+{
+ int n = 1;
+ int ret;
+ cbuf_reserve(ost, len+2);
+
+ cbuf_putc(ost,'"');
+
+ while(len--) {
+ switch (*s) {
+ case '"':
+ case '\\':
+ ret = cbuf_printf(ost, "\\%c", *s);
+ break;
+ default:
+ if (isprint(*s) && ((*s == ' ') || !isspace(*s))) {
+ ret = cbuf_putc(ost, *s);
+ } else {
+ ret = cbuf_printf(ost, "\\%02x", *s);
+ }
+ }
+ s++;
+ if (ret == -1) {
+ return -1;
+ }
+ n += ret;
+ }
+ ret = cbuf_putc(ost,'"');
+
+ return (ret == -1) ? -1 : (n + ret);
+}
diff --git a/source3/lib/cbuf.h b/source3/lib/cbuf.h
index ffb52d7b9a..90318ec7a9 100644
--- a/source3/lib/cbuf.h
+++ b/source3/lib/cbuf.h
@@ -225,11 +225,26 @@ char* cbuf_gets(cbuf* b, size_t idx);
* @see srprs_quoted_string
*
* @param[out] ost outstream
- * @param[in] s string
+ * @param[in] s '\0' terminated string of printable characters.
*
* @return numner of bytes written, -1 on error
*/
int cbuf_print_quoted_string(cbuf* ost, const char* s);
+/**
+ * Print quoted string to stream.
+ * Escapes nonprintable characters.
+ *
+ * @todo check for ssputc failure
+ * @see srprs_quoted
+ *
+ * @param[out] ost outstream
+ * @param[in] s string of bytes
+ * @param[in] len number of bytes
+ *
+ * @return numner of bytes written, -1 on error
+ */
+int cbuf_print_quoted(cbuf* ost, const char* s, size_t len);
+
#endif /*__CBUF_H*/