Implement cmdsocket_write to allow responses on the socket.

This commit is contained in:
2007-12-19 21:59:08 +00:00
parent a86643abb0
commit 24f3b3f3c6
6 changed files with 53 additions and 3 deletions

View File

@@ -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);

View File

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

View File

@@ -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;
}

View File

@@ -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 *);

View File

@@ -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()) {

View File

@@ -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)