📄 mserver5.c
字号:
#line 74 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#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 */#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#line 104 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"static int malloc_init = 1;/* NEEDED? */#if defined(_MSC_VER) && defined(__cplusplus)#include <eh.h>voidmserver_abort(){ fprintf(stderr, "\n! mserver_abort() was called by terminate(). !\n"); fflush(stderr); MT_global_exit(0);}#endifvoidusage(char *prog){ fprintf(stderr, "Usage: %s [options] [script]\n", prog); fprintf(stderr, " --dbname=<database_name> \n"); fprintf(stderr, " --dbfarm=<database_directory> \n"); fprintf(stderr, " --help for more options \n"); exit(0);}voidusage2(char *prog){ fprintf(stderr, "Usage: %s [options] [script]\n", prog); fprintf(stderr, " --dbname=<database_name> \n"); fprintf(stderr, " --dbfarm=<directory> \n"); fprintf(stderr, " --dbinit=<stmt> Server prepare statement\n"); fprintf(stderr, " --user=<str> Defaults to [monetdb]\n"); fprintf(stderr, " --password=<str> Defaults to [monetdb]\n"); fprintf(stderr, " --config=<config_file> \n"); fprintf(stderr, " --delay=<number> cycle delay [300]\n"); fprintf(stderr, " --debug=<number> trace server actions[0]\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"); exit(0);}#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"voidmonet_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%s\n", GDKgetenv("gdk_version")); printf("# Copyright (c) 1993-2007 CWI, all rights reserved\n"); 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("# config:%s\n", GDKgetenv("config")); printf("# dbfarm:%s\n", GDKgetenv("gdk_dbfarm"));#endif printf("# dbname:%s\n", GDKgetenv("gdk_dbname")); printf("# Visit http://monetdb.cwi.nl/ for further information\n"); }}strabsolute_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);}#line 187 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#define BSIZE 8192intmonet_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); /* determine Monet's kernel settings */ if (!GDKinit(dbname, dbfarm, strcasecmp(alloc_map, "yes") == 0) ) { free(dbfarm); free(n); return 0; } free(dbfarm);#line 225 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx" 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 ((p = GDKgetenv("gdk_vm_minsize"))){ /* when allocating HUGE regions, switch from vmalloc() to mmap() on a real file */ /* for 32-bits systems HUGE = RAM/8, for 64-bits systems HUGE = RAM/2 */ lng max_vm_minsize = ((lng)GDK_mem_maxsize*sizeof(void*)*sizeof(void*))/128; /* sanity check to avoid running out of swap space */ GDK_vm_minsize = (size_t) MIN(max_vm_minsize, 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;}intmain(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[12] = { {"config", 1, 0, 'c'}, {"dbname", 1, 0, 0}, {"dbfarm", 1, 0, 0}, {"dbinit", 1, 0, 0}, {"daemon", 1, 0, 0}, {"debug", 2, 0, 'd'}, {"delay", 1, 0, 0}, {"help", 2, 0, 'h'}, {"help", 0, 0, '?'}, {"set", 1, 0, 's'}, {"trace", 0, 0, 't'}, {0, 0, 0, 0} };#line 337 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#if defined(_MSC_VER) && defined(__cplusplus) set_terminate(mserver_abort);#endif/* should be looked into if (setlocale(LC_CTYPE, "") == NULL){ GDKfatal( "cannot set locale\n"); }*/#ifdef HAVE_MALLOPT #line 323 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx" 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;#line 348 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#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:?s:", 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, "delay") == 0) { setlen = mo_add_option(&set, setlen, opt_cmdline, "delay", 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; } usage(prog); break; case 'c': setlen = mo_add_option(&set, setlen, opt_cmdline, "config", optarg); break; case 'd': debug = 1; if (optarg) { setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_debug", optarg); } 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 0%o ??\n", 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);#ifdef MONET_GLOBAL_DEBUG else mo_print_options(set, setlen);#endif if (monet_init(set, setlen) == 0 || mal_init()) return 0; /* 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); } { 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);#line 525 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx" 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); for (i = 0; monet_script[i]; i++) { evalFile(mal_clients, monet_script[i], listing); 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;}#line 556 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -