SCIENTIFIC-LINUX-USERS Archives

January 2016

SCIENTIFIC-LINUX-USERS@LISTSERV.FNAL.GOV

Options: Use Monospaced Font
Show Text Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
André Hartmann <[log in to unmask]>
Reply To:
André Hartmann <[log in to unmask]>
Date:
Thu, 14 Jan 2016 16:29:41 +0100
Content-Type:
text/plain
Parts/Attachments:
text/plain (94 lines)
Dear Mark,

thanks for your investigation.

Indeed, I had included linux/can.h before sys/socket.h (which includes 
bits/sockaddr.h, and should *not* be included directly) so the compiler 
struggled.

After swapping the include lines, and including sys/socket.h before 
linux/can.h, it compiles fine.

So again, many thanks!

Best regards,
André


Am 14.01.2016 um 15:33 schrieb Mark Stodola:
> On 01/14/2016 04:06 AM, André Hartmann wrote:
>> Hello List,
>>
>> I have written a program which uses SocketCAN for CAN communication.
>> The development takes place under Ubuntu Linux and compilation is fine
>> there (also cross-compilation for an embedded ARM Linux).
>>
>> But when I compile my program under Scientific Linux 6.7, I get the
>> following errors:
>>
>> "
>> In file included from socket_can/receivethread.h:6,
>>                   from socket_can/receivethread.c:4:
>> /usr/include/linux/can.h:81: error: expected specifier-qualifier-list
>> before 'sa_family_t'
>> socket_can/receivethread.c: In function 'receivethread_init':
>> socket_can/receivethread.c:52: error: 'struct sockaddr_can' has no
>> member named 'can_family'
>> socket_can/receivethread.c:53: error: 'struct sockaddr_can' has no
>> member named 'can_ifindex'
>> "
>>
>> Searching for the definition of sa_family_t gave a lot of usages,
>> but no definition:
>>
>> $ cd /usr/include/linux
>> $ grep -r sa_family_t
>> llc.h:    sa_family_t     sllc_family;    /* AF_LLC */
>> llc.h:    sa_family_t    sllc_arphrd;    /* ARPHRD_ETHER */
>> llc.h:    unsigned char   __pad[__LLC_SOCK_SIZE__ - sizeof(sa_family_t)
>> * 2 -
>> rose.h:    sa_family_t    srose_family;
>> rose.h:    sa_family_t    srose_family;
>> x25.h:    sa_family_t       sx25_family;        /* Must be AF_X25 */
>> if_pppox.h:       sa_family_t     sa_family;            /* address
>> family, AF_PPPOX */
>> if_pppox.h:    sa_family_t     sa_family;      /* address family,
>> AF_PPPOX */
>> in.h:  sa_family_t        sin_family;    /* Address family        */
>> ax25.h:    sa_family_t    sax25_family;
>> ipx.h:    sa_family_t    sipx_family;
>> netlink.h:#include <linux/socket.h> /* for sa_family_t */
>> netlink.h:    sa_family_t    nl_family;    /* AF_NETLINK    */
>> can.h:    sa_family_t can_family;
>> phonet.h:    sa_family_t spn_family;
>> phonet.h:    __u8 spn_zero[sizeof(struct sockaddr) - sizeof(sa_family_t)
>> - 3];
>> un.h:    sa_family_t sun_family;    /* AF_UNIX */
>> irda.h:    sa_family_t sir_family;   /* AF_IRDA */
>> atalk.h:    sa_family_t      sat_family;
>>
>> If I add the typedef to socket.h, everything is fine until the next
>> kernel update:
>>
>> typedef unsigned short sa_family_t;
>>
>> The system is:
>>
>> $ uname -a
>> Linux sl67-x64 2.6.32-573.12.1.el6.x86_64 #1 SMP Tue Dec 15 08:24:23 CST
>> 2015 x86_64 x86_64 x86_64 GNU/Linux
>>
>> Any opinion on this?
>>
>> Best regards,
>> André
>
> It looks like sa_family_t has been morphing over time.  In SL5, it is
> indeed defined in linux/socket.h.  In SL6 I find it defined in
> bits/sockaddr.h.  In SL7 it continues to be in bits/sockaddr.h, but
> there is also __kernel_sa_family_t defined in linux/socket.h.
>
> Try adding bits/sockaddr.h to your includes.
>
> -Mark

ATOM RSS1 RSS2