081012

|



ここずっと毎日削ってはニス塗りを繰り返していた、机の天板。かなりピカピ
カに。もうちょっと鏡面目指して続けます。



PowerEdge T105に試しにXサーバ入れてみたとこ、僕なら(文字が読めて、緑が 緑に見れればいいいいよレベル)十分使えるレベルのビデオカードだった。 (ML115はさすがに無理だと思ったけれど)、騒音レベルもかなり低いし、これならデスクトップ用に もう一台注文しておいてもよかったかも。
xorg-server-1.4.2になってxorgcfgがなくなってしまった。かなり便利だったの に。meta-pkgsから入れただけだとfont-sony-miscが入らないので8x16がない。ちょっとはまった。
amd64だと自前の日記ツールからxmlrpcを介してMovabletypeにコミットするプ ログラムが動かない。昨日は仕方なくi386からコミットしたのだけど、ちょこっ と様子を見てみることに。
デバッガで追うとva_argsで死んでいる...。半日かけてデバッグしてみたとこ ろ va_list pointers, bad(?) gcc codeのスレ だった。結局この仕様のままなんだ! 驚いたよ。
動かない理由はこれ。
#include <stdio.h>
#include <stdarg.h>

/*

i386 cc
1:ohayo
2:desu
3:yo
4:desu

amd64 cc
1:ohayo
2:(文字化け)
3:(文字化け)
Segmentation fault (core dumped)

 */
void foo (char *, ...);
void bar (va_list *);

void
bar (va_list *p)
{
  printf ("2:%s\n", va_arg(*p, char *));
  printf ("3:%s\n", va_arg(*p, char *));
}

void
b (va_list p)
{
  bar (&p);
}

void
foo(char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  printf ("1:%s\n", va_arg(ap, char *));
  b (ap);
  printf ("4:%s\n", va_arg(ap, char *));
  va_end (ap);
}

int
main ()
{
  foo ("ss", "ohayo", "desu", "yo", "!");

  return 0;
}
amd64とi386でva_listの定義が違っていてどうにもならない。amd64上でc++な らコンパイルが通らないからわかるのだけど、ccだとコンパイルは通って動か ないのでいやらしい。これを下のようにva_listを値で渡しているところをポイ ンタにしてva_copyして下に渡さないと(ポインタ渡しのところはそのまま) i386と同じ挙動にならない。vprintfの挙動もi386はインクリメントしないのに amd64だとインクリメントするので挙動を合わせるためにva_argにしてあります。
#include <stdio.h>
#include <stdarg.h>

/*
i386 cc
1:ohayo
2:desu
3:yo
4:desu

amd64 cc
1:ohayo
2:desu
3:yo
4:desu


 */
void foo (char *, ...);
void bar (va_list *);

void
bar (va_list *p)
{
  printf ("2:%s\n", va_arg(*p, char *));
  printf ("3:%s\n", va_arg(*p, char *));
}

void
b (va_list *p)
{
  va_list q;
  va_copy (q, *p);
  bar (&q);
}

void
foo(char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  printf ("1:%s\n", va_arg(ap, char *));
  b (&ap);
  printf ("4:%s\n", va_arg(ap, char *));
  va_end (ap);
}

int
main ()
{
  foo ("ss", "ohayo", "desu", "yo", "!");

  return 0;
}

xmlrpc-cの該当部分を延々と書き換えてなんとか動くようになったかも。しか しこんなきっついのがあってよくもまぁamd64使えてるなと驚いた。それと xmlrpc-cなんて誰も使ってなさそうということも...^^。
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h xmlrpc-c-1.09.00/include/xmlrpc-c/base.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/base.h	2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/base.h	2008-10-12 21:16:45.000000000 +0900
@@ -417,7 +417,7 @@
 void
 xmlrpc_build_value_va(xmlrpc_env *    const env,
                       const char *    const format,
-                      va_list               args,
+                      va_list               *args,
                       xmlrpc_value ** const valPP,
                       const char **   const tailP);
 
