mirror of
https://github.com/ChronosX88/psyced.git
synced 2024-12-05 00:22:19 +00:00
some missing files
This commit is contained in:
parent
61e6cf4f60
commit
699fe68c44
42
config/blueprint/README
Normal file
42
config/blueprint/README
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
==========================================
|
||||||
|
YOU SHOULD READ THIS MESSAGE IN YOUR local/
|
||||||
|
DIRECTORY. config/blueprint ONLY CONTAINS
|
||||||
|
THE DEFAULT COPY OF THE CONFIGURATION. IT
|
||||||
|
IS NOT IN USE AS YOU RUN THE SERVER. SO
|
||||||
|
DON'T EDIT ANY FILES IN config/blueprint.
|
||||||
|
THX ======================================
|
||||||
|
|
||||||
|
banner.txt is the file that is shown to
|
||||||
|
telnet users at login
|
||||||
|
|
||||||
|
config.c is currently not being used, really.
|
||||||
|
|
||||||
|
config.h is of no interest.
|
||||||
|
|
||||||
|
hosts.h lets you specify ip ranges that are
|
||||||
|
particularely trustworthy or untrustworthy.
|
||||||
|
|
||||||
|
init.ls contains the list of classes that
|
||||||
|
will be compiled at boot-time. it is mostly
|
||||||
|
useful for debugging, as in a healthy
|
||||||
|
system any required class can be compiled
|
||||||
|
at the moment it is used for the first time.
|
||||||
|
so for production use this is kept to the
|
||||||
|
bare minimum. only the parts of psyced you
|
||||||
|
are actually using will be loaded.
|
||||||
|
|
||||||
|
local.h hosts your personal tunings to the
|
||||||
|
psyced system.
|
||||||
|
|
||||||
|
path.h lets you rearrange the directories
|
||||||
|
where the code for the protocol implementations
|
||||||
|
reside. you don't need to do that normally.
|
||||||
|
|
||||||
|
ports.h is generated by the installation
|
||||||
|
procedure and contains the port numbers you
|
||||||
|
chose for the services you want to use.
|
||||||
|
|
||||||
|
psyconf.h is also generated that way by the
|
||||||
|
psyconf utility. it contains the settings
|
||||||
|
from psyced.ini in a form pleasant for LPC.
|
||||||
|
|
8
config/blueprint/banner.txt
Normal file
8
config/blueprint/banner.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[connected]
|
||||||
|
|
||||||
|
PROTOCOL for SYNCHRONOUS CONFERENCING http://www.psyced.org/
|
||||||
|
--------------- ___ __ _ _ __ ___ __ ------------------
|
||||||
|
| \ (__ \ / / | | \
|
||||||
|
|__/ \ V | |- | )
|
||||||
|
>>> | (__/ | \__ |__ |_/ <<<
|
||||||
|
|
66
config/blueprint/config.c
Normal file
66
config/blueprint/config.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// $Id: config.c,v 1.9 2006/11/07 07:58:36 lynx Exp $ vim:syntax=lpc
|
||||||
|
#include <net.h>
|
||||||
|
|
||||||
|
/* a data file or an include can be read by any file in the system but
|
||||||
|
* we want this information to be readable by the gateway code only
|
||||||
|
* that's why it has to be lpc code
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef GATEWAY_PATH
|
||||||
|
|
||||||
|
/* if you are positive that you want to run your own gateways to
|
||||||
|
* legacy messaging systems, please insert your gateway credentials
|
||||||
|
* into the fields below and activate the code by turning #if 0 to #if 1
|
||||||
|
*
|
||||||
|
* update: these bot-style gateways are not functional. don't switch
|
||||||
|
* them to 1 as either the python scripts or the jabber code isn't
|
||||||
|
* up to date with them.
|
||||||
|
*/
|
||||||
|
|
||||||
|
# define USE_ICQ_GATEWAY 0 // don't change
|
||||||
|
# define USE_AIM_GATEWAY 0 // don't change
|
||||||
|
|
||||||
|
qConfig() {
|
||||||
|
string p = file_name(previous_object());
|
||||||
|
# ifdef __COMPAT_MODE__
|
||||||
|
p = "/"+p;
|
||||||
|
# endif
|
||||||
|
P3(("\n%O: config requested by %s\n", ME, p))
|
||||||
|
# if USE_ICQ_GATEWAY
|
||||||
|
if (abbrev(GATEWAY_PATH "icq", p)) return
|
||||||
|
(["host" : "icq.localhost",
|
||||||
|
"port" : 5234,
|
||||||
|
"scheme" : "icq",
|
||||||
|
"name" : "icqlinker",
|
||||||
|
"secret" : "myicqsecret",
|
||||||
|
"nickname" : "your uin here",
|
||||||
|
"password" : "and your password please" ]);
|
||||||
|
# endif
|
||||||
|
# if USE_AIM_GATEWAY
|
||||||
|
if (abbrev(GATEWAY_PATH "aim2", p)) return
|
||||||
|
(["host" : "aim.localhost",
|
||||||
|
"port" : 5233,
|
||||||
|
"scheme" : "aim",
|
||||||
|
"name" : "aimlinker",
|
||||||
|
"secret" : "myaimsecret",
|
||||||
|
"nickname" : "screen name",
|
||||||
|
"password" : "and your password please" ]);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
load() {
|
||||||
|
# if USE_ICQ_GATEWAY
|
||||||
|
D(" " GATEWAY_PATH "icq");
|
||||||
|
load_object(GATEWAY_PATH "icq");
|
||||||
|
# endif
|
||||||
|
# if USE_AIM_GATEWAY
|
||||||
|
D(" " GATEWAY_PATH "aim2");
|
||||||
|
load_object(GATEWAY_PATH "aim2");
|
||||||
|
# endif
|
||||||
|
# ifdef RELAY_OBJECT
|
||||||
|
D(" " RELAY_OBJECT "\n");
|
||||||
|
call_out(load_object, 0, RELAY_OBJECT);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
23
config/blueprint/config.h
Normal file
23
config/blueprint/config.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// $Id: config.h,v 1.1 2007/04/26 13:34:02 lynx Exp $ // vim:syntax=lpc
|
||||||
|
//
|
||||||
|
// This file is not intended to be modified. Make your local changes
|
||||||
|
// in psyced.ini, and if that wasn't good enough, use local.h.
|
||||||
|
// If you are integrating psyced with other LPC applications, feel
|
||||||
|
// free to modify path.h. If you aren't, better leave it as it is.
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
# define CONFIG_H
|
||||||
|
|
||||||
|
// load local modifications by the admin
|
||||||
|
# include "local.h"
|
||||||
|
|
||||||
|
// load port configuration as generated by psyconf
|
||||||
|
# include "ports.h"
|
||||||
|
|
||||||
|
// load layout of psyced software modules
|
||||||
|
# include "path.h"
|
||||||
|
|
||||||
|
// load psyced.ini settings converted by psyconf
|
||||||
|
# include "psyconf.h"
|
||||||
|
|
||||||
|
#endif
|
7
config/blueprint/hosts.h
Normal file
7
config/blueprint/hosts.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// Examples of specially enabled or disabled hosts.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// #define ENABLED_HOSTS "192.168.0.", "10."
|
||||||
|
//
|
||||||
|
// #define DISABLED_HOSTS "207.46.197.", "207.46.19."
|
||||||
|
//
|
3
config/blueprint/init.ls
Normal file
3
config/blueprint/init.ls
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
net/user
|
||||||
|
net/place/basic
|
||||||
|
local/config
|
5
config/blueprint/local.h
Normal file
5
config/blueprint/local.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// This is local.h for advanced tunings to the psyced runtime and
|
||||||
|
// LPC compilation process. The format looks just like a regular
|
||||||
|
// header file for the C language. Settings you can specify
|
||||||
|
// here are documented at http://about.psyc.eu/Tuning
|
||||||
|
|
50
config/blueprint/path.h
Normal file
50
config/blueprint/path.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#ifndef _INCLUDE_PATH_H
|
||||||
|
#define _INCLUDE_PATH_H
|
||||||
|
|
||||||
|
#define NET_PATH "/net/"
|
||||||
|
#define PLACE_PATH "/place/"
|
||||||
|
#define SERVICE_PATH "/service/"
|
||||||
|
#define DATA_PATH "/data/"
|
||||||
|
#define CONFIG_PATH "/local/"
|
||||||
|
#define DAEMON_PATH NET_PATH "d/"
|
||||||
|
#define GATEWAY_PATH NET_PATH "gateway/"
|
||||||
|
|
||||||
|
// protocol for synchronous conferencing
|
||||||
|
#define PSYC_PATH "/net/psyc/"
|
||||||
|
|
||||||
|
// experimental PSYC 1.0 interface
|
||||||
|
#define SPYC_PATH "/net/spyc/"
|
||||||
|
|
||||||
|
// irc server emulation
|
||||||
|
#define IRC_PATH "/net/irc/"
|
||||||
|
|
||||||
|
// jabber server emulation
|
||||||
|
#define JABBER_PATH "/net/jabber/"
|
||||||
|
|
||||||
|
// telnet access
|
||||||
|
#define TELNET_PATH "/net/tn/"
|
||||||
|
|
||||||
|
// java applet server, uses a very simple protocol
|
||||||
|
#define APPLET_PATH "/net/applet/"
|
||||||
|
|
||||||
|
// accept messages and simple mails via smtp
|
||||||
|
#define SMTP_PATH "/net/smtp/"
|
||||||
|
|
||||||
|
// experimental: access message log via pop3
|
||||||
|
#define POP3_PATH "/net/pop/"
|
||||||
|
|
||||||
|
// experimental: serve as a sip "proxy"
|
||||||
|
#define SIP_PATH "/net/sip/"
|
||||||
|
|
||||||
|
// allow access to subscribed threaded discussion groups via nntp
|
||||||
|
#define NNTP_PATH "/net/nntp/"
|
||||||
|
|
||||||
|
// accept messages and allow lastlog access via wap
|
||||||
|
#define WAP_PATH "/net/wap/"
|
||||||
|
|
||||||
|
// simple http server
|
||||||
|
#ifndef HTTP_PATH
|
||||||
|
# define HTTP_PATH "/net/http/"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
33
config/blueprint/ports.h
Normal file
33
config/blueprint/ports.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* this file shall automatically be generated by psyconf.
|
||||||
|
*
|
||||||
|
* the values in here may be the same as in services.h
|
||||||
|
* or they may not. so always be conscious which ones you
|
||||||
|
* are using to which purpose. -lynX
|
||||||
|
*/
|
||||||
|
|
||||||
|
#echo This is just the demo ports.h. I shouldn't get loaded.
|
||||||
|
#echo If I do, then you didn't run psyconf successfully!!
|
||||||
|
|
||||||
|
#define PSYC_PORT 4404
|
||||||
|
|
||||||
|
#define HTTP_PORT 33333
|
||||||
|
#define HTTPS_PORT 34443
|
||||||
|
|
||||||
|
#define IRC_PORT 6667
|
||||||
|
#define IRCS_PORT 9999
|
||||||
|
|
||||||
|
#define JABBER_PORT 5222
|
||||||
|
#define JABBERS_PORT 5223
|
||||||
|
#define JABBER_S2S_PORT 5269
|
||||||
|
|
||||||
|
#define TELNET_PORT 2323
|
||||||
|
#define TELNETS_PORT
|
||||||
|
|
||||||
|
#define APPLET_PORT 2008
|
||||||
|
|
||||||
|
#define SMTP_PORT
|
||||||
|
#define SMTPS_PORT
|
||||||
|
|
||||||
|
#define NTTP_PORT
|
||||||
|
#define NNTPS_PORT
|
||||||
|
|
68
config/gentoo/ldmud/files/erq/Makefile.in
Normal file
68
config/gentoo/ldmud/files/erq/Makefile.in
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
# These lines are needed on some machines.
|
||||||
|
MAKE=make
|
||||||
|
SHELL=@CONFIG_SHELL@
|
||||||
|
INSTALL=@INSTALL@
|
||||||
|
mkinstalldirs=$(SHELL) @top_srcdir@/mkinstalldirs
|
||||||
|
#
|
||||||
|
CC=@CC@
|
||||||
|
|
||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
|
||||||
|
SUBDIRS = indent make_docs xerq
|
||||||
|
SED = sed
|
||||||
|
|
||||||
|
BINDIR=@bindir@
|
||||||
|
MUD_LIB=@libdir@
|
||||||
|
ERQ_DIR=@libexecdir@
|
||||||
|
|
||||||
|
#PROFIL= -DOPCPROF -DVERBOSE_OPCPROF
|
||||||
|
#PROFIL=-p -DMARK
|
||||||
|
#PROFIL=-pg
|
||||||
|
PROFIL=
|
||||||
|
#Enable warnings from the compiler, if wanted.
|
||||||
|
WARN= # no warning options - will work with all compilers :-)
|
||||||
|
#WARN= -Wall -Wshadow -Dlint
|
||||||
|
#WARN= -Wall -Wshadow -Wno-parentheses # gcc settings
|
||||||
|
#
|
||||||
|
# Optimization and source level debugging options.
|
||||||
|
# adding a -fomit-frame-pointer on the NeXT (gcc version 1.93 (68k, MIT syntax))
|
||||||
|
# will corrupt the driver.
|
||||||
|
HIGH_OPTIMIZE = @OCFLAGS@ # high optimization
|
||||||
|
MED_OPTIMIZE= @MCFLAGS@ # medium optimization
|
||||||
|
LOW_OPTIMIZE = @LCFLAGS@ # minimal optimization
|
||||||
|
NO_OPTIMIZE= @DCFLAGS@ # no optimization; for frequent recompilations.
|
||||||
|
|
||||||
|
OPTIMIZE= $(@val_optimize@_OPTIMIZE)
|
||||||
|
|
||||||
|
# The main debugging level is define in config.h
|
||||||
|
# Add additional options here.
|
||||||
|
DEBUG=
|
||||||
|
#
|
||||||
|
MPATH=-DMUD_LIB='"$(MUD_LIB)"' -DBINDIR='"$(BINDIR)"' -DERQ_DIR='"$(ERQ_DIR)"'
|
||||||
|
#
|
||||||
|
TOPINC=-I@top_srcdir@
|
||||||
|
#
|
||||||
|
CFLAGS= @EXTRA_CFLAGS@ $(OPTIMIZE) $(DEBUG) $(WARN) $(MPATH) $(PROFIL) $(TOPINC)
|
||||||
|
#
|
||||||
|
LIBS=@ERQ_LIBS@ -lresolv
|
||||||
|
#
|
||||||
|
LDFLAGS=@LDFLAGS@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
all: erq@EXEEXT@
|
||||||
|
|
||||||
|
FORCE: install
|
||||||
|
|
||||||
|
erq@EXEEXT@: erq.c
|
||||||
|
# $(CC) erq.c -lresolv -o erq@EXEEXT@
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) erq.c -o erq@EXEEXT@ $(LIBS)
|
||||||
|
|
||||||
|
install: erq@EXEEXT@
|
||||||
|
$(mkinstalldirs) $(BINDIR)
|
||||||
|
$(INSTALL) erq@EXEEXT@ $(BINDIR)/erq@EXEEXT@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -f *.o erq@EXEEXT@ *~
|
2612
config/gentoo/ldmud/files/erq/erq.c
Normal file
2612
config/gentoo/ldmud/files/erq/erq.c
Normal file
File diff suppressed because it is too large
Load Diff
60
config/gentoo/ldmud/files/erq/erq.h
Normal file
60
config/gentoo/ldmud/files/erq/erq.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* external request demon interface definitions */
|
||||||
|
|
||||||
|
#ifndef ERQ_H__
|
||||||
|
#define ERQ_H__ 1
|
||||||
|
|
||||||
|
/* servive request types */
|
||||||
|
|
||||||
|
#define ERQ_RLOOKUP 0 /* Lookup ip -> name */
|
||||||
|
#define ERQ_EXECUTE 1 /* Execute a program */
|
||||||
|
#define ERQ_FORK 2 /* Fork a program */
|
||||||
|
#define ERQ_AUTH 3 /* Connect to a remote authd */
|
||||||
|
#define ERQ_SPAWN 4 /* Spawn a program */
|
||||||
|
#define ERQ_SEND 5 /* Send data to a program or connection */
|
||||||
|
#define ERQ_KILL 6 /* Kill a program or connection */
|
||||||
|
#define ERQ_OPEN_UDP 7 /* Open a UDP socket */
|
||||||
|
#define ERQ_OPEN_TCP 8 /* Open a TCP connection */
|
||||||
|
#define ERQ_LISTEN 9 /* Open a TCP accept-socket */
|
||||||
|
#define ERQ_ACCEPT 10 /* Accept a connection from a accept-socket */
|
||||||
|
#define ERQ_LOOKUP 11 /* Lookup name -> ip */
|
||||||
|
|
||||||
|
#ifdef __IPV6__
|
||||||
|
#define ERQ_RLOOKUPV6 12 /* Lookup name/ip6 */
|
||||||
|
#endif
|
||||||
|
#define ERQ_LOOKUP_SRV 13
|
||||||
|
|
||||||
|
/* Additional service request type flags evaluated by efun send_erq().
|
||||||
|
* The ERQ itself won't get to see it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ERQ_CB_STRING (1 << 31) /* Callback closure takes a string arg */
|
||||||
|
|
||||||
|
|
||||||
|
/* answers from ERQ_EXECUTE / ERQ_FORK */
|
||||||
|
|
||||||
|
#define ERQ_OK 0
|
||||||
|
#define ERQ_SIGNALED 1
|
||||||
|
#define ERQ_E_NOTFOUND 2 /* process not found by wait */
|
||||||
|
#define ERQ_E_UNKNOWN 3 /* unknown exit condition from wait() */
|
||||||
|
#define ERQ_E_ARGLENGTH 4
|
||||||
|
#define ERQ_E_ARGFORMAT 5
|
||||||
|
#define ERQ_E_ARGNUMBER 6
|
||||||
|
#define ERQ_E_ILLEGAL 7
|
||||||
|
#define ERQ_E_PATHLEN 8
|
||||||
|
#define ERQ_E_FORKFAIL 9
|
||||||
|
#define ERQ_E_TICKET 11
|
||||||
|
#define ERQ_E_INCOMPLETE 12
|
||||||
|
#define ERQ_E_WOULDBLOCK 13
|
||||||
|
#define ERQ_E_PIPE 14
|
||||||
|
#define ERQ_STDOUT 15 /* Normal data received */
|
||||||
|
#define ERQ_STDERR 16
|
||||||
|
#define ERQ_EXITED 17 /* Connection closed on EOF */
|
||||||
|
#define ERQ_E_NSLOTS 18
|
||||||
|
|
||||||
|
/* reserved handles */
|
||||||
|
|
||||||
|
#define ERQ_HANDLE_RLOOKUP (-1)
|
||||||
|
#define ERQ_HANDLE_KEEP_HANDLE (-2)
|
||||||
|
#define ERQ_HANDLE_RLOOKUPV6 (-3)
|
||||||
|
|
||||||
|
#endif /* ERQ_H__ */
|
215
config/gentoo/ldmud/files/erq/srv.c
Normal file
215
config/gentoo/ldmud/files/erq/srv.c
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
#include "srv.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <arpa/inet.h> // For solaris
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#include <resolv.h>
|
||||||
|
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
/* the biggest packet we'll send and receive */
|
||||||
|
#if PACKETSZ > 1024
|
||||||
|
#define MAXPACKET PACKETSZ
|
||||||
|
#else
|
||||||
|
#define MAXPACKET 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* and what we send and receive */
|
||||||
|
typedef union {
|
||||||
|
HEADER hdr;
|
||||||
|
u_char buf[MAXPACKET];
|
||||||
|
} querybuf;
|
||||||
|
|
||||||
|
#ifndef T_SRV
|
||||||
|
#define T_SRV 33
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void freesrvhost ( struct srvhost * s )
|
||||||
|
{
|
||||||
|
struct srvhost * n;
|
||||||
|
while( s ) {
|
||||||
|
n = s->next;
|
||||||
|
/* hack to make double-free visible by causing null dereference */
|
||||||
|
s->next = NULL;
|
||||||
|
free( (void *)s );
|
||||||
|
s = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int compare( const void * a, const void * b )
|
||||||
|
{
|
||||||
|
struct srvhost * aa, * bb;
|
||||||
|
|
||||||
|
if ( !a )
|
||||||
|
return 1;
|
||||||
|
if ( !b )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
aa = (struct srvhost *) *(int*)a;
|
||||||
|
bb = (struct srvhost *) *(int*)b;
|
||||||
|
|
||||||
|
if ( aa->pref > bb->pref )
|
||||||
|
return 1;
|
||||||
|
if ( aa->pref < bb->pref )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if ( aa->rweight > bb->rweight )
|
||||||
|
return -1;
|
||||||
|
if ( aa->rweight < bb->rweight )
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct srvhost * getsrv( const char * domain,
|
||||||
|
const char * service, const char * protocol ) {
|
||||||
|
querybuf answer; /* answer buffer from nameserver */
|
||||||
|
int n;
|
||||||
|
char * zone;
|
||||||
|
int ancount, qdcount; /* answer count and query count */
|
||||||
|
HEADER *hp; /* answer buffer header */
|
||||||
|
struct srvhost **replyarray;
|
||||||
|
struct srvhost * firsthost;
|
||||||
|
int answerno;
|
||||||
|
u_char hostbuf[256];
|
||||||
|
u_char *msg, *eom, *cp; /* answer buffer positions */
|
||||||
|
int dlen, type, pref, weight, port;
|
||||||
|
|
||||||
|
if ( !domain || !*domain ||
|
||||||
|
!service || !*service ||
|
||||||
|
!protocol || !*protocol )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
zone = (char *)malloc( strlen( domain ) +
|
||||||
|
strlen( service ) +
|
||||||
|
strlen( protocol ) + 20 );
|
||||||
|
if (zone == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
*zone = '\0';
|
||||||
|
|
||||||
|
if (*service != '_') // If service and protocol do not start with a
|
||||||
|
strcat(zone, "_"); // _, prepend the _ to them...
|
||||||
|
|
||||||
|
strcat(zone, service);
|
||||||
|
strcat(zone, ".");
|
||||||
|
|
||||||
|
if (*protocol != '_')
|
||||||
|
strcat(zone, "_");
|
||||||
|
|
||||||
|
strcat(zone, protocol);
|
||||||
|
strcat(zone, ".");
|
||||||
|
|
||||||
|
strcat(zone, domain);
|
||||||
|
|
||||||
|
n = res_query( zone, C_IN, T_SRV, (u_char *)&answer, sizeof( answer ) );
|
||||||
|
|
||||||
|
(void) free( zone );
|
||||||
|
zone = NULL;
|
||||||
|
|
||||||
|
if ( n < (int)sizeof(HEADER) )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* valid answer received. skip the query record. */
|
||||||
|
|
||||||
|
hp = (HEADER *)&answer;
|
||||||
|
qdcount = ntohs(hp->qdcount);
|
||||||
|
ancount = ntohs(hp->ancount);
|
||||||
|
|
||||||
|
msg = (u_char *)&answer;
|
||||||
|
eom = (u_char *)&answer + n;
|
||||||
|
cp = (u_char *)&answer + sizeof(HEADER);
|
||||||
|
|
||||||
|
while ( qdcount-- > 0 && cp < eom ) {
|
||||||
|
n = dn_expand( msg, eom, cp, (char *)hostbuf, 256 );
|
||||||
|
if (n < 0)
|
||||||
|
return NULL;
|
||||||
|
cp += n + QFIXEDSZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make a big-enough (probably too big) reply array */
|
||||||
|
|
||||||
|
replyarray
|
||||||
|
= (struct srvhost **) malloc( ancount * sizeof(struct srvhost *) );
|
||||||
|
for( n = 0; n < ancount; n++ )
|
||||||
|
replyarray[n] = NULL;
|
||||||
|
answerno = 0;
|
||||||
|
|
||||||
|
/* loop through the answer buffer and extract SRV records */
|
||||||
|
while ( ancount-- > 0 && cp < eom ) {
|
||||||
|
n = dn_expand( msg, eom, cp, (char *)hostbuf, 256 );
|
||||||
|
if ( n < 0 ) {
|
||||||
|
for( n = 0; n < answerno; n++ )
|
||||||
|
(void) free( replyarray[n] );
|
||||||
|
(void)free( replyarray );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cp += n;
|
||||||
|
|
||||||
|
type = _getshort(cp);
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
/* class = _getshort(cp); */
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
/* ttl = _getlong(cp); */
|
||||||
|
cp += sizeof(u_long);
|
||||||
|
|
||||||
|
dlen = _getshort(cp);
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
if ( type != T_SRV ) {
|
||||||
|
cp += dlen;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pref = _getshort(cp);
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
weight = _getshort(cp);
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
port = _getshort(cp);
|
||||||
|
cp += sizeof(u_short);
|
||||||
|
|
||||||
|
n = dn_expand( msg, eom, cp, (char *)hostbuf, 256 );
|
||||||
|
if (n < 0)
|
||||||
|
break;
|
||||||
|
cp += n;
|
||||||
|
|
||||||
|
replyarray[answerno]
|
||||||
|
= (struct srvhost *)malloc( sizeof( struct srvhost ) +
|
||||||
|
strlen( (char *)hostbuf ) );
|
||||||
|
replyarray[answerno]->pref = pref;
|
||||||
|
replyarray[answerno]->weight = weight;
|
||||||
|
if ( weight )
|
||||||
|
replyarray[answerno]->rweight = 1+random()%( 10000 * weight );
|
||||||
|
else
|
||||||
|
replyarray[answerno]->rweight = 0;
|
||||||
|
replyarray[answerno]->port = port;
|
||||||
|
replyarray[answerno]->next = NULL;
|
||||||
|
strcpy( replyarray[answerno]->name, (char *)hostbuf );
|
||||||
|
|
||||||
|
answerno++;
|
||||||
|
}
|
||||||
|
if (answerno == 0) return NULL;
|
||||||
|
qsort( replyarray, answerno, sizeof( struct srvhost * ),
|
||||||
|
compare );
|
||||||
|
|
||||||
|
// Recreate a linked list from the sorted array...
|
||||||
|
for( n = 0; n < answerno; n++ )
|
||||||
|
replyarray[n]->next = replyarray[n+1];
|
||||||
|
replyarray[answerno-1]->next = NULL;
|
||||||
|
|
||||||
|
firsthost = replyarray[0];
|
||||||
|
(void) free( replyarray );
|
||||||
|
return firsthost;
|
||||||
|
}
|
||||||
|
|
32
config/gentoo/ldmud/files/erq/srv.h
Normal file
32
config/gentoo/ldmud/files/erq/srv.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
** $Id: srv.h,v 1.1 2006/05/22 11:18:10 lynx Exp $
|
||||||
|
**
|
||||||
|
** Definition of something or other
|
||||||
|
**
|
||||||
|
** Created : 979899
|
||||||
|
**
|
||||||
|
** Copyright (C) 1997 by Troll Tech AS. All rights reserved.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SRV_H
|
||||||
|
#define SRV_H
|
||||||
|
|
||||||
|
struct srvhost {
|
||||||
|
unsigned int pref;
|
||||||
|
struct srvhost * next;
|
||||||
|
unsigned int port;
|
||||||
|
unsigned int weight;
|
||||||
|
unsigned int rweight;
|
||||||
|
char name[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern void freesrvhost ( struct srvhost * );
|
||||||
|
|
||||||
|
extern struct srvhost * getsrv( const char * domain,
|
||||||
|
const char * service,
|
||||||
|
const char * protocol );
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
311
config/gentoo/ldmud/files/psyced.settings
Normal file
311
config/gentoo/ldmud/files/psyced.settings
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# settings/psyced version 4.0
|
||||||
|
#
|
||||||
|
# $Id: psyced.settings,v 1.10 2007/05/08 00:52:01 lynx Exp $
|
||||||
|
#
|
||||||
|
# LDMUD compilation settings for psyced, the LPC server and client
|
||||||
|
# implementation of the protocol for synchronous conferencing.
|
||||||
|
# Please execute this instead of ./configure before compilation.
|
||||||
|
#
|
||||||
|
# The latest version of this file is in the psyced-CVS and usually also
|
||||||
|
# at http://www.psyced.org/dist/config/psyced.settings
|
||||||
|
# The version in the LDMUD distribution may be slightly outdated.
|
||||||
|
#
|
||||||
|
# Documents and download on: http://www.psyced.org
|
||||||
|
# Information about PSYC: http://www.psyc.eu
|
||||||
|
#
|
||||||
|
# the PSYC implementation and library is designed in a way that it should
|
||||||
|
# easily co-host in a running LPMUD, it just needs a few patches to the
|
||||||
|
# master object and #includes in simul_efun.
|
||||||
|
#
|
||||||
|
# how to multiplex InterMUD and PSYC on the same udp port:
|
||||||
|
# PSYC UDP packets always start with ".\n".
|
||||||
|
#
|
||||||
|
# configure will strip this part from the script.
|
||||||
|
|
||||||
|
cp $0 settings/psyced-current
|
||||||
|
exec ./configure --prefix=/opt/psyced --bindir=/opt/psyced/bin --libdir=/opt/psyced/world --libexec=/opt/psyced/run --with-setting=psyced-current $*
|
||||||
|
exit
|
||||||
|
|
||||||
|
#-- PSYCLPC EXTENSIONS
|
||||||
|
|
||||||
|
# compile json c library in, if available
|
||||||
|
enable_use_json=yes
|
||||||
|
|
||||||
|
# compile expat xml & xmpp parser in, if available
|
||||||
|
enable_use_expat=yes
|
||||||
|
|
||||||
|
# enable this if you want use http://about.psyc.eu/psyclpc#Authlocal
|
||||||
|
enable_use_authlocal=yes
|
||||||
|
# requires procfs with readable /proc/net/tcp
|
||||||
|
#
|
||||||
|
# some kernel configurations show wrong port numbers however,
|
||||||
|
# in that case the correlation from peer port to user id fails.
|
||||||
|
# there is however no risk of error (the peer ports are unprivileged
|
||||||
|
# whereas the 'wrong' ones are privileged ones. could be related to
|
||||||
|
# iptables or some other port mapping magic).
|
||||||
|
|
||||||
|
#-- FILE PATHES
|
||||||
|
|
||||||
|
with_master_name=drivers/ldmud/master/master
|
||||||
|
# unused really
|
||||||
|
with_swap_file=log/psyced.swap
|
||||||
|
|
||||||
|
#-- NETWORKING & DATA BASES
|
||||||
|
|
||||||
|
# cool tool that does external name server resolution and more
|
||||||
|
enable_erq=erq
|
||||||
|
|
||||||
|
# the "sorry" message of the built-in ACL isn't flexible enough:
|
||||||
|
# it cannot output a properly formatted HTTP or PSYC message
|
||||||
|
# and why shouldn't this be done in LPC anyway?
|
||||||
|
enable_access_control=no
|
||||||
|
|
||||||
|
# zlib compression, really
|
||||||
|
enable_use_mccp=yes
|
||||||
|
|
||||||
|
# Enable support for TLS (Transport Layer Security).
|
||||||
|
#
|
||||||
|
# 'no': TLS support is not compiled it
|
||||||
|
# 'gnu': TLS support using GnuTLS is compiled in if found.
|
||||||
|
# 'ssl': TLS support using OpenSSL is compiled in if found.
|
||||||
|
# 'yes': TLS support using either OpenSSL or GnuTLS is compiled in if found.
|
||||||
|
# The configuration script looks first for OpenSSL, then GnuTLS.
|
||||||
|
# If both are available, OpenSSL is used.
|
||||||
|
#
|
||||||
|
# gnutls does not offer features we need
|
||||||
|
enable_use_tls=ssl
|
||||||
|
|
||||||
|
# SQL storage not implemented. Maybe PSYC synchronization is good enough?
|
||||||
|
# see http://about.psyc.eu/storage for info.
|
||||||
|
enable_use_mysql=no
|
||||||
|
enable_use_pgsql=no
|
||||||
|
enable_use_sqlite=no
|
||||||
|
|
||||||
|
# maximum permitted tcp connections
|
||||||
|
with_max_players=900
|
||||||
|
|
||||||
|
# The maximum number of ports to listen for connections on.
|
||||||
|
with_maxnumports=33
|
||||||
|
|
||||||
|
# size of the buffer for incoming data of each socket
|
||||||
|
with_size_socket_buffer=32768
|
||||||
|
|
||||||
|
# The maximum number of simultaneous connect() calls
|
||||||
|
with_max_net_connects=33
|
||||||
|
|
||||||
|
# how can i set all the other port numbers?
|
||||||
|
# still using the historic dirty command line hack?
|
||||||
|
with_portno=4404
|
||||||
|
|
||||||
|
# Maximum size of a socket send buffer.
|
||||||
|
with_set_buffer_size_max=262144
|
||||||
|
|
||||||
|
# the PSYC port
|
||||||
|
with_udp_port=4404
|
||||||
|
|
||||||
|
# Enable support for IPv6 (this should better be autodetected!!)
|
||||||
|
#enable_use_ipv6=no
|
||||||
|
|
||||||
|
# Enable the use of pthreads for background socket IO.
|
||||||
|
enable_use_pthreads=no
|
||||||
|
|
||||||
|
# If PThreads are used, this is the max amount of data held pending
|
||||||
|
# for writing. If the amount is exceeded, the oldest data blocks
|
||||||
|
# are discarded.
|
||||||
|
# If 0, any amount of data is allowed.
|
||||||
|
with_pthread_write_max_size=333333
|
||||||
|
|
||||||
|
#-- RUNTIME LIMITS
|
||||||
|
#
|
||||||
|
# currently we consider a psyced a friendly environment
|
||||||
|
# where no coders will abuse cpu time and other limits
|
||||||
|
# you may want to change this if you have many room coders
|
||||||
|
|
||||||
|
# you can lower this value for better debugging
|
||||||
|
with_max_cost=9999999
|
||||||
|
#with_catch_reserved_cost=2000
|
||||||
|
#with_master_reserved_cost=512
|
||||||
|
enable_dynamic_costs=no
|
||||||
|
|
||||||
|
# Maximum function call depth for normal program execution
|
||||||
|
#with_max_user_trace=60
|
||||||
|
# Maximum function call depth during error handling.
|
||||||
|
# It must be bigger than MAX_USER_TRACE (check at compile time).
|
||||||
|
#with_max_trace=65
|
||||||
|
# Maximum number of bits in a bit string.
|
||||||
|
# The limit is more based on considerations of speed than memory consumption.
|
||||||
|
#with_max_bits=6144
|
||||||
|
# Allowed number of ed commands per backend cycle (for faster file upload).
|
||||||
|
#with_allowed_ed_cmds=20
|
||||||
|
|
||||||
|
# disabled "mud" limits
|
||||||
|
with_max_array_size=0
|
||||||
|
with_max_mapping_size=0
|
||||||
|
with_max_mapping_keys=0
|
||||||
|
with_read_file_max_size=0
|
||||||
|
with_max_byte_transfer=0
|
||||||
|
with_max_callouts=0
|
||||||
|
# new, was =100000
|
||||||
|
with_pthread_write_max_size=0
|
||||||
|
|
||||||
|
# Compiler stack size. This value affects the complexity the compiler can
|
||||||
|
# parse.
|
||||||
|
#with_compiler_stack_size=400
|
||||||
|
|
||||||
|
# Maximum number of local variables
|
||||||
|
#with_max_local=50
|
||||||
|
|
||||||
|
# Maximum size of an expanded preprocessor definition.
|
||||||
|
#with_defmax=65000
|
||||||
|
|
||||||
|
#-- MEMORY ALLOCATION
|
||||||
|
|
||||||
|
# slabmalloc seems to interact badly with net/jabber
|
||||||
|
#with_malloc=sysmalloc
|
||||||
|
# but other mallocs don't even compile & run
|
||||||
|
|
||||||
|
enable_malloc_sbrk=yes
|
||||||
|
enable_malloc_check=no
|
||||||
|
enable_malloc_trace=no
|
||||||
|
enable_malloc_sbrk_trace=no
|
||||||
|
#enable_malloc_lpc_trace=no, MALLOC_slaballoc
|
||||||
|
|
||||||
|
# disabled, sort of
|
||||||
|
with_reserved_user_size=100000
|
||||||
|
|
||||||
|
# hash table sizes. we have many chat strings (like lastlogs), but few objects
|
||||||
|
# (max: 65536)
|
||||||
|
with_htable_size=32768
|
||||||
|
with_otable_size=256
|
||||||
|
# Size of the hash table for defines, reserved words, identifiers, and
|
||||||
|
# efun names. This should be several times smaller than HTABLE_SIZE.
|
||||||
|
#with_itable_size=256
|
||||||
|
# Size of the apply cache, expressed in the bitsize of its indices.
|
||||||
|
# The number of entries is 2**cache_bits.
|
||||||
|
#with_apply_cache_bits=12
|
||||||
|
|
||||||
|
# Select whether compiled regular expressions shall be cached, and
|
||||||
|
# how big the cache shall be (max: 65536).
|
||||||
|
enable_rxcache_table=yes
|
||||||
|
with_rxcache_table=4096
|
||||||
|
|
||||||
|
#-- TIMER MECHANISMS
|
||||||
|
|
||||||
|
# short resets, not strictly necessary but useful
|
||||||
|
with_time_to_reset=1000
|
||||||
|
with_time_to_clean_up=9000
|
||||||
|
#with_time_to_swap=1500
|
||||||
|
#with_time_to_swap_variables=2500
|
||||||
|
with_time_to_swap=0
|
||||||
|
with_time_to_swap_variables=0
|
||||||
|
|
||||||
|
#-- MUD FEATURES
|
||||||
|
|
||||||
|
# should work in "native" too, after a tweak or two
|
||||||
|
# however, psyced expects create() to get called instead of reset(0)
|
||||||
|
enable_compat_mode=yes
|
||||||
|
enable_strict_euids=no
|
||||||
|
|
||||||
|
# The Input escape character.
|
||||||
|
# If this character is typed as first on the line, the normal input_to()s
|
||||||
|
# are bypassed.
|
||||||
|
#with_input_escape="!"
|
||||||
|
|
||||||
|
# Define ALLOW_FILENAME_SPACES if the driver should accept space characters
|
||||||
|
# in filenames. If it is not defined, a hardcoded test for space characters
|
||||||
|
# is activated.
|
||||||
|
enable_filename_spaces=yes
|
||||||
|
|
||||||
|
with_wizlist_file=no
|
||||||
|
enable_use_set_light=no
|
||||||
|
enable_use_set_is_wizard=no
|
||||||
|
|
||||||
|
#-- LANGUAGE
|
||||||
|
|
||||||
|
enable_use_parse_command=no
|
||||||
|
enable_use_process_string=no
|
||||||
|
enable_lpc_nosave=yes
|
||||||
|
# if turned to yes this causes errors
|
||||||
|
# in textdb and room history:
|
||||||
|
enable_share_variables=no
|
||||||
|
# keep .o files crossplatform
|
||||||
|
enable_use_system_crypt=no
|
||||||
|
|
||||||
|
# Define this to enable LPC structs.
|
||||||
|
enable_use_structs=no
|
||||||
|
|
||||||
|
# new inline closure and function syntax, see doc/LPC/inline-closures
|
||||||
|
# ... We don't want to use them as yet, but current
|
||||||
|
# 3.3.5xx doesn't compile properly without! :-(
|
||||||
|
enable_use_new_inlines=yes
|
||||||
|
|
||||||
|
enable_use_alists=no
|
||||||
|
# we use it for system shout
|
||||||
|
enable_lpc_array_calls=yes
|
||||||
|
# only enables the ancient transfer() efun we don't use
|
||||||
|
enable_use_deprecated=no
|
||||||
|
|
||||||
|
# Enable PCRE instead of traditional regexps
|
||||||
|
# 'no': use traditional regexps by default
|
||||||
|
# 'no-builtin': use traditional regexps by default, or the builtin PCRE
|
||||||
|
# package if PCRE is requested
|
||||||
|
# 'builtin': use PCRE package by default, using the builtin package
|
||||||
|
# 'yes': use the system's PCRE package if available, otherwise the
|
||||||
|
# builtin package
|
||||||
|
enable_use_pcre=yes
|
||||||
|
|
||||||
|
#-- COMPILATION
|
||||||
|
|
||||||
|
# The optimization level in the generated Makefile
|
||||||
|
# Settings: no, low, med, high
|
||||||
|
with_optimize=med
|
||||||
|
|
||||||
|
#-- DEBUGGING
|
||||||
|
|
||||||
|
# Enable basic run time sanity checks. This will use more time
|
||||||
|
# and space, but nevertheless you are strongly encouraged to keep
|
||||||
|
# it defined.
|
||||||
|
enable_debug=yes
|
||||||
|
# LPC compiler debug
|
||||||
|
#enable_yydebug=no
|
||||||
|
|
||||||
|
# Disable inlining. Use this to debug obscure crashes, or for
|
||||||
|
# speed tests.
|
||||||
|
#enable_no_inlines=no
|
||||||
|
|
||||||
|
# Activate debug prints in the telnet machine (lots of output).
|
||||||
|
#enable_debug_telnet=no
|
||||||
|
|
||||||
|
# Activate allocation debug prints in the malloc module (lots of output).
|
||||||
|
# Supported by: MALLOC_smalloc, MALLOC_slaballoc
|
||||||
|
#enable_debug_malloc_allocs=no
|
||||||
|
|
||||||
|
# The DEBUG level for the ERQ daemon:
|
||||||
|
# 0 : no debug output
|
||||||
|
# 1 : standard debug output
|
||||||
|
# 2 : verbose debug output
|
||||||
|
with_erq_debug=0
|
||||||
|
|
||||||
|
# If TRACE_CODE is enable, the driver keeps a log of TOTAL_TRACE_LENGTH
|
||||||
|
# most recently execute bytecode instructions.
|
||||||
|
enable_trace_code=yes
|
||||||
|
with_total_trace_length=1024
|
||||||
|
|
||||||
|
# Enable these for runtime statistics:
|
||||||
|
# COMM_STAT: number and size of outgoing packets
|
||||||
|
# APPLY_CACHE_STAT: number of hits and misses in the apply cache
|
||||||
|
enable_comm_stat=yes
|
||||||
|
enable_apply_cache_stat=no
|
||||||
|
|
||||||
|
# Enable usage statistics of VM instructions.
|
||||||
|
enable_opcprof=no
|
||||||
|
enable_verbose_opcprof=no
|
||||||
|
|
||||||
|
# Lars' hardcore debug features
|
||||||
|
#enable_check_object_stat=no
|
||||||
|
#enable_check_mapping_total=no
|
||||||
|
#enable_check_object_ref=no
|
||||||
|
#enable_check_object_gc_ref=no
|
||||||
|
#enable_dump_gc_refs=no
|
3
pike/net.pmod/psyc.pmod/common.pike
Normal file
3
pike/net.pmod/psyc.pmod/common.pike
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import net.library;
|
||||||
|
|
||||||
|
#include "../../../world/net/psyc/common.c"
|
35
utility/latency.pike
Normal file
35
utility/latency.pike
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# contributed by fippo
|
||||||
|
|
||||||
|
Stdio.File socket;
|
||||||
|
int count;
|
||||||
|
array(int) start, stop;
|
||||||
|
|
||||||
|
void logon(int success) {
|
||||||
|
socket->set_nonblocking(read_cb);
|
||||||
|
socket->write(".\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void read_cb(int id, string data) {
|
||||||
|
//werror("read_cb:\n%s\n---\n", data);
|
||||||
|
count++;
|
||||||
|
if (count == 2) {
|
||||||
|
start = System.gettimeofday()[..1];
|
||||||
|
socket->write(":_target\tpsyc://localhost/~fippo\n\n_request_version\n.\n");
|
||||||
|
}
|
||||||
|
if (count > 2) {
|
||||||
|
stop = System.gettimeofday()[..1];
|
||||||
|
werror("latency is %d\n", (stop[0] - start[0])*1000000 + (stop[1] - start[1]));
|
||||||
|
if (count < 500) {
|
||||||
|
socket->write(":_target\tpsyc://localhost/\n\n_request_version\n.\n");
|
||||||
|
start = stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
socket = Stdio.File();
|
||||||
|
socket->async_connect("localhost", 4404, logon);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
440
world/drivers/ldmud/master/accept.c
Normal file
440
world/drivers/ldmud/master/accept.c
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
// $Id: accept.c,v 1.119 2008/08/03 14:21:59 lynx Exp $ // vim:syntax=lpc:ts=8
|
||||||
|
//
|
||||||
|
// this file contains the glue between LDMUD and psyced to
|
||||||
|
// connect the socket ports to appropriately named objects.
|
||||||
|
//
|
||||||
|
#include "/local/config.h"
|
||||||
|
|
||||||
|
#ifdef Dmaster
|
||||||
|
# undef DEBUG
|
||||||
|
# define DEBUG Dmaster
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include NET_PATH "include/net.h"
|
||||||
|
#include NET_PATH "include/services.h"
|
||||||
|
#include DRIVER_PATH "include/driver.h"
|
||||||
|
#include CONFIG_PATH "config.h"
|
||||||
|
|
||||||
|
#include DRIVER_PATH "sys/tls.h"
|
||||||
|
|
||||||
|
#ifndef ERR_TLS_NOT_DETECTED
|
||||||
|
# define ERR_TLS_NOT_DETECTED -31337
|
||||||
|
# ifdef SPYC_PATH
|
||||||
|
# echo Warning: TLS autodetect is not enabled in driver.
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
volatile int shutdown_in_progress = 0;
|
||||||
|
|
||||||
|
// not part of the master/driver API.. this is called from the library
|
||||||
|
void notify_shutdown_first(int progress) {
|
||||||
|
P3(("%O notify_shutdown_first(%O)\n", ME, progress))
|
||||||
|
shutdown_in_progress = progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef UID2NICK
|
||||||
|
# ifdef _userid_nick_mapping
|
||||||
|
# define UID2NICK(uid) ([ _userid_nick_mapping ])[uid]
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is called every time a TCP connection is established.
|
||||||
|
* It dispatches the ports to the protocol implementations.
|
||||||
|
* input_to() can't be called from here.
|
||||||
|
*
|
||||||
|
* uid is only passed if USE_AUTHLOCAL is built into the driver.
|
||||||
|
*/
|
||||||
|
object connect(int uid, int port, string service) {
|
||||||
|
int peerport;
|
||||||
|
mixed arg, t;
|
||||||
|
|
||||||
|
// now that's a bit of preprocessor magic you don't need to understand.. ;)
|
||||||
|
D2( if (uid) D("master:connected on port "+ query_mud_port() +" by uid "
|
||||||
|
+ uid +"\n");
|
||||||
|
else) {
|
||||||
|
D3(D("master:connected on port "+query_mud_port()
|
||||||
|
+" by "+query_ip_name()+"\n");)
|
||||||
|
}
|
||||||
|
#ifndef H_DEFAULT_PROMPT
|
||||||
|
set_prompt("");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (shutdown_in_progress) {
|
||||||
|
PT(("shutdown_in_progress(%O): putting connection from %O on hold\n",
|
||||||
|
shutdown_in_progress, query_ip_name(ME)))
|
||||||
|
// put the connection on hold to avoid further reconnects
|
||||||
|
return clone_object(NET_PATH "utility/onhold");
|
||||||
|
}
|
||||||
|
|
||||||
|
// we dont want the telnet machine most of the time
|
||||||
|
// but disabling and re-enabling it for telnet doesn't work
|
||||||
|
switch(port || query_mud_port()) {
|
||||||
|
|
||||||
|
#if HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
||||||
|
case PSYCS_PORT: // inofficial & temporary
|
||||||
|
# if __EFUN_DEFINED__(tls_want_peer_certificate)
|
||||||
|
tls_want_peer_certificate(ME);
|
||||||
|
# endif
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
#endif // fall thru
|
||||||
|
#if HAS_PORT(PSYC_PORT, PSYC_PATH)
|
||||||
|
case PSYC_PORT:
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(PSYC_PORT, PSYC_PATH) || HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
||||||
|
# ifdef DRIVER_HAS_CALL_BY_REFERENCE
|
||||||
|
arg = ME;
|
||||||
|
query_ip_number(&arg);
|
||||||
|
// this assumes network byte order provided by driver
|
||||||
|
peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0;
|
||||||
|
if (peerport < 0) peerport = 65536 + peerport;
|
||||||
|
// no support for non-AF_INET nets yet
|
||||||
|
if (peerport == PSYC_SERVICE) peerport = 0;
|
||||||
|
# else
|
||||||
|
// as long as the object names don't collide, this is okay too
|
||||||
|
peerport = 65536 + random(9999999);
|
||||||
|
# endif
|
||||||
|
# ifdef DRIVER_HAS_RENAMED_CLONES
|
||||||
|
unless (service) service = "psyc";
|
||||||
|
t = "S:"+ service + ":"+ query_ip_number();
|
||||||
|
// tcp peerports cannot be connected to, so we use minus
|
||||||
|
if (peerport) t += ":-"+peerport;
|
||||||
|
# else
|
||||||
|
t = clone_object(PSYC_PATH "server");
|
||||||
|
# endif
|
||||||
|
// the psyc backend distinguishes listen ports from peers using minus
|
||||||
|
D3(D(S("%O -> load(%O, %O)\n", t, query_ip_number(), -peerport));)
|
||||||
|
return t -> load(query_ip_number(), -peerport);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(SPYCS_PORT, SPYC_PATH)
|
||||||
|
case SPYCS_PORT: // inofficial & temporary
|
||||||
|
# if __EFUN_DEFINED__(tls_want_peer_certificate)
|
||||||
|
tls_want_peer_certificate(ME);
|
||||||
|
# endif
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
#endif // fall thru
|
||||||
|
#if HAS_PORT(SPYC_PORT, SPYC_PATH)
|
||||||
|
case SPYC_PORT:
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(SPYC_PORT, SPYC_PATH) || HAS_PORT(SPYCS_PORT, SPYC_PATH)
|
||||||
|
# ifdef DRIVER_HAS_CALL_BY_REFERENCE
|
||||||
|
arg = ME;
|
||||||
|
query_ip_number(&arg);
|
||||||
|
// this assumes network byte order provided by driver
|
||||||
|
peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0;
|
||||||
|
if (peerport < 0) peerport = 65536 + peerport;
|
||||||
|
// no support for non-AF_INET nets yet
|
||||||
|
if (peerport == SPYC_SERVICE) peerport = 0;
|
||||||
|
# else
|
||||||
|
// as long as the object names don't collide, this is okay too
|
||||||
|
peerport = 65536 + random(9999999);
|
||||||
|
# endif
|
||||||
|
# ifdef DRIVER_HAS_RENAMED_CLONES
|
||||||
|
t = "S:spyc:"+query_ip_number();
|
||||||
|
// tcp peerports cannot be connected to, so we use minus
|
||||||
|
if (peerport) t += ":-"+peerport;
|
||||||
|
# else
|
||||||
|
t = clone_object(SPYC_PATH "server");
|
||||||
|
# endif
|
||||||
|
// the psyc backend distinguishes listen ports from peers using minus
|
||||||
|
D3(D(S("%O -> load(%O, %O)\n", t, query_ip_number(), -peerport));)
|
||||||
|
return t -> load(query_ip_number(), -peerport);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(POP3S_PORT, POP3_PATH)
|
||||||
|
case POP3S_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(POP3_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(POP3_PORT, POP3_PATH)
|
||||||
|
case POP3_PORT:
|
||||||
|
return clone_object(POP3_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(SMTPS_PORT, NNTP_PATH)
|
||||||
|
case SMTPS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(SMTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(SMTP_PORT, SMTP_PATH)
|
||||||
|
case SMTP_PORT:
|
||||||
|
return clone_object(SMTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// heldensagas little http app
|
||||||
|
#if HAS_PORT(SHT_PORT, SHT_PATH)
|
||||||
|
case SHT_PORT:
|
||||||
|
return clone_object(SHT_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(NNTPS_PORT, NNTP_PATH)
|
||||||
|
case NNTPS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(NNTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(NNTP_PORT, NNTP_PATH)
|
||||||
|
case NNTP_PORT:
|
||||||
|
return clone_object(NNTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(JABBERS_PORT, JABBER_PATH)
|
||||||
|
case JABBERS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(JABBER_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(JABBER_PORT, JABBER_PATH)
|
||||||
|
case JABBER_PORT:
|
||||||
|
# if __EFUN_DEFINED__(enable_telnet)
|
||||||
|
enable_telnet(0); // are you sure!???
|
||||||
|
# endif
|
||||||
|
return clone_object(JABBER_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(JABBER_S2S_PORT, JABBER_PATH)
|
||||||
|
case JABBER_S2S_PORT:
|
||||||
|
# ifdef DRIVER_HAS_CALL_BY_REFERENCE
|
||||||
|
arg = ME;
|
||||||
|
query_ip_number(&arg);
|
||||||
|
// this assumes network byte order provided by driver
|
||||||
|
peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0;
|
||||||
|
if (peerport < 0) peerport = 65536 + peerport;
|
||||||
|
if (peerport == JABBER_S2S_SERVICE) peerport = 0;
|
||||||
|
# else
|
||||||
|
// as long as the object names don't collide, this is okay too
|
||||||
|
peerport = 65536 + random(9999999);
|
||||||
|
# endif
|
||||||
|
# if __EFUN_DEFINED__(enable_telnet)
|
||||||
|
enable_telnet(0);
|
||||||
|
# endif
|
||||||
|
t = "S:xmpp:"+query_ip_number();
|
||||||
|
// it's just an object name, but let's be consequent minus peerport
|
||||||
|
if (peerport) t += ":-"+peerport;
|
||||||
|
# ifdef _flag_log_sockets_XMPP
|
||||||
|
SIMUL_EFUN_FILE -> log_file("RAW_XMPP", "\n\n%O: %O -> load(%O, %O)",
|
||||||
|
ME, t,
|
||||||
|
# ifdef _flag_log_hosts
|
||||||
|
query_ip_number(),
|
||||||
|
# else
|
||||||
|
"?",
|
||||||
|
# endif
|
||||||
|
-peerport);
|
||||||
|
# endif
|
||||||
|
P3(("%O -> load(%O, %O)\n", t, query_ip_number(), -peerport))
|
||||||
|
return t -> load(query_ip_number(), -peerport);
|
||||||
|
#endif
|
||||||
|
#if 0 //__EFUN_DEFINED__(enable_binary)
|
||||||
|
// work in progress
|
||||||
|
case 8888:
|
||||||
|
enable_binary();
|
||||||
|
enable_telnet(0);
|
||||||
|
return clone_object(NET_PATH "socks/protocol");
|
||||||
|
case 1935:
|
||||||
|
enable_binary();
|
||||||
|
enable_telnet(0);
|
||||||
|
return clone_object(NET_PATH "rtmp/protocol");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(IRCS_PORT, IRC_PATH)
|
||||||
|
case IRCS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(IRC_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(IRC_PORT, IRC_PATH)
|
||||||
|
case IRC_PORT:
|
||||||
|
# if 0 // __EFUN_DEFINED__(enable_telnet)
|
||||||
|
enable_telnet(0); // shouldn't harm.. but it does!!!
|
||||||
|
# endif
|
||||||
|
return clone_object(IRC_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(APPLET_PORT, APPLET_PATH)
|
||||||
|
case APPLET_PORT:
|
||||||
|
# if __EFUN_DEFINED__(enable_telnet)
|
||||||
|
// enable_telnet(0);
|
||||||
|
# endif
|
||||||
|
return clone_object(APPLET_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(TELNETS_PORT, TELNET_PATH)
|
||||||
|
case TELNETS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
// we could do the UID2NICK thing here, too, but why should we?
|
||||||
|
// what do you need tls for on a localhost tcp link?
|
||||||
|
return clone_object(TELNET_PATH "server");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(TELNET_PORT, TELNET_PATH)
|
||||||
|
case TELNET_PORT:
|
||||||
|
// set_prompt("> ");
|
||||||
|
// we can't do the usual autodetect here, as telnet users
|
||||||
|
// don't send first and rather expect the server to prompt
|
||||||
|
// the correct way to do this: implement telnet nego for tls. bah!
|
||||||
|
t = clone_object(TELNET_PATH "server");
|
||||||
|
# ifdef UID2NICK
|
||||||
|
if (uid && (arg = UID2NICK(uid))) { t -> sName(arg); }
|
||||||
|
# endif
|
||||||
|
return t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(HTTPS_PORT, HTTP_PATH)
|
||||||
|
case HTTPS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0) {
|
||||||
|
D1( if (t != ERR_TLS_NOT_DETECTED) PP(( "TLS(%O) on %O: %O\n",
|
||||||
|
t, query_mud_port(), tls_error(t) )); )
|
||||||
|
#if !HAS_PORT(HTTP_PORT, HTTP_PATH)
|
||||||
|
// if we have no http port, it may be intentional
|
||||||
|
return (object)0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
D2( else if (t > 0) PP(( "Setting up TLS connection in the background.\n" )); )
|
||||||
|
D2( else PP(( "Oh yeah, I'm initializing an https session!\n" )); )
|
||||||
|
return clone_object(HTTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
/* don't fall thru. allow for https: to be available without http: */
|
||||||
|
#if HAS_PORT(HTTP_PORT, HTTP_PATH)
|
||||||
|
case HTTP_PORT:
|
||||||
|
return clone_object(HTTP_PATH "server");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAS_PORT(MUDS_PORT, MUD_PATH)
|
||||||
|
case MUDS_PORT:
|
||||||
|
t = tls_init_connection(this_object());
|
||||||
|
if (t < 0 && t != ERR_TLS_NOT_DETECTED) PP(( "TLS on %O: %O\n",
|
||||||
|
query_mud_port(), tls_error(t) ));
|
||||||
|
return clone_object(MUD_PATH "login");
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(MUD_PORT, MUD_PATH)
|
||||||
|
default:
|
||||||
|
// if you want to multiplex psyced with an LPMUD game
|
||||||
|
// set_prompt("> ");
|
||||||
|
return clone_object(MUD_PATH "login");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
PP(("Received connection on port %O which isn't configured.\n",
|
||||||
|
query_mud_port()));
|
||||||
|
return (object)0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DRIVER_HAS_RENAMED_CLONES
|
||||||
|
// named clones -lynx
|
||||||
|
object compile_object(string file) {
|
||||||
|
string path, name;
|
||||||
|
object rob;
|
||||||
|
|
||||||
|
# ifdef PSYC_PATH
|
||||||
|
if (abbrev("S:psyc:", file)) {
|
||||||
|
rob = clone_object(PSYC_PATH "server");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (abbrev("psyc:", file)) {
|
||||||
|
rob = clone_object(PSYC_PATH "active");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# ifdef SPYC_PATH
|
||||||
|
if (abbrev("S:spyc:", file)) {
|
||||||
|
rob = clone_object(SPYC_PATH "server");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (abbrev("spyc:", file)) {
|
||||||
|
rob = clone_object(SPYC_PATH "active");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
# ifdef HTTP_PATH
|
||||||
|
// match both http:/ and https:/ objects ;D
|
||||||
|
if (abbrev("http", file)) {
|
||||||
|
rob = clone_object(HTTP_PATH "fetch");
|
||||||
|
if (rob) rob->fetch(file[..<3]);
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (abbrev("xmlrpc:", file)) {
|
||||||
|
rob = clone_object(HTTP_PATH "xmlrpc");
|
||||||
|
if (rob) rob->fetch("http://" + file[7..<3]);
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
if (sscanf(file, "%s#%s.c", path, name) && name != "") {
|
||||||
|
unless (name = SIMUL_EFUN_FILE->legal_name(name))
|
||||||
|
return (object)0;
|
||||||
|
rob = clone_object(path);
|
||||||
|
rob -> sName(name);
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O becomes %s of %s\n",
|
||||||
|
rob, name, path));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (sscanf(file, "place/%s.c", name) && name != "") {
|
||||||
|
#ifdef SANDBOX
|
||||||
|
string t;
|
||||||
|
#endif
|
||||||
|
unless (name = SIMUL_EFUN_FILE->legal_name(name))
|
||||||
|
return (object)0;
|
||||||
|
|
||||||
|
#ifdef SANDBOX
|
||||||
|
if (file_size(t = USER_PATH + name + ".c") != -1) {
|
||||||
|
rob = t -> sName(name);
|
||||||
|
D2(if (rob) PP(("USER PLACE loaded: %O becomes %O\n", rob, file));)
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
#ifdef _flag_disable_places_arbitrary
|
||||||
|
P2(("WARN: cloned places disabled by #define %O\n", file))
|
||||||
|
return (object)0;
|
||||||
|
#else
|
||||||
|
#ifdef _path_archetype_place_default
|
||||||
|
rob = clone_object(_path_archetype_place_default);
|
||||||
|
#else
|
||||||
|
rob = clone_object(NET_PATH "place/default");
|
||||||
|
#endif
|
||||||
|
rob -> sName(name);
|
||||||
|
D2(if (rob) PP(("PLACE CLONED: %O becomes %O\n", rob, file));)
|
||||||
|
#endif
|
||||||
|
#ifdef SANDBOX
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (sscanf(file, "%s/text.c", path) && path != "") {
|
||||||
|
rob = clone_object(NET_PATH "text");
|
||||||
|
rob -> sPath(path);
|
||||||
|
D2(if (rob) PP(("DB CLONED: %O becomes %s/text\n", rob, path));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
# ifdef JABBER_PATH
|
||||||
|
if (abbrev("S:xmpp:", file)) {
|
||||||
|
rob = clone_object(JABBER_PATH "gateway");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
if (abbrev("C:xmpp:", file)) {
|
||||||
|
rob = clone_object(JABBER_PATH "active");
|
||||||
|
D2(if (rob) PP(("NAMED CLONE: %O => %s\n", rob, file));)
|
||||||
|
return rob;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
P3(("WARN: could not create %O\n", file))
|
||||||
|
return (object)0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
32
world/net/include/trust.h
Normal file
32
world/net/include/trust.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// $Id: trust.h,v 1.2 2008/07/26 13:18:06 lynx Exp $ // vim:syntax=lpc:ts=8
|
||||||
|
//
|
||||||
|
#ifndef _INCLUDE_TRUST_H
|
||||||
|
#define _INCLUDE_TRUST_H
|
||||||
|
|
||||||
|
// all of these need new names to fit the tuning masterplan
|
||||||
|
#ifndef MAX_EXPOSE_GROUPS
|
||||||
|
# define MAX_EXPOSE_GROUPS 4 // just the top four ;)
|
||||||
|
#endif
|
||||||
|
#ifndef DEFAULT_EXPOSE_GROUPS // change this value in your local.h
|
||||||
|
# define DEFAULT_EXPOSE_GROUPS 4 // if you want groups to be exposed by
|
||||||
|
#endif // default like on irc
|
||||||
|
#ifndef MAX_EXPOSE_FRIENDS
|
||||||
|
# define MAX_EXPOSE_FRIENDS 8 // just the top eight ;)
|
||||||
|
#endif
|
||||||
|
#ifndef DEFAULT_EXPOSE_FRIENDS
|
||||||
|
# define DEFAULT_EXPOSE_FRIENDS 4 // do not expose yet, until we have
|
||||||
|
// profiles worth exposing for
|
||||||
|
#endif
|
||||||
|
#define TRUST_OVER_NOTIFY 3 // how much /trust counts more
|
||||||
|
// than notify. the normal value for
|
||||||
|
// a notify friendship is 8. if a
|
||||||
|
// medium trust is equivalent to
|
||||||
|
// that, 3 needs to be added to
|
||||||
|
// trust 5 to reach notify 8.
|
||||||
|
#define TRUST_MYSELF (9 + TRUST_OVER_NOTIFY)
|
||||||
|
// maximum trust
|
||||||
|
#ifndef EXPOSE_THRESHOLD
|
||||||
|
# define EXPOSE_THRESHOLD TRUST_MYSELF // at least show it to myself
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
239
world/net/spyc/dispatch.i
Normal file
239
world/net/spyc/dispatch.i
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
// included by TCP circuit *and* UDP daemon // vim:syntax=lpc
|
||||||
|
|
||||||
|
void dispatch(mixed header_vars, mixed varops, mixed method, mixed body) {
|
||||||
|
string vname;
|
||||||
|
mixed vop; // value operation
|
||||||
|
string t;
|
||||||
|
mapping vars;
|
||||||
|
string family;
|
||||||
|
int glyph;
|
||||||
|
|
||||||
|
// check that method is a valid keyword
|
||||||
|
if (method && !legal_keyword(method)) {
|
||||||
|
DISPATCHERROR("non legal method");
|
||||||
|
}
|
||||||
|
#ifdef PSYC_TCP
|
||||||
|
// copy() + occasional double modifier ops should be more
|
||||||
|
// efficient than merge at every packet --lynX
|
||||||
|
// no one cares about "efficiency" here. please proof your
|
||||||
|
// bold statements with benchmarks anyway
|
||||||
|
vars = header_vars + instate;
|
||||||
|
#else
|
||||||
|
vars = header_vars;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// FIXME: this can happen earlier, e.g. in parse.c after
|
||||||
|
// process_header
|
||||||
|
// check _source/_context
|
||||||
|
// this check can be skipped if _source and _context are empty
|
||||||
|
if ((t = vars["_context"] || vars["_source"])) {
|
||||||
|
array(mixed) u;
|
||||||
|
unless (u = parse_uniform(t)) {
|
||||||
|
DISPATCHERROR("logical source is not an uniform\n")
|
||||||
|
}
|
||||||
|
#ifdef PSYC_TCP
|
||||||
|
unless (qAuthenticated(NAMEPREP(u[UHost]))) {
|
||||||
|
DISPATCHERROR("non-authenticated host\n")
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// TODO?
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// check that _target is hosted by us
|
||||||
|
// this check can be skipped if _target is not set
|
||||||
|
if ((t = vars["_target"])) {
|
||||||
|
array(mixed) u;
|
||||||
|
unless (u = parse_uniform(t)) {
|
||||||
|
DISPATCHERROR("target is not an uniform\n")
|
||||||
|
}
|
||||||
|
// FIXME relaying support here?
|
||||||
|
if (!is_localhost(u[UHost])) {
|
||||||
|
DISPATCHERROR("target is not configured on this server\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// FIXME: i dont like this block... maybe we decode each variable
|
||||||
|
// when setting it?
|
||||||
|
// that would also fit with 0 as varname deletion
|
||||||
|
// below
|
||||||
|
foreach(vop : varops) {
|
||||||
|
vname = vop[0];
|
||||||
|
|
||||||
|
// psyc type conversion implementation ( http://about.psyc.eu/Type )
|
||||||
|
// this does not support register_type() yet, but it is feasible
|
||||||
|
PSYC_TRY(vname) {
|
||||||
|
case "_uniform":
|
||||||
|
case "_page":
|
||||||
|
case "_entity":
|
||||||
|
// TODO: check legal uniform
|
||||||
|
break;
|
||||||
|
case "_nick":
|
||||||
|
// TODO: check legal nick
|
||||||
|
break;
|
||||||
|
case "_degree":
|
||||||
|
// only honour the first digit
|
||||||
|
if (strlen(vop[2]) && vop[2][0] >= '0' && vop[2][0] <= '9')
|
||||||
|
vop[2] = vop[2][0] - '0';
|
||||||
|
else {
|
||||||
|
PT(("type parser _degree: could not handle value %O\n",
|
||||||
|
vop[2]))
|
||||||
|
vop[2] = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "_time":
|
||||||
|
case "_amount":
|
||||||
|
vop[2] = to_int(vop[2]);
|
||||||
|
break;
|
||||||
|
case "_list":
|
||||||
|
mixed plist = list_parse(vop[2]);
|
||||||
|
if (plist == -1) {
|
||||||
|
DISPATCHERROR("could not parse list");
|
||||||
|
}
|
||||||
|
vop[2] = plist;
|
||||||
|
break;
|
||||||
|
PSYC_SLICE_AND_REPEAT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME deliver packet
|
||||||
|
// this should be a separate function
|
||||||
|
PT(("SPYC vars is %O\n", vars))
|
||||||
|
PT(("SPYC method %O\nbody %O\n", method, body))
|
||||||
|
// delivery rules as usual, but
|
||||||
|
if (vars["_context"]) {
|
||||||
|
mixed context;
|
||||||
|
mixed context_state;
|
||||||
|
mixed source, target;
|
||||||
|
|
||||||
|
if (vars["_source"]) {
|
||||||
|
P0(("invalid _context %O with _source %O\n",
|
||||||
|
context, vars["_source"]))
|
||||||
|
DISPATCHERROR("invalid usage of context with _source");
|
||||||
|
}
|
||||||
|
|
||||||
|
context = find_context(vars["_context"]);
|
||||||
|
if (!objectp(context)) {
|
||||||
|
P0(("context %O not found?!\n", vars["_context"]))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
context_state = context->get_state();
|
||||||
|
|
||||||
|
// apply varops to context state
|
||||||
|
foreach(vop : varops) {
|
||||||
|
vname = vop[0];
|
||||||
|
if (!legal_keyword(vname) || abbrev("_INTERNAL", vname)) {
|
||||||
|
DISPATCHERROR("illegal varname in psyc")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(vop[1]) { // the glyph
|
||||||
|
case C_GLYPH_MODIFIER_SET:
|
||||||
|
vars[vname] = vop[2];
|
||||||
|
break;
|
||||||
|
case C_GLYPH_MODIFIER_ASSIGN:
|
||||||
|
vars[vname] = context_state[vname] = vop[2];
|
||||||
|
break;
|
||||||
|
case C_GLYPH_MODIFIER_AUGMENT:
|
||||||
|
if (!abbrev("_list", vname)) {
|
||||||
|
DISPATCHERROR("psyc modifier + with non-list arg")
|
||||||
|
}
|
||||||
|
// FIXME: duplicates?
|
||||||
|
context_state[vname] += vop[2];
|
||||||
|
PT(("current state is %O, augment %O\n", context_state[vname], vop[2]))
|
||||||
|
break;
|
||||||
|
case C_GLYPH_MODIFIER_DIMINISH:
|
||||||
|
if (!abbrev("_list", vname)) {
|
||||||
|
DISPATCHERROR("psyc modifier + with non-list arg")
|
||||||
|
}
|
||||||
|
PT(("current state is %O, diminish %O\n", context_state[vname], vop[2]))
|
||||||
|
foreach(mixed item : vop[2])
|
||||||
|
context_state[vname] -= ({ item });
|
||||||
|
PT(("after dim: %O\n", context_state[vname]))
|
||||||
|
break;
|
||||||
|
case C_GLYPH_MODIFIER_QUERY:
|
||||||
|
DISPATCHERROR("psyc modifier ? not implemented")
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vars = vars + context_state;
|
||||||
|
// FIXME: is it legal to do this if this has _target?
|
||||||
|
// there should be no mods then anyway
|
||||||
|
context->commit_state(context_state);
|
||||||
|
|
||||||
|
if (vars["_target"]) {
|
||||||
|
// FIXME: delivery copycat from below
|
||||||
|
// beware: source is set to 0 here as it may not be present
|
||||||
|
target = find_psyc_object(parse_uniform(vars["_target"]));
|
||||||
|
PT(("target is %O\n", target))
|
||||||
|
// FIXME: net/entity can not yet deal with 0 method
|
||||||
|
//
|
||||||
|
if (objectp(context)) {
|
||||||
|
context->msg(0, method || "", body, vars, 0, target);
|
||||||
|
} else {
|
||||||
|
// FIXME: proper croak back to sender here
|
||||||
|
P0(("context %O for unicast to %O not found???\n", target))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (vars["_source_relay"]) {
|
||||||
|
mixed localrelay;
|
||||||
|
if ((localrelay = psyc_object(vars["_source_relay"]))) {
|
||||||
|
P0(("local relay %O\n", localrelay))
|
||||||
|
vars["_source_relay"] = localrelay;
|
||||||
|
} else { // NORMALIZE UNIFORM
|
||||||
|
vars["_source_relay"] = lower_case(vars["_source_relay"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (objectp(context)) {
|
||||||
|
// do we need more local object detection here?
|
||||||
|
context -> castmsg(source, method || "", body, vars);
|
||||||
|
} else {
|
||||||
|
// empty contexts are not bad currently
|
||||||
|
// in the current implementation it only means that no one
|
||||||
|
// interested in that context is online right now
|
||||||
|
// FIXME: lines above are about the old stuff where we did
|
||||||
|
// not have context state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!vars["_target"] && !vars["_source"]) {
|
||||||
|
#ifdef PSYC_TCP
|
||||||
|
circuit_msg(method, vars, body);
|
||||||
|
#else
|
||||||
|
P1(("Ignoring a rootMsg from UDP: %O,%O,%O\n", method, vars, body))
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
string source;
|
||||||
|
mixed target;
|
||||||
|
if (!vars["_source"]) {
|
||||||
|
// FIXME: where to set netloc in active
|
||||||
|
if (!netloc) { // set in sender after _request_features
|
||||||
|
// FIXME: this is wrong
|
||||||
|
DISPATCHERROR("Did you forget to request circuit features?");
|
||||||
|
}
|
||||||
|
source = netloc;
|
||||||
|
} else {
|
||||||
|
// FIXME: a macro NORMALIZE_UNIFORM that may do lower_case please
|
||||||
|
// not a simple lower_case
|
||||||
|
source = lower_case(vars["_source"]);
|
||||||
|
}
|
||||||
|
// source was checked either via x509 or dns before
|
||||||
|
// so it is 'safe' to do this
|
||||||
|
register_target(source);
|
||||||
|
|
||||||
|
// deliver FIXME same code above
|
||||||
|
if (!vars["_target"]) {
|
||||||
|
target = find_object(NET_PATH "root");
|
||||||
|
} else {
|
||||||
|
target = find_psyc_object(parse_uniform(vars["_target"]));
|
||||||
|
}
|
||||||
|
PT(("target is %O\n", target))
|
||||||
|
// FIXME: net/entity can not yet deal with 0 method
|
||||||
|
if (objectp(target))
|
||||||
|
target->msg(source, method || "", body, vars);
|
||||||
|
else {
|
||||||
|
// FIXME: proper croak back to sender here
|
||||||
|
P0(("target %O not found???\n", target))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::dispatch(header_vars, varops, method, body);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user