All of lore.kernel.org
 help / color / mirror / Atom feed
From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/ricci common/ClientSocket.cpp common/Mak ...
Date: 9 Aug 2007 21:29:45 -0000	[thread overview]
Message-ID: <20070809212945.6008.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/cluster
Module name:	conga
Branch: 	RHEL4
Changes by:	rmccabe at sourceware.org	2007-08-09 21:29:43

Modified files:
	ricci/common   : ClientSocket.cpp Makefile Module.cpp 
	                 executils.cpp 
	ricci/init.d   : ricci 
	ricci/modules/cluster: ClusterModule.cpp Makefile Virt.cpp 
	                       Virt.h 
	ricci/modules/storage: VG.cpp parted_wrapper.cpp 
	ricci/ricci    : SSLInstance.cpp 
Added files:
	ricci/common   : base64.c base64.h 
	ricci/test_suite/cluster: delete_xvm_key.xml 
	                          generate_xvm_key.xml get_xvm_key.xml 
	                          set_xvm_key.xml 

Log message:
	Merge in fixes from the RHEL5 branch, pass 2

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/base64.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/base64.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.4.4.1&r2=1.4.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.7.2.1&r2=1.7.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Module.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5&r2=1.5.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/executils.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.7.4.1&r2=1.7.4.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/init.d/ricci.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.10&r2=1.10.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/ClusterModule.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.6.2.1&r2=1.6.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Makefile.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.15&r2=1.15.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Virt.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Virt.h.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/VG.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.3&r2=1.9.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/storage/parted_wrapper.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.8.4.2&r2=1.8.4.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/SSLInstance.cpp.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.7&r2=1.7.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/test_suite/cluster/delete_xvm_key.xml.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/test_suite/cluster/generate_xvm_key.xml.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.2.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/test_suite/cluster/get_xvm_key.xml.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/test_suite/cluster/set_xvm_key.xml.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.4.1

