Hi all, I was just trying to compile gnome-keyring with Clang (from the LLVM project) and it seems it doesn't support this construct (which makes a lot of sense in my opinion): const int i = 5; union { char foo[i]; } bar; The attached patch makes gnome-keyring build with Clang. This is actually the first package I'm seeing that actually uses this construct (nowhere used in FreeBSD, Xorg, etc). -- Ed Schouten <ed 80386 nl> WWW: http://80386.nl/
--- common/gkr-unix-credentials.c +++ common/gkr-unix-credentials.c @@ -50,16 +50,12 @@ * remote PID. */ #if defined(HAVE_CMSGCRED) struct cmsgcred *cred; - const size_t cmsglen = CMSG_LEN (sizeof (struct cmsgcred)); - const size_t cmsgspace = CMSG_SPACE (sizeof (struct cmsgcred)); #else /* defined(LOCAL_CREDS) */ struct sockcred *cred; - const size_t cmsglen = CMSG_LEN (sizeof (struct sockcred)); - const size_t cmsgspace = CMSG_SPACE (sizeof (struct sockcred)); #endif union { struct cmsghdr hdr; - char cred[cmsgspace]; + char cred[CMSG_SPACE(sizeof *cred)]; } cmsg; #endif @@ -80,7 +76,7 @@ #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) memset (&cmsg, 0, sizeof (cmsg)); msg.msg_control = (caddr_t) &cmsg; - msg.msg_controllen = cmsgspace; + msg.msg_controllen = CMSG_SPACE(sizeof *cred); #endif again: @@ -102,7 +98,8 @@ } #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) - if (cmsg.hdr.cmsg_len < cmsglen || cmsg.hdr.cmsg_type != SCM_CREDS) { + if (cmsg.hdr.cmsg_len < CMSG_LEN(sizeof *cred) || + cmsg.hdr.cmsg_type != SCM_CREDS) { fprintf (stderr, "message from recvmsg() was not SCM_CREDS\n"); return -1; }
Attachment:
pgpIMGnb57fR3.pgp
Description: PGP signature