The unified diff between revisions [891173fb..] and [81f2a8bb..] is displayed below. It can also be downloaded as a raw diff.

#
# old_revision [891173fb957443aa4b4a92446e8e30e67c4d08fd]
# new_revision [81f2a8bbe94638a22f5651ee07112ceabd50285c]
#
# patch "src/lsi/abi.h"
#  from [22ae6181e13640fa9e5388e7e9862a5b98d98d28]
#    to [b14a77a718dd8eb49216c167be0519b98baf8b25]
# 
# patch "src/lsi/abispec"
#  from [258eb50ffcd6396b358fec612b301d4cd65f1884]
#    to [adb7007fe9480740656a6011fb7fba55e9999579]
# 
# patch "src/lsi/vm.c"
#  from [7fbddce92f86fd74d95ad28871274cf4653d9d55]
#    to [e2e905076968e53dd131de512d042191f64d91bf]
#
============================================================
--- src/lsi/abi.h	22ae6181e13640fa9e5388e7e9862a5b98d98d28
+++ src/lsi/abi.h	b14a77a718dd8eb49216c167be0519b98baf8b25
@@ -52,4 +52,6 @@ int vm_intfn_sql_getvar(void);
 int vm_intfn_sql_query(void);
 int vm_intfn_sql_query_1s(void);
 int vm_intfn_sql_getvar(void);
+int vm_intfn_sql_getvar_array(void);
 int vm_intfn_sql_setvar(void);
+int vm_intfn_sql_setvar_array(void);
============================================================
--- src/lsi/abispec	258eb50ffcd6396b358fec612b301d4cd65f1884
+++ src/lsi/abispec	adb7007fe9480740656a6011fb7fba55e9999579
@@ -42,7 +42,9 @@ function sql_getvar
 function sql_query
 function sql_query_1s
 function sql_getvar
+function sql_getvar_array
 function sql_setvar
+function sql_setvar_array
 
 /*
  * The ABI should be identified by a SHA1 hash of this file
============================================================
--- src/lsi/vm.c	7fbddce92f86fd74d95ad28871274cf4653d9d55
+++ src/lsi/vm.c	e2e905076968e53dd131de512d042191f64d91bf
@@ -472,14 +472,18 @@ int vm_intfn_cmdsocket_write(void)
 	char *buffer = stack_getstr(vm_current, len, 2);
 	int newoff;
 
+	printf("cmdsocket_write in vm\n");
+
 	newoff = cmdsocket_write(buffer, len, off);
 	stack_poke(vm_current, 1, newoff);
 
 	if (newoff != len) {
+		printf("cmdsocket_write sleeping\n");
 		vm_queue(vm_current, VM_CMDWRITEQ);
 		vm_current = NULL;
 		return 0;
 	}
+	printf("cmdsocket_write success\n");
 	return 1;
 }
 
@@ -614,13 +618,40 @@ int vm_intfn_sql_getvar(void)
 	snprintf(buf, len+1, stack_getstr(vm_current, len, 1));
 	snprintf(query, VM_STRING_MAX, "SELECT value FROM vars WHERE name=\"%s\"", buf);
 
-	sql_query(query, strlen(query), &result);
+	if (sql_query(query, strlen(query), &result) != 2)
+		result = -1;
 
 	/* XXX what to do with an error here? */
 	stack_poke(vm_current, 0, result); /* return value */
 	return 1;
 }
 
+int vm_intfn_sql_getvar_array(void)
+{
+	int len, off;
+	char buf[VM_STRING_MAX];
+	char query[VM_STRING_MAX];
+	int result;
+
+	off = stack_get(vm_current, 1);
+	len = stack_get(vm_current, 2);
+
+	if (len >= VM_STRING_MAX) {
+		printf("Excessive string length - can't perform query\n");
+		return 1;
+	}
+
+	snprintf(buf, len+1, stack_getstr(vm_current, len, 2));
+	snprintf(query, VM_STRING_MAX, "SELECT value FROM vars WHERE name=\"%s[%d]\"", buf, off);
+
+	if (sql_query(query, strlen(query), &result) != 2)
+		result = -1;
+
+	/* XXX what to do with an error here? */
+	stack_poke(vm_current, 0, result); /* return value */
+	return 1;
+}
+
 int vm_intfn_sql_setvar(void)
 {
 	int len, val;
@@ -645,6 +676,32 @@ int vm_intfn_sql_setvar(void)
 	stack_poke(vm_current, 0, result); /* return value */
 	return 1;
 }
+
+int vm_intfn_sql_setvar_array(void)
+{
+	int len, off, val;
+	char buf[VM_STRING_MAX];
+	char query[VM_STRING_MAX];
+	int result;
+
+	val = stack_get(vm_current, 1);
+	off = stack_get(vm_current, 2);
+	len = stack_get(vm_current, 3);
+
+	if (len >= VM_STRING_MAX) {
+		printf("Excessive string length - can't perform query\n");
+		return 1;
+	}
+
+	snprintf(buf, len+1, stack_getstr(vm_current, len, 3));
+	snprintf(query, VM_STRING_MAX, "INSERT OR REPLACE INTO vars VALUES(\"%s[%d]\", %d)", buf, off, val);
+
+	sql_query(query, strlen(query), &result);
+
+	/* XXX what to do with an error here? */
+	stack_poke(vm_current, 0, result); /* return value */
+	return 1;
+}
 #endif
 
 int vm_intfn_beatdetect_read(void)
@@ -933,16 +990,20 @@ int vm_spawn_args(char *fn, int n, ...)
 		return 0;
 	}
 	newt->sp = newt->stackbase;
-	/* Push return address here, to point to some special thread exit
-	   routine */
 
+	stack_push(newt, 0); 	/* Return value */
+
 	/* Push optional arguments */
 	va_start(ap, n);
-	while (n--)
-	    stack_push(newt, va_arg(ap, int));
+	while (n--) {
+	    int a = va_arg(ap, int);
+//	    printf("arg is %d\n", a);
+	    stack_push(newt, a);
+	}
 	va_end(ap);
 
-	stack_push(newt, 0); 	/* Return value */
+	/* Push return address here, to point to some special thread exit
+	   routine */
 	stack_push(newt, 0);	/* Return address */
 
 	/* Insert into head of run queue */