Changeset: 8afb21cc1a54 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8afb21cc1a54
Modified Files:
sql/src/backends/monet5/merovingian/daemon/Makefile.ag
sql/src/backends/monet5/merovingian/daemon/client.c
sql/src/backends/monet5/merovingian/daemon/client.h
sql/src/backends/monet5/merovingian/daemon/connections.c
sql/src/backends/monet5/merovingian/daemon/connections.h
sql/src/backends/monet5/merovingian/daemon/controlrunner.c
sql/src/backends/monet5/merovingian/daemon/controlrunner.h
sql/src/backends/monet5/merovingian/daemon/discoveryrunner.c
sql/src/backends/monet5/merovingian/daemon/discoveryrunner.h
sql/src/backends/monet5/merovingian/daemon/forkmserver.c
sql/src/backends/monet5/merovingian/daemon/forkmserver.h
sql/src/backends/monet5/merovingian/daemon/handlers.c
sql/src/backends/monet5/merovingian/daemon/handlers.h
sql/src/backends/monet5/merovingian/daemon/merovingian.c
sql/src/backends/monet5/merovingian/daemon/merovingian.h
sql/src/backends/monet5/merovingian/daemon/merovingian_client.c
sql/src/backends/monet5/merovingian/daemon/merovingian_connections.c
sql/src/backends/monet5/merovingian/daemon/merovingian_controlrunner.c
sql/src/backends/monet5/merovingian/daemon/merovingian_discoveryrunner.c
sql/src/backends/monet5/merovingian/daemon/merovingian_forkmserver.c
sql/src/backends/monet5/merovingian/daemon/merovingian_handlers.c
sql/src/backends/monet5/merovingian/daemon/merovingian_peering.c
sql/src/backends/monet5/merovingian/daemon/merovingian_peering.h
sql/src/backends/monet5/merovingian/daemon/merovingian_proxy.c
sql/src/backends/monet5/merovingian/daemon/peering.c
sql/src/backends/monet5/merovingian/daemon/peering.h
sql/src/backends/monet5/merovingian/daemon/proxy.c
sql/src/backends/monet5/merovingian/daemon/proxy.h
Branch: default
Log Message:
properly link together the separate C-files instead of just including
diffs (truncated from 6860 to 300 lines):
diff -r 89dbff627628 -r 8afb21cc1a54
sql/src/backends/monet5/merovingian/daemon/Makefile.ag
--- a/sql/src/backends/monet5/merovingian/daemon/Makefile.ag Mon Sep 20
14:55:29 2010 +0200
+++ b/sql/src/backends/monet5/merovingian/daemon/Makefile.ag Mon Sep 20
14:55:40 2010 +0200
@@ -22,34 +22,33 @@
INCLUDES = \
$(MONETDB5_INCS) \
$(MONETDB_INCS) \
- -I../utils
-
-MEROVINGIAN_SUBS = \
- merovingian_client.c \
- merovingian_connections.c \
- merovingian_controlrunner.c \
- merovingian_discoveryrunner.c \
- merovingian_forkmserver.c \
- merovingian_handlers.c \
- merovingian_proxy.c
+ -I..
EXTRA_DIST = $(man_MANS) \
- merovingian_peering.h \
- $(MEROVINGIAN_SUBS)
-
-lib_merodaemon = {
- NOINST
- SOURCES = \
- merovingian.c \
- merovingian_peering.c
-}
+ merovingian.h \
+ client.h \
+ connections.h \
+ controlrunner.h \
+ discoveryrunner.h \
+ forkmserver.h \
+ handlers.h \
+ peering.h \
+ proxy.c
bin_monetdbd = {
# hack: include merovingian.1.in here to get it expanded
- SOURCES = monetdbd.1.in
+ SOURCES = monetdbd.1.in \
+ merovingian.c \
+ client.c \
+ connections.c \
+ controlrunner.c \
+ discoveryrunner.c \
+ forkmserver.c \
+ handlers.c \
+ peering.c \
+ proxy.c
LIBS = \
../utils/libmeroutil \
- libmerodaemon \
$(MONETDB5_LIBS) -lmonetdb5 \
$(MONETDB_LIBS) -lbat -lstream \
$(SOCKET_LIBS) \
diff -r 89dbff627628 -r 8afb21cc1a54
sql/src/backends/monet5/merovingian/daemon/client.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/backends/monet5/merovingian/daemon/client.c Mon Sep 20
14:55:40 2010 +0200
@@ -0,0 +1,475 @@
+/*
+ * 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-July 2008 CWI.
+ * Copyright August 2008-2010 MonetDB B.V.
+ * All Rights Reserved.
+ */
+
+#include "sql_config.h"
+
+#include <stdio.h>
+#include <string.h> /* strerror, strchr, strcmp */
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
+#include <stream.h>
+#include <stream_socket.h>
+#include <mal_sabaoth.h>
+#include <utils/utils.h> /* freeConfFile */
+#include <utils/properties.h> /* readProps */
+
+#include "merovingian.h"
+#include "forkmserver.h"
+#include "proxy.h"
+
+extern char _mero_keep_listening;
+extern confkeyval *_mero_props;
+
+static err
+handleClient(int sock, char isusock)
+{
+ stream *fdin, *fout;
+ str buf = alloca(sizeof(char) * 8096);
+ char *user = NULL, *algo = NULL, *passwd = NULL, *lang = NULL;
+ char *database = NULL, *s;
+ char *host = NULL;
+ sabdb *top = NULL;
+ sabdb *stat = NULL;
+ struct sockaddr_in saddr;
+ socklen_t saddrlen = sizeof(struct sockaddr_in);
+ err e;
+ confkeyval *ckv, *kv;
+ char mydoproxy;
+ sabdb redirs[24]; /* do we need more? */
+ int r = 0;
+
+ fdin = socket_rastream(sock, "merovingian<-client (read)");
+ if (fdin == 0)
+ return(newErr("merovingian-client inputstream problems"));
+ fdin = block_stream(fdin);
+
+ fout = socket_wastream(sock, "merovingian->client (write)");
+ if (fout == 0) {
+ close_stream(fdin);
+ return(newErr("merovingian-client outputstream problems"));
+ }
+ fout = block_stream(fout);
+
+ /* note that we claim to speak proto 8 here */
+ mnstr_printf(fout, "%s:merovingian:8:%s:%s:",
+ "void", /* some bs */
+ "md5,plain", /* we actually don't look at the password
*/
+#ifdef WORDS_BIGENDIAN
+ "BIG"
+#else
+ "LIT"
+#endif
+ );
+ mnstr_flush(fout);
+
+ /* get response */
+ buf[0] = '\0';
+ if (mnstr_read_block(fdin, buf, 8095, 1) < 0) {
+ /* we didn't get a terminated block :/ */
+ e = newErr("client sent challenge in incomplete block: %s",
buf);
+ mnstr_printf(fout, "!merovingian: client sent something this
server could not understand, sorry\n", user);
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+ buf[8095] = '\0';
+
+ /* decode BIG/LIT:user:{cypher}passwordchal:lang:database: line */
+
+ user = buf;
+ /* byte order */
+ s = strchr(user, ':');
+ if (s) {
+ *s = 0;
+ /* we don't use this in merovingian */
+ /* mnstr_set_byteorder(fin->s, strcmp(user, "BIG") == 0); */
+ user = s + 1;
+ } else {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: incomplete challenge '%s'\n",
user);
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+
+ /* passwd */
+ s = strchr(user, ':');
+ if (s) {
+ *s = 0;
+ passwd = s + 1;
+ /* decode algorithm, i.e. {plain}mypasswordchallenge */
+ if (*passwd != '{') {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: invalid password
entry\n");
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+ algo = passwd + 1;
+ s = strchr(algo, '}');
+ if (!s) {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: invalid password
entry\n");
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+ *s = 0;
+ passwd = s + 1;
+ } else {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: incomplete challenge '%s'\n",
user);
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+
+ /* lang */
+ s = strchr(passwd, ':');
+ if (s) {
+ *s = 0;
+ lang = s + 1;
+ } else {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: incomplete challenge, missing
language\n");
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+
+ /* database */
+ s = strchr(lang, ':');
+ if (s) {
+ *s = 0;
+ database = s + 1;
+ /* since we don't know where the string ends, we need to look
+ * for another : */
+ s = strchr(database, ':');
+ if (s == NULL) {
+ e = newErr("client challenge error: %s", buf);
+ mnstr_printf(fout, "!merovingian: incomplete challenge,
missing trailing colon\n");
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ } else {
+ *s = '\0';
+ }
+ }
+
+ if (*database == '\0') {
+ /* we need to have a database, if we haven't gotten one,
+ * complain */
+ mnstr_printf(fout, "!merovingian: please specify a database\n");
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(newErr("no database specified"));
+ } else {
+ if (strcmp(lang, "resolve") == 0) {
+ /* ensure the pattern ends with '/\*' such that we
force a
+ * remote entry, including those for local databases,
this
+ * way we will get a redirect back to merovingian for
such
+ * database if it is proxied and hence not remotely
+ * available */
+ size_t len = strlen(database);
+ if (len > 2 &&
+ database[len - 2] != '/' &&
+ database[len - 1] != '*')
+ {
+ char *n = alloca(sizeof(char) * len + 2 + 1);
+ snprintf(n, len + 2 + 1, "%s/*", database);
+ database = n;
+ }
+ }
+ if ((e = forkMserver(database, &top, 0)) != NO_ERR) {
+ if (top == NULL) {
+ mnstr_printf(fout, "!merovingian: no such
database '%s', please create it first\n", database);
+ } else {
+ mnstr_printf(fout, "!merovingian: internal
error while starting mserver, please refer to the logs\n");
+ }
+ mnstr_flush(fout);
+ close_stream(fout);
+ close_stream(fdin);
+ return(e);
+ }
+ stat = top;
+ }
+
+ /* collect possible redirects */
+ for (stat = top; stat != NULL; stat = stat->next) {
+ if (stat->conns == NULL || stat->conns->val == NULL) {
+ Mfprintf(stdout, "dropping database without available "
+ "connections: '%s'\n", stat->dbname);
+ } else if (r == 24) {
+ Mfprintf(stdout, "dropping database connection because
of "
+ "too many already: %s\n",
stat->conns->val);
+ } else {
+ redirs[r++] = *stat;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list