Update of /cvsroot/monetdb/MonetDB5/src/tools
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv25912/src/tools

Modified Files:
      Tag: MonetDB_5-2
        Makefile.ag 
Added Files:
      Tag: MonetDB_5-2
        monet_version.c.in monet_version.h mserver5.mx 
Removed Files:
      Tag: MonetDB_5-2
        mserver5.mx.in 
Log Message:
tablet fixed null pointer dereference 
split out the monet_version code as it needs configure to set variables.
(mx.in's are now not allowed anymore)


Index: Makefile.ag
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/tools/Makefile.ag,v
retrieving revision 1.54.2.1
retrieving revision 1.54.2.2
diff -u -d -r1.54.2.1 -r1.54.2.2
--- Makefile.ag 3 Oct 2007 09:45:59 -0000       1.54.2.1
+++ Makefile.ag 14 Oct 2007 08:20:22 -0000      1.54.2.2
@@ -19,7 +19,7 @@
 INCLUDES = -I../mal $(CLIENTS_INCS) $(MONETDB_INCS) $(OPENSSL_INCS) 
$(PCRE_CFLAGS)
 
 bin_mserver5 = {
-       SOURCES = mserver5.mx.in
+       SOURCES = mserver5.mx monet_version.h monet_version.c.in
        LIBS = ../mal/libmal @SHARED_LIBS@ $(MONETDB_LIBS) \
                 -lbat -lmutils -lstream \
                 $(SOCKET_LIBS) $(Z_LIBS) $(BZ_LIBS) \

--- NEW FILE: monet_version.h ---
#ifndef MONETDB_VERSION_H
#define MONETDB_VERSION_H

extern void monet_version(void);

#endif /* MONETDB_VERSION_H */

--- NEW FILE: mserver5.mx ---
@' The contents of this file are subject to the MonetDB Public License
@' Version 1.1 (the "License"); you may not use this file except in
@' compliance with the License. You may obtain a copy of the License at
@' http://monetdb.cwi.nl/Legal/MonetDBLicense-1.1.html
@'
@' Software distributed under the License is distributed on an "AS IS"
@' basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
@' License for the specific language governing rights and limitations
@' under the License.
@'
@' The Original Code is the MonetDB Database System.
@'
@' The Initial Developer of the Original Code is CWI.
@' Portions created by CWI are Copyright (C) 1997-2007 CWI.
@' All Rights Reserved.

@f mserver5
@a M.L. Kersten, P. Boncz, Niels Nes, Stefan Manegold, Sjoerd Mullender
@v 5.0
@* The Monet Server
The program @code{ mserver5} is the MonetDB server. It is started by the 
database
administrator.  The console is primarilly meant to further initialize
the server, such as starting internet listeners.

@+ Manual Page
The server is a multithreaded program. There is one system thread, and for
each service, e.g. a client session or transaction service,
there is one worker thread.
As a default, the server also starts the internet listener thread,
on the port number specified in the parameter file.

@- Usage
@verbatim
usage: mserver5 [options] [scripts]
    --dbname=<database_name>
    --dbfarm=<directory>
    --dbinit=<stmt>           Server prepare statement
    --config=<config_file>
    --debug=<number>          trace server actions[0]
    --daemon=yes|no           run in background [no]
    --set <option>=<value>    set environment value
    --help                    this list of options
    --version                 version and compile time info
@end verbatim

The server options have the following meaning:
@table @code
@item --dbname <db-name>
        open the database <db-name>.
@item --config <config-file>
        where to find the environment settings
@item --dbinit <stmt>
        execute the statement first.
@end itemize

@{
@+ Implementation
@h
#ifndef _MONET_GLOBAL_H_
#define _MONET_GLOBAL_H_
#include "mal_config.h"
#include "monet_options.h"
#include "mal.h"
#include "mal_session.h"
#include "mal_import.h"
#include "mal_client.h"
#include "mal_function.h"

/* #define MONET_GLOBAL_DEBUG */
#endif /* _MONET_GLOBAL_H_ */
@c
#include "mal_config.h"
#include "mserver5.h"
#include "mal_authorize.h"
#include "mal_sabaoth.h"
#include <stdio.h>
#include <errno.h>
#include <string.h> /* strerror */
#include <locale.h>
#include "monet_version.h"

#ifdef _CRTDBG_MAP_ALLOC
/* Windows only:
   our definition of new and delete clashes with the one if
   _CRTDBG_MAP_ALLOC is defined.
*/
#undef _CRTDBG_MAP_ALLOC
#endif

#if defined(_MSC_VER) && _MSC_VER >= 1400
#define getcwd _getcwd
#endif
@-
The architecture is setup to handle multiple streams of requests.
The first thread started represents the server. It reads from standard input
and writes to standard input. This is also a way to recognize the server
actions. 
To start the server in the background one should use the argument -background.
This closes standard input. Direct execution in the background may cause
the server to hang in stdio for input from the terminal.
@ 
The server thread started remains in existence until all other threads die.
The server is stopped by cntrl-D or receiving the quit command.
@

@c
static int malloc_init = 1;
/* NEEDED? */
#if defined(_MSC_VER) && defined(__cplusplus)
#include <eh.h>
void
mserver_abort()
{
        fprintf(stderr, "\n! mserver_abort() was called by terminate(). !\n");
        fflush(stderr);
        MT_global_exit(0);
}
#endif

void
usage(char *prog)
{
        fprintf(stderr, "Usage: %s [options] [scripts]\n", prog);
        fprintf(stderr, "    --dbname=<database_name> \n");
        fprintf(stderr, "    --dbfarm=<database_directory> \n");
    fprintf(stderr,"     --version                 \n");
    fprintf(stderr,"     --help        for more details\n");
        exit(0);
}
void
usage2(char *prog)
{
        fprintf(stderr, "Usage: %s [options] [scripts]\n", prog);
        fprintf(stderr, "    --dbname=<database_name> \n");
        fprintf(stderr, "    --dbfarm=<directory> \n");
        fprintf(stderr, "    --dbinit=<stmt>           Server prepare 
statement\n");
        fprintf(stderr, "    --config=<config_file> \n");
        fprintf(stderr, "    --daemon=yes|no           run in background 
[no]\n");
        fprintf(stderr, "    --set <option>=<value>    set environment 
value\n");
        fprintf(stderr, "    --help                    this list of options 
\n");
    fprintf(stderr, "    --version                 version and compile time 
info\n");

        fprintf(stderr,"The debug options:\n");
        fprintf(stderr,"     --threads\n");
        fprintf(stderr,"     --memory\n");
        fprintf(stderr,"     --properties\n");
        fprintf(stderr,"     --io\n");
        fprintf(stderr,"     --transactions\n");
        fprintf(stderr,"     --modules\n");
        fprintf(stderr,"     --algorithms\n");
        fprintf(stderr,"     --xproperties\n");
        fprintf(stderr,"     --performance\n");
        fprintf(stderr,"     --debug=<bitmask>\n");

        exit(0);
}

@-
A welcoming message is displayed to inform the user about recent
changes. 
@c
void
monet_hello(opt *set, int setlen)
{
#ifdef STATIC
        char *linkinfo = "statically";
#else
        char *linkinfo = "dynamically";
#endif
        char *msg = mo_find_option(set, setlen, "monet_welcome");

        if (msg && strcmp(msg, "yes") == 0) {
                printf("# MonetDB server v" VERSION ", based on kernel v%s\n",
                                GDKversion());
                printf("# Serving database '%s'\n", GDKgetenv("gdk_dbname"));
                printf("# Compiled for %s/" SZFMT "bit with " SZFMT "bit OIDs 
%s linked\n", HOST, (size_t) (sizeof(ptr) * 8), (size_t) (sizeof(oid) * 8), 
linkinfo);
#ifdef MONET_GLOBAL_DEBUG
                printf("# Configuration:%s\n", GDKgetenv("config"));
                printf("# Database farm:%s\n", GDKgetenv("gdk_dbfarm"));
#endif
                printf("# Copyright (c) 1993-2007 CWI, all rights reserved\n");
                printf("# Visit http://monetdb.cwi.nl/ for further 
information\n");
        }
}

@-
Version information, and compile time options.
@c
#ifdef HAVE_LIBPCRE
#include <pcre.h>
#endif
#ifdef HAVE_OPENSSL
#include <openssl/opensslv.h>
#endif

str
absolute_path(str s)
{
        if (!MT_path_absolute(s)) {
                str ret = (str) GDKmalloc(strlen(s) + strlen(monet_cwd) + 2);

                sprintf(ret, "%s%c%s", monet_cwd, DIR_SEP, s);
                return ret;
        }
        return GDKstrdup(s);
}

@-
The options obtained during initialization should be maintained as
a global structure for other components to extract information.
@c
#define BSIZE 8192

int
monet_init(opt *set, int setlen)
{
        char *p;
        opt *n = (opt *) malloc(setlen * sizeof(opt));
        int i, j, nlen = 0;

        char *dbname = mo_find_option(set, setlen, "gdk_dbname");
        char *dbfarm = mo_find_option(set, setlen, "gdk_dbfarm");
        char *alloc_map = mo_find_option(set, setlen, "gdk_alloc_map");

        if (n == NULL || dbname == NULL || dbfarm == NULL || alloc_map == NULL) 
{
                fprintf(stderr, "Error, no database name or directory\n");
                if (n)
                        free(n);
                return 0;
        }

        dbfarm = mo_substitute(set, setlen, dbfarm);

        if ((p = mo_find_option(set, setlen, "gdk_debug")))
                GDKdebug = strtol(p, NULL, 10);

        if ((p = mo_find_option(set, setlen, "gdk_mem_pagebits"))) 
                GDK_mem_pagebits = strtol(p, NULL, 10);

        if ((p = mo_find_option(set, setlen, "gdk_vmtrim"))) 
                GDK_vm_trim = strcasecmp(p, "yes") == 0;

        /* determine Monet's kernel settings */
        if (!GDKinit(dbname, dbfarm, strcasecmp(alloc_map, "yes") == 0) ) {
                free(dbfarm);
                free(n);
                return 0;
        }
        free(dbfarm);

@-
Find duplicate entries in the property list and move
them to the front. Actually, this should be done in
monet_options.mx.in
@c
        for (i = 0; i < setlen; i++) {
                int done = 0;

                for (j = 0; j < nlen; j++) {
                        if (strcmp(n[j].name, set[i].name) == 0) {
                                if (n[j].kind < set[i].kind) {
                                        n[j] = set[i];
                                }
                                done = 1;
                                break;
                        }
                }
                if (!done) {
                        n[nlen] = set[i];
                        nlen++;
                }
        }
        for (i = 0; i < nlen; i++) {
                char *value;

                value = mo_substitute(n, nlen, n[i].value);
                GDKsetenv(n[i].name, value);
                free(value);
        }
        free(n);

        if ((p = GDKgetenv("gdk_mem_bigsize"))) {
                /* when allocating >6% of all RAM; do so using vmalloc() iso 
malloc() */
                lng max_mem_bigsize = GDK_mem_maxsize/16;

                /* sanity check to avoid memory fragmentation */
                GDK_mem_bigsize = (size_t) MIN(max_mem_bigsize, strtol(p, NULL, 
10));
        }
        if (GDKgetenv_isyes("gdk_embedded") || GDKgetenv_isyes("embedded")) {
                GDKembedded = 1;
        }

        if (GDKgetenv_isyes("monet_daemon") || GDKgetenv_isyes("daemon")) {
                monet_daemon = 1;
#ifdef HAVE_SETSID
                setsid();
#endif
        }

        monet_hello(set, setlen);
        /* you don't need the commandline arguments anymore */
        mo_free_options(set, setlen);
        return 1;
}

void emergencyBreakpoint(){
        /* just a handle to break after system initialization for GDB */
}

static void
handler(int sig)
{
        (void)sig;
        mal_exit();
}

int
main(int argc, char **av)
{
        char *prog = *av;
        opt *set = NULL;
        int idx = 0, debug = 0, setlen = 0, listing = 0, i = 0;
        str dbinit = NULL;
        str err = MAL_SUCCEED;

        static struct option long_options[] = {
                {"config", 1, 0, 'c'},
                {"dbname", 1, 0, 0},
                {"dbfarm", 1, 0, 0},
                {"dbinit", 1, 0, 0},
                {"daemon", 1, 0, 0},
                {"debug", 2, 0, 'd'},
                {"help", 0, 0, 'h'},
                {"version", 0, 0, 0},
                {"set", 1, 0, 's'},
                {"trace", 0, 0, 't'},
                {"threads",0,0,0},
                {"memory",0,0,0},
                {"properties",0,0,0},
                {"io",0,0,0},
                {"transaction",0,0,0},
                {"modules",0,0,0},
                {"algorithms",0,0,0},
                {"performance",0,0,0},
                {"xproperties",0,0,0},
                {0, 0, 0, 0}
        };

@-
We give malloc advice here. Main goal: prevent fragmentation.
We do this by declaring everything below 2K as 'small'. These
values will be drawn from a fixed pools of 400K.
A grain size of 128 bytes is used to keep overhead low.

We do this by declaring everything below 2K as 'small'. These
values will be drawn from a fixed pools of 400K.
A grain size of 128 bytes is used to keep overhead low.
Trivial remark: for dynamically linked executables the mallopt
capabilities depend on the malloc implementation used at run time.

Unlike V4 we ignore the alloc_map advice, which leads to a much
faster system start.
@= mallopt
        if (malloc_init) {
/* for (Red Hat) Linux (6.2) unused and ignored at least as of glibc-2.1.3-15 */
/* for (Red Hat) Linux (8) used at least as of glibc-2.2.93-5 */
            if (mallopt(M_MXFAST, 192)) {
                fprintf(stderr, "!monet: mallopt(M_MXFAST,192) fails.\n");
            }
#ifdef M_BLKSZ
            if (mallopt(M_BLKSZ, 8*1024)) {
                fprintf(stderr, "!monet: mallopt(M_BLKSZ,8*1024) fails.\n");
            }
#endif
        }
        malloc_init=0;
@c

#if defined(_MSC_VER) && defined(__cplusplus)
        set_terminate(mserver_abort);
#endif
        if (setlocale(LC_CTYPE, "") == NULL) {
                GDKfatal("cannot set locale\n");
        }

#ifdef HAVE_MALLOPT
        @:mallopt@
#else
        (void) malloc_init;     /* still unused */
#endif

        if (getcwd(monet_cwd, PATHLENGTH - 1) == NULL) {
                perror("pwd");
                GDKfatal("monet_init: could not determine current directory\n");
        }

        if (!(setlen = mo_builtin_settings(&set)))
                usage(prog);

        setlen = mo_add_option(&set, setlen, opt_config, "prefix", 
MONETDBPREFIX);
        setlen = mo_add_option(&set, setlen, opt_config, "config", 
MONETDBCONFIG);

        for (;;) {
                int option_index = 0;

                int c = getopt_long(argc, av, "c:d::t:r:h?s:m:i:a:e:x",
                                    long_options, &option_index);

                if (c == -1)
                        break;

                switch (c) {
                case 0:
                        if (strcmp(long_options[option_index].name, "dbname") 
== 0) {
                                setlen = mo_add_option(&set, setlen, 
opt_cmdline, "gdk_dbname", optarg);
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "dbfarm") 
== 0) {
                                setlen = mo_add_option(&set, setlen, 
opt_cmdline, "gdk_dbfarm", optarg);
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "dbinit") 
== 0) {
                                if (dbinit)
                                        fprintf(stderr, "#warning: ignoring 
multiple --dbinit argument\n");
                                else
                                        dbinit = optarg;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "daemon") 
== 0) {
                                setlen = mo_add_option(&set, setlen, 
opt_cmdline, "gdk_daemon", optarg);
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "version") 
== 0) {
                                monet_version();
                                break;
                        }
                        /* debugging options */
                        if (strcmp(long_options[option_index].name, 
"properties") == 0) {
                                debug |=GRPproperties;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, 
"algorithms") == 0) {
                                debug|= GRPalgorithms;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, 
"xproperties") == 0) {
                                debug|= GRPxproperties;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, 
"performance") == 0) {
                                debug|= GRPperformance;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "io") == 0) 
{
                                debug|= GRPio;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "memory") 
== 0) {
                                debug|= GRPmemory;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "modules") 
== 0) {
                                debug|= GRPmodules;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, 
"transactions") == 0) {
                                debug|= GRPtransactions;
                                break;
                        }
                        if (strcmp(long_options[option_index].name, "threads") 
== 0) {
                                debug|= GRPthreads;
                                break;
                        }
                        usage(prog);
                        break;
                case 'c':
                        setlen = mo_add_option(&set, setlen, opt_cmdline, 
"config", optarg);
                        break;
                case 'd':
                        if (optarg) {
                                setlen = mo_add_option(&set, setlen, 
opt_cmdline, "gdk_debug", optarg);
                        } else {
                                debug = 1;
                        }
                        break;
                case 's':{
                        /* should add option to a list */
                        char *tmp = strchr(optarg, '=');

                        if (tmp) {
                                *tmp = '\0';
                                setlen = mo_add_option(&set, setlen, 
opt_cmdline, optarg, tmp + 1);
                        } else {
                                fprintf(stderr, "ERROR: wrong format %s\n", 
optarg);
                        }
                }
                        break;
                case 't':       /* trace option, ignored to reduce testweb 
complaints
                        fprintf(stderr, "#warning: trace option not yet 
supported\n");
                        */
                        break;
                case 'h':
                        if(strcmp(long_options[option_index].name, "help") == 
0) {
                                usage2(prog);
                                break;
                        }
                case '?':
                        usage(prog);
                default:
                        fprintf(stderr, "ERROR: getopt returned character "
                                                        "code '%c' 0%o\n",c, c);
                        usage(prog);
                }
        }

        if (!(setlen = mo_system_config(&set, setlen)))
                usage(prog);

        monet_script = (str *) GDKmalloc(sizeof(str) * (argc + 1));
        monet_script[idx] = NULL;
        while (optind < argc) {
                monet_script[idx] = absolute_path(av[optind]);
                monet_script[idx + 1] = NULL;
                optind++;
                idx++;
        }

        if (debug)
                mo_print_options(set, setlen);
        if (monet_init(set, setlen) == 0 )
                return 0;
        /* propagate the debug flag to the environment table */
        if( debug){
                char buf[BUFSIZ];
                snprintf(buf,BUFSIZ,"%d",debug);
                GDKsetenv("gdk_debug", buf);
                GDKdebug=debug; /* overruled by command line */
        }

        GDKsetenv("monet_version", VERSION);

        /* configure sabaoth to use the right dbfarm and active database */
        SABAOTHinit(GDKgetenv("gdk_dbfarm"), GDKgetenv("gdk_dbname"));
        /* wipe out all cruft, if left over */
        if ((err = SABAOTHwildRetreat(&i)) != MAL_SUCCEED) {
                /* just swallow the error */
                GDKfree(err);
        }
        /* From this point, the server should exit cleanly.  Discussion:
         * even earlier?  Sabaoth here registers the server has started up. */
        if ((err = SABAOTHregisterStart(&i)) != MAL_SUCCEED) {
                /* throw the error at the user, but don't die */
                fprintf(stderr, "!%s\n", err);
                GDKfree(err);
        }

