]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/utility.hh
Merge pull request #7199 from Habbie/builder-cache-buster
[thirdparty/pdns.git] / pdns / utility.hh
1 /*
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22 // Utility class specification.
23
24 #ifndef UTILITY_HH
25 #define UTILITY_HH
26
27 #ifdef NEED_POSIX_TYPEDEF
28 typedef unsigned char uint8_t;
29 typedef unsigned short int uint16_t;
30 typedef unsigned int uint32_t;
31 typedef unsigned long long uint64_t;
32 #endif
33
34 #include <arpa/inet.h>
35 #include <netinet/in.h>
36 #include <sys/socket.h>
37 #include <sys/time.h>
38 #include <sys/uio.h>
39 #include <signal.h>
40 #include <pthread.h>
41 #include <semaphore.h>
42 #include <signal.h>
43 #include <errno.h>
44 #include <unistd.h>
45 #include <string>
46
47 #include "namespaces.hh"
48
49 //! A semaphore class.
50 class Semaphore
51 {
52 private:
53 typedef int sem_value_t;
54
55 #if defined(_AIX) || defined(__APPLE__)
56 uint32_t m_magic;
57 pthread_mutex_t m_lock;
58 pthread_cond_t m_gtzero;
59 sem_value_t m_count;
60 uint32_t m_nwaiters;
61 #else
62 sem_t *m_pSemaphore;
63 #endif
64
65 protected:
66 public:
67 Semaphore(const Semaphore&) = delete;
68 void operator=(const Semaphore&) = delete;
69 //! Default constructor.
70 Semaphore( unsigned int value = 0 );
71
72 //! Destructor.
73 ~Semaphore( void );
74
75 //! Posts to a semaphore.
76 int post( void );
77
78 //! Waits for a semaphore.
79 int wait( void );
80
81 //! Tries to wait for a semaphore.
82 int tryWait( void );
83
84 //! Retrieves the semaphore value.
85 int getValue( Semaphore::sem_value_t *sval );
86 };
87
88 //! This is a utility class used for platform independent abstraction.
89 class Utility
90 {
91 public:
92 typedef ::iovec iovec;
93 typedef ::pid_t pid_t;
94 typedef int sock_t;
95 typedef ::socklen_t socklen_t;
96
97 //! Connect with timeout
98 // Returns:
99 // > 0 on success
100 // -1 on error
101 // 0 on timeout
102 static int timed_connect(sock_t sock,
103 const sockaddr *addr,
104 socklen_t sockaddr_size,
105 int timeout_sec,
106 int timeout_usec);
107
108 //! Returns the process id of the current process.
109 static pid_t getpid( void );
110
111 //! Gets the current time.
112 static int gettimeofday( struct timeval *tv, void *tz = NULL );
113
114 //! Converts an address from dot and numbers format to binary data.
115 static int inet_aton( const char *cp, struct in_addr *inp );
116
117 //! Converts an address from presentation format to network format.
118 static int inet_pton( int af, const char *src, void *dst );
119
120 //! The inet_ntop() function converts an address from network format (usually a struct in_addr or some other binary form, in network byte order) to presentation format.
121 static const char *inet_ntop( int af, const char *src, char *dst, size_t size );
122
123 //! Retrieves a gid using a groupname.
124 static int makeGidNumeric( const string & group );
125
126 //! Retrieves an uid using an username.
127 static int makeUidNumeric( const string & username );
128
129 //! Writes a vector.
130 static int writev( Utility::sock_t socket, const iovec *vector, size_t count );
131 //! Returns a random number.
132 static long int random( void );
133
134 //! Sets the random seed.
135 static void srandom( unsigned int seed );
136
137 //! Drops the program's group privileges.
138 static void dropGroupPrivs( int uid, int gid );
139
140 //! Drops the program's user privileges.
141 static void dropUserPrivs( int uid );
142
143 //! Sets the socket into Bind-any mode
144 static void setBindAny ( int af, Utility::sock_t socket );
145
146 //! Sleeps for a number of seconds.
147 static unsigned int sleep( unsigned int seconds );
148
149 //! Sleeps for a number of microseconds.
150 static void usleep( unsigned long usec );
151
152 static time_t timegm(struct tm *tm);
153
154 };
155
156
157 #endif // UTILITY_HH