You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Joe Orton <jo...@redhat.com> on 2007/09/13 09:04:05 UTC

[PATCH] fix build with new versions of glibc

Recent releases of glibc define "open" in unistd.h as a macro, to allow 
the detection at compile time of open() invocations which have undefined 
behaviour (omitting the mode parameter when required, notably).  This is 
explicitly permitted by the POSIX specification for all function call 
interfaces it defines.

The SVN build breaks with these new glibc releases - in places where 
"foo->open(" is used, the "open(" part gets macro-expanded to 
something... undesirable.  The patch below prevents that macro expansion 
and fixes the build.

(please CC me on responses, I am not subscribed to the list)

* build/generator/swig/header_wrappers.py: Wrap generated callback
function name invocation with parentheses to prevent macro expansion
with new versions of glibc.

* subversion/libsvn_fs/fs-loader.c,
subversion/libsvn_fs_base/bdb/changes-table.c,
subversion/libsvn_fs_base/bdb/copies-table.c,
subversion/libsvn_fs_base/bdb/env.c,
subversion/libsvn_fs_base/bdb/lock-tokens-table.c,
subversion/libsvn_fs_base/bdb/locks-table.c,
subversion/libsvn_fs_base/bdb/nodes-table.c,
subversion/libsvn_fs_base/bdb/reps-table.c,
subversion/libsvn_fs_base/bdb/rev-table.c,
subversion/libsvn_fs_base/bdb/strings-table.c,
subversion/libsvn_fs_base/bdb/txn-table.c,
subversion/libsvn_fs_base/bdb/uuids-table.c,
subversion/libsvn_ra/ra_loader.c,
subversion/libsvn_ra/wrapper_template.h: Wrap use of "open"
throughout, to prevent expansion as a macro with new versions of
glibc.

Index: build/generator/swig/header_wrappers.py
===================================================================
--- build/generator/swig/header_wrappers.py	(revision 26575)
+++ build/generator/swig/header_wrappers.py	(working copy)
@@ -153,7 +153,7 @@
         type = "%s *" % struct
 
         self._write_callback(type, return_type, struct[:-2], name, params,
-                             "_obj->%s" % name)
+                             "(_obj->%s)" % name)
 
       elif match[0] and match[1]:
         # Callbacks declared as a typedef
Index: subversion/libsvn_fs_base/bdb/txn-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/txn-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/txn-table.c	(working copy)
@@ -51,9 +51,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&txns, env, 0));
-  BDB_ERR(txns->open(SVN_BDB_OPEN_PARAMS(txns, NULL),
-                     "transactions", 0, DB_BTREE,
-                     open_flags, 0666));
+  BDB_ERR((txns->open)(SVN_BDB_OPEN_PARAMS(txns, NULL),
+                       "transactions", 0, DB_BTREE,
+                       open_flags, 0666));
 
   /* Create the `next-key' table entry.  */
   if (create)
Index: subversion/libsvn_fs_base/bdb/reps-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/reps-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/reps-table.c	(working copy)
@@ -44,9 +44,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&reps, env, 0));
-  BDB_ERR(reps->open(SVN_BDB_OPEN_PARAMS(reps, NULL),
-                     "representations", 0, DB_BTREE,
-                     open_flags, 0666));
+  BDB_ERR((reps->open)(SVN_BDB_OPEN_PARAMS(reps, NULL),
+                       "representations", 0, DB_BTREE,
+                       open_flags, 0666));
 
   /* Create the `next-key' table entry.  */
   if (create)
Index: subversion/libsvn_fs_base/bdb/locks-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/locks-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/locks-table.c	(working copy)
@@ -45,9 +45,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&locks, env, 0));
-  error = locks->open(SVN_BDB_OPEN_PARAMS(locks, NULL),
-                      "locks", 0, DB_BTREE,
-                      open_flags, 0666);
+  error = (locks->open)(SVN_BDB_OPEN_PARAMS(locks, NULL),
+                        "locks", 0, DB_BTREE,
+                        open_flags, 0666);
 
   /* Create the table if it doesn't yet exist.  This is a form of
      automagical repository upgrading. */
Index: subversion/libsvn_fs_base/bdb/copies-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/copies-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/copies-table.c	(working copy)
@@ -43,9 +43,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&copies, env, 0));
-  BDB_ERR(copies->open(SVN_BDB_OPEN_PARAMS(copies, NULL),
-                       "copies", 0, DB_BTREE,
-                       open_flags, 0666));
+  BDB_ERR((copies->open)(SVN_BDB_OPEN_PARAMS(copies, NULL),
+                         "copies", 0, DB_BTREE,
+                         open_flags, 0666));
 
   /* Create the initial `next-key' table entry.  */
   if (create)
