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
.h> ```ddr
lets enter bits/socket.h
/* Structure describing a generic socket address. */
struct sockaddr
{
(sa_); /* Common data: address family and length. */
__SOCKADDR_COMMON 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
{
(sin_);
__SOCKADDR_COMMON ; /* Port number. */
in_port_t sin_portstruct 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)];
};