Implement cmdsocket_write to allow responses on the socket.
This commit is contained in:
@@ -47,4 +47,5 @@ int vm_intfn_mouse_read(void);
|
|||||||
int vm_intfn_cmdsocket_listen(void);
|
int vm_intfn_cmdsocket_listen(void);
|
||||||
int vm_intfn_cmdsocket_accept(void);
|
int vm_intfn_cmdsocket_accept(void);
|
||||||
int vm_intfn_cmdsocket_read(void);
|
int vm_intfn_cmdsocket_read(void);
|
||||||
|
int vm_intfn_cmdsocket_write(void);
|
||||||
int vm_intfn_cmdsocket_prefix(void);
|
int vm_intfn_cmdsocket_prefix(void);
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ function mouse_read
|
|||||||
function cmdsocket_listen
|
function cmdsocket_listen
|
||||||
function cmdsocket_accept
|
function cmdsocket_accept
|
||||||
function cmdsocket_read
|
function cmdsocket_read
|
||||||
|
function cmdsocket_write
|
||||||
function cmdsocket_prefix
|
function cmdsocket_prefix
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ void cmd_parse(char *cmd) {
|
|||||||
char function[CMD_MAXSIZE + PREFIX_MAXSIZE];
|
char function[CMD_MAXSIZE + PREFIX_MAXSIZE];
|
||||||
|
|
||||||
*strchr(cmd, '\n') = '\0';
|
*strchr(cmd, '\n') = '\0';
|
||||||
printf("DEBUG: Received command: %s\n", cmd);
|
// printf("DEBUG: Received command: %s\n", cmd);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
sp = strtok(cmd, " \t\r");
|
sp = strtok(cmd, " \t\r");
|
||||||
@@ -143,7 +143,7 @@ void cmd_parse(char *cmd) {
|
|||||||
strcpy(function, cmd_prefix);
|
strcpy(function, cmd_prefix);
|
||||||
strncat(function, cmd, CMD_MAXSIZE);
|
strncat(function, cmd, CMD_MAXSIZE);
|
||||||
|
|
||||||
printf("DEBUG: function: %s, arg %d\n", function, arg);
|
// printf("DEBUG: function: %s, arg %d\n", function, arg);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (vm_spawn_args(function, 1, arg)) {
|
if (vm_spawn_args(function, 1, arg)) {
|
||||||
/* Write an ack here, once a proper function exists */
|
/* Write an ack here, once a proper function exists */
|
||||||
@@ -154,7 +154,7 @@ void cmd_parse(char *cmd) {
|
|||||||
write(cmd_active, "ERROR\n", strlen("ERROR\n"));
|
write(cmd_active, "ERROR\n", strlen("ERROR\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Received command: %s\n", cmd);
|
// printf("Received command: %s\n", cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int cmdsocket_read(void)
|
int cmdsocket_read(void)
|
||||||
@@ -202,3 +202,31 @@ int cmdsocket_read(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns offset to restart at. If off == len, then we have finished.
|
||||||
|
* If the return value is the same as off passed in, then the caller
|
||||||
|
* should sleep.
|
||||||
|
*/
|
||||||
|
int cmdsocket_write(char *buffer, int len, int off)
|
||||||
|
{
|
||||||
|
// printf("cmdsocket_write called with %p, %d, %d\n", buffer, len, off);
|
||||||
|
if (!cmdsocket_initialised)
|
||||||
|
return 0;
|
||||||
|
if (!cmd_active)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (off < len) {
|
||||||
|
int r;
|
||||||
|
r = write(cmd_active, buffer + off, len - off);
|
||||||
|
if (r == -1) {
|
||||||
|
if (errno == EAGAIN)
|
||||||
|
return off;
|
||||||
|
warn("error writing packet");
|
||||||
|
}
|
||||||
|
if (r == 0)
|
||||||
|
return off;
|
||||||
|
off += r;
|
||||||
|
}
|
||||||
|
return off;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,4 +5,5 @@ void cmdsocket_close(void);
|
|||||||
int cmdsocket_listen(int port);
|
int cmdsocket_listen(int port);
|
||||||
int cmdsocket_accept(void);
|
int cmdsocket_accept(void);
|
||||||
int cmdsocket_read(void);
|
int cmdsocket_read(void);
|
||||||
|
int cmdsocket_write(char *buffer, int len, int off);
|
||||||
int cmdsocket_prefix(char *);
|
int cmdsocket_prefix(char *);
|
||||||
|
|||||||
18
src/lsi/vm.c
18
src/lsi/vm.c
@@ -464,6 +464,24 @@ int vm_intfn_cmdsocket_read(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vm_intfn_cmdsocket_write(void)
|
||||||
|
{
|
||||||
|
int off = stack_get(vm_current, 1);
|
||||||
|
int len = stack_get(vm_current, 2);
|
||||||
|
char *buffer = stack_getstr(vm_current, len, 2);
|
||||||
|
int newoff;
|
||||||
|
|
||||||
|
newoff = cmdsocket_write(buffer, len, off);
|
||||||
|
stack_poke(vm_current, 1, newoff);
|
||||||
|
|
||||||
|
if (newoff != len) {
|
||||||
|
vm_queue(vm_current, VM_CMDWRITEQ);
|
||||||
|
vm_current = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int vm_intfn_beatdetect_read(void)
|
int vm_intfn_beatdetect_read(void)
|
||||||
{
|
{
|
||||||
if (!beatdetect_read()) {
|
if (!beatdetect_read()) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ void vm_wakeup(int queue);
|
|||||||
#define VM_MIDIQ 8
|
#define VM_MIDIQ 8
|
||||||
#define VM_CMDLISTENQ 9
|
#define VM_CMDLISTENQ 9
|
||||||
#define VM_CMDREADQ 10
|
#define VM_CMDREADQ 10
|
||||||
|
#define VM_CMDWRITEQ 20
|
||||||
|
|
||||||
#define VM_USERQMIN 20
|
#define VM_USERQMIN 20
|
||||||
#define VM_NOQUEUE (-1)
|
#define VM_NOQUEUE (-1)
|
||||||
|
|||||||
Reference in New Issue
Block a user