bundle inet_ntop in systems that don't have it
[gnutls:gnutls.git] / lib / system.h
1 /*
2  * Copyright (C) 2010-2012 Free Software Foundation, Inc.
3  *
4  * Author: Nikos Mavrogiannopoulos
5  *
6  * This file is part of GnuTLS.
7  *
8  * The GnuTLS is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; either version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>
20  *
21  */
22
23 #ifndef SYSTEM_H
24 #define SYSTEM_H
25
26 #include <gnutls_int.h>
27 #include <time.h>
28 #include <sys/time.h>
29
30 #ifndef _WIN32
31 #include <sys/uio.h>            /* for writev */
32 #else
33 #include <windows.h>            /* for Sleep */
34 #endif
35
36 #ifdef _POSIX_PATH_MAX
37 # define GNUTLS_PATH_MAX _POSIX_PATH_MAX
38 #else
39 # define GNUTLS_PATH_MAX 256
40 #endif
41
42 int system_errno(gnutls_transport_ptr_t);
43
44 #ifdef _WIN32
45 ssize_t system_write(gnutls_transport_ptr_t ptr, const void *data,
46                      size_t data_size);
47 #else
48 #define HAVE_WRITEV
49 ssize_t system_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec,
50                       int iovec_cnt);
51 #endif
52 ssize_t system_read(gnutls_transport_ptr_t ptr, void *data,
53                     size_t data_size);
54
55 #if defined(_WIN32)
56 # define HAVE_WIN32_LOCKS
57 #elif defined(HAVE_LIBPTHREAD) || defined(HAVE_PTHREAD_MUTEX_LOCK)
58 # define HAVE_PTHREAD_LOCKS
59 #else
60 # define HAVE_NO_LOCKS
61 #endif
62
63 extern gnutls_time_func gnutls_time;
64
65 static inline void millisleep(unsigned int ms)
66 {
67 #ifdef _WIN32
68         Sleep(ms);
69 #else
70         struct timespec ts;
71
72         ts.tv_sec = 0;
73         ts.tv_nsec = ms * 1000 * 1000;
74
75         nanosleep(&ts, NULL);
76 #endif
77 }
78
79 /* emulate gnulib's gettime using gettimeofday to avoid linking to
80  * librt */
81 inline static void gettime(struct timespec *t)
82 {
83 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME)
84         clock_gettime(CLOCK_REALTIME, t);
85 #else
86         struct timeval tv;
87         gettimeofday(&tv, NULL);
88         t->tv_sec = tv.tv_sec;
89         t->tv_nsec = tv.tv_usec * 1000;
90 #endif
91 }
92
93 int _gnutls_find_config_path(char *path, size_t max_size);
94 int _gnutls_ucs2_to_utf8(const void *data, size_t size,
95                          gnutls_datum_t * output, unsigned bigendian);
96
97 int gnutls_system_global_init(void);
98 void gnutls_system_global_deinit(void);
99
100 #ifndef _WIN32
101 # if defined(HAVE_NETINET_IN_H)
102 #  include <netinet/in.h>
103 # endif
104 # include <arpa/inet.h>
105 #else
106 # define inet_aton _gnutls_inet_aton
107 int inet_aton(const char *cp, struct in_addr *inp);
108 #endif
109
110 #ifndef HAVE_INET_PTON
111 # define inet_pton _gnutls_inet_pton
112 int inet_pton(int af, const char *src, void *dst);
113 #endif
114
115 #ifndef HAVE_INET_NTOP
116 # define inet_ntop _gnutls_inet_ntop
117 const char *inet_ntop(int af, const void *src,
118                       char *dst, socklen_t size);
119 #endif
120
121 #endif                          /* SYSTEM_H */