Linux and C header location

Posted on July 1, 2014
Tags: c

#include <something> is located in /usr/include or /usr/local/include

1 get the list of header files associated with a apt package

dpkg -L libssl-dev | grep '\.h$'

2 find

Finding where the C headers are located and how to use them

#include <sys/socket.h>
man socket

find /usr/include -name socket.h
#sometimes need to search in /usr/
find /usr/ -name socket.h

within sys/socket.h we see some related libraries

#include <bits/socket.h>
#include <bits/types/struct_osockaddr.h>
#include <bits/socka
```ddr.h>

lets enter bits/socket.h

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];           /* Address data.  */
  };

3 grep -rs

What is __SOCKADDR_COMMON ?

grep -rs "__SOCKADDR_COMMON"
#output>
#socket.h:    __SOCKADDR_COMMON (sa_);   /* Common data: address family and length.  */
#socket.h:  (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
#socket.h:    __SOCKADDR_COMMON (ss_);   /* Address family, etc.  */
-->#sockaddr.h:#define      __SOCKADDR_COMMON(sa_prefix) \
#sockaddr.h:#define __SOCKADDR_COMMON_SIZE       (sizeof (unsigned short int))

lets check sockaddr.h

typedef unsigned short int sa_family_t;

#define __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family

The backslash \ just means multiline.
__SOCKADDR_COMMON takes an argument sa_prefix
double ## means concat

If you give it SA_ as input, you get
typedef unsigned short int sa_family_t SA_family as the output


struct sockaddr_in is what we want which is in /usr/include/netinet/in.h

struct sockaddr_in
{
  __SOCKADDR_COMMON (sin_);
  in_port_t sin_port;           /* Port number.  */
  struct in_addr sin_addr;      /* Internet address.  */

  /* Pad to size of `struct sockaddr'.  */
  unsigned char sin_zero[sizeof (struct sockaddr) -
             __SOCKADDR_COMMON_SIZE -
             sizeof (in_port_t) -
             sizeof (struct in_addr)];
};