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

Reply via email to