network.h revision d54ef607275c4899e082fbeeb210346484d2e85f
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#ifndef __NETWORK_H
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#define __NETWORK_H
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#ifndef WIN32
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# include <sys/socket.h>
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# include <netinet/in.h>
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# include <netdb.h>
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen# include <arpa/inet.h>
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen#endif
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen
6daca8888bbf2b5bf26903cf397d5219ea752241Timo Sirainen#ifdef HAVE_SOCKS_H
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen#include <socks.h>
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#endif
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen#ifndef AF_INET6
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# ifdef PF_INET6
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# define AF_INET6 PF_INET6
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# else
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# define AF_INET6 10
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# endif
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#endif
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenstruct _IPADDR {
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen unsigned short family;
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#ifdef HAVE_IPV6
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen struct in6_addr ip;
d8eedfaad386a8776e4931086b039b72e1ad38c4Timo Sirainen#else
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen struct in_addr ip;
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen#endif
acc8c0647873b1c847bfa362ddefd0d219d0aa91Timo Sirainen};
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* maxmimum string length of IP address */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#ifdef HAVE_IPV6
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# define MAX_IP_LEN INET6_ADDRSTRLEN
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#else
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen# define MAX_IP_LEN 20
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#endif
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#define IPADDR_IS_V4(ip) ((ip)->family == AF_INET)
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen#define IPADDR_IS_V6(ip) ((ip)->family == AF_INET6)
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen/* returns 1 if IPADDRs are the same */
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainenint net_ip_compare(const IPADDR *ip1, const IPADDR *ip2);
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen/* Connect to socket with ip address */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_connect_ip(const IPADDR *ip, unsigned int port, const IPADDR *my_ip);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Connect to named UNIX socket */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_connect_unix(const char *path);
e6bdf53eb0143af99e3eb977ff0f8a496ecd1a8dTimo Sirainen/* Disconnect socket */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvoid net_disconnect(int fd);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Try to let the other side close the connection, if it still isn't
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen disconnected after certain amount of time, close it ourself */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvoid net_disconnect_later(int fd);
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Set socket blocking/nonblocking */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvoid net_set_nonblock(int fd, int nonblock);
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen/* Set TCP_CORK if supported, ie. don't send out partial frames.
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen Returns 0 if ok, -1 if failed. */
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainenint net_set_cork(int fd, int cork);
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen
f3e1593a7d9b02090575fb20db90a235e10145a5Timo Sirainen/* Set IP to contain INADDR_ANY for IPv4 or IPv6. The IPv6 any address may
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen include IPv4 depending on the system (Linux yes, BSD no). */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvoid net_get_ip_any4(IPADDR *ip);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenvoid net_get_ip_any6(IPADDR *ip);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Listen for connections on a socket */
aff1e150e13980354cfd794c74dac76a791a641eTimo Sirainenint net_listen(const IPADDR *my_ip, unsigned int *port);
aff1e150e13980354cfd794c74dac76a791a641eTimo Sirainen/* Listen for connections on an UNIX socket */
aff1e150e13980354cfd794c74dac76a791a641eTimo Sirainenint net_listen_unix(const char *path);
ad3a1b8f8e2a5596afb1b099a69ae6f688887eecTimo Sirainen/* Accept a connection on a socket. Returns -1 for temporary failure,
aff1e150e13980354cfd794c74dac76a791a641eTimo Sirainen -2 for fatal failure */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_accept(int fd, IPADDR *addr, unsigned int *port);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Read data from socket, return number of bytes read,
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen -1 = error, -2 = disconnected */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenssize_t net_receive(int fd, void *buf, size_t len);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Transmit data, return number of bytes sent, -1 = error, -2 = disconnected */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenssize_t net_transmit(int fd, const void *data, size_t len);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Get IP addresses for host. ips contains ips_count of IPs, they don't need
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen to be free'd. Returns 0 = ok, others = error code for net_gethosterror() */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_gethostbyname(const char *addr, IPADDR **ips, int *ips_count);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* get error of net_gethostname() */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenconst char *net_gethosterror(int error);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* return TRUE if host lookup failed because it didn't exist (ie. not
e6bdf53eb0143af99e3eb977ff0f8a496ecd1a8dTimo Sirainen some error with name server) */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_hosterror_notfound(int error);
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainen/* Get socket address/port */
9446c7a5d400cba60d097c528bd08312552438e3Timo Sirainenint net_getsockname(int fd, IPADDR *addr, unsigned int *port);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* IPADDR -> char* translation. `host' must be at least MAX_IP_LEN bytes */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_ip2host(const IPADDR *ip, char *host);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* char* -> IPADDR translation. */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_host2ip(const char *host, IPADDR *ip);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Get socket error */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint net_geterror(int fd);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen/* Get name of TCP service */
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenchar *net_getservbyport(unsigned short port);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint is_ipv4_address(const char *host);
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainenint is_ipv6_address(const char *host);
2dc6cf8bad599bfe9129bb496539a08ee3631cc0Timo Sirainen
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen#endif
b494ffed8ded8d170d9ace3dc607b1d278048241Timo Sirainen