/usr/include/sys/socket.h uses a macro called ALIGN (used by CMSG_DATA) but never defines one nor an additional header is included (<machine/param.h> has an ALIGN-macro). This circumstance causes the compiler to assume ALIGN is a function and the linker to fail. Fix: Either give socket.h an own ALIGN-macro or include <machine/param.h> in socket.h to use the ALIGN-macro of param.h. Or tell all the guys using socket.h-functions to include <machine/param.h> first. I prefer providing socket.h with an own macro, for example the one from <machine/param.h> How-To-Repeat: I hope the description makes it obvious :-)
State Changed From-To: open->feedback Are you sure you're including the correct headers in the correct order as per the socket(2) manual page? #include <sys/types.h> #include <sys/socket.h>
On Mon, 17 Jul 2000 19:33:32 +0200, Martin Kaeske wrote: > int main(void) > { > struct cmsghdr cmsg; > CMSG_DATA(&cmsg); > exit(0); > } Oh right. Geez, I remember a _huuuge_ discussion relating to this on one of the mailing lists, but I can't remember what the issue was, nor which listt. :-( I'll dig around. Ciao, Sheldon.
Right, I did some digging, which turned out to be useless. So I asked bruce Evans about the situation. This was his reply. Ciao, Sheldon. ------- Forwarded Message Date: Tue, 18 Jul 2000 23:37:32 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Sheldon Hearn <sheldonh@uunet.co.za> Subject: Re: The CMSG_*() and ALIGN() macros In-Reply-To: <48154.963919398@axl.ops.uunet.co.za> Message-ID: <Pine.BSF.4.21.0007182324480.1464-100000@besplex.bde.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII On Tue, 18 Jul 2000, Sheldon Hearn wrote: > Could you either point me at the right archive or explain why > we shouldn't mandate the inclusion of <sys/param.h> instead of > <sys/types.h> in the socket(2) manpage and others which include > <sys/socket.h>? Because <sys/socket.h> implements socket stuff, not all the goop in <sys/param.h>. > Is the final word that folks who want CMSG_*() should just know for > themselves to do the right thing? Would a new manual page for the > macros help? That is too much to ask, since we changed the interface. Here is my last saved mail from shin about this. I was essentially happy with these patches, but don't seem to have replied. I thought that shin was going to commit them, but he disappeared almost immediately after writing this. Bruce From bde Mon Apr 3 21:55:23 2000 Return-Path: <shin@nd.net.fujitsu.co.jp> Received: from fgwmail5.fujitsu.co.jp (fgwmail5.fujitsu.co.jp [192.51.44.35]) by mailman.zeta.org.au (8.8.7/8.8.7) with ESMTP id CAA15739 for <bde@zeta.org.au>; Mon, 3 Apr 2000 02:09:11 +1000 Received: from m5.gw.fujitsu.co.jp by fgwmail5.fujitsu.co.jp (8.9.3/3.7W-MX0002-Fujitsu Gateway) id BAA16840 for <bde@zeta.org.au>; Mon, 3 Apr 2000 01:09:09 +0900 (JST) (envelope-from shin@nd.net.fujitsu.co.jp) Received: from incapgw.fujitsu.co.jp by m5.gw.fujitsu.co.jp (8.9.3/3.7W-0003-Fujitsu Domain Master) id BAA27587; Mon, 3 Apr 2000 01:09:08 +0900 (JST) Received: from localhost ([192.168.245.154]) by incapgw.fujitsu.co.jp (8.9.3/3.7W-0002) id BAA11137; Mon, 3 Apr 2000 01:09:05 +0900 (JST) To: bde@zeta.org.au Subject: Re: 'machine/param.h' required for 'sys/socket.h' In-Reply-To: <Pine.BSF.4.21.0004021744400.1236-100000@alphplex.bde.org> References: <20000402074908D.shin@nd.net.fujitsu.co.jp> <Pine.BSF.4.21.0004021744400.1236-100000@alphplex.bde.org> X-Mailer: Mew version 1.94 on Emacs 20.4 / Mule 4.0 (HANANOEN) X-Prom-Mew: Prom-Mew 1.93.4 (procmail reader for Mew) Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Mon_Apr__3_01:09:57_2000_809)--" Content-Transfer-Encoding: 7bit Message-Id: <20000403011000P.shin@nd.net.fujitsu.co.jp> Date: Mon, 03 Apr 2000 01:10:00 +0900 From: Yoshinobu Inoue <shin@nd.net.fujitsu.co.jp> X-Dispatcher: imput version 990905(IM130) Content-Length: 7447 Lines: 246 Status: RO X-Status: X-Keywords: X-UID: 19734 - ----Next_Part(Mon_Apr__3_01:09:57_2000_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit > > Index: alpha/include/param.h > > =================================================================== > > RCS file: /home/ncvs/src/sys/alpha/include/param.h,v > > retrieving revision 1.17 > > diff -u -r1.17 param.h > > Similarly. Diffing the alpha version with the i386 versions shows many > gratuitous differences and bugs (broken dbtob() on alpha...). It's > interesting that the alpha version doesn't have > "#ifndef _MACHINE_PARAM_H_ ...". Yes, so maybe there is no multiple inclusion for <sys/param.h> and <sys/pipe.h>. I once tried to merge some differences between param.h for i386 and alpha, but quit it because I thought it might create new namespace pollution for the copied side. (Or is it permissible?) Also I didn't touched dbtob() macro, because I don't know what is correct fix for alpha. I attach the updated patches. Please let me know if you think other changes(like ones I withhold above) should also be fixed in this time. Yoshinobu Inoue - ----Next_Part(Mon_Apr__3_01:09:57_2000_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="namespace.diff2" Index: sys/socket.h =================================================================== RCS file: /home/ncvs/src/sys/sys/socket.h,v retrieving revision 1.39 diff -u -r1.39 socket.h - --- sys/socket.h 2000/03/11 19:51:04 1.39 +++ sys/socket.h 2000/04/02 15:09:58 @@ -37,6 +37,14 @@ #ifndef _SYS_SOCKET_H_ #define _SYS_SOCKET_H_ +#ifdef _NO_NAMESPACE_POLLUTION +#include <machine/param.h> +#else +#define _NO_NAMESPACE_POLLUTION +#include <machine/param.h> +#undef _NO_NAMESPACE_POLLUTION +#endif + /* * Definitions related to sockets: types, address families, options. */ @@ -352,20 +360,20 @@ /* given pointer to struct cmsghdr, return pointer to data */ #define CMSG_DATA(cmsg) ((u_char *)(cmsg) + \ - - ALIGN(sizeof(struct cmsghdr))) + _ALIGN(sizeof(struct cmsghdr))) /* given pointer to struct cmsghdr, return pointer to next cmsghdr */ #define CMSG_NXTHDR(mhdr, cmsg) \ - - (((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len) + \ - - ALIGN(sizeof(struct cmsghdr)) > \ + (((caddr_t)(cmsg) + _ALIGN((cmsg)->cmsg_len) + \ + _ALIGN(sizeof(struct cmsghdr)) > \ (caddr_t)(mhdr)->msg_control + (mhdr)->msg_controllen) ? \ (struct cmsghdr *)NULL : \ - - (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len))) + (struct cmsghdr *)((caddr_t)(cmsg) + _ALIGN((cmsg)->cmsg_len))) #define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control) - -#define CMSG_SPACE(l) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l)) - -#define CMSG_LEN(l) (ALIGN(sizeof(struct cmsghdr)) + (l)) +#define CMSG_SPACE(l) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(l)) +#define CMSG_LEN(l) (_ALIGN(sizeof(struct cmsghdr)) + (l)) /* "Socket"-level control message types: */ #define SCM_RIGHTS 0x01 /* access rights (array of int) */ Index: i386/include/param.h =================================================================== RCS file: /home/ncvs/src/sys/i386/include/param.h,v retrieving revision 1.55 diff -u -r1.55 param.h - --- i386/include/param.h 2000/03/29 05:39:04 1.55 +++ i386/include/param.h 2000/04/02 15:09:58 @@ -37,21 +37,37 @@ * $FreeBSD: src/sys/i386/include/param.h,v 1.55 2000/03/29 05:39:04 jlemon Exp $ */ - -#ifndef _MACHINE_PARAM_H_ - -#define _MACHINE_PARAM_H_ - - /* * Machine dependent constants for Intel 386. */ + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is unsigned int + * and must be cast to any desired pointer type. + */ +#ifndef _ALIGNBYTES +#define _ALIGNBYTES (sizeof(int) - 1) +#endif +#ifndef _ALIGN +#define _ALIGN(p) (((unsigned)(p) + _ALIGNBYTES) & ~_ALIGNBYTES) +#endif + #ifndef _MACHINE #define _MACHINE i386 #endif - -#ifndef MACHINE - -#define MACHINE "i386" - -#endif #ifndef _MACHINE_ARCH #define _MACHINE_ARCH i386 #endif + +#ifndef _NO_NAMESPACE_POLLUTION + +#ifndef _MACHINE_PARAM_H_ +#define _MACHINE_PARAM_H_ + +#ifndef MACHINE +#define MACHINE "i386" +#endif #ifndef MACHINE_ARCH #define MACHINE_ARCH "i386" #endif @@ -70,13 +86,8 @@ #define NCPUS 1 #endif - -/* - - * Round p (pointer or byte index) up to a correctly-aligned value - - * for all data types (int, long, ...). The result is unsigned int - - * and must be cast to any desired pointer type. - - */ - -#define ALIGNBYTES (sizeof(int) - 1) - -#define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES) +#define ALIGNBYTES _ALIGNBYTES +#define ALIGN(p) _ALIGN(p) #define PAGE_SHIFT 12 /* LOG2(PAGE_SIZE) */ #define PAGE_SIZE (1<<PAGE_SHIFT) /* bytes/page */ @@ -158,3 +169,4 @@ #define pgtok(x) ((x) * (PAGE_SIZE / 1024)) #endif /* !_MACHINE_PARAM_H_ */ +#endif /* !_NO_NAMESPACE_POLLUTION */ Index: alpha/include/param.h =================================================================== RCS file: /home/ncvs/src/sys/alpha/include/param.h,v retrieving revision 1.17 diff -u -r1.17 param.h - --- alpha/include/param.h 2000/02/29 08:48:10 1.17 +++ alpha/include/param.h 2000/04/02 15:09:58 @@ -46,15 +46,43 @@ /* * Machine dependent constants for the Alpha. */ + +/* + * Round p (pointer or byte index) up to a correctly-aligned value for all + * data types (int, long, ...). The result is u_long and must be cast to + * any desired pointer type. + * + * ALIGNED_POINTER is a boolean macro that checks whether an address + * is valid to fetch data elements of type t from on this architecture. + * This does not reflect the optimal alignment, just the possibility + * (within reasonable limits). + * + */ +#ifndef _ALIGNBYTES +#define _ALIGNBYTES 7 +#endif +#ifndef _ALIGN +#define _ALIGN(p) (((u_long)(p) + _ALIGNBYTES) &~ _ALIGNBYTES) +#endif +#ifndef _ALIGNED_POINTER +#define _ALIGNED_POINTER(p,t) ((((u_long)(p)) & (sizeof(t)-1)) == 0) +#endif + #ifndef _MACHINE #define _MACHINE alpha #endif - -#ifndef MACHINE - -#define MACHINE "alpha" - -#endif #ifndef _MACHINE_ARCH #define _MACHINE_ARCH alpha #endif + +#ifndef _NO_NAMESPACE_POLLUTION + +#ifndef _MACHINE_PARAM_H_ +#define _MACHINE_PARAM_H_ + +#ifndef MACHINE +#define MACHINE "alpha" +#endif #ifndef MACHINE_ARCH #define MACHINE_ARCH "alpha" #endif @@ -72,20 +100,9 @@ #define NCPUS 1 - -/* - - * Round p (pointer or byte index) up to a correctly-aligned value for all - - * data types (int, long, ...). The result is u_long and must be cast to - - * any desired pointer type. - - * - - * ALIGNED_POINTER is a boolean macro that checks whether an address - - * is valid to fetch data elements of type t from on this architecture. - - * This does not reflect the optimal alignment, just the possibility - - * (within reasonable limits). - - * - - */ - -#define ALIGNBYTES 7 - -#define ALIGN(p) (((u_long)(p) + ALIGNBYTES) &~ ALIGNBYTES) - -#define ALIGNED_POINTER(p,t) ((((u_long)(p)) & (sizeof(t)-1)) == 0) +#define ALIGNBYTES _ALIGNBYTES +#define ALIGN(p) _ALIGN(p) +#define ALIGNED_POINTER(p,t) _ALIGNED_POINTER(p,t) #define PAGE_SIZE (1 << ALPHA_PGSHIFT) /* bytes/page */ #define PAGE_SHIFT ALPHA_PGSHIFT @@ -161,3 +178,6 @@ #define alpha_ptob(x) ((unsigned long)(x) << PAGE_SHIFT) #define pgtok(x) ((x) * (PAGE_SIZE / 1024)) + +#endif /* !_MACHINE_PARAM_H_ */ +#endif /* !_NO_NAMESPACE_POLLUTION */ - ----Next_Part(Mon_Apr__3_01:09:57_2000_809)---- ------- End of Forwarded Message
State Changed From-To: feedback->open After some research, it appears that Yoshinobu Inoue has already formulated a proposed patch for this. Unfortunately, Inoue-san is unavailable at present, so what this PR really needs now is for some brave soul to step into the quagmire.
Why doesn't we simply add an ALIGN macro to socket.h? Something like : #ifdef ALIGNBYTES #define ALIGNBYTES (sizeof(int) - 1) #ifdef ALIGN #define ALIGN(p) (((unsigned)(p) + ALIGNBYTES) & ~ALIGNBYTES) #endif /* ALIGN */ #endif /* ALIGNBYTES */ I think it's better than including <machine/param.h> just for a single macro,
Responsible Changed From-To: freebsd-bugs->asmodai I'm working on solving this issue.
State Changed From-To: open->feedback CURRENT now has a solution in the source code. This will be revisited soon since Bruce Evans had some improvements. But this should at least remove the bogus dependency introduced in the header files. 4-STABLE will be done as soon as the solution in CURRENT is final.
State Changed From-To: feedback->closed Fix present in both CURRENT and 4.2-STABLE.