#ifdef HAVE_SIGACTION
        {
                struct sigaction sa;

                sigemptyset(&sa.sa_mask);
                sa.sa_flags = 0;
                sa.sa_handler = handler;
                if (
                                sigaction(SIGINT, &sa, NULL) == -1 ||
                                sigaction(SIGQUIT, &sa, NULL) == -1 ||
                                sigaction(SIGTERM, &sa, NULL) == -1)
                {
                        fprintf(stderr, "!unable to create signal handlers\n");
                }
        }
#else
        signal(SIGINT, handler);
#ifdef SIGQUIT
        signal(SIGQUIT, handler);
#endif
        signal(SIGTERM, handler);
#endif

        {
                str lang = "mal";
                /* we inited mal before, so publish its existence */
                if ((err = SABAOTHmarchScenario(&i, &lang)) != MAL_SUCCEED) {
                        /* throw the error at the user, but don't die */
                        fprintf(stderr, "!%s\n", err);
                        GDKfree(err);
                }
        }

        {
                /* unlock the vault, first see if we can find the file which
                 * holds the secret */
                char* secret = alloca(sizeof(char) * 1024);
                FILE* secretf;
                size_t len;
                
                if (GDKgetenv("monet_vault_key") == NULL) {
                        /* use a default (hard coded, non safe) key */
                        secret = "Xas632jsi2whjds8";
                        fprintf(stderr, "#warning: please don't forget to set 
your "
                                        "vault key!\n#(see %s)\n", 
GDKgetenv("config"));
                } else {
                        if ((secretf = fopen(GDKgetenv("monet_vault_key"), 
"r")) == NULL) {
                                snprintf(secret, 1023, "unable to open 
vault_key_file %s: %s",
                                                GDKgetenv("monet_vault_key"), 
strerror(errno));
                                secret[1023] = '\0';
                                GDKfatal(secret);
                        }
                        len = fread(secret, 1, 1023, secretf);
                        secret[len] = '\0';
                        len = strlen(secret); /* secret can contain null-bytes 
*/
                        if (len < 5) {
                                fprintf(stderr, "#warning: your vault key is 
too short "
                                                "(" SZFMT "), enlarge your 
vault key!\n",
                                                len); /* penis */
                        }
                        fclose(secretf);
                }
                if ((err = AUTHunlockVault(&secret)) != MAL_SUCCEED)
                        GDKfatal(err);
        }
        /* make sure the authorisation BATs are loaded */
        if ((err = AUTHinitTables()) != MAL_SUCCEED)
                GDKfatal(err);
        if (mal_init())
                return 0;

