/* /secure/daemon/inet.c * From the Dead Souls V Object Library * A daemon to handle the start and stop of inet servers * Created by Descartes of Borg 961219 * Version: @(#) inet.c 1.1@(#) * Last modified: 96/12/19 */ #include <lib.h> #include <save.h> inherit LIB_DAEMON; class service { int PortOffset; string SocketClass; int SocketType; } private static mapping Servers = ([]); private mapping Services = ([]); int eventStartServer(string svc); int eventStopServer(string svc); mapping GetServers() { return copy(Servers); } int AddService(string name, int port_offset, string socket_class, int type) { class service s = new(class service); if( !master()->valid_apply(({})) ) { return 0; } s->PortOffset = port_offset; s->SocketClass = socket_class; s->SocketType = type; Services[name] = s; if( !eventSave() ) { return 0; } Servers[name] = new(LIB_SERVER, query_host_port()+port_offset, type, socket_class); return 1; } int RemoveService(string name) { if( !master()->valid_apply() ) { return 0; } if( Servers[name] ) { Servers[name]->eventShutdown(); } map_delete(Servers, name); map_delete(Services, name); return eventSave(); } int eventRestartServer(string svc) { if( !eventStopServer(svc) ) { return 0; } if( !eventStartServer(svc) ) { return 0; } return 1; } int eventStartServer(string svc) { class service s = Services[svc]; object ob = Servers[svc]; if( !master()->valid_apply(({})) ) { return 0; } if( ob ) { return 0; } if( !s ) { return 0; } ob = new(LIB_SERVER, query_host_port()+s->PortOffset, s->SocketType, s->SocketClass); if( ob ) { Servers[svc] = ob; return 1; } else { return 0; } } int eventStopServer(string svc) { object ob = Servers[svc]; if( !master()->valid_apply(({})) ) { return 0; } if( !ob ) { return 0; } ob->eventShutdown(); map_delete(Servers, svc); if( ob ) { return 0; } else { return 1; } } static void create() { SetSaveFile(SAVE_INET); daemon::create(); SetNoClean(1); foreach(string svc, class service s in Services) { Servers[svc] = new(LIB_SERVER, query_host_port() + s->PortOffset, s->SocketType, s->SocketClass); } }