Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CF-1.1 library. Part03/03

0 views
Skip to first unread message

Jan-Piet Mens

unread,
Jan 18, 1993, 10:20:49 AM1/18/93
to
#! /bin/sh
#
# This is CF version 1.1 at patchlevel 1.
# Make a new directory for the CF sources, cd to it, and run kits 1 up
# to 3 through sh. When all 3 kits have been run, read README.
#
echo " "
echo "This is CF 1.1 at patchlevel 1, kit 3 (of 3):"
echo " End of kit 3 (of 3)"
echo "will echo at the end if this kit is complete."
export PATH || (echo "Please use sh to unpack this archive." ; kill $$)
mkdir hints nls 2>/dev/null
echo Extracting pipe.c
sed >pipe.c <<'!STUFFY!FUNK!' -e 's/X//'
X#include <stdio.h>
X#include "config.h"
X#include "cf.h"
X#ifdef __STDC__
X# include <stdarg.h>
X#else
X# include <varargs.h>
X#endif
X#include <sys/wait.h>
X#ifdef I_FCNTL
X# include <fcntl.h>
X#endif
X#include <errno.h>
X#ifdef I_LIMITS
X# include <limits.h>
X#endif
X#include <unistd.h>
X
X/*
X * $Header: /home/jpm/src/cf/RCS/pipe.c,v 1.1 1993/01/18 14:47:53 jpm Exp $
X *
X * $Log: pipe.c,v $
X * Revision 1.1 1993/01/18 14:47:53 jpm
X * Initial revision
X *
X * Revision 1.1 1993/01/15 09:34:52 jpm
X * Initial revision
X *
X *
X */
X
X#define MAXARGS (90)
X
Xstatic Pid_t *children = NULL; /* Array of child pointers */
Xstatic int maxfd; /* Maximum file descriptors */
X
X#ifdef _SC_OPEN_MAX
X#endif
X#ifndef OPEN_MAX
X# define OPEN_MAX (0)
X#endif
X#define OPEN_MAX_GUESS (256)
X
X/*
X * How many open files may we have ?
X */
X
Xstatic int _open_max()
X{
X static int openmax = OPEN_MAX;
X
X if (openmax == 0) {
X errno = 0;
X#ifdef _SC_OPEN_MAX
X if ((openmax = sysconf(_SC_OPEN_MAX)) < 0) {
X if (errno == 0)
X openmax = OPEN_MAX_GUESS;
X else
X perror("sysconf for _SC_OPEN_MAX");
X }
X#else
X# if OPEN_MAX == 0
X# error "don't know how many files to open!"
X# endif
X#endif
X }
X TRACE(("open_max() says: %d", openmax));
X return (openmax);
X}
X
X/*
X * This popen() always reads (mode="r"). It will be called as in
X *
X * "/bin/ls", "-l", "-a", "/bin", 0
X *
X * The last argument MUST be zero.
X */
X
X#ifdef __STDC__
XFILE *cpp_popen(char *prog, ...)
X#else
XFILE *cpp_popen(prog, va_alist)
Xchar *prog;
Xva_dcl
X#endif
X{
X static char rcs_id[] = "@(#)$Id: pipe.c,v 1.1 1993/01/18 14:47:53 jpm Exp $";
X va_list ap;
X FILE *fp;
X char *args[MAXARGS];
X int pid, pip[2];
X
X if (children == NULL) {
X maxfd = _open_max();
X if ((children = (Pid_t *)calloc(maxfd, sizeof(Pid_t))) == NULL)
X return (NULL);
X }
X
X if (pipe(pip) == -1)
X return (NULL);
X
X if ((pid = fork()) < 0) {
X return (NULL);
X }
X else if (pid == 0) { /* CHILD */
X int n = 0, i;
X
X#ifdef __STDC__
X va_start(ap, prog);
X#else
X va_start(ap);
X#endif
X args[n++] = prog;
X args[n++] = "-DCF=1"; /* Set own code */
X#ifdef LIMITED_CPP
X args[n++] = "-DLIMITED_CPP=1";
X#endif
X n = _read_env(args, n);
X for (; (args[n] = va_arg(ap, char *)) != 0; n++)
X if (n >= (MAXARGS - 1))
X break;
X args[n] = 0;
X va_end(ap);
X
X (void) close(1);
X (void) dup(pip[1]);
X (void) close(pip[0]);
X (void) close(pip[1]);
X
X for (i = 0; i < maxfd; i++)
X if (children[i] > 0)
X (void) close(i);
X
X TRACE(("--> Starting cpp with args ="));
X#ifdef DEBUG
X for (i = 0; i < n; i++)
X TRACE(("\t%s", args[i]));
X#endif
X
X TRACE(("CPP_START"));
X (void) execv(prog, args);
X perror(prog);
X _exit(-1);
X }
X
X /*
X * Parent ...
X */
X
X (void) close(pip[1]);
X if ((fp = fdopen(pip[0], "r")) == (FILE *)0)
X return (NULL);
X children[fileno(fp)] = pid; /* Remember pid for this fd */
X
X return (fp);
X}
X
Xint cpp_pclose(fp)
XFILE *fp;
X{
X int fd, status;
X Pid_t pid;
X
X if (children == NULL)
X return (-1); /* Popen() never called */
X fd = fileno(fp);
X if ((pid = children[fd]) == 0)
X return (-1); /* fp not opened by popen() */
X children[fd] = 0;
X if (fclose(fp) == EOF)
X return (-1);
X
X while (waitpid(pid, &status, 0) < 0)
X if (errno != EINTR)
X return (-1);
X return (status);
X}
X
X/*
X * Convert environment strings to -D options for CPP. If LIMITED_CPP is
X * defined, only CF_ strings will be translated (my cpp complains on too
X * many -D options; not arg-list-too-long, mind you!
X */
X
Xint _read_env(args, n)
Xchar **args; /* Args to cpp */
Xint n; /* Current entry in args[] */
X{
X extern char **environ;
X char **ep, *bp;
X Malloc_t malloc();
X
X for (ep = environ; *ep != (char *)0; ep++) {
X#ifdef LIMITED_CPP
X if (strncmp(*ep, "CF_", 3))
X continue;
X#endif
X bp = malloc((unsigned)strlen(*ep) + 3); /* -D...... */
X (void) strcpy(bp, "-D");
X (void) strcat(bp, *ep);
X args[n++] = bp;
X if (n >= (MAXARGS - 1))
X break;
X }
X return (n);
X}
X
X#ifdef TESTING
Xmain()
X{
X FILE *fp = cpp_popen("/lib/cpp", "-DJP=mens", "file", 0);
X int c;
X
X while ((c = getc(fp)) != EOF)
X putchar(c);
X cpp_pclose(fp);
X}
X#endif
!STUFFY!FUNK!
echo Extracting cf.h.SH
sed >cf.h.SH <<'!STUFFY!FUNK!' -e 's/X//'
Xcase $CONFIG in
X'')
X if test ! -f config.sh; then
X ln ../config.sh . || \
X ln ../../config.sh . || \
X ln ../../../config.sh . || \
X ln ../../../../config.sh . || \
X (echo "Can't find config.sh."; exit 1)
X fi 2>/dev/null
X . ./config.sh
X ;;
Xesac
X: This forces SH files to create target in same directory as SH file.
X: This is so that make depend always knows where to find SH derivatives.
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
Xecho "Extracting cf.h (with variable substitutions)"
X: This section of the file will have variable substitutions done on it.
X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
X: Protect any dollar signs and backticks that you do not want interpreted
X: by putting a backslash in front. You may delete these comments.
X$spitshell >cf.h <<!GROK!THIS!
X#ifndef _CF_H_IN_
X# define _CF_H_IN_
X
X/* HAS_CATOPEN
X * This symbol, if defined, indicates that the catopen routine is available
X * to open NLS language catalogues.
X */
X#$d_catopen HAS_CATOPEN /**/
X
X/* HAS_CATGETS
X * This symbol, if defined, indicates that the catgets routine is available
X * to extract nls information from language catalogues. Otherwise you
X * should use printf().
X */
X#$d_catgets HAS_CATGETS /**/
X!GROK!THIS!
X
X: In the following dollars and backticks do not need the extra backslash.
X$spitshell >>cf.h <<'!NO!SUBS!'
X
X#if defined(HAS_CATOPEN) && defined(HAS_CATGETS)
X# define HAS_NLS_SUPPORT /**/
X#endif
X
Xenum _cftype { t_long = 1, t_str, t_dbl, t_bol } ;
Xtypedef enum _cftype cf_et;
X
Xstruct _cflist {
X char *name; /* Config name */
X cf_et type; /* Type (_cftype) */
X long min, max; /* t_long: min <= value <= max */
X /* t_str: min <= strlen(value) <= max */
X char *val; /* Value */
X};
Xtypedef struct _cflist cfent;
X
X#define _cstring(x) ((x)->sym.val)
X#define _clong(x) (*(long *)(x)->sym.val)
X#define _cdouble(x) (*(double *)(x)->sym.val)
X#define _cbool(x) (*(char *)(x)->sym.val)
X#define _cmin(x) ((x)->sym.min)
X#define _cmax(x) ((x)->sym.max)
X#define _ctype(x) ((x)->sym.type)
X
X#define cstring(x) ((x)->val)
X#define clong(x) (*(long *)(x)->val)
X#define cdouble(x) (*(double *)(x)->val)
X#define cbool(x) (*(char *)(x)->val)
X#define cmin(x) ((x)->min)
X#define cmax(x) ((x)->max)
X#define ctype(x) ((x)->type)
X
Xstruct _cfsymbol {
X struct _cflist sym; /* Symbol in table */
X struct _cfsymbol *next; /* Pointer to next element */
X};
Xtypedef struct _cfsymbol cfsymbol;
X
X#define cf(name) cf_string(name)
X
X/* flags */
X#define CF_REALNULL 0x00000001 /* If set, returns "<<null>>" else NULL */
X#define CF_SILENT 0x00000002 /* Don't report errors */
X#define CF_ERREXIT 0x00000004 /* If set, exit on errors */
X#define CF_IGNORE_U 0x00000008 /* Unkown configs in file are ignored */
X
X#define CF_OK (0)
X#define CF_ERR (-1)
X#define MAX_CF_FILES (10) /* Max # of files to load with cf_load() */
X
X#ifdef DEBUG
X# define TRACE(x) _cf_trace x
X#else
X# define TRACE(x)
X#endif /* DEBUG */
X
X#if defined(__STDC__)
X# ifndef _
X# define _(x) x
X# endif
X#else
X# ifndef _
X# define _(x)
X# endif
X#endif
X
X#ifdef DEBUG
X void _cf_trace _((char *fmt, ...));
X#endif
X
Xextern int cf_init _(( cfent *list ));
Xextern int cf_load _(( char *file, ... ));
Xextern FILE *cpp_popen _(( char *prog, ... ));
Xextern int cpp_pclose _(( FILE *fp ));
Xextern int _read_env _(( char **args, int n ));
Xextern unsigned long _cflags _(( void ));
Xextern void cf_setflags _(( unsigned long flagsval ));
Xextern void cf_error _(( char *fmt, ... ));
Xextern int cf_inst _(( char *name, cf_et type, long min, long max, char *value ));
Xextern cfsymbol *cf_lookup _(( char *name ));
Xextern char *cf_string _(( char *name ));
Xextern char cf_bool _(( char *name ));
Xextern long cf_long _(( char *name ));
Xextern double cf_double _(( char *name ));
Xextern int cf_printall _(( int (*func)() ));
Xextern char *_cf_strsave _(( char *s ));
Xextern char *vgets _(( FILE *fp ));
X
Xextern int atoi(), _flsbuf(), _filbuf();
Xextern void free();
X
X#endif /* _CF_H_IN_ */
X!NO!SUBS!
Xchmod 755 cf.h
X$eunicefix cf.h
!STUFFY!FUNK!
chmod +x cf.h.SH
echo Extracting INSTALL
sed >INSTALL <<'!STUFFY!FUNK!' -e 's/X//'
XInstallation instructions for configuration library CF.
X
X1. Run ./Configure and answer the questions. On systems without NLS (Native
X Language Support) routines, answer the question on your ``gencat'' with
X "/bin/true" or ":".
X
X2. After running ./Configure, look in nls/genincl, and check the name of
X your AWK interpreter in the variable AWK. This should be set to a clever
X awk (nawk, gawk, etc.). If you only have old-awk (oawk), remove the
X line containing function "sub" around line 168 in "nls/genincl".
X
X3. Check the Makefile in the top-level directory.
X
X Some cpp's (mine) complain if the number of -D options given on the
X command line is too large. Should this be the case for you, add
X -DLIMITED_CPP to the DEFS variable in the Makefile. This will disallow
X the passing of the whole environment as -D options. Only environment
X variables called "CF_*" will be passed with -D options to the pre-processor.
X
X4. Check config.h in the top-level dir. It should be ok for your system.
X
X5. Do a ``make''. This will produce a library called ``libcf.a'' and an
X executable test program called ``cftest''. Check the output of the test
X program. If you are satisfied
X
X6. Do a ``make install''. This will install the include file (cf.h) and
X the library (libcf.a) at the locations you chose on running ./Configure.
X The man-page (cf.3) will also be installed accordingly.
X
X7. If you don't have (or want) the NLS support functions, you have finished.
X
X8. If you *do* have NLS, install the message catalogues where you usually
X keep them, and set your NLSPATH variable according to the following
X
X NLSPATH=/usr/local/lib/nls/%N.%L.cat
X export NLSPATH
X
X LANG=english or LANG=german
X export LANG
X
X9. If you add additional languages, send me the files and I'll keep them
X posted.
X
XIf you make any mods, send them to me for incorporating into the release.
XMy name is Jan-Piet Mens, and my Email address is : j...@Logix.DE
X
X 18th Jan 1993
X
!STUFFY!FUNK!
echo Extracting nls/Makefile.SH
sed >nls/Makefile.SH <<'!STUFFY!FUNK!' -e 's/X//'
Xcase $CONFIG in
X'')
X if test ! -f config.sh; then
X ln ../config.sh . || \
X ln ../../config.sh . || \
X ln ../../../config.sh . || \
X ln ../../../../config.sh . || \
X (echo "Can't find config.sh."; exit 1)
X fi 2>/dev/null
X . ./config.sh
X ;;
Xesac
X: This forces SH files to create target in same directory as SH file.
X: This is so that make depend always knows where to find SH derivatives.
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
Xecho "Extracting Makefile (with variable substitutions)"
X: This section of the file will have variable substitutions done on it.
X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
X: Protect any dollar signs and backticks that you do not want interpreted
X: by putting a backslash in front. You may delete these comments.
X$spitshell >Makefile <<!GROK!THIS!
XGENCAT= $gencat
X!GROK!THIS!
X
X: In the following dollars and backticks do not need the extra backslash.
X$spitshell >>Makefile <<'!NO!SUBS!'
XCC=cc
XCFLAGS=-O -I.
XGENINCL=./genincl
X
Xall: catalogues cfnls.h
X
Xcfnls.h: cf.english.m
X $(GENINCL) -o cfnls.h cf.english.m
X
Xcatalogues: cf.english.cat cf.german.cat
X
Xcf.english.cat: cf.english.m; $(GENCAT) -m cf.english.cat cf.english.m
Xcf.german.cat: cf.german.m; $(GENCAT) -m cf.german.cat cf.german.m
X
Xclean:
X rm -f *.o core a.out cfnls.h cf.*.cat *.orig *.rej *~ *#
Xclobber: clean
X rm -f genincl config.sh
Xdistclean: clobber
X rm -f Makefile genincl
X!NO!SUBS!
Xchmod 755 Makefile
X$eunicefix Makefile
!STUFFY!FUNK!
chmod +x nls/Makefile.SH
echo Extracting cftest.c
sed >cftest.c <<'!STUFFY!FUNK!' -e 's/X//'
X#include <stdio.h>
X#include "config.h"
X#include "cf.h"
X
X/*
X * $Header: /home/jpm/src/cf/RCS/cftest.c,v 1.1 1993/01/18 14:47:47 jpm Exp $
X *
X * $Log: cftest.c,v $
X * Revision 1.1 1993/01/18 14:47:47 jpm
X * Initial revision
X *
X * Revision 1.1 1993/01/15 09:33:56 jpm
X * Initial revision
X *
X *
X */
X
Xmain()
X{
X static char rcs_id[] = "@(#)$Id: cftest.c,v 1.1 1993/01/18 14:47:47 jpm Exp $";
X
X static cfent config[] = {
X { "path", t_str, 3, 30, "/u/local/bin"},
X { "file", t_str, 5, 5, "foobar"},
X { NULL, 0, 0}
X };
X int pf();
X
X cf_setflags(CF_ERREXIT|CF_IGNORE_U);
X cf_init(config);
X
X cf_inst("my-double", t_dbl, 0, 0, "145.78");
X cf_inst("my-integer", t_long, 0, 9999, "1002");
X cf_inst("my-string", t_str, 10, 30, "Jan-Piet Mens");
X cf_inst("my-bool", t_bol, 0, 1, "1");
X
X cf_load("demo.cf", 0);
X
X cf_printall(pf);
X puts("-------------------------------");
X
X printf("path = %s\n", cf("path"));
X printf("my-double = %10.2lf\n", cf_double("my-double"));
X printf("my-bool = %s\n", cf_bool("my-bool") ? "TRUE" : "FALSE");
X
X printf("hello = %s\n", cf("hello"));
X return (0);
X}
X
Xint pf(sp)
Xcfent *sp;
X{
X printf("%30s -> ", sp->name);
X switch (sp->type) {
X case t_long:
X printf("{%d}", clong(sp));
X break;
X case t_dbl:
X printf("(%f)", cdouble(sp));
X break;
X case t_str:
X printf("[%s]", cstring(sp));
X break;
X case t_bol:
X printf((cbool(sp)) ? "TRUE" : "FALSE");
X break;
X default:
X printf("TYPE ERROR");
X }
X putchar('\n');
X return (CF_OK);
X}
!STUFFY!FUNK!
echo Extracting PACKLIST
sed >PACKLIST <<'!STUFFY!FUNK!' -e 's/X//'
XAfter all the CF kits are run you should have the following files:
X
XFilename Kit Description
X-------- --- -----------
XConfigure 2 Portability tool
XCopyright 3 Blurb
XINSTALL 3 Installation instructions
XMakefile.SH 1 Installation recipe
XPACKLIST 3 Which files came with which kits
XREADME 1 Read Me First
Xcf.h.SH 3 Include file
Xcf.n 1 Man-page raw. Used to create cf.1
Xcftest.c 3 Test program for CF library
Xconf.c 1 Input file processing
Xconfig_h.SH 1 Produces config.h
Xdemo.cf 1 Sample configuration profile
Xhints/sco32_gcc.sh 3 Hints for SCO 3.2 using GCC
Xhints/sco_3.2.sh 3 Hints for SCO 3.2
Xhints/svr4.sh 1 Hints for SVR4 (my version)
Xnls/Makefile.SH 3 Installation
Xnls/cf.english.m 3 English NLS messages
Xnls/cf.german.m 3 German NLS messages
Xnls/genincl.1 1 Manpage for genincl
Xnls/genincl.SH 1 Create .h from .m file
Xpatchlevel.h 3 Current Patchlevel
Xpipe.c 3 Process c-preprocessor
Xsymb.c 1 Symbol table
Xvgets.c 1 Virtual gets()
!STUFFY!FUNK!
echo Extracting nls/cf.german.m
sed >nls/cf.german.m <<'!STUFFY!FUNK!' -e 's/X//'
X$set 102 cf
X$ SymNotFound
X1 Fehler: Symbol [%s] nicht gefunden.
X$ CFExiting
X2 \n\tEnde...\n
X$ FileNotFound
X3 Konfigurationsdatei [%s] nicht gefunden.\n\t\terrno=%d (%s).
X$ UnkownConfVar
X4 Konfigurationsvariable [%s] in Datei `%s' naehe Zeile %ld ist unbekannt...
X$ BoolHasVal
X5 Konfigurationsvariable [%s] in Datei `%s' naehe Zeile %ld\n\hat Wert (%s). Dies ist unzulaessig, da die Variable Bool ist.
X$ SymNotString
X6 Konfigurationsvariable [%s] ist nicht vom Typ Zeichenkette.
X$ SymNotBool
X7 Konfigurationsvariable [%s] ist nicht vom Typ Bool
X$ SymNotInt
X8 Konfigurationsvariable [%s] ist nicht vom Typ Numerisch..
X$ SymNotDouble
X9 Konfigurationsvariable [%s] ist nicht vom Typ Gleitkomma..
X$ CantStartCpp
X10 Ich kann Preprocessor (%s) nicht laden: errno=%d (%s).
X$ Int2SB
X11 Wert der Konfigurationsvariable [%s] muss zwischen %ld und %ld sein.
X$ StrLen
X12 Laenge des Konfigurationsstring [%s] muss zwischen %ld und %ld sein.
!STUFFY!FUNK!
echo Extracting nls/cf.english.m
sed >nls/cf.english.m <<'!STUFFY!FUNK!' -e 's/X//'
X$set 102 cf
X$ SymNotFound
X1 Fatal: symbol [%s] not found in core.
X$ CFExiting
X2 \n\tExiting...\n
X$ FileNotFound
X3 Cannot open configuration file [%s].\n\t\terrno=%d (%s).
X$ UnkownConfVar
X4 Configuration variable [%s] in file `%s' near line %ld is unkown...
X$ BoolHasVal
X5 Configuration variable [%s] in file `%s' near line %ld\n\thas value (%s). This is illegal, since the variable is BOOLEAN.
X$ SymNotString
X6 Configuration variable [%s] is not of type STRING.
X$ SymNotBool
X7 Configuration variable [%s] is not of type BOOL.
X$ SymNotInt
X8 Configuration variable [%s] is not of type INT.
X$ SymNotDouble
X9 Configuration variable [%s] is not of type DOUBLE.
X$ CantStartCpp
X10 Cannot load pre-processor (%s): errno=%d (%s).
X$ Int2SB
X11 Value of configuration variable [%s] must be between %ld and %ld.
X$ StrLen
X12 Length of configuration string [%s] must be between %ld and %ld.
!STUFFY!FUNK!
echo Extracting Copyright
sed >Copyright <<'!STUFFY!FUNK!' -e 's/X//'
X/*
X * CF lib, Copyright 1993, Jan-Piet Mens
X * License to freely use and distribute this software is hereby granted
X * by the author, subject to the condition that this copyright notice
X * remains intact. The author retains the exclusive right to publish
X * derivative works based on this work, including, but not limited
X * to, revised versions of this work
X */
!STUFFY!FUNK!
echo Extracting hints/sco32_gcc.sh
sed >hints/sco32_gcc.sh <<'!STUFFY!FUNK!' -e 's/X//'
Xcc='gcc'
Xccflags='-fpcc-struct-return'
Xcppflags='-D__GNUC__'
Xoptimize='-O'
Xcf_default='.:/etc:/u/local/lib'
Xlibc='/lib/libc_s.a'
Xlibs='-lc_s'
Xmanext='3'
Xmansrc='/u/local/man/man.3'
Xranlib=':'
Xsysman='/u/local/man/man.1'
Xrunnm='true'
Xusenm='true'
!STUFFY!FUNK!
echo Extracting hints/sco_3.2.sh
sed >hints/sco_3.2.sh <<'!STUFFY!FUNK!' -e 's/X//'
Xgencat=/bin/true
Xawk=/usr/bin/nawk
Xmansrc=/usr/man/man.S
Xmanext=S
!STUFFY!FUNK!
echo Extracting patchlevel.h
sed >patchlevel.h <<'!STUFFY!FUNK!' -e 's/X//'
X#define PATCHLEVEL 1
!STUFFY!FUNK!
echo "End of kit 3 (of 3)"
echo " "
cat /dev/null >kit3isdone
run=''
config=''
for iskit in 1 2 3; do
if test -f kit${iskit}isdone; then
run="$run $iskit"
else
todo="$todo $iskit"
fi
done
case $todo in
'')
echo "You have run all your kits. Please read README and then type Configure."
chmod 755 Configure
rm -f kit*isdone
;;
*) echo "You have run$run."
echo "You still need to run$todo."
;;
esac
: Someone might mail this, so exit before signature...
exit 0
--
__ _____ __ __
| || _ \ | \/ | Logix GmbH +49-611-309797
__| || ___/ | | Moritzstrasse 50 j...@Logix.DE
|_____||__| |__||__| D-6200 Wiesbaden ...!uunet!mcsun!unido!logixwi!jpm
0 new messages