@-
Time to execute the script files. 
Start with the init command[todo], which may be defined in
the configuration file.
@c
        MSinitClientPrg(mal_clients, "user","main");
        if (dbinit == NULL)
                dbinit = GDKgetenv("dbinit");
        if (dbinit) {
                str input = GDKstrdup(dbinit);

                callString(mal_clients, input, listing);
                GDKfree(input);
        }

        if (GDKgetenv("mal_listing"))
                sscanf(GDKgetenv("mal_listing"), "%d", &listing);

        emergencyBreakpoint();
        for (i = 0; monet_script[i]; i++) {
                str msg=evalFile(mal_clients, monet_script[i], listing);
                /* check for internal exception message to terminate */
                if(msg  && strcmp(msg,"MALException:client.quit:Server 
stopped.")==0)
                        mal_exit();
                if( msg) GDKfree(msg);
                GDKfree(monet_script[i]);
                monet_script[i] = 0;
        }
        GDKfree(monet_script);
        if (monet_daemon) {
                while(1) 
                        MT_sleep_ms(5000);
        } else
                MSserveClient(mal_clients);

        /* mal_exit calls MT_global_exit, so statements after this call will
         * never get reached */
        mal_exit();

        return 0;
}
@}

--- NEW FILE: monet_version.c.in ---

#include "monet_version.h"

void
monet_version()
{
        printf("MonetDB server v" VERSION " (" SZFMT "-bit), "
                        "based on kernel v%s (" SZFMT "-bit oids)\n",
                        (size_t) (sizeof(ptr) * 8), GDKversion(),
                        (size_t) (sizeof(oid) * 8));
        printf("Copyright (c) 1993-2007 CWI, all rights reserved\n");
        printf("Visit http://monetdb.cwi.nl/ for further information\n");
        printf("Configured for prefix: " MONETDBPREFIX "\n");
        printf("Libraries:\n");
#ifdef HAVE_LIBPCRE
        printf("  libpcre: %s (%s)\n", pcre_version(), "@pcreversion@");
#endif
#ifdef HAVE_OPENSSL
        printf("  openssl: %s (%s)\n", OPENSSL_VERSION_TEXT, 
"@opensslversion@");
#endif
        printf("Compiled by: %s\n", "@builtby@");
        printf("Compilation: %s\n", "@compilercall@");
#ifdef STATIC
        printf("Linking    : %s (static)\n", "@linkercall@");
#else
        printf("Linking    : %s\n", "@linkercall@");
#endif
        exit(0);
}

--- mserver5.mx.in DELETED ---


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins

Reply via email to