/cvs/cluster/conga/ricci/common/base64.c,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/common/base64.c
+++ -	2007-08-09 21:29:43.564631000 +0000
@@ -0,0 +1,421 @@
+/* base64.c -- Encode binary data using printable characters.
+   Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* Written by Simon Josefsson.  Partially adapted from GNU MailUtils
+ * (mailbox/filter_trans.c, as of 2004-11-28).  Improved by review
+ * from Paul Eggert, Bruno Haible, and Stepan Kasal.
+ *
+ * See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>.
+ *
+ * Be careful with error checking.  Here is how you would typically
+ * use these functions:
+ *
+ * bool ok = base64_decode_alloc (in, inlen, &out, &outlen);
+ * if (!ok)
+ *   FAIL: input was not valid base64
+ * if (out == NULL)
+ *   FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN
+ *
+ * size_t outlen = base64_encode_alloc (in, inlen, &out);
+ * if (out == NULL && outlen == 0 && inlen != 0)
+ *   FAIL: input too long
+ * if (out == NULL)
+ *   FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN.
+ *
+ */
+
+/* Get prototype. */
+#include "base64.h"
+
+/* Get malloc. */
+#include <stdlib.h>
+
+/* Get UCHAR_MAX. */
+#include <limits.h>
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static inline unsigned char
+to_uchar (char ch)
+{
+  return ch;
+}
+
+/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
+   If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
+   possible.  If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
+   terminate the output buffer. */
+void
+base64_encode (const char *in, size_t inlen,
+	       char *out, size_t outlen)
+{
+  static const char b64str[64] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+  while (inlen && outlen)
+    {
+      *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
+      if (!--outlen)
+	break;
+      *out++ = b64str[((to_uchar (in[0]) << 4)
+		       + (--inlen ? to_uchar (in[1]) >> 4 : 0))
+		      & 0x3f];
+      if (!--outlen)
+	break;
+      *out++ =
+	(inlen
+	 ? b64str[((to_uchar (in[1]) << 2)
+		   + (--inlen ? to_uchar (in[2]) >> 6 : 0))
+		  & 0x3f]
+	 : '=');
+      if (!--outlen)
+	break;
+      *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
+      if (!--outlen)
+	break;
+      if (inlen)
+	inlen--;
+      if (inlen)
+	in += 3;
+    }
+
+  if (outlen)
+    *out = '\0';
+}
+
+/* Allocate a buffer and store zero terminated base64 encoded data
+   from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e.,
+   the length of the encoded data, excluding the terminating zero.  On
+   return, the OUT variable will hold a pointer to newly allocated
+   memory that must be deallocated by the caller.  If output string
+   length would overflow, 0 is returned and OUT is set to NULL.  If
+   memory allocation failed, OUT is set to NULL, and the return value
+   indicates length of the requested memory block, i.e.,
+   BASE64_LENGTH(inlen) + 1. */
+size_t
+base64_encode_alloc (const char *in, size_t inlen, char **out)
+{
+  size_t outlen = 1 + BASE64_LENGTH (inlen);
+
+  /* Check for overflow in outlen computation.
+   *
+   * If there is no overflow, outlen >= inlen.
+   *
+   * If the operation (inlen + 2) overflows then it yields at most +1, so
+   * outlen is 0.
+   *
+   * If the multiplication overflows, we lose at least half of the
+   * correct value, so the result is < ((inlen + 2) / 3) * 2, which is
+   * less than (inlen + 2) * 0.66667, which is less than inlen as soon as
+   * (inlen > 4).
+   */
+  if (inlen > outlen)
+    {
+      *out = NULL;
+      return 0;
+    }
+
+  *out = malloc (outlen);
+  if (!*out)
+    return outlen;
+
+  base64_encode (in, inlen, *out, outlen);
+
+  return outlen - 1;
+}
+
+/* With this approach this file works independent of the charset used
+   (think EBCDIC).  However, it does assume that the characters in the
+   Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255.  POSIX
+   1003.1-2001 require that char and unsigned char are 8-bit
+   quantities, though, taking care of that problem.  But this may be a
+   potential problem on non-POSIX C99 platforms.
+
+   IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_"
+   as the formal parameter rather than "x".  */
+#define B64(_)					\
+  ((_) == 'A' ? 0				\
+   : (_) == 'B' ? 1				\
+   : (_) == 'C' ? 2				\
+   : (_) == 'D' ? 3				\
+   : (_) == 'E' ? 4				\
+   : (_) == 'F' ? 5				\
+   : (_) == 'G' ? 6				\
+   : (_) == 'H' ? 7				\
+   : (_) == 'I' ? 8				\
+   : (_) == 'J' ? 9				\
+   : (_) == 'K' ? 10				\
+   : (_) == 'L' ? 11				\
+   : (_) == 'M' ? 12				\
+   : (_) == 'N' ? 13				\
+   : (_) == 'O' ? 14				\
+   : (_) == 'P' ? 15				\
+   : (_) == 'Q' ? 16				\
+   : (_) == 'R' ? 17				\
+   : (_) == 'S' ? 18				\
+   : (_) == 'T' ? 19				\
+   : (_) == 'U' ? 20				\
+   : (_) == 'V' ? 21				\
+   : (_) == 'W' ? 22				\
+   : (_) == 'X' ? 23				\
+   : (_) == 'Y' ? 24				\
+   : (_) == 'Z' ? 25				\
+   : (_) == 'a' ? 26				\
+   : (_) == 'b' ? 27				\
+   : (_) == 'c' ? 28				\
+   : (_) == 'd' ? 29				\
+   : (_) == 'e' ? 30				\
+   : (_) == 'f' ? 31				\
+   : (_) == 'g' ? 32				\
+   : (_) == 'h' ? 33				\
+   : (_) == 'i' ? 34				\
+   : (_) == 'j' ? 35				\
+   : (_) == 'k' ? 36				\
+   : (_) == 'l' ? 37				\
+   : (_) == 'm' ? 38				\
+   : (_) == 'n' ? 39				\
+   : (_) == 'o' ? 40				\
+   : (_) == 'p' ? 41				\
+   : (_) == 'q' ? 42				\
+   : (_) == 'r' ? 43				\
+   : (_) == 's' ? 44				\
+   : (_) == 't' ? 45				\
+   : (_) == 'u' ? 46				\
+   : (_) == 'v' ? 47				\
+   : (_) == 'w' ? 48				\
+   : (_) == 'x' ? 49				\
+   : (_) == 'y' ? 50				\
+   : (_) == 'z' ? 51				\
+   : (_) == '0' ? 52				\
+   : (_) == '1' ? 53				\
+   : (_) == '2' ? 54				\
+   : (_) == '3' ? 55				\
+   : (_) == '4' ? 56				\
+   : (_) == '5' ? 57				\
+   : (_) == '6' ? 58				\
+   : (_) == '7' ? 59				\
+   : (_) == '8' ? 60				\
+   : (_) == '9' ? 61				\
+   : (_) == '+' ? 62				\
+   : (_) == '/' ? 63				\
+   : -1)
+
+static const signed char b64[0x100] = {
+  B64 (0), B64 (1), B64 (2), B64 (3),
+  B64 (4), B64 (5), B64 (6), B64 (7),
+  B64 (8), B64 (9), B64 (10), B64 (11),
+  B64 (12), B64 (13), B64 (14), B64 (15),
+  B64 (16), B64 (17), B64 (18), B64 (19),
+  B64 (20), B64 (21), B64 (22), B64 (23),
+  B64 (24), B64 (25), B64 (26), B64 (27),
+  B64 (28), B64 (29), B64 (30), B64 (31),
+  B64 (32), B64 (33), B64 (34), B64 (35),
+  B64 (36), B64 (37), B64 (38), B64 (39),
+  B64 (40), B64 (41), B64 (42), B64 (43),
+  B64 (44), B64 (45), B64 (46), B64 (47),
+  B64 (48), B64 (49), B64 (50), B64 (51),
+  B64 (52), B64 (53), B64 (54), B64 (55),
+  B64 (56), B64 (57), B64 (58), B64 (59),
+  B64 (60), B64 (61), B64 (62), B64 (63),
+  B64 (64), B64 (65), B64 (66), B64 (67),
+  B64 (68), B64 (69), B64 (70), B64 (71),
+  B64 (72), B64 (73), B64 (74), B64 (75),
+  B64 (76), B64 (77), B64 (78), B64 (79),
+  B64 (80), B64 (81), B64 (82), B64 (83),
+  B64 (84), B64 (85), B64 (86), B64 (87),
+  B64 (88), B64 (89), B64 (90), B64 (91),
+  B64 (92), B64 (93), B64 (94), B64 (95),
+  B64 (96), B64 (97), B64 (98), B64 (99),
+  B64 (100), B64 (101), B64 (102), B64 (103),
+  B64 (104), B64 (105), B64 (106), B64 (107),
+  B64 (108), B64 (109), B64 (110), B64 (111),
+  B64 (112), B64 (113), B64 (114), B64 (115),
+  B64 (116), B64 (117), B64 (118), B64 (119),
+  B64 (120), B64 (121), B64 (122), B64 (123),
+  B64 (124), B64 (125), B64 (126), B64 (127),
+  B64 (128), B64 (129), B64 (130), B64 (131),
+  B64 (132), B64 (133), B64 (134), B64 (135),
+  B64 (136), B64 (137), B64 (138), B64 (139),
+  B64 (140), B64 (141), B64 (142), B64 (143),
+  B64 (144), B64 (145), B64 (146), B64 (147),
+  B64 (148), B64 (149), B64 (150), B64 (151),
+  B64 (152), B64 (153), B64 (154), B64 (155),
+  B64 (156), B64 (157), B64 (158), B64 (159),
+  B64 (160), B64 (161), B64 (162), B64 (163),
+  B64 (164), B64 (165), B64 (166), B64 (167),
+  B64 (168), B64 (169), B64 (170), B64 (171),
+  B64 (172), B64 (173), B64 (174), B64 (175),
+  B64 (176), B64 (177), B64 (178), B64 (179),
+  B64 (180), B64 (181), B64 (182), B64 (183),
+  B64 (184), B64 (185), B64 (186), B64 (187),
+  B64 (188), B64 (189), B64 (190), B64 (191),
+  B64 (192), B64 (193), B64 (194), B64 (195),
+  B64 (196), B64 (197), B64 (198), B64 (199),
+  B64 (200), B64 (201), B64 (202), B64 (203),
+  B64 (204), B64 (205), B64 (206), B64 (207),
+  B64 (208), B64 (209), B64 (210), B64 (211),
+  B64 (212), B64 (213), B64 (214), B64 (215),
+  B64 (216), B64 (217), B64 (218), B64 (219),
+  B64 (220), B64 (221), B64 (222), B64 (223),
+  B64 (224), B64 (225), B64 (226), B64 (227),
+  B64 (228), B64 (229), B64 (230), B64 (231),
+  B64 (232), B64 (233), B64 (234), B64 (235),
+  B64 (236), B64 (237), B64 (238), B64 (239),
+  B64 (240), B64 (241), B64 (242), B64 (243),
+  B64 (244), B64 (245), B64 (246), B64 (247),
+  B64 (248), B64 (249), B64 (250), B64 (251),
+  B64 (252), B64 (253), B64 (254), B64 (255)
+};
+
+#if UCHAR_MAX == 255
+# define uchar_in_range(c) true
+#else
+# define uchar_in_range(c) ((c) <= 255)
+#endif
+
+/* Return true if CH is a character from the Base64 alphabet, and
+   false otherwise.  Note that '=' is padding and not considered to be
+   part of the alphabet.  */
+bool
+isbase64 (char ch)
+{
+  return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)];
+}
+
+/* Decode base64 encoded input array IN of length INLEN to output
+   array OUT that can hold *OUTLEN bytes.  Return true if decoding was
+   successful, i.e. if the input was valid base64 data, false
+   otherwise.  If *OUTLEN is too small, as many bytes as possible will
+   be written to OUT.  On return, *OUTLEN holds the length of decoded
+   bytes in OUT.  Note that as soon as any non-alphabet characters are
+   encountered, decoding is stopped and false is returned.  This means
+   that, when applicable, you must remove any line terminators that is
+   part of the data stream before calling this function.  */
+bool
+base64_decode (const char *in, size_t inlen, char *out, size_t *outlen) {
+  size_t outleft = *outlen;
+
+  while (inlen >= 2)
+    {
+      if (!isbase64 (in[0]) || !isbase64 (in[1]))
+	break;
+
+      if (outleft)
+	{
+	  *out++ = ((b64[to_uchar (in[0])] << 2)
+		    | (b64[to_uchar (in[1])] >> 4));
+	  outleft--;
+	}
+
+      if (inlen == 2)
+	break;
+
+      if (in[2] == '=')
+	{
+	  if (inlen != 4)
+	    break;
+
+	  if (in[3] != '=')
+	    break;
+
+	}
+      else
+	{
+	  if (!isbase64 (in[2]))
+	    break;
+
+	  if (outleft)
+	    {
+	      *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0)
+			| (b64[to_uchar (in[2])] >> 2));
+	      outleft--;
+	    }
+
+	  if (inlen == 3)
+	    break;
+
+	  if (in[3] == '=')
+	    {
+	      if (inlen != 4)
+		break;
+	    }
+	  else
+	    {
+	      if (!isbase64 (in[3]))
+		break;
+
+	      if (outleft)
+		{
+		  *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0)
+			    | b64[to_uchar (in[3])]);
+		  outleft--;
+		}
+	    }
+	}
+
+      in += 4;
+      inlen -= 4;
+    }
+
+  *outlen -= outleft;
+
+  if (inlen != 0)
+    return false;
+
+  return true;
+}
+
+/* Allocate an output buffer in *OUT, and decode the base64 encoded
+   data stored in IN of size INLEN to the *OUT buffer.  On return, the
+   size of the decoded data is stored in *OUTLEN.  OUTLEN may be NULL,
+   if the caller is not interested in the decoded length.  *OUT may be
+   NULL to indicate an out of memory error, in which case *OUTLEN
+   contains the size of the memory block needed.  The function returns
+   true on successful decoding and memory allocation errors.  (Use the
+   *OUT and *OUTLEN parameters to differentiate between successful
+   decoding and memory error.)  The function returns false if the
+   input was invalid, in which case *OUT is NULL and *OUTLEN is
+   undefined. */
+bool
+base64_decode_alloc (const char *in, size_t inlen, char **out,
+		     size_t *outlen)
+{
+  /* This may allocate a few bytes too much, depending on input,
+     but it's not worth the extra CPU time to compute the exact amount.
+     The exact amount is 3 * inlen / 4, minus 1 if the input ends
+     with "=" and minus another 1 if the input ends with "==".
+     Dividing before multiplying avoids the possibility of overflow.  */
+  size_t needlen = 3 * (inlen / 4) + 2;
+
+  *out = malloc (needlen);
+  if (!*out)
+    return true;
+
+  if (!base64_decode (in, inlen, *out, &needlen))
+    {
+      free (*out);
+      *out = NULL;
+      return false;
+    }
+
+  if (outlen)
+    *outlen = needlen;
+
+  return true;
+}
/cvs/cluster/conga/ricci/common/base64.h,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/common/base64.h
+++ -	2007-08-09 21:29:43.652464000 +0000
@@ -0,0 +1,45 @@
+/* base64.h -- Encode binary data using printable characters.
+   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+   Written by Simon Josefsson.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef BASE64_H
+# define BASE64_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+/* Get bool. */
+# include <stdbool.h>
+
+/* This uses that the expression (n+(k-1))/k means the smallest
+   integer >= n/k, i.e., the ceiling of n/k.  */
+# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4)
+
+extern bool isbase64 (char ch);
+
+extern void base64_encode (const char *in, size_t inlen,
+			   char *out, size_t outlen);
+
+extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
+
+extern bool base64_decode (const char *in, size_t inlen,
+			   char *out, size_t *outlen);
+
+extern bool base64_decode_alloc (const char *in, size_t inlen,
+				 char **out, size_t *outlen);
+
+#endif /* BASE64_H */
--- conga/ricci/common/ClientSocket.cpp	2007/03/27 02:06:26	1.4.4.1
+++ conga/ricci/common/ClientSocket.cpp	2007/08/09 21:29:42	1.4.4.2
@@ -27,6 +27,7 @@
 
 #include <unistd.h>
 #include <errno.h>
