mud/fluffos-2.23-ds03/packages/debug.c
2020-09-06 05:43:07 -07:00

79 lines
2.4 KiB
C

void f_thread() {
int sv[2];
fd = find_new_socket();
if (fd < 0)
return fd;
if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
return EESOCKET;
ret = fork();
if (ret == -1) {
error("fork() in debug() failed: %s\n", strerror(errno));
}
if(ret){
close(sv[1]);
lpc_socks[fd].fd = sv[0];
lpc_socks[fd].flags = S_EXTERNAL;
set_read_callback(fd, sp-3);
set_write_callback(fd, sp-2);
set_close_callback(fd, sp-1);
lpc_socks[fd].owner_ob = current_object;
lpc_socks[fd].mode = MUD;
lpc_socks[fd].state = STATE_DATA_XFER;
memset((char *) &lpc_socks[fd].l_addr, 0, sizeof(lpc_socks[fd].l_addr));
memset((char *) &lpc_socks[fd].r_addr, 0, sizeof(lpc_socks[fd].r_addr));
lpc_socks[fd].owner_ob = current_object;
lpc_socks[fd].release_ob = NULL;
lpc_socks[fd].r_buf = NULL;
lpc_socks[fd].r_off = 0;
lpc_socks[fd].r_len = 0;
lpc_socks[fd].w_buf = NULL;
lpc_socks[fd].w_off = 0;
lpc_socks[fd].w_len = 0;
current_object->flags |= O_EFUN_SOCKET;
return fd;
}
close(sv[0]);
function_to_call_t cb;
memset(&cb, 0, sizeof(function_to_call_t));
process_efun_callback(0, &cb, F_THREAD);
for(i=0; i<5; i++)
if(external_port[i].port)
close(external_port[i].fd); //close external ports
for(i=0;i<sizeof(lpc_socks)/sizeof(lpc_socks[0]);i++)
close(lpc_sock[i].fd);
svalue_t *res = call_efun_callback(&cb, 1);
switch (res->type) {
case T_OBJECT:
break;
default:
save_svalue_depth = 0;
int len = svalue_save_size(message);
if (save_svalue_depth > MAX_SAVE_SVALUE_DEPTH) {
OS_socket_write(sv[1], "\x00\x00\x00\x11\"result too big\"", 21);
break;
}
char *buf = (char *)
DMALLOC(len + 5, TAG_TEMPORARY, "socket_write: default");
if (buf == NULL)
break;
*(INT_32 *) buf = htonl((long) len);
len += 4;
buf[4] = '\0';
p = buf + 4;
save_svalue(message, &p);
int ret,written = 0;
while(written < len){
ret = OS_socket_write(sv[1], buf+written, len-written);
if(ret < 0)
break;
written += ret;
}
break;
}
fflush(0);
exit(0);
}