Index: subversion/libsvn_fs_base/bdb/lock-tokens-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/lock-tokens-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/lock-tokens-table.c	(working copy)
@@ -45,9 +45,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&lock_tokens, env, 0));
-  error = lock_tokens->open(SVN_BDB_OPEN_PARAMS(lock_tokens, NULL),
-                            "lock-tokens", 0, DB_BTREE,
-                            open_flags, 0666);
+  error = (lock_tokens->open)(SVN_BDB_OPEN_PARAMS(lock_tokens, NULL),
+                              "lock-tokens", 0, DB_BTREE,
+                              open_flags, 0666);
 
   /* Create the table if it doesn't yet exist.  This is a form of
      automagical repository upgrading. */
Index: subversion/libsvn_fs_base/bdb/strings-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/strings-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/strings-table.c	(working copy)
@@ -47,9 +47,9 @@
      multiple records. Note: this must occur before ->open().  */
   BDB_ERR(strings->set_flags(strings, DB_DUP));
 
-  BDB_ERR(strings->open(SVN_BDB_OPEN_PARAMS(strings, NULL),
-                        "strings", 0, DB_BTREE,
-                        open_flags, 0666));
+  BDB_ERR((strings->open)(SVN_BDB_OPEN_PARAMS(strings, NULL),
+                          "strings", 0, DB_BTREE,
+                          open_flags, 0666));
 
   if (create)
     {
Index: subversion/libsvn_fs_base/bdb/uuids-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/uuids-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/uuids-table.c	(working copy)
@@ -47,9 +47,9 @@
   BDB_ERR(db_create(&uuids, env, 0));
   BDB_ERR(uuids->set_re_len(uuids, APR_UUID_FORMATTED_LENGTH));
 
-  error = uuids->open(SVN_BDB_OPEN_PARAMS(uuids, NULL),
-                      "uuids", 0, DB_RECNO,
-                      open_flags, 0666);
+  error = (uuids->open)(SVN_BDB_OPEN_PARAMS(uuids, NULL),
+                        "uuids", 0, DB_RECNO,
+                        open_flags, 0666);
 
   /* This is a temporary compatibility check; it creates the
      UUIDs table if one does not already exist. */
Index: subversion/libsvn_fs_base/bdb/rev-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/rev-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/rev-table.c	(working copy)
@@ -41,9 +41,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&revisions, env, 0));
-  BDB_ERR(revisions->open(SVN_BDB_OPEN_PARAMS(revisions, NULL),
-                          "revisions", 0, DB_RECNO,
-                          open_flags, 0666));
+  BDB_ERR((revisions->open)(SVN_BDB_OPEN_PARAMS(revisions, NULL),
+                            "revisions", 0, DB_RECNO,
+                            open_flags, 0666));
 
   *revisions_p = revisions;
   return 0;
Index: subversion/libsvn_fs_base/bdb/env.c
===================================================================
--- subversion/libsvn_fs_base/bdb/env.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/env.c	(working copy)
@@ -563,7 +563,7 @@
   flags |= DB_THREAD;
 #endif
   SVN_ERR(convert_bdb_error
-          (bdb, bdb->env->open(bdb->env, bdb->path_bdb, flags, mode)));
+          (bdb, (bdb->env->open)(bdb->env, bdb->path_bdb, flags, mode)));
 
 #if SVN_BDB_AUTO_COMMIT
   /* Assert the BDB_AUTO_COMMIT flag on the opened environment. This
Index: subversion/libsvn_fs_base/bdb/changes-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/changes-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/changes-table.c	(working copy)
@@ -54,9 +54,9 @@
      one-per-row.  Note: this must occur before ->open().  */
   BDB_ERR(changes->set_flags(changes, DB_DUP));
 
-  BDB_ERR(changes->open(SVN_BDB_OPEN_PARAMS(changes, NULL),
-                        "changes", 0, DB_BTREE,
-                        open_flags, 0666));
+  BDB_ERR((changes->open)(SVN_BDB_OPEN_PARAMS(changes, NULL),
+                          "changes", 0, DB_BTREE,
+                          open_flags, 0666));
 
   *changes_p = changes;
   return 0;
Index: subversion/libsvn_fs_base/bdb/nodes-table.c
===================================================================
--- subversion/libsvn_fs_base/bdb/nodes-table.c	(revision 26575)
+++ subversion/libsvn_fs_base/bdb/nodes-table.c	(working copy)
@@ -50,9 +50,9 @@
 
   BDB_ERR(svn_fs_bdb__check_version());
   BDB_ERR(db_create(&nodes, env, 0));