+#include <string.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -159,14 +160,14 @@
     throw String("ClientSocket::recv(): socket already closed");
   
   while (true) {
-    char buffer[1024];
+    char buffer[4096];
     int ret = ::recv(_sock, buffer, sizeof(buffer), 0);
     if (ret == -1) {
       if (errno == EINTR)
 	continue;
       else if (errno == EAGAIN)
 	return "";
-      throw String("ClientSocket::recv(): recv error");
+      throw String("ClientSocket::recv(): recv error: ") + String(strerror(errno));
     }
     
     if (ret == 0) {
@@ -204,10 +205,9 @@
     if (ret == -1) {
       if (errno == EINTR)
 	continue;
-      else if (errno == EAGAIN ||
-	       errno == EWOULDBLOCK)
+      else if (errno == EAGAIN || errno == EWOULDBLOCK)
 	return msg;
-      throw String("ClientSocket::send(): socket error");
+      throw String("ClientSocket::send(): socket error: ") + String(strerror(errno));
     }
     
     //    log(String("sent ") + ret + " bytes thru socket " + _sock, 
--- conga/ricci/common/Makefile	2007/03/27 02:06:26	1.7.2.1
+++ conga/ricci/common/Makefile	2007/08/09 21:29:42	1.7.2.2
@@ -32,6 +32,7 @@
 	Variable.o \
 	Random.o \
 	daemon_init.o \
+	base64.o \
 	Module.o
 
 
--- conga/ricci/common/Module.cpp	2006/08/15 04:15:52	1.5
+++ conga/ricci/common/Module.cpp	2007/08/09 21:29:42	1.5.4.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2006
+  Copyright Red Hat, Inc. 2006-2007
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
@@ -253,56 +253,74 @@
 int
 __stdin_out_module_driver(Module& module)
 {
-  unsigned int time_beg = time_mil();
-  String data;
+	unsigned int time_beg = time_mil();
+	String data;
   
-  while (time_mil() < time_beg + timeout) {
-    poll_fd poll_data;
-    poll_data.fd = 0;
-    poll_data.events = POLLIN;
-    poll_data.revents = 0;
+	while (time_mil() < time_beg + timeout) {
+		poll_fd poll_data;
+		poll_data.fd = 0;
+		poll_data.events = POLLIN;
+		poll_data.revents = 0;
     
-    // wait for events
-    int ret = poll(&poll_data, 1, 500);
-    if (ret == 0) {
-      // continue waiting
-      continue;
-    } else if (ret == -1) {
-      if (errno == EINTR)
-        continue;
-      else
-        throw String("poll() error");
-    }
-    
-    // process event
-    if (poll_data.revents & POLLIN) {
-      char buff[1024];
-      int ret = read(poll_data.fd, buff, sizeof(buff));
-      if (ret == -1) {
-	if (errno == EINTR)
-	  continue;
-	throw String("error reading stdin");
-      }
-      try {
-	data.append(buff, ret);
-	shred(buff, sizeof(buff));
-	XMLObject request = parseXML(data);
-	XMLObject response = module.process(request);
-	cout << generateXML(response) << endl;
-	return 0;
-      } catch ( ... ) {
-	shred(buff, sizeof(buff));
-      }
-      continue;
-    }
-    if (poll_data.revents & (POLLERR | POLLHUP | POLLNVAL))
-      throw String("stdin error???");
+		// wait for events
+		int ret = poll(&poll_data, 1, 500);
+
+		if (ret == 0) {
+			/*
+			** We may be done if the total input length is a multiple of
+			** the buffer size.
+			*/
+			if (data.length() > 0) {
+				try {
+					XMLObject request = parseXML(data);
+					XMLObject response = module.process(request);
+					cout << generateXML(response) << endl;
+					return 0;
+				} catch ( ... ) { }
+			}
+			// continue waiting
+			continue;
+		} else if (ret == -1) {
+			if (errno == EINTR)
+				continue;
+			else
+				throw String("poll() error: ") + String(strerror(errno));
+		}
     
-  } // while
+		// process event
+		if (poll_data.revents & POLLIN) {
+			char buff[4096];
+			int ret;
+
+			ret = read(poll_data.fd, buff, sizeof(buff));
+			if (ret == -1) {
+				if (errno == EINTR)
+					continue;
+				throw String("error reading stdin: ") + String(strerror(errno));
+			}
+
+			if (ret > 0) {
+				data.append(buff, ret);
+				shred(buff, sizeof(buff));
+			}
+
+			if ((size_t) ret < sizeof(buff)) {
+				try {
+					XMLObject request = parseXML(data);
+					XMLObject response = module.process(request);
+					cout << generateXML(response) << endl;
+					return 0;
+				} catch ( ... ) { }
+			}
+			continue;
+		}
+
+		if (poll_data.revents & (POLLERR | POLLHUP | POLLNVAL))
+			throw String("stdin error: ") + String(strerror(errno));
+	} // while
   
   //  cout << data << endl;
-  
-  throw String("invalid input");
+	throw String("invalid input");
 }
 
 
--- conga/ricci/common/executils.cpp	2007/03/05 20:07:33	1.7.4.1
+++ conga/ricci/common/executils.cpp	2007/08/09 21:29:42	1.7.4.2
@@ -218,7 +218,7 @@
   
   if (poll_info.revents & POLLIN) {
     try {
-      char data_in[1024];
+      char data_in[4096];
       int ret = read(fd, data_in, sizeof(data_in));
       if (ret < 0)
 	return;
--- conga/ricci/init.d/ricci	2007/01/18 03:02:38	1.10
+++ conga/ricci/init.d/ricci	2007/08/09 21:29:42	1.10.2.1
@@ -1,10 +1,9 @@
 #!/bin/sh
 #
-# Copyright (C) 2005 Red Hat, Inc.
+# Copyright (C) 2005-2007 Red Hat, Inc.
 #
 # This program is Free Software.  You may modify and/or redistribute it under
-# the terms of the GNU General Public License version 2, or (at your option)
-# any later version.
+# the terms of the GNU General Public License version 2.
 #
 # description:  Starts and stops Red Hat Cluster and Storage Remote \
 #               Configuration Interface (ricci)
@@ -32,127 +31,125 @@
 #
 # Only root wants to run this...
 #
-[ `id -u` = 0 ] || exit 0
+[ `id -u` = 0 ] || exit 4
 
 #
 # If we're not configured, then don't start anything.
 #
-[ "${NETWORKING}" = "yes" ] || exit 0
-
-
-
+[ "${NETWORKING}" = "yes" ] || exit 1
 
 ssl_certs_ok()
 {
-    if [ ! -e $SSL_PRIVKEY ] ; then
-	return 1
-    fi
-    if [ ! -e $SSL_PUBKEY ] ; then
-	return 2
-    fi
-    return 0
+	if [ ! -f "$SSL_PRIVKEY" ] ; then
+		return 1
+	fi
+	if [ ! -f "$SSL_PUBKEY" ] ; then
+		return 2
+	fi
+	return 0
 }
 
 generate_ssl_certs()
 {
-    rm -f $SSL_PUBKEY $SSL_PRIVKEY
-    echo -n "generating SSL certificates...  "
-    /usr/bin/openssl genrsa -out $SSL_PRIVKEY 2048 > /dev/null 2>&1
-    /usr/bin/openssl req -new -x509 -key $SSL_PRIVKEY -out $SSL_PUBKEY -days 1825 -config /var/lib/ricci/certs/cacert.config
-    /bin/chown $RUNASUSER:$RUNASUSER $SSL_PRIVKEY $SSL_PUBKEY
-    /bin/chmod 644 $SSL_PUBKEY
-    /bin/chmod 600 $SSL_PRIVKEY
-    echo "done"
-    return $?
+	rm -f "$SSL_PUBKEY" "$SSL_PRIVKEY"
+	echo -n "generating SSL certificates...  "
+	/usr/bin/openssl genrsa -out "$SSL_PRIVKEY" 2048 >&/dev/null
+	/usr/bin/openssl req -new -x509 -key "$SSL_PRIVKEY" -out "$SSL_PUBKEY" -days 1825 -config /var/lib/ricci/certs/cacert.config
+	/bin/chown $RUNASUSER:$RUNASUSER "$SSL_PRIVKEY" "$SSL_PUBKEY"
+	/bin/chmod 644 "$SSL_PUBKEY"
+	/bin/chmod 600 "$SSL_PRIVKEY"
+	ret=$?
+	echo "done"
+	return $ret
 }
 
 
 case $1 in
 	start)
-	        service messagebus status > /dev/null 2>&1
+		service messagebus status >&/dev/null
 		if [ $? -ne 0 ]; then
-		    service messagebus start
-		    service messagebus status > /dev/null 2>&1
-		    if [ $? -ne 0 ]; then
-			echo "not starting ricci..."
-			/usr/bin/logger -t $RICCID "startup failed"
-			exit 1
-		    fi
+			service messagebus start
+			service messagebus status >&/dev/null
+			if [ $? -ne 0 ]; then
+				echo "not starting ricci..."
+				/usr/bin/logger -t $RICCID "startup failed"
+				exit 1
+			fi
 		fi
-	        service oddjobd status > /dev/null 2>&1
+		service oddjobd status >&/dev/null
 		if [ $? -ne 0 ]; then
-		    service oddjobd start
-		    service oddjobd status > /dev/null 2>&1
-		    if [ $? -ne 0 ]; then
-			echo "not starting ricci..."
-			/usr/bin/logger -t $RICCID "startup failed"
-			exit 1
-		    fi
+			service oddjobd start
+			service oddjobd status >&/dev/null
+			if [ $? -ne 0 ]; then
+				echo "not starting ricci..."
+				/usr/bin/logger -t $RICCID "startup failed"
+				exit 1
+			fi
 		fi
 		
-		service saslauthd start > /dev/null 2>&1
-		
+		service saslauthd start >&/dev/null
 		ssl_certs_ok
 		if [ "1$?" != "10" ] ; then
-		    generate_ssl_certs
+			generate_ssl_certs
 		fi
 		
-		NewUID=`cat /etc/passwd | grep "^$RUNASUSER:" | sed -e 's/^[^:]*:[^:]*://' -e 's/:.*//'`
+		NewUID=`grep "^$RUNASUSER:" /etc/passwd | sed -e 's/^[^:]*:[^:]*://' -e 's/:.*//'`
 		echo -n $"Starting $ID: "
 		daemon $RICCID -u $NewUID
 		rtrn=$?
 		echo 
+
 		if [ $rtrn -eq 0 ]; then
-		    touch $LOCKFILE
-		    /usr/bin/logger -t $RICCID "startup succeeded"
+			touch "$LOCKFILE"
+			/usr/bin/logger -t $RICCID "startup succeeded"
 		else
-		    /usr/bin/logger -t $RICCID "startup failed"
+			/usr/bin/logger -t $RICCID "startup failed"
 		fi
-		;;
+	;;
 
-        restart)
+	restart)
 		$0 stop
 		$0 start 
 		rtrn=$?
-		;;
+	;;
 
 	status)
 		status $RICCID
 		rtrn=$?
