/* @@@HEAD@@@
// Network Module
*/
/*
// NOTES: echo() -> connection_write() ?
*/
#include "config.h"
#include "defs.h"
#include "y.tab.h"
#include "cdc_types.h"
#include "execute.h"
#include "net.h"
/*
// -----------------------------------------------------------------
//
// Modifies: cur_player, contents of cur_conn.
// Effects: If called by the system object with a dbref argument,
// assigns that dbref to cur_conn->dbref and to cur_player
// and returns 1, unless there is no current connection, in
// which case it returns 0.
//
*/
void op_reassign_connection(void) {
data_t * args;
/* Accept a dbref. */
if (!func_init_1(&args, DBREF))
return;
if (cur_conn) {
cur_conn->dbref = args[0].u.dbref;
pop(1);
push_int(1);
} else {
pop(1);
push_int(0);
}
}
/*
// -----------------------------------------------------------------
*/
void op_bind_port(void) {
data_t * args;
/* Accept a port to bind to, and a dbref to handle connections. */
if (!func_init_2(&args, INTEGER, DBREF))
return;
if (add_server(args[0].u.val, args[1].u.dbref))
push_int(1);
else if (server_failure_reason == socket_id)
cthrow(socket_id, "Couldn't create server socket.");
else /* (server_failure_reason == bind_id) */
cthrow(bind_id, "Couldn't bind to port %d.", args[0].u.val);
}
/*
// -----------------------------------------------------------------
*/
void op_unbind_port(void) {
data_t * args;
/* Accept a port number. */
if (!func_init_1(&args, INTEGER))
return;
if (!remove_server(args[0].u.val))
cthrow(servnf_id, "No server socket on port %d.", args[0].u.val);
else
push_int(1);
}
/*
// -----------------------------------------------------------------
*/
void op_open_connection(void) {
data_t *args;
char *address;
int port;
Dbref receiver;
long r;
if (!func_init_3(&args, STRING, INTEGER, DBREF))
return;
address = string_chars(args[0].u.str);
port = args[1].u.val;
receiver = args[2].u.dbref;
r = make_connection(address, port, receiver);
if (r == address_id)
cthrow(address_id, "Invalid address");
else if (r == socket_id)
cthrow(socket_id, "Couldn't create socket for connection");
pop(3);
push_int(1);
}
/*
// -----------------------------------------------------------------
*/
void op_hostname(void) {
data_t *args;
string_t *r;
/* Accept a port number. */
if (!func_init_1(&args, STRING))
return;
r = hostname(args[0].u.str->s);
pop(1);
push_string(r);
}
/*
// -----------------------------------------------------------------
*/
void op_ip(void) {
data_t *args;
string_t *r;
/* Accept a hostname. */
if (!func_init_1(&args, STRING))
return;
r = ip(args[0].u.str->s);
pop(1);
push_string(r);
}
void op_close_connection(void) {
/* Accept no arguments. */
if (!func_init_0())
return;
/* Kick off anyone assigned to the current object. */
push_int(boot(cur_frame->object->dbref));
}
/*
// Echo a buffer to the connection
*/
void op_echo(void)
{
data_t *args;
/* Accept a string to echo. */
if (!func_init_1(&args, BUFFER))
return;
/* Write the string to any connection associated with this object. */
tell(cur_frame->object->dbref, args[0].u.buffer);
pop(1);
push_int(1);
}