-  BDB_ERR(nodes->open(SVN_BDB_OPEN_PARAMS(nodes, NULL),
-                      "nodes", 0, DB_BTREE,
-                      open_flags, 0666));
+  BDB_ERR((nodes->open)(SVN_BDB_OPEN_PARAMS(nodes, NULL),
+                        "nodes", 0, DB_BTREE,
+                        open_flags, 0666));
 
   /* Create the `next-key' table entry (use '1' because '0' is
      reserved for the root directory to use). */
Index: subversion/libsvn_ra/wrapper_template.h
===================================================================
--- subversion/libsvn_ra/wrapper_template.h	(revision 26575)
+++ subversion/libsvn_ra/wrapper_template.h	(working copy)
@@ -73,8 +73,8 @@
   callbacks2->progress_func = NULL;
   callbacks2->progress_baton = NULL;
 
-  SVN_ERR(VTBL.open(sess, repos_URL, callbacks2, callback_baton,
-                    config, pool));
+  SVN_ERR((VTBL.open)(sess, repos_URL, callbacks2, callback_baton,
+                      config, pool));
   *session_baton = sess;
   return SVN_NO_ERROR;
 }
Index: subversion/libsvn_ra/ra_loader.c
===================================================================
--- subversion/libsvn_ra/ra_loader.c	(revision 26575)
+++ subversion/libsvn_ra/ra_loader.c	(working copy)
@@ -459,8 +459,8 @@
   session->pool = pool;
 
   /* Ask the library to open the session. */
-  SVN_ERR(vtable->open(session, repos_URL, callbacks, callback_baton,
-                       config, pool));
+  SVN_ERR((vtable->open)(session, repos_URL, callbacks, callback_baton,
+                         config, pool));
 
   *session_p = session;
   return SVN_NO_ERROR;
Index: subversion/libsvn_fs/fs-loader.c
===================================================================
--- subversion/libsvn_fs/fs-loader.c	(revision 26575)
+++ subversion/libsvn_fs/fs-loader.c	(working copy)
@@ -392,7 +392,7 @@
   SVN_ERR(fs_library_vtable(&vtable, path, pool));
   *fs_p = svn_fs_new(fs_config, pool);
   SVN_ERR(acquire_fs_mutex());
