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.hwithin 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##familyThe 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)];
};