-		;;
+	;;
 
 	stop)
 		echo -n "Shutting down $ID: "
 		killproc $RICCID SIGTERM
 		rtrn=$?
 		if [ $rtrn -eq 0 ]; then
-		    sleep 8
-		    rm -f $PIDFILE
-		    rm -f $LOCKFILE
-		    /usr/bin/logger -t $RICCID "shutdown succeeded"
+			sleep 8
+			rm -f $PIDFILE
+			rm -f $LOCKFILE
+			/usr/bin/logger -t $RICCID "shutdown succeeded"
+			rtrn=0
 		else
-		    /usr/bin/logger -t $RICCID "shutdown failed"
+			/usr/bin/logger -t $RICCID "shutdown failed"
+			rtrn=1
 		fi
-		rtrn=0
 		echo 
-		;;
+	;;
 
-        condrestart)
-               if [ -f ${PIDFILE} ] ; then
-		   $0 restart
-		   rtrn=$?
-	       fi
-	       ;;
-
-        reload)
-               rtrn=0
-	       ;;
+	condrestart)
+		if [ -f ${PIDFILE} ] ; then
+			$0 restart
+			rtrn=$?
+		fi
+	;;
+
+	reload)
+		rtrn=3
+	;;
 
 	*)
 		echo "Usage: $0 {start|stop|status|restart|condrestart|reload}"
-		rtrn=1
-		;;
-
+		rtrn=3
+	;;
 esac
 
 exit $rtrn
--- conga/ricci/modules/cluster/ClusterModule.cpp	2007/03/09 22:50:08	1.6.2.1
+++ conga/ricci/modules/cluster/ClusterModule.cpp	2007/08/09 21:29:42	1.6.2.2
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2006
+  Copyright Red Hat, Inc. 2006-2007
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
@@ -13,11 +13,12 @@
 
   You should have received a copy of the GNU General Public License
   along with this program; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge, 
+  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge,
   MA 02139, USA.
 */
 /*
  * Author: Stanko Kupcevic <kupcevic@redhat.com>
+ * Author: Ryan McCabe <rmccabe@redhat.com>
  */
 
 
@@ -27,6 +28,7 @@
 #include "Clusvcadm.h"
 #include "Fence.h"
 #include "Virt.h"
+#include "base64.h"
 
 
 using namespace std;
@@ -42,13 +44,18 @@
 static VarMap fence_node(const VarMap& args);
 static VarMap start_node(const VarMap& args);
 static VarMap stop_node(const VarMap& args);
+
 static VarMap virt_guest(const VarMap& args);
+static VarMap delete_xvm_key(const VarMap& args);
+static VarMap set_xvm_key(const VarMap& args);
+static VarMap get_xvm_key(const VarMap& args);
+static VarMap generate_xvm_key(const VarMap& args);
 
 static ApiFcnMap build_fcn_map();
 
 
 ClusterModule::ClusterModule() :
-  Module(build_fcn_map())
+	Module(build_fcn_map())
 {}
 
 ClusterModule::~ClusterModule()
