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 */