1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
if(UNIX)
check_function_exists(crypt HAVE_CRYPT_IN_SYSTEM_LIBRARIES)
if(HAVE_CRYPT_IN_SYSTEM_LIBRARIES)
set(HAVE_CRYPT TRUE)
else(HAVE_CRYPT_IN_SYSTEM_LIBRARIES)
check_library_exists(crypt crypt "" HAVE_CRYPT_IN_LIBCRYPT)
if(HAVE_CRYPT_IN_LIBCRYPT)
set(RPCAPD_LINK_LIBRARIES ${RPCAPD_LINK_LIBRARIES} crypt)
set(HAVE_CRYPT TRUE)
else(HAVE_CRYPT_IN_LIBCRYPT)
message(WARNING "crypt() not found. Won't be able to build rpcapd.")
endif(HAVE_CRYPT_IN_LIBCRYPT)
endif(HAVE_CRYPT_IN_SYSTEM_LIBRARIES)
endif(UNIX)
#
# On UN*X, we need pthreads and crypt().
#
if(WIN32 OR ((CMAKE_USE_PTHREADS_INIT OR PTHREADS_FOUND) AND HAVE_CRYPT))
if(UNIX)
#
# Do we have getspnam()?
#
check_function_exists(getspnam HAVE_GETSPNAM)
#
# Find library needed for getaddrinfo.
# NOTE: if you hand check_library_exists as its last argument a variable
# that's been set, it skips the test, so we need different variables.
#
include(CheckLibraryExists)
check_function_exists(getaddrinfo STDLIBS_HAVE_GETADDRINFO)
if(NOT STDLIBS_HAVE_GETADDRINFO)
check_library_exists(xnet getaddrinfo "" LIBXNET_HAS_GETADDRINFO)
if(LIBXNET_HAS_GETADDRINFO)
set(RPCAPD_LINK_LIBRARIES ${RPCAPD_LINK_LIBRARIES} xnet)
else(LIBXNET_HAS_GETADDRINFO)
include(CMakePushCheckState)
cmake_push_check_state()
set(CMAKE_REQUIRED_LIBRARIES nsl)
check_library_exists(socket getaddrinfo "" LIBSOCKET_HAS_GETADDRINFO)
cmake_pop_check_state()
if(LIBSOCKET_HAS_GETADDRINFO)
set(RPCAPD_LINK_LIBRARIES ${RPCAPD_LINK_LIBRARIES} socket nsl)
endif(LIBSOCKET_HAS_GETADDRINFO)
endif(LIBXNET_HAS_GETADDRINFO)
endif(NOT STDLIBS_HAVE_GETADDRINFO)
endif(UNIX)
if(WIN32)
set(RPCAPD_EXTRA_SOURCES
win32-svc.c
${pcap_SOURCE_DIR}/charconv.c
${pcap_SOURCE_DIR}/missing/getopt.c
rpcapd.rc)
include_directories(${pcap_SOURCE_DIR}/rpcapd ${pcap_SOURCE_DIR}/missing)
endif(WIN32)
add_executable(rpcapd
daemon.c
fileconf.c
log.c
rpcapd.c
${pcap_SOURCE_DIR}/rpcap-protocol.c
${pcap_SOURCE_DIR}/sockutils.c
${pcap_SOURCE_DIR}/sslutils.c
${pcap_SOURCE_DIR}/fmtutils.c
${RPCAPD_EXTRA_SOURCES}
)
if(NOT C_ADDITIONAL_FLAGS STREQUAL "")
set_target_properties(rpcapd PROPERTIES COMPILE_FLAGS ${C_ADDITIONAL_FLAGS})
endif()
if(NOT "${SANITIZER_FLAGS}" STREQUAL "")
set_target_properties(rpcapd PROPERTIES
LINK_FLAGS "${SANITIZER_FLAGS}")
endif()
#
# By default, build rpcapd universal with the appropriate set of
# architectures for the OS on which we're doing the build.
#
if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "")
#
# Get the major version of Darwin.
#
string(REGEX MATCH "^([0-9]+)" SYSTEM_VERSION_MAJOR "${CMAKE_SYSTEM_VERSION}")
if(SYSTEM_VERSION_MAJOR EQUAL 9)
#
# Leopard. Build for 32-bit x86 and 32-bit PowerPC, with
# 32-bit x86 first.
#
set(OSX_PROGRAM_ARCHITECTURES "i386;ppc")
elseif(SYSTEM_VERSION_MAJOR EQUAL 10)
#
# Snow Leopard. Build for x86-64 and 32-bit x86, with
# x86-64 first.
#
set(OSX_PROGRAM_ARCHITECTURES "x86_64;i386")
else()
#
# Post-Snow Leopard. Build only for x86-64.
# XXX - update if and when Apple adds ARM-based Macs.
# (You're on your own for iOS etc.)
#
set(OSX_PROGRAM_ARCHITECTURES "x86_64")
endif()
set_target_properties(rpcapd PROPERTIES
OSX_ARCHITECTURES "${OSX_PROGRAM_ARCHITECTURES}")
endif()
if(WIN32)
target_link_libraries(rpcapd ${LIBRARY_NAME}
${RPCAPD_LINK_LIBRARIES} ${PCAP_LINK_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
else(WIN32)
target_link_libraries(rpcapd ${LIBRARY_NAME}_static
${RPCAPD_LINK_LIBRARIES} ${PCAP_LINK_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
endif(WIN32)
######################################
# Install rpcap daemon and man pages
######################################
#
# "Define GNU standard installation directories", which actually
# are also defined, to some degree, by autotools, and at least
# some of which are general UN*X conventions.
#
include(GNUInstallDirs)
set(MANADMIN_EXPAND rpcapd.manadmin.in)
set(MANFILE_EXPAND rpcapd-config.manfile.in)
if(WIN32)
#
# XXX - where should the install target put rpcapd on Windows?
#
# Note that if an installer package is being produced
# from the results of the build, the installer package
# will determine where it goes.
#
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
install(TARGETS rpcapd DESTINATION bin/amd64)
else(CMAKE_SIZEOF_VOID_P EQUAL 8)
install(TARGETS rpcapd DESTINATION bin)
endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
else(WIN32)
#
# On UN*X, we put it in the sbin directory.
#
# XXX - the Linux Filesystem Hierarchy Standard says /usr/sbin
# is for daemons, but some other systems use /usr/libexec instead.
# However, since some users might, instead of having rpcapd be
# launched by inetd/xinetd/launchd/systemd, just run it on a
# machine when remote capture is to be done, a case can be made
# for the sbin directory even on systems with /usr/libexec.
#
install(TARGETS rpcapd DESTINATION ${CMAKE_INSTALL_SBINDIR})
endif(WIN32)
# On UN*X, and on Windows when not using MSVC, generate process man
# pages and arrange that they be installed.
if(NOT MSVC)
#
# Man pages.
#
# For each section of the manual for which we have man pages
# that require macro expansion, do the expansion.
#
set(MANADMIN "")
foreach(TEMPLATE_MANPAGE ${MANADMIN_EXPAND})
string(REPLACE ".manadmin.in" ".${MAN_ADMIN_COMMANDS}" MANPAGE ${TEMPLATE_MANPAGE})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY)
set(MANADMIN ${MANADMIN} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE})
endforeach(TEMPLATE_MANPAGE)
install(FILES ${MANADMIN} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_ADMIN_COMMANDS})
set(MANFILE "")
foreach(TEMPLATE_MANPAGE ${MANFILE_EXPAND})
string(REPLACE ".manfile.in" ".${MAN_FILE_FORMATS}" MANPAGE ${TEMPLATE_MANPAGE})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY)
set(MANFILE ${MANFILE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE})
endforeach(TEMPLATE_MANPAGE)
install(FILES ${MANFILE} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_FILE_FORMATS})
endif(NOT MSVC)
endif(WIN32 OR ((CMAKE_USE_PTHREADS_INIT OR PTHREADS_FOUND) AND HAVE_CRYPT))
|