-  err = vtable->open(*fs_p, path, pool, common_pool);
+  err = (vtable->open)(*fs_p, path, pool, common_pool);
   err2 = release_fs_mutex();
   if (err)
     {
@@ -494,7 +494,7 @@
 
   SVN_ERR(fs_library_vtable(&vtable, path, fs->pool));
   SVN_ERR(acquire_fs_mutex());
-  err = vtable->open(fs, path, fs->pool, common_pool);
+  err = (vtable->open)(fs, path, fs->pool, common_pool);
   err2 = release_fs_mutex();
   if (err)
     {

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] fix build with new versions of glibc

Posted by "Hyrum K. Wright" <hy...@mail.utexas.edu>.
Karl Fogel wrote:
> For the record: committed a fix (based on Joe's patch) in r27362.

Thanks for reporting back!  (It makes tracking patches a bit easier.)

-Hyrum


Re: [PATCH] fix build with new versions of glibc

Posted by Karl Fogel <kf...@red-bean.com>.
For the record: committed a fix (based on Joe's patch) in r27362.

-Karl

Karl Fogel <kf...@red-bean.com> writes:
> "Hyrum K. Wright" <hy...@mail.utexas.edu> writes:
>>>> On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
>>>>> Recent releases of glibc define "open" in unistd.h as a macro, to allow
>>>>> the detection at compile time of open() invocations which have undefined
>>>>> behaviour (omitting the mode parameter when required, notably).  This is
>>>>> explicitly permitted by the POSIX specification for all function call
>>>>> interfaces it defines.
>>>>>
>>>>> The SVN build breaks with these new glibc releases - in places where
>>>>> "foo->open(" is used, the "open(" part gets macro-expanded to
>>>>> something... undesirable.  The patch below prevents that macro expansion
>>>>> and fixes the build.
>>>>
>>>> Nice fix. Thanks for fixing header_wrappers.py as well.
>>>>
>>>> +1 from me on your patch.
>>> 
>>> +1 to commit.
>>
>> Did this ever get committed?
>
> For reference, folks, this is
>
>    http://svn.haxx.se/dev/archive-2007-09/0343.shtml
>
> Annoyingly, it's hard to grab a patch from a message body there, but
> we should commit this, possibly with some tweaks:
>
> For the BDB calls, we can't just rename "open" to something else,
> since it's a name imposed by BDB.  Joe's patch (wrapping the calls in
> parens) is the right solution there.
>
> For the Subversion vtables, we could just rename "open", and that
> would probably be the more maintainable solution.
>
> I don't have time to do this ATM, but I wanted to toss out these
> comments.
>
> -Karl
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
> For additional commands, e-mail: dev-help@subversion.tigris.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] fix build with new versions of glibc

Posted by Karl Fogel <kf...@red-bean.com>.
"Hyrum K. Wright" <hy...@mail.utexas.edu> writes:
>>> On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
>>>> Recent releases of glibc define "open" in unistd.h as a macro, to allow
>>>> the detection at compile time of open() invocations which have undefined
>>>> behaviour (omitting the mode parameter when required, notably).  This is
>>>> explicitly permitted by the POSIX specification for all function call
>>>> interfaces it defines.
>>>>
>>>> The SVN build breaks with these new glibc releases - in places where
>>>> "foo->open(" is used, the "open(" part gets macro-expanded to
>>>> something... undesirable.  The patch below prevents that macro expansion
>>>> and fixes the build.
>>>
>>> Nice fix. Thanks for fixing header_wrappers.py as well.
>>>
>>> +1 from me on your patch.
>> 
>> +1 to commit.
>
> Did this ever get committed?

For reference, folks, this is

   http://svn.haxx.se/dev/archive-2007-09/0343.shtml

Annoyingly, it's hard to grab a patch from a message body there, but
we should commit this, possibly with some tweaks:

For the BDB calls, we can't just rename "open" to something else,
since it's a name imposed by BDB.  Joe's patch (wrapping the calls in
parens) is the right solution there.

For the Subversion vtables, we could just rename "open", and that
would probably be the more maintainable solution.

I don't have time to do this ATM, but I wanted to toss out these
comments.

-Karl

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] fix build with new versions of glibc

Posted by "Hyrum K. Wright" <hy...@mail.utexas.edu>.
Daniel Rall wrote:
> 
> On Sep 13, 2007, at 6:55 AM, David James wrote:
> 
>> On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
>>> Recent releases of glibc define "open" in unistd.h as a macro, to allow
>>> the detection at compile time of open() invocations which have undefined
>>> behaviour (omitting the mode parameter when required, notably).  This is
>>> explicitly permitted by the POSIX specification for all function call
>>> interfaces it defines.
>>>
>>> The SVN build breaks with these new glibc releases - in places where
>>> "foo->open(" is used, the "open(" part gets macro-expanded to
>>> something... undesirable.  The patch below prevents that macro expansion
>>> and fixes the build.
>>
>> Nice fix. Thanks for fixing header_wrappers.py as well.
>>
>> +1 from me on your patch.
> 
> +1 to commit.

Did this ever get committed?

-Hyrum


Re: [PATCH] fix build with new versions of glibc

Posted by Daniel Rall <dl...@finemaltcoding.com>.
On Sep 13, 2007, at 6:55 AM, David James wrote:

> On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
>> Recent releases of glibc define "open" in unistd.h as a macro, to  
>> allow
>> the detection at compile time of open() invocations which have  
>> undefined
>> behaviour (omitting the mode parameter when required, notably).   
>> This is
>> explicitly permitted by the POSIX specification for all function call
>> interfaces it defines.
>>
>> The SVN build breaks with these new glibc releases - in places where
>> "foo->open(" is used, the "open(" part gets macro-expanded to
>> something... undesirable.  The patch below prevents that macro  
>> expansion
>> and fixes the build.
>
> Nice fix. Thanks for fixing header_wrappers.py as well.
>
> +1 from me on your patch.

+1 to commit.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Re: [PATCH] fix build with new versions of glibc

Posted by David James <ja...@cs.toronto.edu>.
On 9/13/07, Joe Orton <jo...@redhat.com> wrote:
> Recent releases of glibc define "open" in unistd.h as a macro, to allow
> the detection at compile time of open() invocations which have undefined
> behaviour (omitting the mode parameter when required, notably).  This is
> explicitly permitted by the POSIX specification for all function call
> interfaces it defines.
>
> The SVN build breaks with these new glibc releases - in places where
> "foo->open(" is used, the "open(" part gets macro-expanded to
> something... undesirable.  The patch below prevents that macro expansion
> and fixes the build.

Nice fix. Thanks for fixing header_wrappers.py as well.

+1 from me on your patch.

Cheers,

David

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org