Browse Source

Implement cmdsocket_write to allow responses on the socket.

master
Gavan Fantom 17 years ago
parent
commit
24f3b3f3c6
  1. 1
      src/lsi/abi.h
  2. 1
      src/lsi/abispec
  3. 34
      src/lsi/cmdsocket.c
  4. 1
      src/lsi/cmdsocket.h
  5. 18
      src/lsi/vm.c
  6. 1
      src/lsi/vm.h

1
src/lsi/abi.h

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

1
src/lsi/abispec

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

34
src/lsi/cmdsocket.c

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

1
src/lsi/cmdsocket.h

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

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

1
src/lsi/vm.h

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

Loading…
Cancel
Save