parent $network_root object $daemon var $root dbref 'daemon var $root child_index 5 var $root fertile 0 var $root manager $daemon var $root owned [$daemon] var $root owners [$daemon] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $network_root buffer `[] var $network_root ip "" var $network_root hostname "" var $network_root port 0 var $network_root socket 0 var $network_root active 0 var $root inited 1 var $daemon current_receiver 0 var $daemon connections [] var $daemon interface 0 var $daemon timeout 0 var $daemon default_port 0 method new_connection var num, tmp; // we have a new connection. if ((sender() != this()) || (caller() != definer())) throw(~perm, "Invalid call to private method."); catch any { // Get a good dbref num = listlen(connections); tmp = (tostr(.dbref('symbol)) + "_") + tostr(num); while ((| get_name(tosym("connection_" + tmp)) |)) { num = num + 1; tmp = (tostr(.dbref('symbol)) + "_") + tostr(num); } // Create a new receiver current_receiver = $connection.spawn(tmp); current_receiver.add_writer(this()); current_receiver.set_manager(current_receiver); current_receiver.initialize_connection(interface, timeout); // bind it (> .bind(.port(), current_receiver) <); // add it to the list connections = setadd(connections, current_receiver); } with handler { // switch (error()) { // case ~bind: (| current_receiver.close() |); (| .stop_listening() |); rethrow(error()); // } } . method connection_starting // called by $connection.connect() (> .perms(caller(), $connection) <); (> .new_connection() <); . method connection_ending // called by $connection.disconnect() (> .perms(caller(), $connection) <); (> .old_connection(sender()) <); . method old_connection arg obj; // called by $daemon.connection_ending (> .perms(sender(), 'this) <); connections = setremove(connections, obj); . method uninit_daemon (> .perms(caller(), $root) <); (> .reset_daemon() <); (| current_receiver.daemon_reset() |); interface = 0; current_receiver = 0; connections = []; timeout = -1; default_port = 0; . method init_daemon (> .perms(caller(), $root) <); interface = 0; current_receiver = 0; connections = []; timeout = -1; default_port = 0; . method reset_daemon arg [args]; var c, cons; (> .perms(sender(), 'this) <); args = [@args, 'continue][1]; cons = connections + (current_receiver ? [current_receiver] | []); for c in (cons) { (| c.receive("DAEMON RESET", 'daemon_reset) |); (| c.close() |); } current_receiver = 0; connections = []; if (args == 'continue) (> .new_connection() <); . method set_interface arg obj; (> .perms(sender(), 'manager) <); interface = obj; . method start_listening arg [port]; (> .perms(sender(), 'manager) <); port = [@port, default_port][1]; .set_port(port); .new_connection(); . method stop_listening (> .perms(sender(), 'manager) <); (| .set_port(0) |); (| current_receiver.close() |); (| .reset_daemon('stop) |); (| .unbind(.port()) |); . method set_timeout arg seconds; (> .perms(sender(), 'manager) <); timeout = seconds; . method default_port return default_port; . method set_default_port arg port; (> .perms(sender(), 'manager) <); if (type(port) != 'integer) throw(~type, "Port must be submitted as an integer."); default_port = port; . method connections return connections; . method startup arg [args]; var name, opt, port; (> .perms(caller(), $sys) <); name = tostr(.dbref('symbol)); name = "-p" + substr(name, 1, ("_" in name) - 1); opt = name in args; port = (| toint(args[opt + 1]) |); (| .stop_listening() |); .start_listening(port || default_port); .