@@ -431,7 +431,7 @@
 xmlrpc_decompose_value_va(xmlrpc_env *   const envP,
                           xmlrpc_value * const value,
                           const char *   const format,
-                          va_list              args);
+                          va_list              *args);
 
 /* xmlrpc_parse_value... is the same as xmlrpc_decompose_value... except
    that it doesn't do proper memory management -- it returns xmlrpc_value's
@@ -451,7 +451,7 @@
 xmlrpc_parse_value_va(xmlrpc_env *   const envP,
                       xmlrpc_value * const value,
                       const char *   const format,
-                      va_list              args);
+                      va_list              *args);
 
 /*=========================================================================
 **  Encoding XML
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/string_int.h	2006-09-25 05:00:00.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/string_int.h	2008-10-12 21:18:24.000000000 +0900
@@ -17,7 +17,7 @@
 void
 xmlrpc_vasprintf(const char ** const retvalP,
                  const char *  const fmt,
-                 va_list             varargs);
+                 va_list             *varargs);
 
 void GNU_PRINTF_ATTR(2,3)
 xmlrpc_asprintf(const char ** const retvalP, const char * const fmt, ...);
diff -ur xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h xmlrpc-c-1.09.00/include/xmlrpc-c/util.h
--- xmlrpc-c-1.09.00.orig/include/xmlrpc-c/util.h	2006-12-24 06:45:21.000000000 +0900
+++ xmlrpc-c-1.09.00/include/xmlrpc-c/util.h	2008-10-12 21:21:39.000000000 +0900
@@ -140,7 +140,7 @@
 xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
                              int          const code,
                              const char * const format,
-                             va_list      const args);
+                             va_list      const *__args);
 
 /* The same as the above, but using a printf-style format string. */
 void 
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c xmlrpc-c-1.09.00/lib/libutil/casprintf.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/casprintf.c	2006-07-30 06:49:02.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/casprintf.c	2008-10-12 21:20:25.000000000 +0900
@@ -11,7 +11,9 @@
 static __inline__ void
 simpleVasprintf(char **      const retvalP,
                 const char * const fmt,
-                va_list            varargs) {
+                va_list            *__varargs) {
+  va_list ap;
+  va_copy (ap, *__varargs);
 /*----------------------------------------------------------------------------
    This is a poor man's implementation of vasprintf(), of GNU fame.
 -----------------------------------------------------------------------------*/
@@ -21,12 +23,12 @@
     result = malloc(initialSize);
     if (result != NULL) {
         size_t bytesNeeded;
-        bytesNeeded = vsnprintf(result, initialSize, fmt, varargs);
+        bytesNeeded = vsnprintf(result, initialSize, fmt, ap);
         if (bytesNeeded > initialSize) {
             free(result);
             result = malloc(bytesNeeded);
             if (result != NULL)
-                vsnprintf(result, bytesNeeded, fmt, varargs);
+                vsnprintf(result, bytesNeeded, fmt, ap);
         } else if (bytesNeeded == initialSize) {
             if (result[initialSize-1] != '\0') {
                 /* This is one of those old systems where vsnprintf()
@@ -53,14 +55,15 @@
 void
 xmlrpc_vasprintf(const char ** const retvalP,
                  const char *  const fmt,
-                 va_list             varargs) {
-    
+                 va_list             *__varargs) {
+  va_list ap;
+  va_copy (ap, *__varargs);
     char * string;
 
 #if HAVE_ASPRINTF
-    vasprintf(&string, fmt, varargs);
+    vasprintf(&string, fmt, ap);
 #else
-    simpleVasprintf(&string, fmt, varargs);
+    simpleVasprintf(&string, fmt, &ap);
 #endif
 
     if (string == NULL)
diff -ur xmlrpc-c-1.09.00.orig/lib/libutil/error.c xmlrpc-c-1.09.00/lib/libutil/error.c
--- xmlrpc-c-1.09.00.orig/lib/libutil/error.c	2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/lib/libutil/error.c	2008-10-12 21:23:14.000000000 +0900
@@ -79,11 +79,12 @@
 xmlrpc_set_fault_formatted_v(xmlrpc_env * const envP,
                              int          const code,
                              const char * const format,
-                             va_list      const args) {
-
+                             va_list      const *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     char buffer[ERROR_BUFFER_SZ];
 
-    vsnprintf(buffer, ERROR_BUFFER_SZ, format, args);
+    vsnprintf(buffer, ERROR_BUFFER_SZ, format, ap);
 
     /* vsnprintf is guaranteed to terminate the buffer, but we're paranoid. */
     buffer[ERROR_BUFFER_SZ - 1] = '\0';
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp xmlrpc-c-1.09.00/src/cpp/client_simple.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/client_simple.cpp	2006-02-05 04:25:18.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/client_simple.cpp	2008-10-12 20:56:36.000000000 +0900
@@ -71,9 +71,11 @@
 void
 makeParamArray(string          const format,
                xmlrpc_value ** const paramArrayPP,
-               va_list               args) {
+               va_list               *__args) {
     
     env_wrap env;
+    va_list ap;
+    va_copy (ap, *__args);
 
     /* The format is a sequence of parameter specifications, such as
        "iiii" for 4 integer parameters.  We add parentheses to make it
@@ -83,7 +85,7 @@
     const char * tail;
 
     xmlrpc_build_value_va(&env.env_c, arrayFormat.c_str(),
-                          args, paramArrayPP, &tail);
+                          &ap, paramArrayPP, &tail);
 
     if (env.env_c.fault_occurred)
         throw(error(env.env_c.fault_string));
@@ -118,7 +120,7 @@
 
     va_list args;
     va_start(args, resultP);
-    makeParamArray(format, ¶mArrayP, args);
+    makeParamArray(format, ¶mArrayP, &args);
     va_end(args);
 
     if (env.env_c.fault_occurred)
diff -ur xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp xmlrpc-c-1.09.00/src/cpp/girerr.cpp
--- xmlrpc-c-1.09.00.orig/src/cpp/girerr.cpp	2006-03-23 08:44:44.000000000 +0900
+++ xmlrpc-c-1.09.00/src/cpp/girerr.cpp	2008-10-12 21:20:40.000000000 +0900
@@ -14,7 +14,7 @@
     va_start(varargs, format);
 
     const char * value;
-    xmlrpc_vasprintf(&value, format, varargs);
+    xmlrpc_vasprintf(&value, format, &varargs);
     
     string const valueString(value);
 
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c xmlrpc-c-1.09.00/src/xmlrpc_build.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_build.c	2008-10-12 17:54:34.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_build.c	2008-10-12 20:54:59.000000000 +0900
@@ -424,12 +424,14 @@
 void
 xmlrpc_build_value_va(xmlrpc_env *    const envP,
                       const char *    const format,
-                      va_list               args,
+                      va_list               *__args,
                       xmlrpc_value ** const valPP,
                       const char **   const tailP) {
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT(format != NULL);
+    va_list ap;
+    va_copy (ap, *__args);
 
     if (strlen(format) == 0)
         xmlrpc_faultf(envP, "Format string is empty.");
@@ -437,7 +439,7 @@
         const char * formatCursor;
 
         formatCursor = &format[0];
-        getValue(envP, &formatCursor, &args, valPP);
+        getValue(envP, &formatCursor, &ap, valPP);
         
         if (!envP->fault_occurred)
             XMLRPC_ASSERT_VALUE_OK(*valPP);
@@ -458,7 +460,7 @@
     const char * suffix;
 
     va_start(args, format);
-    xmlrpc_build_value_va(envP, format, args, &retval, &suffix);
+    xmlrpc_build_value_va(envP, format, &args, &retval, &suffix);
     va_end(args);
 
     if (!envP->fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c xmlrpc-c-1.09.00/src/xmlrpc_client.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client.c	2007-01-01 11:14:06.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client.c	2008-10-12 21:11:24.000000000 +0900
@@ -633,11 +633,13 @@
                 const char *               const methodName,
                 const char *               const format,
                 xmlrpc_value **            const resultPP,
-                va_list                          args) {
+                va_list                          *__args) {
 
     xmlrpc_value * argP;
     xmlrpc_env argenv;
     const char * suffix;
+    va_list ap;
+    va_copy (ap, *__args);
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT_PTR_OK(serverUrl);
@@ -647,7 +649,7 @@
 
     /* Build our argument value. */
     xmlrpc_env_init(&argenv);
-    xmlrpc_build_value_va(&argenv, format, args, &argP, &suffix);
+    xmlrpc_build_value_va(&argenv, format, &ap, &argP, &suffix);
     if (argenv.fault_occurred)
         xmlrpc_env_set_fault_formatted(
             envP, argenv.fault_code, "Invalid RPC arguments.  "
@@ -696,7 +698,7 @@
 
     va_start(args, format);
     clientCall2f_va(envP, clientP, serverUrl,
-                    methodName, format, resultPP, args);
+                    methodName, format, resultPP, &args);
     va_end(args);
 }
 
@@ -969,7 +971,7 @@
 
     /* Build our argument array. */
     va_start(args, format);
-    xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+    xmlrpc_build_value_va(envP, format, &args, ¶mArrayP, &suffix);
     va_end(args);
     if (!envP->fault_occurred) {
         if (*suffix != '\0')
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c xmlrpc-c-1.09.00/src/xmlrpc_client_global.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_client_global.c	2006-04-10 23:17:01.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_client_global.c	2008-10-12 21:09:55.000000000 +0900
@@ -127,15 +127,16 @@
               const xmlrpc_server_info * const serverInfoP,
               const char *               const methodName,
               const char *               const format,
-              va_list                          args,
+              va_list                          *__args,
               xmlrpc_value **            const resultPP) {
-
+  va_list ap;
+  va_copy (ap, *__args);
     validateGlobalClientExists(envP);
     if (!envP->fault_occurred) {
         xmlrpc_value * paramArrayP;
         const char * suffix;
         
-        xmlrpc_build_value_va(envP, format, args, ¶mArrayP, &suffix);
+        xmlrpc_build_value_va(envP, format, &ap, ¶mArrayP, &suffix);
         
         if (!envP->fault_occurred) {
             if (*suffix != '\0')
@@ -171,7 +172,7 @@
         va_list args;
         va_start(args, format);
     
-        clientCall_va(envP, serverInfoP, methodName, format, args, &resultP);
+        clientCall_va(envP, serverInfoP, methodName, format, &args, &resultP);
 
         va_end(args);
         xmlrpc_server_info_free(serverInfoP);
@@ -193,7 +194,7 @@
     xmlrpc_value * resultP;
 
     va_start(args, format);
-    clientCall_va(envP, serverP, methodName, format, args, &resultP);
+    clientCall_va(envP, serverP, methodName, format, &args, &resultP);
     va_end(args);
 
     return resultP;
@@ -305,7 +306,7 @@
         va_list args;
     
         va_start(args, format);
-        xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+        xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
         va_end(args);
     
         if (!env.fault_occurred) {
@@ -371,7 +372,7 @@
     xmlrpc_env_init(&env);
 
     va_start(args, format);
-    xmlrpc_build_value_va(&env, format, args, ¶mArrayP, &suffix);
+    xmlrpc_build_value_va(&env, format, &args, ¶mArrayP, &suffix);
     va_end(args);
 
     if (!env.fault_occurred) {
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c xmlrpc-c-1.09.00/src/xmlrpc_decompose.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.c	2006-09-20 16:34:49.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_decompose.c	2008-10-12 21:14:32.000000000 +0900
@@ -1022,14 +1022,15 @@
 static void
 createDecompTree(xmlrpc_env *             const envP,
                  const char *             const format,
-                 va_list                        args,
+                 va_list                        *__args,
                  struct decompTreeNode ** const decompRootPP) {
-
+  va_list ap;
+  va_copy (ap, *__args);
     const char * formatCursor;
     struct decompTreeNode * decompRootP;
 
     formatCursor = &format[0];
-    createDecompTreeNext(envP, &formatCursor, &args, &decompRootP);
+    createDecompTreeNext(envP, &formatCursor, &ap, &decompRootP);
     if (!envP->fault_occurred) {
         if (*formatCursor != '\0')
             xmlrpc_faultf(envP, "format string '%s' has garbage at the end: "
@@ -1051,15 +1052,16 @@
                xmlrpc_value * const valueP,
                bool           const oldstyleMemMgmt,
                const char *   const format,
-               va_list              args) {
-
+               va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     struct decompTreeNode * decompRootP;
 
     XMLRPC_ASSERT_ENV_OK(envP);
     XMLRPC_ASSERT_VALUE_OK(valueP);
     XMLRPC_ASSERT(format != NULL);
 
-    createDecompTree(envP, format, args, &decompRootP);
+    createDecompTree(envP, format, &ap, &decompRootP);
 
     if (!envP->fault_occurred) {
         decomposeValueWithTree(envP, valueP, oldstyleMemMgmt, decompRootP);
@@ -1074,11 +1076,12 @@
 xmlrpc_decompose_value_va(xmlrpc_env *   const envP,
                           xmlrpc_value * const valueP,
                           const char *   const format,
-                          va_list              args) {
-
+                          va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     bool const oldstyleMemMgtFalse = false;
 
-    decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, args);
+    decomposeValue(envP, valueP, oldstyleMemMgtFalse, format, &ap);
 }
 
 
@@ -1092,7 +1095,7 @@
     va_list args;
 
     va_start(args, format);
-    xmlrpc_decompose_value_va(envP, value, format, args);
+    xmlrpc_decompose_value_va(envP, value, format, &args);
     va_end(args);
 }
 
@@ -1102,11 +1105,12 @@
 xmlrpc_parse_value_va(xmlrpc_env *   const envP,
                       xmlrpc_value * const valueP,
                       const char *   const format,
-                      va_list              args) {
-
+                      va_list              *__args) {
+  va_list ap;
+  va_copy (ap, *__args);
     bool const oldstyleMemMgmtTrue = true;
 
-    decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, args);
+    decomposeValue(envP, valueP, oldstyleMemMgmtTrue, format, &ap);
 }
 
 
@@ -1120,6 +1124,6 @@
     va_list args;
 
     va_start(args, format);
-    xmlrpc_parse_value_va(envP, value, format, args);
+    xmlrpc_parse_value_va(envP, value, format, &args);
     va_end(args);
 }
Only in xmlrpc-c-1.09.00/src: xmlrpc_decompose.c~
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_decompose.o and xmlrpc-c-1.09.00/src/xmlrpc_decompose.o differ
Binary files xmlrpc-c-1.09.00.orig/src/xmlrpc_expat.o and xmlrpc-c-1.09.00/src/xmlrpc_expat.o differ
diff -ur xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c xmlrpc-c-1.09.00/src/xmlrpc_parse.c
--- xmlrpc-c-1.09.00.orig/src/xmlrpc_parse.c	2006-09-04 06:52:31.000000000 +0900
+++ xmlrpc-c-1.09.00/src/xmlrpc_parse.c	2008-10-12 21:14:54.000000000 +0900
@@ -76,7 +76,7 @@
 
     va_list args;
     va_start(args, format);
-    xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, args);
+    xmlrpc_set_fault_formatted_v(envP, XMLRPC_PARSE_ERROR, format, &args);
     va_end(args);
 }