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_accept(void);
|
||||
int vm_intfn_cmdsocket_read(void);
|
||||
int vm_intfn_cmdsocket_write(void);
|
||||
int vm_intfn_cmdsocket_prefix(void);
|
||||
|
||||
@@ -36,6 +36,7 @@ function mouse_read
|
||||
function cmdsocket_listen
|
||||
function cmdsocket_accept
|
||||
function cmdsocket_read
|
||||
function cmdsocket_write
|
||||
function cmdsocket_prefix
|
||||
|
||||
/*
|
||||
|
||||
@@ -130,7 +130,7 @@ void cmd_parse(char *cmd) {
|
||||
char function[CMD_MAXSIZE + PREFIX_MAXSIZE];
|
||||
|
||||
*strchr(cmd, '\n') = '\0';
|
||||
printf("DEBUG: Received command: %s\n", cmd);
|
||||
// printf("DEBUG: Received command: %s\n", cmd);
|
||||
fflush(stdout);
|
||||
|
||||
sp = strtok(cmd, " \t\r");
|
||||
@@ -143,7 +143,7 @@ void cmd_parse(char *cmd) {
|
||||
strcpy(function, cmd_prefix);
|
||||
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);
|
||||
if (vm_spawn_args(function, 1, arg)) {
|
||||
/* 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"));
|
||||
}
|
||||
|
||||
printf("Received command: %s\n", cmd);
|
||||
// printf("Received command: %s\n", cmd);
|
||||
}
|
||||
|
||||
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_accept(void);
|
||||
int cmdsocket_read(void);
|
||||
int cmdsocket_write(char *buffer, int len, int off);
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (!beatdetect_read()) {
|
||||
|
||||
@@ -18,6 +18,7 @@ void vm_wakeup(int queue);
|
||||
#define VM_MIDIQ 8
|
||||
#define VM_CMDLISTENQ 9
|
||||
#define VM_CMDREADQ 10
|
||||
#define VM_CMDWRITEQ 20
|
||||
|
||||
#define VM_USERQMIN 20
|
||||
#define VM_NOQUEUE (-1)
|
||||
|
||||
Reference in New Issue
Block a user