@@ -58,157 +65,161 @@
 ApiFcnMap
 build_fcn_map()
 {
-  FcnMap   api_1_0;
-  api_1_0["get_cluster.conf"]                     = get_cluster_conf;
-  api_1_0["set_cluster.conf"]                     = set_cluster_conf;
-  
-  api_1_0["status"]                               = cluster_status;
-  
-  api_1_0["start_service"]                        = service_start;
-  api_1_0["stop_service"]                         = service_stop;
-  api_1_0["restart_service"]                      = service_restart;
-  api_1_0["migrate_service"]                      = service_migrate;
-  
-  api_1_0["start_node"]                           = start_node;
-  api_1_0["stop_node"]                            = stop_node;
-  api_1_0["fence_node"]                           = fence_node;
-  api_1_0["virt_guest"]                           = virt_guest;
-  
-  
-  ApiFcnMap   api_fcn_map;
-  api_fcn_map["1.0"] = api_1_0;
-  
-  return api_fcn_map;
-}
+	FcnMap	api_1_0;
+
+	api_1_0["get_cluster.conf"]		= get_cluster_conf;
+	api_1_0["set_cluster.conf"]		= set_cluster_conf;
+
+	api_1_0["status"]				= cluster_status;
+
+	api_1_0["start_service"]		= service_start;
+	api_1_0["stop_service"]			= service_stop;
+	api_1_0["restart_service"]		= service_restart;
+	api_1_0["migrate_service"]		= service_migrate;
+
+	api_1_0["start_node"]			= start_node;
+	api_1_0["stop_node"]			= stop_node;
+	api_1_0["fence_node"]			= fence_node;
 
 
-VarMap 
+	api_1_0["delete_xvm_key"]		= delete_xvm_key;
+	api_1_0["set_xvm_key"]			= set_xvm_key;
+	api_1_0["get_xvm_key"]			= get_xvm_key;
+	api_1_0["generate_xvm_key"]		= generate_xvm_key;
+	api_1_0["virt_guest"]			= virt_guest;
+
+
+	ApiFcnMap api_fcn_map;
+	api_fcn_map["1.0"] = api_1_0;
+
+	return api_fcn_map;
+}
+
+VarMap
 cluster_status(const VarMap& args)
 {
-  Variable var("status", Cluster::status());
-  
-  VarMap ret;
-  ret.insert(pair<String, Variable>(var.name(), var));
-  return ret;
+	Variable var("status", Cluster::status());
+
+	VarMap ret;
+	ret.insert(pair<String, Variable>(var.name(), var));
+	return ret;
 }
 
-VarMap 
+VarMap
 get_cluster_conf(const VarMap& args)
 {
-  Variable var("cluster.conf", ClusterConf::get());
-  
-  VarMap ret;
-  ret.insert(pair<String, Variable>(var.name(), var));
-  return ret;
+	Variable var("cluster.conf", ClusterConf::get());
+
+	VarMap ret;
+	ret.insert(pair<String, Variable>(var.name(), var));
+	return ret;
 }
 
