gus: Do not manually free the state, qdev does it for us
[qemu] / cutils.c
index 73d4e1f..7a22346 100644 (file)
--- a/cutils.c
+++ b/cutils.c
 #include "qemu-common.h"
 #include "host-utils.h"
 
-/*
- * fill first 'len' characters of 'buff' with pruned
- * contents of 'str' delimited by the character 'c'.
- * Escape character '\' is pruned off.
- * Return pointer to the delimiting character.
- */
-const char *fill_token(char *buf, const int len, const char *str, const char c)
-{
-    const char *p=str;
-    char *q=buf;
-
-    while (p < str+len-1) {
-    if (*p == c)
-        break;
-        if (*p == '\\') {
-            p++;
-            if (*p == '\0')
-                break;
-        }
-        *q++ = *p++;
-    }
-    *q='\0';
-    return p;
-}
-
-
 void pstrcpy(char *buf, int buf_size, const char *str)
 {
     int c;
@@ -109,6 +83,19 @@ int stristart(const char *str, const char *val, const char **ptr)
     return 1;
 }
 
+/* XXX: use host strnlen if available ? */
+int qemu_strnlen(const char *s, int max_len)
+{
+    int i;
+
+    for(i = 0; i < max_len; i++) {
+        if (s[i] == '\0') {
+            break;
+        }
+    }
+    return i;
+}
+
 time_t mktimegm(struct tm *tm)
 {
     time_t t;
@@ -128,6 +115,22 @@ int qemu_fls(int i)
     return 32 - clz32(i);
 }
 
+/*
+ * Make sure data goes on disk, but if possible do not bother to
+ * write out the inode just for timestamp updates.
+ *
+ * Unfortunately even in 2009 many operating systems do not support
+ * fdatasync and have to fall back to fsync.
+ */
+int qemu_fdatasync(int fd)
+{
+#ifdef _POSIX_SYNCHRONIZED_IO
+    return fdatasync(fd);
+#else
+    return fsync(fd);
+#endif
+}
+
 /* io vectors */
 
 void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint)
@@ -164,6 +167,31 @@ void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len)
     ++qiov->niov;
 }
 
+/*
+ * Copies iovecs from src to the end dst until src is completely copied or the
+ * total size of the copied iovec reaches size. The size of the last copied
+ * iovec is changed in order to fit the specified total size if it isn't a
+ * perfect fit already.
+ */
+void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size)
+{
+    int i;
+    size_t done;
+
+    assert(dst->nalloc != -1);
+
+    done = 0;
+    for (i = 0; (i < src->niov) && (done != size); i++) {
+        if (done + src->iov[i].iov_len > size) {
+            qemu_iovec_add(dst, src->iov[i].iov_base, size - done);
+            break;
+        } else {
+            qemu_iovec_add(dst, src->iov[i].iov_base, src->iov[i].iov_len);
+        }
+        done += src->iov[i].iov_len;
+    }
+}
+
 void qemu_iovec_destroy(QEMUIOVector *qiov)
 {
     assert(qiov->nalloc != -1);