-VarMap 
+VarMap
 set_cluster_conf(const VarMap& args)
 {
-  XMLObject conf;
-  bool propagate;
-  try {
-    VarMap::const_iterator iter = args.find("cluster.conf");
-    if (iter == args.end())
-      throw APIerror("missing cluster.conf variable");
-    conf = iter->second.get_XML();
-    
-    propagate = false;
-    iter = args.find("propagate");
-    if (iter != args.end())
-      propagate = iter->second.get_bool();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  ClusterConf::set(conf, propagate);
-  
-  VarMap ret;
-  return ret;
+	XMLObject conf;
+	bool propagate;
+
+	try {
+		VarMap::const_iterator iter = args.find("cluster.conf");
+		if (iter == args.end())
+			throw APIerror("missing cluster.conf variable");
+		conf = iter->second.get_XML();
+
+		propagate = false;
+		iter = args.find("propagate");
+		if (iter != args.end())
+			propagate = iter->second.get_bool();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	ClusterConf::set(conf, propagate);
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 service_stop(const VarMap& args)
 {
-  String name;
-  try {
-    VarMap::const_iterator iter = args.find("servicename");
-    if (iter == args.end())
-      throw APIerror("missing servicename variable");
-    name = iter->second.get_string();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Clusvcadm::stop(name);
-  
-  VarMap ret;
-  return ret;
+	String name;
+
+	try {
+		VarMap::const_iterator iter = args.find("servicename");
+		if (iter == args.end())
+			throw APIerror("missing servicename variable");
+		name = iter->second.get_string();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Clusvcadm::stop(name);
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 service_start(const VarMap& args)
 {
-  String service_name, node_name;
-  try {
-    VarMap::const_iterator iter = args.find("servicename");
-    if (iter == args.end())
-      throw APIerror("missing servicename variable");
-    service_name = iter->second.get_string();
-    
-    iter = args.find("nodename");
-    if (iter != args.end())
-      node_name = iter->second.get_string();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Clusvcadm::start(service_name, node_name);
-  
-  VarMap ret;
-  return ret;
+	String service_name, node_name;
+
+	try {
+		VarMap::const_iterator iter = args.find("servicename");
+		if (iter == args.end())
+			throw APIerror("missing servicename variable");
+		service_name = iter->second.get_string();
+
+		iter = args.find("nodename");
+		if (iter != args.end())
+			node_name = iter->second.get_string();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Clusvcadm::start(service_name, node_name);
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 service_migrate(const VarMap& args)
 {
-  String service_name, node_name;
-  try {
-    VarMap::const_iterator iter = args.find("servicename");
-    if (iter == args.end())
-      throw APIerror("missing servicename variable");
-    service_name = iter->second.get_string();
-    
-    iter = args.find("nodename");
-    if (iter != args.end())
-      node_name = iter->second.get_string();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Clusvcadm::migrate(service_name, node_name);
-  
-  VarMap ret;
-  return ret;
+	String service_name, node_name;
+	try {
+		VarMap::const_iterator iter = args.find("servicename");
+		if (iter == args.end())
+			throw APIerror("missing servicename variable");
+		service_name = iter->second.get_string();
+
+		iter = args.find("nodename");
+		if (iter != args.end())
+			node_name = iter->second.get_string();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Clusvcadm::migrate(service_name, node_name);
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 service_restart(const VarMap& args)
 {
-  String name;
-  try {
-    VarMap::const_iterator iter = args.find("servicename");
-    if (iter == args.end())
-      throw APIerror("missing servicename variable");
-    name = iter->second.get_string();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Clusvcadm::restart(name);
-  
-  VarMap ret;
-  return ret;
+	String name;
+	try {
+		VarMap::const_iterator iter = args.find("servicename");
+		if (iter == args.end())
+			throw APIerror("missing servicename variable");
+		name = iter->second.get_string();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Clusvcadm::restart(name);
+	VarMap ret;
+	return ret;
 }
 
 VarMap
@@ -221,62 +232,141 @@
 	return ret;
 }
 
-VarMap 
+VarMap
+delete_xvm_key(const VarMap& args) {
+	Virt::delete_xvm_key();
+	VarMap ret;
+	return ret;
+}
+
+VarMap
+set_xvm_key(const VarMap& args) {
+	String key_base64;
+
+	try {
+		VarMap::const_iterator iter = args.find("key_base64");
+
+		if (iter != args.end()) {
+			key_base64 = iter->second.get_string();
+		} else {
+			throw String("missing key_base64 variable");
+		}
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Virt::set_xvm_key(key_base64.c_str());
+	VarMap ret;
+	return ret;
+}
+
+VarMap
+get_xvm_key(const VarMap& args) {
+	char *key_base64 = NULL;
+
+	key_base64 = Virt::get_xvm_key();
+	Variable var("key_base64", String(key_base64));
+	memset(key_base64, 0, strlen(key_base64));
+	free(key_base64);
+
+	VarMap ret;
+	ret.insert(pair<String, Variable>(var.name(), var));
+	return ret;
+}
+
+VarMap
+generate_xvm_key(const VarMap& args) {
+	size_t key_bytes = XVM_KEY_DEFAULT_SIZE;
+
+	try {
+		VarMap::const_iterator iter = args.find("size");
+
+		if (iter != args.end()) {
+			int bytes = iter->second.get_int();
+
+			if (bytes < XVM_KEY_MIN_SIZE) {
+				char err[64];
+				snprintf(err, sizeof(err),
+					"The minimum fence_xvm key size is %u bytes",
+					XVM_KEY_MIN_SIZE);
+				throw String(err);
+			}
+
+			if (bytes > XVM_KEY_MAX_SIZE) {
+				char err[64];
+				snprintf(err, sizeof(err),
+					"The maximum fence_xvm key size is %u bytes",
+					XVM_KEY_MAX_SIZE);
+				throw String(err);
+			}
+			key_bytes = (size_t) bytes;
+		}
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Virt::generate_xvm_key(key_bytes);
+	VarMap ret;
+	return ret;
+}
+
+VarMap
 fence_node(const VarMap& args)
 {
-  String name;
-  try {
-    VarMap::const_iterator iter = args.find("nodename");
-    if (iter == args.end())
-      throw APIerror("missing nodename variable");
-    name = iter->second.get_string();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Fence::fence_node(name);
-  
-  VarMap ret;
-  return ret;
+	String name;
+
+	try {
+		VarMap::const_iterator iter = args.find("nodename");
+		if (iter == args.end())
+			throw APIerror("missing nodename variable");
+		name = iter->second.get_string();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Fence::fence_node(name);
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 start_node(const VarMap& args)
 {
-  bool cluster_startup = false;
-  try {
-    VarMap::const_iterator iter = args.find("cluster_startup");
-    if (iter != args.end())
-      cluster_startup = iter->second.get_bool();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Cluster::start_node(cluster_startup);
-  
-  VarMap ret;
-  return ret;
+	bool cluster_startup = false;
+
+	try {
+		VarMap::const_iterator iter = args.find("cluster_startup");
+		if (iter != args.end())
+			cluster_startup = iter->second.get_bool();
+		} catch ( String e ) {
+			throw APIerror(e);
+	}
+
+	Cluster::start_node(cluster_startup);
+
+	VarMap ret;
+	return ret;
 }
 
-VarMap 
+VarMap
 stop_node(const VarMap& args)
 {
-  bool cluster_shutdown = false;
-  bool purge_conf = false;
-  try {
-    VarMap::const_iterator iter = args.find("cluster_shutdown");
-    if (iter != args.end())
-      cluster_shutdown = iter->second.get_bool();
-    iter = args.find("purge_conf");
-    if (iter != args.end())
-      purge_conf = iter->second.get_bool();
-  } catch ( String e ) {
-    throw APIerror(e);
-  }
-  
-  Cluster::stop_node(cluster_shutdown,
-		     purge_conf);
-  
-  VarMap ret;
-  return ret;
+	bool cluster_shutdown = false;
+	bool purge_conf = false;
+
+	try {
+		VarMap::const_iterator iter = args.find("cluster_shutdown");
+		if (iter != args.end())
+			cluster_shutdown = iter->second.get_bool();
+
+		iter = args.find("purge_conf");
+		if (iter != args.end())
+			purge_conf = iter->second.get_bool();
+	} catch ( String e ) {
+		throw APIerror(e);
+	}
+
+	Cluster::stop_node(cluster_shutdown, purge_conf);
+	VarMap ret;
+	return ret;
 }
--- conga/ricci/modules/cluster/Makefile	2006/11/20 23:10:58	1.15
+++ conga/ricci/modules/cluster/Makefile	2007/08/09 21:29:42	1.15.2.1
@@ -25,8 +25,8 @@
 	Virt.o
 
 
-INCLUDE    += 
-CXXFLAGS   += 
+INCLUDE    += -I${top_srcdir}/common/
+CXXFLAGS   +=
 LDFLAGS    += 
 
 
--- conga/ricci/modules/cluster/Virt.cpp	2006/11/20 23:10:58	1.1
+++ conga/ricci/modules/cluster/Virt.cpp	2007/08/09 21:29:42	1.1.4.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2006
+  Copyright Red Hat, Inc. 2006-2007
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
@@ -17,6 +17,14 @@
   MA 02139, USA.
 */
 
+extern "C" {
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include "base64.h"
+}
+
 #include "Virt.h"
 #include "utils.h"
 
@@ -36,5 +44,128 @@
         if (out.find("Manufacturer: Xen") != out.npos)
             return true;
     } catch ( ... ) {}
+
     return false;
 }
+
+bool Virt::delete_xvm_key(void) {
+	return unlink(XVM_KEY_PATH) == 0;
+}
+
+bool Virt::set_xvm_key(const char *key_base64) {
+	char *buf = NULL;
+	size_t keylen;
+	size_t keylen_dec = 0;
+	ssize_t ret;
+	bool decoded = false;
+	int fd;
+	mode_t old_mask;
+	char tmpname[] = "/etc/cluster/.fence_xvm.keyXXXXXX";
+
+	if (key_base64 == NULL)
+		throw String("no key was given");
+	
+	keylen = strlen(key_base64);
+	if (keylen < 1)
+		throw String("no key was given");
+
+	decoded = base64_decode_alloc(key_base64, keylen, &buf, &keylen_dec);
+	if (!decoded || buf == NULL)
+		throw String("an invalid key was given");
+
+	old_mask = umask(077);
+
+	fd = mkstemp(tmpname);
+	umask(old_mask);
+	if (fd < 0) {
+		memset(buf, 0, keylen_dec);
+		free(buf);
+		throw String("error setting new key");
+	}
+
+	fchmod(fd, 0600);
+	ret = write(fd, buf, keylen_dec);
+	if (ret < 0 || (size_t) ret != keylen_dec) {
+		unlink(tmpname);
+		close(fd);
+		memset(buf, 0, keylen_dec);
+		free(buf);
+		throw String("error setting new key");
+	}
+
+	close(fd);
+	memset(buf, 0, keylen_dec);
+	free(buf);
+
+	if (rename(tmpname, XVM_KEY_PATH) != 0) {
+		unlink(tmpname);
+		throw String("error setting new key");
+	}
+
+	return (true);
+}
+
+bool Virt::generate_xvm_key(size_t keylen) {
+	int fd;
+	size_t ret;
+	char buf[XVM_KEY_MAX_SIZE];
+	struct stat stat;
+
+	if (keylen < XVM_KEY_MIN_SIZE || keylen > XVM_KEY_MAX_SIZE)
+		throw String("invalid key length");
+
+	fd = open("/dev/urandom", O_RDONLY);
+	if (fd < 0)
+		throw String("error generating key");
+
+	ret = read(fd, buf, keylen);
+	close(fd);
+	if ((size_t) ret != keylen)
+		throw String("error generating key");
+		
+
+	fd = open(XVM_KEY_PATH, O_WRONLY | O_EXCL | O_CREAT, 0600);
+	if (fd < 0)
+		throw String("error generating key");
+
+	ret = write(fd, buf, keylen);
+	close(fd);
+	if ((size_t) ret != keylen) {
+		unlink(XVM_KEY_PATH);
+		throw String("error generating key");
+	}
+	return (true);
+}
+
+char *Virt::get_xvm_key(void) {
+	int fd;
+	ssize_t ret;
+	size_t keylen_bin = 0;
+	size_t keylen_base64 = 0;
+	char buf[XVM_KEY_MAX_SIZE];
+	struct stat st;
+	char *key_out = NULL;
+
+	fd = open(XVM_KEY_PATH, O_RDONLY);
+	if (fd < 0)
+		throw String("error retrieving key");
+
+	if (fstat(fd, &st) != 0) {
+		close(fd);
+		throw String("error retrieving key");
+	}
+
+	ret = read(fd, buf, sizeof(buf));
+	close(fd);
+	if (ret < 0 || (off_t) ret != st.st_size) {
+		memset(buf, 0, sizeof(buf));
+		throw String("error retrieving key");
+	}
+	keylen_bin = (size_t) ret;
+
+	keylen_base64 = base64_encode_alloc(buf, keylen_bin, &key_out);
+	memset(buf, 0, sizeof(buf));
+	if (keylen_base64 < 1 || key_out == NULL)
+		throw String("error retrieving key");
+	return (key_out);
+}
--- conga/ricci/modules/cluster/Virt.h	2006/11/20 23:10:58	1.1
+++ conga/ricci/modules/cluster/Virt.h	2007/08/09 21:29:42	1.1.4.1
@@ -22,11 +22,20 @@
 
 #include "String.h"
 
-#define DMIDECODE_PATH	"/usr/sbin/dmidecode"
+#define XVM_KEY_PATH			"/etc/cluster/fence_xvm.key"
+#define XVM_KEY_MAX_SIZE		4096
+#define XVM_KEY_MIN_SIZE		128
+#define XVM_KEY_DEFAULT_SIZE	4096
+
+#define DMIDECODE_PATH			"/usr/sbin/dmidecode"
 
 class Virt {
  public:
 	static bool virt_guest(void);
+	static bool delete_xvm_key(void);
+	static bool set_xvm_key(const char *key_base64);
+	static char *get_xvm_key(void);
+	static bool generate_xvm_key(size_t key_bytes);
 };
 
 #endif
--- conga/ricci/modules/storage/VG.cpp	2007/03/30 14:42:12	1.9.2.3
+++ conga/ricci/modules/storage/VG.cpp	2007/08/09 21:29:42	1.9.2.4
@@ -354,10 +354,15 @@
   props.set(Variable("extent_size", 
 		     4 * 1024 * 1024 /* 4 MB */,
 		     ext_sizes));
-  
+
   // clustered
-  props.set(Variable("clustered", false, true));
-  
+  bool use_clustered = false;
+  try {
+    LVM::check_locking();
+    use_clustered = true;
+  } catch ( ... ) { }
+  props.set(Variable("clustered", use_clustered, true));
+
   // new sources
   VG unused(VG_PREFIX);
   for (list<counting_auto_ptr<BD> >::iterator iter = unused.sources.begin();
--- conga/ricci/modules/storage/parted_wrapper.cpp	2007/03/20 15:48:29	1.8.4.2
+++ conga/ricci/modules/storage/parted_wrapper.cpp	2007/08/09 21:29:42	1.8.4.3
@@ -678,7 +678,7 @@
     else if (s[s.size()-2] == 'g')
       multiplier = 1000 * 1000 * 1000;
     else if (s[s.size()-2] == 't')
-      multiplier = 1000 * 1000 * 1000 * 1000;
+      multiplier = (long long) 1000 * 1000 * 1000 * 1000;
   }
   
   return (long long) utils::to_float(s) * multiplier;
--- conga/ricci/ricci/SSLInstance.cpp	2006/12/06 22:34:08	1.7
+++ conga/ricci/ricci/SSLInstance.cpp	2007/08/09 21:29:43	1.7.2.1
@@ -1,5 +1,5 @@
 /*
-  Copyright Red Hat, Inc. 2005
+  Copyright Red Hat, Inc. 2005-2007
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
@@ -279,7 +279,7 @@
   if (!_accepted)
     throw String("cannot receive, yet: SSL connection not accepted");
   
-  char buff[1024];
+  char buff[4096];
   
   unsigned int beg = time_mil();
   while (time_mil() < beg + timeout) {
/cvs/cluster/conga/ricci/test_suite/cluster/delete_xvm_key.xml,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/test_suite/cluster/delete_xvm_key.xml
+++ -	2007-08-09 21:29:45.080895000 +0000
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<ricci version="1.0" function="process_batch" async="false">
+<batch>
+
+<module name="cluster">
+<request sequence="1254" API_version="1.0">
+<function_call name="delete_xvm_key" />
+</request>
+</module>
+
+</batch>
+</ricci>
+
/cvs/cluster/conga/ricci/test_suite/cluster/generate_xvm_key.xml,v  -->  standard output
revision 1.2.4.1
--- conga/ricci/test_suite/cluster/generate_xvm_key.xml
+++ -	2007-08-09 21:29:45.183050000 +0000
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+<ricci version="1.0" function="process_batch" async="false">
+<batch>
+
+<module name="cluster">
+<request sequence="1254" API_version="1.0">
+<function_call name="generate_xvm_key">
+	<var mutable="false" name="size" type="int" value="4096" />
+</function_call>
+</request>
+</module>
+
+</batch>
+</ricci>
+
/cvs/cluster/conga/ricci/test_suite/cluster/get_xvm_key.xml,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/test_suite/cluster/get_xvm_key.xml
+++ -	2007-08-09 21:29:45.352982000 +0000
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<ricci version="1.0" function="process_batch" async="false">
+<batch>
+
+<module name="cluster">
+<request sequence="1254" API_version="1.0">
+<function_call name="get_xvm_key" />
+</request>
+</module>
+
+</batch>
+</ricci>
+
/cvs/cluster/conga/ricci/test_suite/cluster/set_xvm_key.xml,v  -->  standard output
revision 1.1.4.1
--- conga/ricci/test_suite/cluster/set_xvm_key.xml
+++ -	2007-08-09 21:29:45.482916000 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<ricci version="1.0" function="process_batch" async="false">
+<batch>
+
+<module name="cluster">
+<request sequence="1254" API_version="1.0">
+<function_call name="set_xvm_key">
+	<var mutable="false" name="key_base64" type="string" value="33+Yc2b3UfmAGuvknYE2oW3r26fI/jLZYrVnmEQcnG9ANTlKBd2kFrjstZiDzWENBoOAHGCIX4p5SanuysqHZBrEmgh06FY9ZFz5Ss1unGVNzq39EQDkCIKd+rMOF8ncQTDK3RmGmNImic9Ur13w4AXgSodJJp4m3ycxh3cZDT34G1Q2ZI804FLjSSIE3UNpbtmrxLfIm5jZqquVjtQc/xRWr7MyFgu9t0a40gSVHcojYUml7PTtDkcxE6ka274qQoGLwt77Z/kR2RghuPFAoBa3quyA9V8hFtxlG8sSzTS39R82j5Y2/SNKyMJyRsSeSjNPCXlAEuTPItoCYdZghvR1F9lqXHc51nEhd+MaTCFQ5kdJZ6x1CDniCHteiA7f6a4FLMnT6R+HM7b8/MBUqd9x7iwt9aIwgppoWfTvIV+pJ8N4QrpVliUqt8ZxQ02z7D1QlIKYBGrhnsglMHv6BlZMe4ogX4YkXtV8kjSHBxYHSXvOb+LSHYT8qpQDlmAfONsj+UWsN75Af9HDTUuUcjDl05dEjxrEa/E5OAmpBixjuWrsxVjQfi/qZvETX68k1XC93YEDBwMMEej/uxfomf1BzSxlBSWX/3iXWjvxiOWXoENYLM9IYR/XmZUvq5L45bJ4KLjj178EBRyOWXHdhbD5QJLPyxRg+ePHksFsgsTp3jSqru2i1K+EFLpNGObinTNqzCtGyb0vKjuFlD2/C/IQyOGMg7mIEizJSaJvlRFtLVEJRsPN1Pi9sKXpMgaV4lzkzzGgrooz4zRXJ3cDqEKx2uqRikEakPS0jIgL41NAGlOKNQdFee4RKrB5tefVVuRdfRf8WD0XJ3Fub7YAeKosPMMP6g6aeU32HV2l7SBpxbKoeBUcNyHJ5hGn94U8LLYMJ5j0cY73o0c3AvU/vfFukzU8cLq!
 Xo8ZQ/hrmc51Evk3e5QDhaiv0huR3JbcrmAVEOnrcgXXYUiezE/mDTD+IR44xrCSqO6mWOTYMh0ZGb2roZS4rRy5kykzmbVT/D4TqFHGgpn8aIyP8qVRDhH/UOZZOCdc6um+ipi+otzVQcK9yOYD4pk0rRnJ0DBzDuebLWEvcoHuBiZFzanaEGK7R7FXy3iR9eE7O/6UVbZSsr6DhmdseAKGKQ2HQ0KJ38X1zf+6vOcV/PUvYimNKmpta2qn9pkNyWTdBRVOrS3VLRNRGtHl2uE/oW9QMpL/mY5+YsPyBR8iEcD1Ra3vknGQ0hDK+6KxPeJx1f/QGaVj7oxQze5RWoVKRuhgeWcKaomxoJ+36O5rgakNduOCIUcrGKxWHb1C3YNsDxIzYLLGHhxLVbciXGzxY5EL12GsELFnK+cdv++qkX1HsiKayBt88O0YlYK1DxFK7wMvuK7stOtfzWFI67j/LGoxBYAkXuMcaRiSzDJm5ADEUrug7L9zCp9A+LYPylPu7t2qdEG57bauEosPy48g+3+/fln//JflUOQemnRbAXLfIQxWJwG4JMYDBegJcVtOvoY+kemTP0rPlDwNgijqBwaU/JW0APCZfOUzmLSbt0jV7m46IwUMkvv9Tf2npi8rKABAY7GwuZUKU1IaDYtsEx4njgodHgRQmLvrAaNLA/7L51jI35PxJ2fsj95Iia7jUmOEIe45IpOfEBxPAHGeBUryt9hohfddBocazucGz3b+14grJ68TXJsAGcTeAe66rw/W+cXksG1W5Ih8gQ+v3xUEBoXTTgqD+336C5Lf0APqBMCCF6om0n3NBIVJ4XvqTHjx6Wbj99bTooDcDKsIJVGY3sf1FZdwdsAs85s1CY3k/j6L732jwKdtV+kdqc5VTAkOG4nqST2UFI5Qtc2umjwxDrDe8GJvQLxtMXPGZcxVW3jgsLOAasYdf6VBN79HMd0FrjfG7t2lQ+BjwEmsOS/E!
 gvWV2MjPsyX85901P0M8WSdB7nR5ETvYhQhizFLVjc4ZDY/GBEyCwg20ywEMGU!
 7Fr0r8wg
NUWWi/+gBMsXw6DS6c4Dnwj1U6rExffMOJoXum8Gcdi2N3B1vGAH99KGOFtei3E2DJNpd+EgyuJiuO8fz7EWqbokoJba9U2XMEF+9w7YrtZUOF3tmEMlabNDff/GdBFiEPC4bD7GfBE+1jhuYito7fOMXR4e16q1WDspXhD6MGmqe0xSHXqRLtAO9EErZ9RDm0ass7Uwc3gNtgKtx3Oms4kV/+P/6WTslMmQttKpVAmU1Nhw/5cuaHwuRNNDZvNuSdj4tsykkIGsrfSdiWuE/0Ts+PI17rrgxtHBZWTF10Xg/xaAvytspNHbJylSfwN4a4aBf7U7G3DYg95onD4A4KitWA18VCcP4u8M4TDj/Tyz7Tr37/DAfyLek0+NPKFLgcSuMicBovvHrziuZ+QHCquCTAWxvLC965WKpo7jQzqNZVI195b+CocV+YgV2jKeEoaTdMDjeIVGmxElBYVCKU3+y6BVQpARJ+OSqudqPNuukXR8oBCaZQlsCVkugJ+AqPObsDLTda2mjcCREopIzXhYEYGEUwU8AIMzYlw1F15ZzHzgDOG2b3tXW7TairT2KJA0ZtigVAvHGxBh7H7Z3w0s9sInNvH/bZvjWsvB7fXu9qVZxYh9QYFew7zliyvNXUH3NIJseu3njaKluHhYzPokr2RzTHKdNVeeYcFwIWEJFGnk0AYTxb7mW2ATyWJ7CQHUwAWW0n4DyUdkiOU/081x2wPn/+SuH+YvKc1bzdszoSO2zBaAZjbz7GeZJMYAZfAmigYrjSmtMAClk8BgQy0Ecmt9y/vkoPXNq7iiu7O3dNNX2zd1QXbWkYIYhbvl+Z9zWysuVqZ/sVAavUMjm8cnpWh2Rl13siarO57TL/QysyyGYzKEJw55n+Xhjral6c7NhSi4WbuTaMwpw5pSIw38YA/3XTKLI3FXvV5ZQvNKONsKW4WwHgBDkx0QiGWayLtBU8VLEsYWHWU5jIUc3JJA7QgcV!
 Swii22vlXCcmfqUJuBtV2AkVTOjUluvk9VOqR8Av3hS/iGBHHoEb8oiJUAjL2P1AqdKrmomZpfYtrVRmHOB0dbNUIq0I6sXY0v0kYzKMfu930NrJEjW1kyPJKnbTfifLlOMUYX+6HBqeSa5ml/04qYwajsG/HfgOqtlIBwOU/OilrK4wqjEIZrDR3eO6wIi2Dmeoqc5euFIfkSu2WR2AO+gxhx80lE4Kny97nykVkgK3I79hpfa7A1h0MGp6ZHKOMesGDJMtDRkCCw7ByHI/+or7ysCHfVmTVJ2nX0dpOUoK6eG+YtidtsI/8i++YLXHyZIl8y+LJHwIpLQOzbVAWoLDihrCR0INL3Z/1NCsp1UlbQwe6Ko+7YHzYGHvaVal1CKeTUmNRaX4ydwL1G57PnlYCNF9+YzLuuAKQavRd/o/LVxojlwj2LaUycfGVcXidLZmNfLulKRX7cyly0bxCuf6RNRnRdLGxnPCRu5SJJrhO9AJXKfTzWaPfIn1vUJaNfEQnhA4D1PwKRTpLlPoF/RgIlzzLY47y1o0pEQ/iRH+9W+EObka5l9Re/1K3ZKmrIJaBftpw8ynvq9sjsnR6mr4GgWGPaVkk32ywNB8MFAS0ZgDgoP2l3cKGZyKH7DifPQsO27EjulMmZHwsBdk4yrPv0Ngmz5Mg35UzkIDEqE7m/l5u27CJ5Jo5jdvio57p0DTI1Rkbr/UpsjlnWwrsq7k/bhRWbES9qXxrsI5rD3wsd1EXH4eoxyDNb4X0IkR8oD4UdGQ6JK/IZfY9hK7D0OpGatK150ftvnqabIkExve4+qdZXVIRIVYikSfbb0+2cAj4sOqr2A/TuSLwlDFLIHj1INFB4gM7qCnPQYJ4SwH86HFiBtM7tRNzT6HUNWm/qhe4tqQRYtJSH1w0kOyMXLP5yNLX57AvVzdcvURvY41DV2BgDwM8NKzSO4qNFwGs5sfyvj6uRQW21xGT7C3EHlE1QQK!
 f9sRdRnRmaVHyMOLnRK0aaPsDWhwerO6Wsz2Vm3UJ4Vvgaf9ysA08UvSzcU7mO!
 wbPTRciB
MNrx6q5+XIN7xTOYKPsPHkMRrDlyEPojIgnAUNISAhfSPNZuPwhAC5+OiKQV674GntSTOQ1X+VRRX5DtOEd8I/Z4FzPr+vLl8pgoEEJQlNi7UAeaz0Cn5YH8NlCvk62AjVJ/og9dk1SNr0tXMgQjkETxkTsGFamOx8YdENKqTXXVcE6yZurvnyMdTKDmYnLsPeQgeq2Ngfik/vshyLvssewA3sBm9a8iEYwErXWbu/9ccFXDA7KNS76IJfLSYqPKb68M78/ip6v4z8195MyXrx6Nzpalw3KUeXA/YNcx/jMouX8J2F1nN4V0pvHi1Lwi5bl1kCvbQKQNQtpQyZ0MGjTkxzKHxzzIMtd6a3BR+N8UvSUCxq66mLVPsXRgXuB2oyKE/Q5QnQhrotHCEAwF7Gd5yRQBne+7GzTBGc/JGLhni8iIaMg2lw8blQ4sTqWwNB2eJfyOZ1da4AI+YFubcj86O3XEihRwcsn8UZWu9hdsZuS/S6Al+Ocee1JqeHEM1uc07IAoVL6TW0X2Z6VrobCEB1Gkm9iS419EXLzG9vbjidpz5ORB8yRXDFuouv4hXFSGj4WGj9uew52bcyr+WbtlmBBL1/79E78twZsrVSZ9v/drLqq1Cxr/GIu386pdCfgl0AdZeqwXYuU+3dA5iYQDi1CLRZB9D8pMQovAJE4o/HG54lrmHQ1OckVQ6D9Bqr4Pb0yvCcVozXvDgvPcZnSZT3O1L2pIu0FVWbN5izTR3Yk0zWdGCiyGDjnbH7rs9A5PRsahpaoqjemLHePL12rsJnhcmFBx9sEeXkJQHEWBVot+GphFrMLmJ3LurVJgGi1nIIJ8yBqSno+wU5/kPcgneUZfei3QBuXClVVDS4K4CLs15LWjKgP7DFN88Ojdx3HXHjJyfm8tSyToQEEonw0O2O3Vr1fJHg5cEn8p7yCFY36AqjhqtsFPyZESnUsjW2sIcRhlOcvGP0LDqWko81qW7VUjA!
 AI4Yi2eDWqCsN4OnrJ8UtkYBC07oNiUNhrwV96KPXj8hM1pn7Err56wnGym0dQ1sEUXDSKZV9vMrMNv+TKCtmN1JN0wQplx0fHDl7sUmCQsWgilELEAtVmPH8U/7xe2CHTKaAwveCbu7ebWTqLE2tTd1mmgG+9V60ptZa3SZ9EU3dpMy83cF3QUhfWZiHUh8c/jpSxnw39o8FrDcXuHjjlLJGni/dDHeMH/TVa+SLx6t/uGwZpdXSmvE4ApXMtxabHNTZO8DGbwbfjeD9kL8LA9R9Td9QfMDbYPSpUXqX7Q0HHQAdyPZIftsZ/ZphDrLyveCHsTwPWo/sGKIfQgv35mAgocuobVZqHUJngNpxNppmVbwnbw/We4pla+UZFQvM7gpBkJRAtHFwu+Wlf8/Nk87ZtgPwiNgq1gaLQLORnsRJ5okyS5v223sw=="/>
+</function_call>
+</request>
+</module>
+
+</batch>
+</ricci>



             reply	other threads:[~2007-08-09 21:29 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-09 21:29 rmccabe [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-03-27  2:06 [Cluster-devel] conga/ricci common/ClientSocket.cpp common/Mak rmccabe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070809212945.6008.qmail@sourceware.org \
    --to=rmccabe@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.