summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
-rw-r--r--.cproject362
-rw-r--r--.project60
-rw-r--r--Makefile.in156
-rw-r--r--TODO.in3
-rwxr-xr-xautogen.sh1
-rwxr-xr-xconfig.guess1314
-rwxr-xr-xconfig.sub1410
-rw-r--r--configure.ac32
-rw-r--r--contrib/Makefile.in53
-rw-r--r--docs/Makefile.in24
-rwxr-xr-xgen_todo.pl64
-rw-r--r--include/apache13.h (renamed from apache13.h)13
-rw-r--r--include/apache20.h (renamed from apache20.h)2
-rw-r--r--include/mod_log_sql.h (renamed from mod_log_sql.h)48
-rw-r--r--include/winconfig.h (renamed from winconfig.h)0
-rw-r--r--src/Makefile.in168
-rw-r--r--src/functions.h (renamed from functions.h)8
-rw-r--r--src/functions13.h (renamed from functions13.h)0
-rw-r--r--src/functions20.h (renamed from functions20.h)0
-rw-r--r--src/mod_log_sql.c (renamed from mod_log_sql.c)648
-rw-r--r--src/mod_log_sql_dbd.c132
-rw-r--r--src/mod_log_sql_dbi.c (renamed from mod_log_sql_dbi.c)4
-rw-r--r--src/mod_log_sql_logio.c (renamed from mod_log_sql_logio.c)21
-rw-r--r--src/mod_log_sql_mysql.c (renamed from mod_log_sql_mysql.c)12
-rw-r--r--src/mod_log_sql_pgsql.c (renamed from mod_log_sql_pgsql.c)4
-rw-r--r--src/mod_log_sql_ssl.c (renamed from mod_log_sql_ssl.c)26
-rw-r--r--utility/Makefile.in49
-rw-r--r--utility/ap_pcre.c344
-rw-r--r--utility/ap_pcre.h178
-rw-r--r--utility/config.c534
-rw-r--r--utility/config.h190
-rw-r--r--utility/database.c212
-rw-r--r--utility/database.h25
-rw-r--r--utility/logparse.c768
-rw-r--r--utility/logparse.h37
-rw-r--r--utility/mod_log_sql.conf70
-rw-r--r--utility/shell.c342
-rw-r--r--utility/shell.h0
-rw-r--r--utility/util.c189
-rw-r--r--utility/util.h26
40 files changed, 4267 insertions, 3262 deletions
diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..ce89a76
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,362 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<?fileVersion 4.0.0?>
3
4<cproject>
5<storageModule moduleId="org.eclipse.cdt.core.settings">
6<cconfiguration id="converted.config.350824298">
7
8
9<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="converted.config.350824298" moduleId="org.eclipse.cdt.core.settings" name="Linux GCC">
10<externalSettings/>
11<extensions>
12<extension id="org.eclipse.cdt.core.domsourceindexer" point="org.eclipse.cdt.core.CIndexer"/>
13<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
14<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
15<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
16<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
17<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
18<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
19</extensions>
20</storageModule>
21<storageModule moduleId="org.eclipse.cdt.core.language.mapping">
22<project-mappings/>
23</storageModule>
24<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
25
26<storageModule moduleId="cdtBuildSystem" version="4.0.0">
27<configuration artifactExtension="" artifactName="mod_log_sql" buildProperties="" description="" errorParsers="" id="converted.config.350824298" name="Linux GCC" parent="org.eclipse.cdt.build.core.prefbase.cfg">
28<folderInfo id="converted.config.350824298." name="/" resourcePath="">
29<toolChain id="cdt.managedbuild.toolchain.gnu.base.1351398655" name="Linux GCC" resourceTypeBasedDiscovery="true" superClass="cdt.managedbuild.toolchain.gnu.base">
30<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.base.2070600171" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
31<builder appendEnvironment="true" arguments="${project_name} make" autoBuildTarget="all" buildPath="${workspace_loc:/mod_log_sql/Linux GCC}" cleanBuildTarget="clean" command="${HOME}/bin/sshmake" enableAutoBuild="false" enableCleanBuild="true" enabledIncrementalBuild="true" environment="" id="cdt.managedbuild.target.gnu.builder.base.1704124595" incrementalBuildTarget="all" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" stopOnErr="false" superClass="cdt.managedbuild.target.gnu.builder.base"/>
32<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.264929639" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
33<option id="gnu.c.compiler.option.include.paths.277599024" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
34<listOptionValue builtIn="false" value="&quot;${workspace_loc:/includes/2.2/apr-1}&quot;"/>
35<listOptionValue builtIn="false" value="&quot;${workspace_loc:/includes/2.2/httpd}&quot;"/>
36<listOptionValue builtIn="false" value="&quot;${workspace_loc:/Includes/mysql}&quot;"/>
37<listOptionValue builtIn="false" value="/usr/include"/>
38</option>
39<option id="gnu.c.compiler.option.preprocessor.def.symbols.1267853547" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
40<listOptionValue builtIn="false" value="WITH_APACHE20=1"/>
41<listOptionValue builtIn="false" value="HAVE_CONFIG_H=1"/>
42</option>
43<option id="gnu.c.compiler.option.preprocessor.nostdinc.444721609" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc"/>
44<option id="gnu.c.compiler.option.preprocessor.preprocess.1423240087" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess"/>
45<option id="gnu.c.compiler.option.preprocessor.undef.symbol.732547404" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol"/>
46<option id="gnu.c.compiler.option.optimization.level.92192040" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level"/>
47<option id="gnu.c.compiler.option.optimization.flags.893054260" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags"/>
48<option id="gnu.c.compiler.option.debugging.level.1989991712" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level"/>
49<option id="gnu.c.compiler.option.debugging.other.1416137166" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other"/>
50<option id="gnu.c.compiler.option.debugging.gprof.817771115" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof"/>
51<option id="gnu.c.compiler.option.debugging.prof.1130721011" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof"/>
52<option id="gnu.c.compiler.option.warnings.syntax.1338013879" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax"/>
53<option id="gnu.c.compiler.option.warnings.pedantic.662901430" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic"/>
54<option id="gnu.c.compiler.option.warnings.pedantic.error.1267513833" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error"/>
55<option id="gnu.c.compiler.option.warnings.nowarn.805873345" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn"/>
56<option id="gnu.c.compiler.option.warnings.allwarn.910485376" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn"/>
57<option id="gnu.c.compiler.option.warnings.toerrors.1479340869" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors"/>
58<option id="gnu.c.compiler.option.misc.other.1562816435" name="Other flags" superClass="gnu.c.compiler.option.misc.other"/>
59<option id="gnu.c.compiler.option.misc.verbose.1265706406" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose"/>
60<option id="gnu.c.compiler.option.misc.ansi.1838461503" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi"/>
61<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.616458355" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
62</tool>
63<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.1761639329" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"/>
64<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1017302318" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"/>
65<tool id="com.redhat.eclipse.cdt.autotools.tool.autogen.131560145" name="autogen.sh" superClass="com.redhat.eclipse.cdt.autotools.tool.autogen"/>
66<tool id="com.redhat.eclipse.cdt.autotools.tool.configure.1351107831" name="configure" superClass="com.redhat.eclipse.cdt.autotools.tool.configure"/>
67<tool id="cdt.managedbuild.tool.gnu.archiver.base.1647937860" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
68<tool id="cdt.managedbuild.tool.gnu.c.linker.base.78392638" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base">
69<option id="gnu.c.link.option.nostart.1696010990" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/>
70<option id="gnu.c.link.option.nodeflibs.149057311" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/>
71<option id="gnu.c.link.option.nostdlibs.127927094" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs"/>
72<option id="gnu.c.link.option.strip.899862009" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/>
73<option id="gnu.c.link.option.noshared.2764585" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/>
74<option id="gnu.c.link.option.libs.2040864973" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
75<option id="gnu.c.link.option.paths.1741038220" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
76<option id="gnu.c.link.option.ldflags.132803838" name="Linker flags" superClass="gnu.c.link.option.ldflags"/>
77<option id="gnu.c.link.option.other.378428644" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other"/>
78<option id="gnu.c.link.option.userobjs.495685024" name="Other objects" superClass="gnu.c.link.option.userobjs"/>
79<option id="gnu.c.link.option.shared.626871050" name="Shared (-shared)" superClass="gnu.c.link.option.shared"/>
80<option id="gnu.c.link.option.soname.1808779260" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname"/>
81<option id="gnu.c.link.option.implname.1206228182" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname"/>
82<option id="gnu.c.link.option.defname.2102205174" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname"/>
83<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.2076963094" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
84<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
85<additionalInput kind="additionalinput" paths="$(LIBS)"/>
86</inputType>
87</tool>
88<tool id="cdt.managedbuild.tool.gnu.assembler.base.467752860" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
89<option id="gnu.both.asm.option.include.paths.73704182" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
90<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1742318494" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
91</tool>
92</toolChain>
93</folderInfo>
94</configuration>
95</storageModule>
96<storageModule moduleId="org.eclipse.cdt.core.pathentry">
97<pathentry kind="src" path=""/>
98<pathentry kind="out" path=""/>
99<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
100<pathentry base-path="includes" include="2.0/apr-0" kind="inc" path="" system="true"/>
101<pathentry base-path="includes" include="2.0/httpd" kind="inc" path="" system="true"/>
102<pathentry kind="mac" name="WITH_APACHE20" path="" value="1"/>
103<pathentry kind="mac" name="HAVE_CONFIG_H" path="" value="1"/>
104</storageModule>
105<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
106
107
108<storageModule moduleId="scannerConfiguration">
109<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
110<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
111<buildOutputProvider>
112<openAction enabled="true" filePath=""/>
113<parser enabled="true"/>
114</buildOutputProvider>
115<scannerInfoProvider id="specsFile">
116<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
117<parser enabled="true"/>
118</scannerInfoProvider>
119</profile>
120<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
121<buildOutputProvider>
122<openAction enabled="false" filePath=""/>
123<parser enabled="true"/>
124</buildOutputProvider>
125<scannerInfoProvider id="makefileGenerator">
126<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
127<parser enabled="false"/>
128</scannerInfoProvider>
129</profile>
130<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
131<buildOutputProvider>
132<openAction enabled="false" filePath=""/>
133<parser enabled="true"/>
134</buildOutputProvider>
135<scannerInfoProvider id="specsFile">
136<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
137<parser enabled="false"/>
138</scannerInfoProvider>
139</profile>
140<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
141<buildOutputProvider>
142<openAction enabled="false" filePath=""/>
143<parser enabled="true"/>
144</buildOutputProvider>
145<scannerInfoProvider id="specsFile">
146<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
147<parser enabled="false"/>
148</scannerInfoProvider>
149</profile>
150<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
151<buildOutputProvider>
152<openAction enabled="false" filePath=""/>
153<parser enabled="true"/>
154</buildOutputProvider>
155<scannerInfoProvider id="specsFile">
156<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
157<parser enabled="false"/>
158</scannerInfoProvider>
159</profile>
160<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
161<buildOutputProvider>
162<openAction enabled="false" filePath=""/>
163<parser enabled="true"/>
164</buildOutputProvider>
165<scannerInfoProvider id="specsFile">
166<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
167<parser enabled="false"/>
168</scannerInfoProvider>
169</profile>
170<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
171<buildOutputProvider>
172<openAction enabled="false" filePath=""/>
173<parser enabled="true"/>
174</buildOutputProvider>
175<scannerInfoProvider id="specsFile">
176<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
177<parser enabled="false"/>
178</scannerInfoProvider>
179</profile>
180<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
181<buildOutputProvider>
182<openAction enabled="false" filePath=""/>
183<parser enabled="true"/>
184</buildOutputProvider>
185<scannerInfoProvider id="specsFile">
186<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
187<parser enabled="false"/>
188</scannerInfoProvider>
189</profile>
190<scannerConfigBuildInfo instanceId="converted.config.350824298">
191<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
192<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
193<buildOutputProvider>
194<openAction enabled="true" filePath=""/>
195<parser enabled="true"/>
196</buildOutputProvider>
197<scannerInfoProvider id="specsFile">
198<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
199<parser enabled="true"/>
200</scannerInfoProvider>
201</profile>
202<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
203<buildOutputProvider>
204<openAction enabled="true" filePath=""/>
205<parser enabled="true"/>
206</buildOutputProvider>
207<scannerInfoProvider id="makefileGenerator">
208<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
209<parser enabled="true"/>
210</scannerInfoProvider>
211</profile>
212<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
213<buildOutputProvider>
214<openAction enabled="true" filePath=""/>
215<parser enabled="true"/>
216</buildOutputProvider>
217<scannerInfoProvider id="specsFile">
218<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
219<parser enabled="true"/>
220</scannerInfoProvider>
221</profile>
222<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
223<buildOutputProvider>
224<openAction enabled="true" filePath=""/>
225<parser enabled="true"/>
226</buildOutputProvider>
227<scannerInfoProvider id="specsFile">
228<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
229<parser enabled="true"/>
230</scannerInfoProvider>
231</profile>
232<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
233<buildOutputProvider>
234<openAction enabled="true" filePath=""/>
235<parser enabled="true"/>
236</buildOutputProvider>
237<scannerInfoProvider id="specsFile">
238<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
239<parser enabled="true"/>
240</scannerInfoProvider>
241</profile>
242<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
243<buildOutputProvider>
244<openAction enabled="true" filePath=""/>
245<parser enabled="true"/>
246</buildOutputProvider>
247<scannerInfoProvider id="specsFile">
248<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
249<parser enabled="true"/>
250</scannerInfoProvider>
251</profile>
252<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
253<buildOutputProvider>
254<openAction enabled="true" filePath=""/>
255<parser enabled="true"/>
256</buildOutputProvider>
257<scannerInfoProvider id="specsFile">
258<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
259<parser enabled="true"/>
260</scannerInfoProvider>
261</profile>
262<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
263<buildOutputProvider>
264<openAction enabled="true" filePath=""/>
265<parser enabled="true"/>
266</buildOutputProvider>
267<scannerInfoProvider id="specsFile">
268<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
269<parser enabled="true"/>
270</scannerInfoProvider>
271</profile>
272</scannerConfigBuildInfo>
273<scannerConfigBuildInfo instanceId="converted.config.350824298;converted.config.350824298.;cdt.managedbuild.tool.gnu.c.compiler.base.264929639;cdt.managedbuild.tool.gnu.c.compiler.input.616458355">
274<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
275<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
276<buildOutputProvider>
277<openAction enabled="true" filePath=""/>
278<parser enabled="true"/>
279</buildOutputProvider>
280<scannerInfoProvider id="specsFile">
281<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
282<parser enabled="true"/>
283</scannerInfoProvider>
284</profile>
285<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
286<buildOutputProvider>
287<openAction enabled="false" filePath=""/>
288<parser enabled="true"/>
289</buildOutputProvider>
290<scannerInfoProvider id="makefileGenerator">
291<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
292<parser enabled="false"/>
293</scannerInfoProvider>
294</profile>
295<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
296<buildOutputProvider>
297<openAction enabled="true" filePath=""/>
298<parser enabled="true"/>
299</buildOutputProvider>
300<scannerInfoProvider id="specsFile">
301<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
302<parser enabled="false"/>
303</scannerInfoProvider>
304</profile>
305<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
306<buildOutputProvider>
307<openAction enabled="true" filePath=""/>
308<parser enabled="true"/>
309</buildOutputProvider>
310<scannerInfoProvider id="specsFile">
311<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
312<parser enabled="false"/>
313</scannerInfoProvider>
314</profile>
315<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
316<buildOutputProvider>
317<openAction enabled="true" filePath=""/>
318<parser enabled="true"/>
319</buildOutputProvider>
320<scannerInfoProvider id="specsFile">
321<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
322<parser enabled="false"/>
323</scannerInfoProvider>
324</profile>
325<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
326<buildOutputProvider>
327<openAction enabled="true" filePath=""/>
328<parser enabled="true"/>
329</buildOutputProvider>
330<scannerInfoProvider id="specsFile">
331<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
332<parser enabled="false"/>
333</scannerInfoProvider>
334</profile>
335<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
336<buildOutputProvider>
337<openAction enabled="true" filePath=""/>
338<parser enabled="true"/>
339</buildOutputProvider>
340<scannerInfoProvider id="specsFile">
341<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
342<parser enabled="false"/>
343</scannerInfoProvider>
344</profile>
345<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
346<buildOutputProvider>
347<openAction enabled="true" filePath=""/>
348<parser enabled="true"/>
349</buildOutputProvider>
350<scannerInfoProvider id="specsFile">
351<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
352<parser enabled="false"/>
353</scannerInfoProvider>
354</profile>
355</scannerConfigBuildInfo>
356</storageModule>
357</cconfiguration>
358</storageModule>
359<storageModule moduleId="cdtBuildSystem" version="4.0.0">
360<project id="mod_log_sql.null.887965423" name="mod_log_sql"/>
361</storageModule>
362</cproject>
diff --git a/.project b/.project
index db2ba74..9af17e9 100644
--- a/.project
+++ b/.project
@@ -3,19 +3,16 @@
3 <name>mod_log_sql</name> 3 <name>mod_log_sql</name>
4 <comment></comment> 4 <comment></comment>
5 <projects> 5 <projects>
6 <project>includes</project>
6 </projects> 7 </projects>
7 <buildSpec> 8 <buildSpec>
8 <buildCommand> 9 <buildCommand>
9 <name>org.eclipse.cdt.make.core.makeBuilder</name> 10 <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
10 <triggers>clean,full,incremental,</triggers> 11 <triggers>clean,full,incremental,</triggers>
11 <arguments> 12 <arguments>
12 <dictionary> 13 <dictionary>
13 <key>org.eclipse.cdt.make.core.build.arguments</key> 14 <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
14 <value></value> 15 <value>all</value>
15 </dictionary>
16 <dictionary>
17 <key>org.eclipse.cdt.core.errorOutputParser</key>
18 <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
19 </dictionary> 16 </dictionary>
20 <dictionary> 17 <dictionary>
21 <key>org.eclipse.cdt.make.core.enableAutoBuild</key> 18 <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
@@ -26,47 +23,47 @@
26 <value></value> 23 <value></value>
27 </dictionary> 24 </dictionary>
28 <dictionary> 25 <dictionary>
29 <key>org.eclipse.cdt.make.core.enableFullBuild</key> 26 <key>org.eclipse.cdt.make.core.buildLocation</key>
30 <value>true</value> 27 <value>${workspace_loc:/mod_log_sql/Linux GCC}</value>
31 </dictionary> 28 </dictionary>
32 <dictionary> 29 <dictionary>
33 <key>org.eclipse.cdt.make.core.build.target.inc</key> 30 <key>?name?</key>
34 <value>all</value> 31 <value></value>
35 </dictionary> 32 </dictionary>
36 <dictionary> 33 <dictionary>
37 <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key> 34 <key>org.eclipse.cdt.make.core.enableFullBuild</key>
38 <value>true</value> 35 <value>true</value>
39 </dictionary> 36 </dictionary>
40 <dictionary> 37 <dictionary>
41 <key>org.eclipse.cdt.make.core.build.location</key> 38 <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
42 <value></value> 39 <value>true</value>
43 </dictionary> 40 </dictionary>
44 <dictionary> 41 <dictionary>
45 <key>org.eclipse.cdt.make.core.build.target.clean</key> 42 <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
46 <value>clean</value> 43 <value>clean</value>
47 </dictionary> 44 </dictionary>
48 <dictionary> 45 <dictionary>
49 <key>org.eclipse.cdt.make.core.build.command</key>
50 <value>sshmake</value>
51 </dictionary>
52 <dictionary>
53 <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
54 <value>true</value>
55 </dictionary>
56 <dictionary>
57 <key>org.eclipse.cdt.make.core.append_environment</key> 46 <key>org.eclipse.cdt.make.core.append_environment</key>
58 <value>true</value> 47 <value>true</value>
59 </dictionary> 48 </dictionary>
60 <dictionary> 49 <dictionary>
61 <key>org.eclipse.cdt.make.core.build.target.full</key> 50 <key>org.eclipse.cdt.make.core.contents</key>
62 <value>clean all</value> 51 <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
63 </dictionary> 52 </dictionary>
64 <dictionary> 53 <dictionary>
65 <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> 54 <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
66 <value>false</value> 55 <value>false</value>
67 </dictionary> 56 </dictionary>
68 <dictionary> 57 <dictionary>
69 <key>org.eclipse.cdt.make.core.build.target.auto</key> 58 <key>org.eclipse.cdt.make.core.buildArguments</key>
59 <value>${project_name} make -k</value>
60 </dictionary>
61 <dictionary>
62 <key>org.eclipse.cdt.make.core.buildCommand</key>
63 <value>${HOME}/bin/sshmake</value>
64 </dictionary>
65 <dictionary>
66 <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
70 <value>all</value> 67 <value>all</value>
71 </dictionary> 68 </dictionary>
72 <dictionary> 69 <dictionary>
@@ -76,19 +73,14 @@
76 </arguments> 73 </arguments>
77 </buildCommand> 74 </buildCommand>
78 <buildCommand> 75 <buildCommand>
79 <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name> 76 <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
80 <arguments>
81 </arguments>
82 </buildCommand>
83 <buildCommand>
84 <name>de.loskutov.FileSync.FSBuilder</name>
85 <arguments> 77 <arguments>
86 </arguments> 78 </arguments>
87 </buildCommand> 79 </buildCommand>
88 </buildSpec> 80 </buildSpec>
89 <natures> 81 <natures>
90 <nature>org.eclipse.cdt.core.cnature</nature> 82 <nature>org.eclipse.cdt.core.cnature</nature>
91 <nature>org.eclipse.cdt.make.core.makeNature</nature> 83 <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
92 <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature> 84 <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
93 </natures> 85 </natures>
94</projectDescription> 86</projectDescription>
diff --git a/Makefile.in b/Makefile.in
index 2865d5f..4c60869 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,98 +1,17 @@
1# @configure_input@ 1# @configure_input@
2 2
3# Modify these top variables. 3# Modify these top variables.
4SUBDIRS = docs contrib 4SUBDIRS = docs contrib src utility
5
6HEADERS = mod_log_sql.h \
7 functions.h \
8 functions13.h \
9 functions20.h \
10 apache13.h \
11 apache20.h \
12 winconfig.h
13
14CFLAGS = -Wc,-Wall -Wc,-fno-strict-aliasing
15
16ifeq (@OOO_MAINTAIN@,1)
17CFLAGS += -Wc,-Werror
18endif
19 5
20EXTRA_DIST = AUTHORS INSTALL TODO LICENSE CHANGELOG \ 6EXTRA_DIST = AUTHORS INSTALL TODO LICENSE CHANGELOG \
21 build-apache13.bat build-apache2.bat \ 7 build-apache13.bat build-apache2.bat \
22 8
23coreSOURCES = @PACKAGE_NAME@.c
24coreTARGET = @PACKAGE_NAME@@APXS_EXTENSION@
25coreLDADD = @RT_LIBS@
26coreCFLAGS =
27coreNAME = log_sql
28TARGETS = $(coreTARGET)
29
30sslSOURCES = @PACKAGE_NAME@_ssl.c
31sslTARGET = @PACKAGE_NAME@_ssl@APXS_EXTENSION@
32sslLDADD =
33sslCFLAGS = @MOD_SSL_CFLAGS@
34sslNAME = log_sql_ssl
35
36ifeq (@WANT_SSL_MOD@,1)
37TARGETS += $(sslTARGET)
38endif
39
40logioSOURCES = @PACKAGE_NAME@_logio.c
41logioTARGET = @PACKAGE_NAME@_logio@APXS_EXTENSION@
42logioLDADD =
43logioCFLAGS =
44logioNAME = log_sql_logio
45
46ifeq (@WANT_LOGIO_MOD@,1)
47TARGETS += $(logioTARGET)
48endif
49
50mysqlSOURCES = @PACKAGE_NAME@_mysql.c
51mysqlTARGET = @PACKAGE_NAME@_mysql@APXS_EXTENSION@
52mysqlLDADD = @MYSQL_LDFLAGS@ @MYSQL_LIBS@
53mysqlCFLAGS = @MYSQL_CFLAGS@
54mysqlNAME = log_sql_mysql
55
56ifeq (@WANT_MYSQL_MOD@,1)
57TARGETS += $(mysqlTARGET)
58endif
59
60pgsqlSOURCES = @PACKAGE_NAME@_pgsql.c
61pgsqlTARGET = @PACKAGE_NAME@_pgsql@APXS_EXTENSION@
62pgsqlLDADD = @PGSQL_LDFLAGS@ @PGSQL_LIBS@
63pgsqlCFLAGS = @PGSQL_CFLAGS@
64pgsqlNAME = log_sql_pgsql
65
66ifeq (@WANT_PGSQL_MOD@,1)
67TARGETS += $(pgsqlTARGET)
68endif
69
70dbiSOURCES = @PACKAGE_NAME@_dbi.c
71dbiTARGET = @PACKAGE_NAME@_dbi@APXS_EXTENSION@
72dbiLDADD = @DBI_LDFLAGS@ @DBI_LIBS@
73dbiCFLAGS = @DBI_CFLAGS@
74dbiNAME = log_sql_dbi
75
76ifeq (@WANT_DBI_MOD@,1)
77TARGETS += $(dbiTARGET)
78endif
79
80#Don't modify anything below here 9#Don't modify anything below here
81 10
82PROVIDERS_SUBDIRS = @subdirs@ 11top_srcdir = @top_srcdir@
83
84srcdir = @abs_srcdir@ 12srcdir = @abs_srcdir@
85builddir = @abs_builddir@ 13builddir = @abs_builddir@
86 14
87OBJ = $(coreSOURCES:.c=.o) $(logioSOURCES:.c=.o) $(sslSOURCES:.c=.o) $(mysqlSOURCES:.c=.o) \
88 $(dbiSOURCES:.c=.o) $(pgsqlSOURCES:.c=.o)
89
90LO = $(coreSOURCES:.c=.lo) $(logioSOURCES:.c=.lo) $(sslSOURCES:.c=.lo) $(mysqlSOURCES:.c=.lo) \
91 $(dbiSOURCES:.c=.lo) $(pgsqlSOURCES:.c=.lo)
92
93SLO = $(coreSOURCES:.c=.slo) $(logioSOURCES:.c=.slo) $(sslSOURCES:.c=.slo) $(mysqlSOURCES:.c=.slo) \
94 $(dbiSOURCES:.c=.slo) $(pgsqlSOURCES:.c=.slo)
95
96STD_DIST = install-sh \ 15STD_DIST = install-sh \
97 config.sub \ 16 config.sub \
98 config.guess \ 17 config.guess \
@@ -101,16 +20,15 @@ STD_DIST = install-sh \
101 configure.ac \ 20 configure.ac \
102 configure \ 21 configure \
103 stamp-h.in \ 22 stamp-h.in \
104 config.h.in 23 include/config.h.in
105 24
106DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(coreSOURCES) $(HEADERS) \ 25DISTFILES = $(STD_DIST) $(EXTRA_DIST)
107 $(sslSOURCES) $(logioSOURCES) $(mysqlSOURCES) $(pgsqlSOURCES) $(dbiSOURCES)
108 26
109all: $(TARGETS) all-subdirs 27all: all-subdirs
110 28
111all-subdirs install-subdirs activate-subdirs clean-subdirs distclean-subdirs: 29all-subdirs install-subdirs activate-subdirs clean-subdirs distclean-subdirs:
112 @otarget=`echo $@|sed s/-subdirs//`; \ 30 @otarget=`echo $@|sed s/-subdirs//`; \
113 list=' $(PROVIDERS_SUBDIRS) $(SUBDIRS)'; \ 31 list=' $(SUBDIRS)'; \
114 for i in $$list; do \ 32 for i in $$list; do \
115 if test -d "$$i"; then \ 33 if test -d "$$i"; then \
116 target="$$otarget"; \ 34 target="$$otarget"; \
@@ -124,49 +42,9 @@ all-subdirs install-subdirs activate-subdirs clean-subdirs distclean-subdirs:
124 done; 42 done;
125 43
126TODO: TODO.in 44TODO: TODO.in
127 @./gen_todo.pl 45 @./m4/scripts/gen_todo.pl
128 46
129$(coreTARGET): $(coreSOURCES) $(HEADERS) 47install: install-subdirs
130 @@APXS_BIN@ -c -o $(coreTARGET) $(coreCFLAGS) $(CFLAGS) \
131 @DEFS@ @AP_DEFS@ $(coreLDADD) $(coreSOURCES)
132
133$(logioTARGET): $(logioSOURCES) $(HEADERS)
134 @@APXS_BIN@ -c -o $(logioTARGET) $(logioCFLAGS) $(CFLAGS) \
135 @DEFS@ @AP_DEFS@ $(logioLDADD) $(logioSOURCES)
136
137$(sslTARGET): $(sslSOURCES) $(HEADERS)
138 @@APXS_BIN@ -c -o $(sslTARGET) $(sslCFLAGS) $(CFLAGS) \
139 @DEFS@ @AP_DEFS@ $(sslLDADD) $(sslSOURCES)
140
141$(mysqlTARGET): $(mysqlSOURCES) $(HEADERS)
142 @@APXS_BIN@ -c -o $(mysqlTARGET) $(mysqlCFLAGS) $(CFLAGS) \
143 @DEFS@ @AP_DEFS@ $(mysqlLDADD) $(mysqlSOURCES)
144
145$(pgsqlTARGET): $(pgsqlSOURCES) $(HEADERS)
146 @@APXS_BIN@ -c -o $(pgsqlTARGET) $(pgsqlCFLAGS) $(CFLAGS) \
147 @DEFS@ @AP_DEFS@ $(pgsqlLDADD) $(pgsqlSOURCES)
148
149$(dbiTARGET): $(dbiSOURCES) $(HEADERS)
150 @@APXS_BIN@ -c -o $(dbiTARGET) $(dbiCFLAGS) $(CFLAGS) \
151 @DEFS@ @AP_DEFS@ $(dbiLDADD) $(dbiSOURCES)
152
153install: $(TARGETS) install-subdirs
154 @@APXS_BIN@ -n $(coreNAME) -i $(coreTARGET); \
155 if test @WANT_MYSQL_MOD@ -eq 1; then \
156 @APXS_BIN@ -n $(mysqlNAME) -i $(mysqlTARGET); \
157 fi; \
158 if test @WANT_PGSQL_MOD@ -eq 1; then \
159 @APXS_BIN@ -n $(pgsqlNAME) -i $(pgsqlTARGET); \
160 fi; \
161 if test @WANT_DBI_MOD@ -eq 1; then \
162 @APXS_BIN@ -n $(dbiNAME) -i $(dbiTARGET); \
163 fi; \
164 if test @WANT_SSL_MOD@ -eq 1; then \
165 @APXS_BIN@ -n $(sslNAME) -i $(sslTARGET); \
166 fi; \
167 if test @WANT_LOGIO_MOD@ -eq 1; then \
168 @APXS_BIN@ -n $(logioNAME) -i $(logioTARGET); \
169 fi; \
170 echo "*************************************************************************"; \ 48 echo "*************************************************************************"; \
171 echo "*** The mod_log_sql modules have been installed."; \ 49 echo "*** The mod_log_sql modules have been installed."; \
172 echo "*** Please edit your Apache configuration files and"; \ 50 echo "*** Please edit your Apache configuration files and"; \
@@ -183,17 +61,11 @@ install: $(TARGETS) install-subdirs
183 echo "*************************************************************************"; 61 echo "*************************************************************************";
184 62
185activate: activate-subdirs 63activate: activate-subdirs
186 @@APXS_BIN@ -n $(coreNAME) -i -a $(coreTARGET); \
187 if test @WANT_SSL_MOD@ -eq 1; then \
188 @APXS_BIN@ -n $(sslNAME) -i -a $(sslTARGET); \
189 fi
190 64
191clean: clean-subdirs 65clean: clean-subdirs
192 $(RM) $(OBJ) $(SLO) $(LO) $(TARGETS)
193 $(RM) -r .libs
194 66
195distclean: clean distclean-subdirs 67distclean: clean distclean-subdirs
196 $(RM) config.status config.log config.h config.h.in \ 68 $(RM) config.status config.log include/config.h include/config.h.in \
197 configure stamp-h stamp-h.in Makefile aclocal.m4 69 configure stamp-h stamp-h.in Makefile aclocal.m4
198 $(RM) -r autom4te-2.53.cache 70 $(RM) -r autom4te-2.53.cache
199 71
@@ -201,7 +73,7 @@ DESTDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@
201DESTTGZ = $(DESTDIR).tar.gz 73DESTTGZ = $(DESTDIR).tar.gz
202dist: 74dist:
203 @rm -rf $(DESTDIR); \ 75 @rm -rf $(DESTDIR); \
204 list=' $(PROVIDERS_SUBDIRS) $(SUBDIRS)'; \ 76 list=' $(SUBDIRS)'; \
205 for i in $$list; do \ 77 for i in $$list; do \
206 if test -d "$$i"; then \ 78 if test -d "$$i"; then \
207 target=local-dist; \ 79 target=local-dist; \
@@ -222,8 +94,8 @@ dist:
222 rm -rf $(DESTDIR); \ 94 rm -rf $(DESTDIR); \
223 95
224local-dist: $(DISTFILES) 96local-dist: $(DISTFILES)
225 @mkdir -p $(DESTDIR); \ 97 mkdir -p $(DESTDIR)
226 cp -dp --parents $(DISTFILES) $(DESTDIR); 98 cp -dp --parents $(DISTFILES) $(DESTDIR)
227 99
228.PHONY: include all-subdirs activate-subdirs install-subdirs \ 100.PHONY: include all-subdirs activate-subdirs install-subdirs \
229 clean-subdirs distclean-subdirs dist 101 clean-subdirs distclean-subdirs dist
@@ -241,7 +113,7 @@ stamp-h: config.h.in config.status
241 ./config.status 113 ./config.status
242 114
243$(srcdir)/configure: configure.ac aclocal.m4 115$(srcdir)/configure: configure.ac aclocal.m4
244 cd $(srcdir) && autoconf-2.53 116 cd $(srcdir) && autoconf
245 117
246Makefile: Makefile.in config.status 118Makefile: Makefile.in config.status
247 ./config.status 119 ./config.status
diff --git a/TODO.in b/TODO.in
index 0d871f6..bf6b624 100644
--- a/TODO.in
+++ b/TODO.in
@@ -1,5 +1,5 @@
1TODO: 1TODO:
2* verify a db driver has been loaded. 2* restructure to be more friendly toward DBD pooling
3* validate table names before trying to log them. 3* validate table names before trying to log them.
4* write alternate DB driver (PostgreSQL, libDBI, mod_*_pool) 4* write alternate DB driver (PostgreSQL, libDBI, mod_*_pool)
5* look at forcing table name to ServerName instead of on of the names in 5* look at forcing table name to ServerName instead of on of the names in
@@ -7,7 +7,6 @@ TODO:
7* LogSQLRotateLogs directive with daily/monthly/weekly/etc. 7* LogSQLRotateLogs directive with daily/monthly/weekly/etc.
8* socket-based middleman daemon with configurable conns, or connect/disconnect. 8* socket-based middleman daemon with configurable conns, or connect/disconnect.
9* DBI connection pooling. 9* DBI connection pooling.
10* apr_dbd backend driver
11* ignore by cookie 10* ignore by cookie
12* investigate thread safety issues 11* investigate thread safety issues
13 Use libmysqlclient_r for threaded MPM (or always?) 12 Use libmysqlclient_r for threaded MPM (or always?)
diff --git a/autogen.sh b/autogen.sh
index 829fd3a..869d535 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -12,5 +12,6 @@ fi
12rm -rf autom4te.cache 12rm -rf autom4te.cache
13$ACLOCAL -I m4 13$ACLOCAL -I m4
14$AUTOHEADER 14$AUTOHEADER
15libtoolize -c --force
15$AUTOCONF 16$AUTOCONF
16touch stamp-h.in 17touch stamp-h.in
diff --git a/config.guess b/config.guess
deleted file mode 100755
index cd430f6..0000000
--- a/config.guess
+++ /dev/null
@@ -1,1314 +0,0 @@
1#! /bin/sh
2# Attempt to guess a canonical system name.
3# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
4# Free Software Foundation, Inc.
5
6timestamp='2001-08-21'
7
8# This file is free software; you can redistribute it and/or modify it
9# under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program 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# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21#
22# As a special exception to the GNU General Public License, if you
23# distribute this file as part of a program that contains a
24# configuration script generated by Autoconf, you may include it under
25# the same distribution terms that you use for the rest of that program.
26
27# Written by Per Bothner <bothner@cygnus.com>.
28# Please send patches to <config-patches@gnu.org>.
29#
30# This script attempts to guess a canonical system name similar to
31# config.sub. If it succeeds, it prints the system name on stdout, and
32# exits with 0. Otherwise, it exits with 1.
33#
34# The plan is that this can be called by configure scripts if you
35# don't specify an explicit build system type.
36
37me=`echo "$0" | sed -e 's,.*/,,'`
38
39usage="\
40Usage: $0 [OPTION]
41
42Output the configuration name of the system \`$me' is run on.
43
44Operation modes:
45 -h, --help print this help, then exit
46 -t, --time-stamp print date of last modification, then exit
47 -v, --version print version number, then exit
48
49Report bugs and patches to <config-patches@gnu.org>."
50
51version="\
52GNU config.guess ($timestamp)
53
54Originally written by Per Bothner.
55Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
56Free Software Foundation, Inc.
57
58This is free software; see the source for copying conditions. There is NO
59warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
60
61help="
62Try \`$me --help' for more information."
63
64# Parse command line
65while test $# -gt 0 ; do
66 case $1 in
67 --time-stamp | --time* | -t )
68 echo "$timestamp" ; exit 0 ;;
69 --version | -v )
70 echo "$version" ; exit 0 ;;
71 --help | --h* | -h )
72 echo "$usage"; exit 0 ;;
73 -- ) # Stop option processing
74 shift; break ;;
75 - ) # Use stdin as input.
76 break ;;
77 -* )
78 echo "$me: invalid option $1$help" >&2
79 exit 1 ;;
80 * )
81 break ;;
82 esac
83done
84
85if test $# != 0; then
86 echo "$me: too many arguments$help" >&2
87 exit 1
88fi
89
90
91dummy=dummy-$$
92trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
93
94# CC_FOR_BUILD -- compiler used by this script.
95# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
96# use `HOST_CC' if defined, but it is deprecated.
97
98set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
99 ,,) echo "int dummy(){}" > $dummy.c ;
100 for c in cc gcc c89 ; do
101 ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
102 if test $? = 0 ; then
103 CC_FOR_BUILD="$c"; break ;
104 fi ;
105 done ;
106 rm -f $dummy.c $dummy.o $dummy.rel ;
107 if test x"$CC_FOR_BUILD" = x ; then
108 CC_FOR_BUILD=no_compiler_found ;
109 fi
110 ;;
111 ,,*) CC_FOR_BUILD=$CC ;;
112 ,*,*) CC_FOR_BUILD=$HOST_CC ;;
113esac'
114
115# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
116# (ghazi@noc.rutgers.edu 1994-08-24)
117if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
118 PATH=$PATH:/.attbin ; export PATH
119fi
120
121UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
122UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
123UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
124UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
125
126# Note: order is significant - the case branches are not exclusive.
127
128case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
129 *:NetBSD:*:*)
130 # Netbsd (nbsd) targets should (where applicable) match one or
131 # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
132 # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
133 # switched to ELF, *-*-netbsd* would select the old
134 # object file format. This provides both forward
135 # compatibility and a consistent mechanism for selecting the
136 # object file format.
137 # Determine the machine/vendor (is the vendor relevant).
138 case "${UNAME_MACHINE}" in
139 amiga) machine=m68k-unknown ;;
140 arm32) machine=arm-unknown ;;
141 atari*) machine=m68k-atari ;;
142 sun3*) machine=m68k-sun ;;
143 mac68k) machine=m68k-apple ;;
144 macppc) machine=powerpc-apple ;;
145 hp3[0-9][05]) machine=m68k-hp ;;
146 ibmrt|romp-ibm) machine=romp-ibm ;;
147 *) machine=${UNAME_MACHINE}-unknown ;;
148 esac
149 # The Operating System including object format, if it has switched
150 # to ELF recently, or will in the future.
151 case "${UNAME_MACHINE}" in
152 i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
153 eval $set_cc_for_build
154 if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
155 | grep __ELF__ >/dev/null
156 then
157 # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
158 # Return netbsd for either. FIX?
159 os=netbsd
160 else
161 os=netbsdelf
162 fi
163 ;;
164 *)
165 os=netbsd
166 ;;
167 esac
168 # The OS release
169 release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
170 # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
171 # contains redundant information, the shorter form:
172 # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
173 echo "${machine}-${os}${release}"
174 exit 0 ;;
175 alpha:OSF1:*:*)
176 if test $UNAME_RELEASE = "V4.0"; then
177 UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
178 fi
179 # A Vn.n version is a released version.
180 # A Tn.n version is a released field test version.
181 # A Xn.n version is an unreleased experimental baselevel.
182 # 1.2 uses "1.2" for uname -r.
183 cat <<EOF >$dummy.s
184 .data
185\$Lformat:
186 .byte 37,100,45,37,120,10,0 # "%d-%x\n"
187
188 .text
189 .globl main
190 .align 4
191 .ent main
192main:
193 .frame \$30,16,\$26,0
194 ldgp \$29,0(\$27)
195 .prologue 1
196 .long 0x47e03d80 # implver \$0
197 lda \$2,-1
198 .long 0x47e20c21 # amask \$2,\$1
199 lda \$16,\$Lformat
200 mov \$0,\$17
201 not \$1,\$18
202 jsr \$26,printf
203 ldgp \$29,0(\$26)
204 mov 0,\$16
205 jsr \$26,exit
206 .end main
207EOF
208 eval $set_cc_for_build
209 $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
210 if test "$?" = 0 ; then
211 case `./$dummy` in
212 0-0)
213 UNAME_MACHINE="alpha"
214 ;;
215 1-0)
216 UNAME_MACHINE="alphaev5"
217 ;;
218 1-1)
219 UNAME_MACHINE="alphaev56"
220 ;;
221 1-101)
222 UNAME_MACHINE="alphapca56"
223 ;;
224 2-303)
225 UNAME_MACHINE="alphaev6"
226 ;;
227 2-307)
228 UNAME_MACHINE="alphaev67"
229 ;;
230 2-1307)
231 UNAME_MACHINE="alphaev68"
232 ;;
233 esac
234 fi
235 rm -f $dummy.s $dummy
236 echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
237 exit 0 ;;
238 Alpha\ *:Windows_NT*:*)
239 # How do we know it's Interix rather than the generic POSIX subsystem?
240 # Should we change UNAME_MACHINE based on the output of uname instead
241 # of the specific Alpha model?
242 echo alpha-pc-interix
243 exit 0 ;;
244 21064:Windows_NT:50:3)
245 echo alpha-dec-winnt3.5
246 exit 0 ;;
247 Amiga*:UNIX_System_V:4.0:*)
248 echo m68k-unknown-sysv4
249 exit 0;;
250 amiga:OpenBSD:*:*)
251 echo m68k-unknown-openbsd${UNAME_RELEASE}
252 exit 0 ;;
253 *:[Aa]miga[Oo][Ss]:*:*)
254 echo ${UNAME_MACHINE}-unknown-amigaos
255 exit 0 ;;
256 arc64:OpenBSD:*:*)
257 echo mips64el-unknown-openbsd${UNAME_RELEASE}
258 exit 0 ;;
259 arc:OpenBSD:*:*)
260 echo mipsel-unknown-openbsd${UNAME_RELEASE}
261 exit 0 ;;
262 hkmips:OpenBSD:*:*)
263 echo mips-unknown-openbsd${UNAME_RELEASE}
264 exit 0 ;;
265 pmax:OpenBSD:*:*)
266 echo mipsel-unknown-openbsd${UNAME_RELEASE}
267 exit 0 ;;
268 sgi:OpenBSD:*:*)
269 echo mips-unknown-openbsd${UNAME_RELEASE}
270 exit 0 ;;
271 wgrisc:OpenBSD:*:*)
272 echo mipsel-unknown-openbsd${UNAME_RELEASE}
273 exit 0 ;;
274 *:OS/390:*:*)
275 echo i370-ibm-openedition
276 exit 0 ;;
277 arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
278 echo arm-acorn-riscix${UNAME_RELEASE}
279 exit 0;;
280 SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
281 echo hppa1.1-hitachi-hiuxmpp
282 exit 0;;
283 Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
284 # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
285 if test "`(/bin/universe) 2>/dev/null`" = att ; then
286 echo pyramid-pyramid-sysv3
287 else
288 echo pyramid-pyramid-bsd
289 fi
290 exit 0 ;;
291 NILE*:*:*:dcosx)
292 echo pyramid-pyramid-svr4
293 exit 0 ;;
294 sun4H:SunOS:5.*:*)
295 echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
296 exit 0 ;;
297 sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
298 echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
299 exit 0 ;;
300 i86pc:SunOS:5.*:*)
301 echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
302 exit 0 ;;
303 sun4*:SunOS:6*:*)
304 # According to config.sub, this is the proper way to canonicalize
305 # SunOS6. Hard to guess exactly what SunOS6 will be like, but
306 # it's likely to be more like Solaris than SunOS4.
307 echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
308 exit 0 ;;
309 sun4*:SunOS:*:*)
310 case "`/usr/bin/arch -k`" in
311 Series*|S4*)
312 UNAME_RELEASE=`uname -v`
313 ;;
314 esac
315 # Japanese Language versions have a version number like `4.1.3-JL'.
316 echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
317 exit 0 ;;
318 sun3*:SunOS:*:*)
319 echo m68k-sun-sunos${UNAME_RELEASE}
320 exit 0 ;;
321 sun*:*:4.2BSD:*)
322 UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
323 test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
324 case "`/bin/arch`" in
325 sun3)
326 echo m68k-sun-sunos${UNAME_RELEASE}
327 ;;
328 sun4)
329 echo sparc-sun-sunos${UNAME_RELEASE}
330 ;;
331 esac
332 exit 0 ;;
333 aushp:SunOS:*:*)
334 echo sparc-auspex-sunos${UNAME_RELEASE}
335 exit 0 ;;
336 sparc*:NetBSD:*)
337 echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
338 exit 0 ;;
339 atari*:OpenBSD:*:*)
340 echo m68k-unknown-openbsd${UNAME_RELEASE}
341 exit 0 ;;
342 # The situation for MiNT is a little confusing. The machine name
343 # can be virtually everything (everything which is not
344 # "atarist" or "atariste" at least should have a processor
345 # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
346 # to the lowercase version "mint" (or "freemint"). Finally
347 # the system name "TOS" denotes a system which is actually not
348 # MiNT. But MiNT is downward compatible to TOS, so this should
349 # be no problem.
350 atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
351 echo m68k-atari-mint${UNAME_RELEASE}
352 exit 0 ;;
353 atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
354 echo m68k-atari-mint${UNAME_RELEASE}
355 exit 0 ;;
356 *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
357 echo m68k-atari-mint${UNAME_RELEASE}
358 exit 0 ;;
359 milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
360 echo m68k-milan-mint${UNAME_RELEASE}
361 exit 0 ;;
362 hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
363 echo m68k-hades-mint${UNAME_RELEASE}
364 exit 0 ;;
365 *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
366 echo m68k-unknown-mint${UNAME_RELEASE}
367 exit 0 ;;
368 sun3*:OpenBSD:*:*)
369 echo m68k-unknown-openbsd${UNAME_RELEASE}
370 exit 0 ;;
371 mac68k:OpenBSD:*:*)
372 echo m68k-unknown-openbsd${UNAME_RELEASE}
373 exit 0 ;;
374 mvme68k:OpenBSD:*:*)
375 echo m68k-unknown-openbsd${UNAME_RELEASE}
376 exit 0 ;;
377 mvme88k:OpenBSD:*:*)
378 echo m88k-unknown-openbsd${UNAME_RELEASE}
379 exit 0 ;;
380 powerpc:machten:*:*)
381 echo powerpc-apple-machten${UNAME_RELEASE}
382 exit 0 ;;
383 RISC*:Mach:*:*)
384 echo mips-dec-mach_bsd4.3
385 exit 0 ;;
386 RISC*:ULTRIX:*:*)
387 echo mips-dec-ultrix${UNAME_RELEASE}
388 exit 0 ;;
389 VAX*:ULTRIX*:*:*)
390 echo vax-dec-ultrix${UNAME_RELEASE}
391 exit 0 ;;
392 2020:CLIX:*:* | 2430:CLIX:*:*)
393 echo clipper-intergraph-clix${UNAME_RELEASE}
394 exit 0 ;;
395 mips:*:*:UMIPS | mips:*:*:RISCos)
396 sed 's/^ //' << EOF >$dummy.c
397#ifdef __cplusplus
398#include <stdio.h> /* for printf() prototype */
399 int main (int argc, char *argv[]) {
400#else
401 int main (argc, argv) int argc; char *argv[]; {
402#endif
403 #if defined (host_mips) && defined (MIPSEB)
404 #if defined (SYSTYPE_SYSV)
405 printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
406 #endif
407 #if defined (SYSTYPE_SVR4)
408 printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
409 #endif
410 #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
411 printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
412 #endif
413 #endif
414 exit (-1);
415 }
416EOF
417 eval $set_cc_for_build
418 $CC_FOR_BUILD $dummy.c -o $dummy \
419 && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
420 && rm -f $dummy.c $dummy && exit 0
421 rm -f $dummy.c $dummy
422 echo mips-mips-riscos${UNAME_RELEASE}
423 exit 0 ;;
424 Motorola:PowerMAX_OS:*:*)
425 echo powerpc-motorola-powermax
426 exit 0 ;;
427 Night_Hawk:Power_UNIX:*:*)
428 echo powerpc-harris-powerunix
429 exit 0 ;;
430 m88k:CX/UX:7*:*)
431 echo m88k-harris-cxux7
432 exit 0 ;;
433 m88k:*:4*:R4*)
434 echo m88k-motorola-sysv4
435 exit 0 ;;
436 m88k:*:3*:R3*)
437 echo m88k-motorola-sysv3
438 exit 0 ;;
439 AViiON:dgux:*:*)
440 # DG/UX returns AViiON for all architectures
441 UNAME_PROCESSOR=`/usr/bin/uname -p`
442 if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
443 then
444 if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
445 [ ${TARGET_BINARY_INTERFACE}x = x ]
446 then
447 echo m88k-dg-dgux${UNAME_RELEASE}
448 else
449 echo m88k-dg-dguxbcs${UNAME_RELEASE}
450 fi
451 else
452 echo i586-dg-dgux${UNAME_RELEASE}
453 fi
454 exit 0 ;;
455 M88*:DolphinOS:*:*) # DolphinOS (SVR3)
456 echo m88k-dolphin-sysv3
457 exit 0 ;;
458 M88*:*:R3*:*)
459 # Delta 88k system running SVR3
460 echo m88k-motorola-sysv3
461 exit 0 ;;
462 XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
463 echo m88k-tektronix-sysv3
464 exit 0 ;;
465 Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
466 echo m68k-tektronix-bsd
467 exit 0 ;;
468 *:IRIX*:*:*)
469 echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
470 exit 0 ;;
471 ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
472 echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
473 exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
474 i*86:AIX:*:*)
475 echo i386-ibm-aix
476 exit 0 ;;
477 ia64:AIX:*:*)
478 if [ -x /usr/bin/oslevel ] ; then
479 IBM_REV=`/usr/bin/oslevel`
480 else
481 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
482 fi
483 echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
484 exit 0 ;;
485 *:AIX:2:3)
486 if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
487 sed 's/^ //' << EOF >$dummy.c
488 #include <sys/systemcfg.h>
489
490 main()
491 {
492 if (!__power_pc())
493 exit(1);
494 puts("powerpc-ibm-aix3.2.5");
495 exit(0);
496 }
497EOF
498 eval $set_cc_for_build
499 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
500 rm -f $dummy.c $dummy
501 echo rs6000-ibm-aix3.2.5
502 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
503 echo rs6000-ibm-aix3.2.4
504 else
505 echo rs6000-ibm-aix3.2
506 fi
507 exit 0 ;;
508 *:AIX:*:[45])
509 IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
510 if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
511 IBM_ARCH=rs6000
512 else
513 IBM_ARCH=powerpc
514 fi
515 if [ -x /usr/bin/oslevel ] ; then
516 IBM_REV=`/usr/bin/oslevel`
517 else
518 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
519 fi
520 echo ${IBM_ARCH}-ibm-aix${IBM_REV}
521 exit 0 ;;
522 *:AIX:*:*)
523 echo rs6000-ibm-aix
524 exit 0 ;;
525 ibmrt:4.4BSD:*|romp-ibm:BSD:*)
526 echo romp-ibm-bsd4.4
527 exit 0 ;;
528 ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
529 echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
530 exit 0 ;; # report: romp-ibm BSD 4.3
531 *:BOSX:*:*)
532 echo rs6000-bull-bosx
533 exit 0 ;;
534 DPX/2?00:B.O.S.:*:*)
535 echo m68k-bull-sysv3
536 exit 0 ;;
537 9000/[34]??:4.3bsd:1.*:*)
538 echo m68k-hp-bsd
539 exit 0 ;;
540 hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
541 echo m68k-hp-bsd4.4
542 exit 0 ;;
543 9000/[34678]??:HP-UX:*:*)
544 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
545 case "${UNAME_MACHINE}" in
546 9000/31? ) HP_ARCH=m68000 ;;
547 9000/[34]?? ) HP_ARCH=m68k ;;
548 9000/[678][0-9][0-9])
549 case "${HPUX_REV}" in
550 11.[0-9][0-9])
551 if [ -x /usr/bin/getconf ]; then
552 sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
553 sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
554 case "${sc_cpu_version}" in
555 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
556 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
557 532) # CPU_PA_RISC2_0
558 case "${sc_kernel_bits}" in
559 32) HP_ARCH="hppa2.0n" ;;
560 64) HP_ARCH="hppa2.0w" ;;
561 esac ;;
562 esac
563 fi ;;
564 esac
565 if [ "${HP_ARCH}" = "" ]; then
566 sed 's/^ //' << EOF >$dummy.c
567
568 #define _HPUX_SOURCE
569 #include <stdlib.h>
570 #include <unistd.h>
571
572 int main ()
573 {
574 #if defined(_SC_KERNEL_BITS)
575 long bits = sysconf(_SC_KERNEL_BITS);
576 #endif
577 long cpu = sysconf (_SC_CPU_VERSION);
578
579 switch (cpu)
580 {
581 case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
582 case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
583 case CPU_PA_RISC2_0:
584 #if defined(_SC_KERNEL_BITS)
585 switch (bits)
586 {
587 case 64: puts ("hppa2.0w"); break;
588 case 32: puts ("hppa2.0n"); break;
589 default: puts ("hppa2.0"); break;
590 } break;
591 #else /* !defined(_SC_KERNEL_BITS) */
592 puts ("hppa2.0"); break;
593 #endif
594 default: puts ("hppa1.0"); break;
595 }
596 exit (0);
597 }
598EOF
599 eval $set_cc_for_build
600 (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
601 if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
602 rm -f $dummy.c $dummy
603 fi ;;
604 esac
605 echo ${HP_ARCH}-hp-hpux${HPUX_REV}
606 exit 0 ;;
607 ia64:HP-UX:*:*)
608 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
609 echo ia64-hp-hpux${HPUX_REV}
610 exit 0 ;;
611 3050*:HI-UX:*:*)
612 sed 's/^ //' << EOF >$dummy.c
613 #include <unistd.h>
614 int
615 main ()
616 {
617 long cpu = sysconf (_SC_CPU_VERSION);
618 /* The order matters, because CPU_IS_HP_MC68K erroneously returns
619 true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
620 results, however. */
621 if (CPU_IS_PA_RISC (cpu))
622 {
623 switch (cpu)
624 {
625 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
626 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
627 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
628 default: puts ("hppa-hitachi-hiuxwe2"); break;
629 }
630 }
631 else if (CPU_IS_HP_MC68K (cpu))
632 puts ("m68k-hitachi-hiuxwe2");
633 else puts ("unknown-hitachi-hiuxwe2");
634 exit (0);
635 }
636EOF
637 eval $set_cc_for_build
638 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
639 rm -f $dummy.c $dummy
640 echo unknown-hitachi-hiuxwe2
641 exit 0 ;;
642 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
643 echo hppa1.1-hp-bsd
644 exit 0 ;;
645 9000/8??:4.3bsd:*:*)
646 echo hppa1.0-hp-bsd
647 exit 0 ;;
648 *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
649 echo hppa1.0-hp-mpeix
650 exit 0 ;;
651 hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
652 echo hppa1.1-hp-osf
653 exit 0 ;;
654 hp8??:OSF1:*:*)
655 echo hppa1.0-hp-osf
656 exit 0 ;;
657 i*86:OSF1:*:*)
658 if [ -x /usr/sbin/sysversion ] ; then
659 echo ${UNAME_MACHINE}-unknown-osf1mk
660 else
661 echo ${UNAME_MACHINE}-unknown-osf1
662 fi
663 exit 0 ;;
664 parisc*:Lites*:*:*)
665 echo hppa1.1-hp-lites
666 exit 0 ;;
667 hppa*:OpenBSD:*:*)
668 echo hppa-unknown-openbsd
669 exit 0 ;;
670 C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
671 echo c1-convex-bsd
672 exit 0 ;;
673 C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
674 if getsysinfo -f scalar_acc
675 then echo c32-convex-bsd
676 else echo c2-convex-bsd
677 fi
678 exit 0 ;;
679 C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
680 echo c34-convex-bsd
681 exit 0 ;;
682 C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
683 echo c38-convex-bsd
684 exit 0 ;;
685 C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
686 echo c4-convex-bsd
687 exit 0 ;;
688 CRAY*X-MP:*:*:*)
689 echo xmp-cray-unicos
690 exit 0 ;;
691 CRAY*Y-MP:*:*:*)
692 echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
693 exit 0 ;;
694 CRAY*[A-Z]90:*:*:*)
695 echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
696 | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
697 -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
698 -e 's/\.[^.]*$/.X/'
699 exit 0 ;;
700 CRAY*TS:*:*:*)
701 echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
702 exit 0 ;;
703 CRAY*T3D:*:*:*)
704 echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
705 exit 0 ;;
706 CRAY*T3E:*:*:*)
707 echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
708 exit 0 ;;
709 CRAY*SV1:*:*:*)
710 echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
711 exit 0 ;;
712 CRAY-2:*:*:*)
713 echo cray2-cray-unicos
714 exit 0 ;;
715 F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
716 FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
717 FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
718 FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
719 echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
720 exit 0 ;;
721 hp300:OpenBSD:*:*)
722 echo m68k-unknown-openbsd${UNAME_RELEASE}
723 exit 0 ;;
724 i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
725 echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
726 exit 0 ;;
727 sparc*:BSD/OS:*:*)
728 echo sparc-unknown-bsdi${UNAME_RELEASE}
729 exit 0 ;;
730 *:BSD/OS:*:*)
731 echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
732 exit 0 ;;
733 *:FreeBSD:*:*)
734 echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
735 exit 0 ;;
736 *:OpenBSD:*:*)
737 echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
738 exit 0 ;;
739 i*:CYGWIN*:*)
740 echo ${UNAME_MACHINE}-pc-cygwin
741 exit 0 ;;
742 i*:MINGW*:*)
743 echo ${UNAME_MACHINE}-pc-mingw32
744 exit 0 ;;
745 i*:PW*:*)
746 echo ${UNAME_MACHINE}-pc-pw32
747 exit 0 ;;
748 i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
749 # How do we know it's Interix rather than the generic POSIX subsystem?
750 # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
751 # UNAME_MACHINE based on the output of uname instead of i386?
752 echo i386-pc-interix
753 exit 0 ;;
754 i*:UWIN*:*)
755 echo ${UNAME_MACHINE}-pc-uwin
756 exit 0 ;;
757 p*:CYGWIN*:*)
758 echo powerpcle-unknown-cygwin
759 exit 0 ;;
760 prep*:SunOS:5.*:*)
761 echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
762 exit 0 ;;
763 *:GNU:*:*)
764 echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
765 exit 0 ;;
766 i*86:Minix:*:*)
767 echo ${UNAME_MACHINE}-pc-minix
768 exit 0 ;;
769 arm*:Linux:*:*)
770 echo ${UNAME_MACHINE}-unknown-linux-gnu
771 exit 0 ;;
772 ia64:Linux:*:*)
773 echo ${UNAME_MACHINE}-unknown-linux
774 exit 0 ;;
775 m68*:Linux:*:*)
776 echo ${UNAME_MACHINE}-unknown-linux-gnu
777 exit 0 ;;
778 mips:Linux:*:*)
779 case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
780 big) echo mips-unknown-linux-gnu && exit 0 ;;
781 little) echo mipsel-unknown-linux-gnu && exit 0 ;;
782 esac
783 ;;
784 ppc:Linux:*:*)
785 echo powerpc-unknown-linux-gnu
786 exit 0 ;;
787 ppc64:Linux:*:*)
788 echo powerpc64-unknown-linux-gnu
789 exit 0 ;;
790 alpha:Linux:*:*)
791 case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
792 EV5) UNAME_MACHINE=alphaev5 ;;
793 EV56) UNAME_MACHINE=alphaev56 ;;
794 PCA56) UNAME_MACHINE=alphapca56 ;;
795 PCA57) UNAME_MACHINE=alphapca56 ;;
796 EV6) UNAME_MACHINE=alphaev6 ;;
797 EV67) UNAME_MACHINE=alphaev67 ;;
798 EV68*) UNAME_MACHINE=alphaev68 ;;
799 esac
800 objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
801 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
802 echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
803 exit 0 ;;
804 parisc:Linux:*:* | hppa:Linux:*:*)
805 # Look for CPU level
806 case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
807 PA7*) echo hppa1.1-unknown-linux-gnu ;;
808 PA8*) echo hppa2.0-unknown-linux-gnu ;;
809 *) echo hppa-unknown-linux-gnu ;;
810 esac
811 exit 0 ;;
812 parisc64:Linux:*:* | hppa64:Linux:*:*)
813 echo hppa64-unknown-linux-gnu
814 exit 0 ;;
815 s390:Linux:*:* | s390x:Linux:*:*)
816 echo ${UNAME_MACHINE}-ibm-linux
817 exit 0 ;;
818 sh*:Linux:*:*)
819 echo ${UNAME_MACHINE}-unknown-linux-gnu
820 exit 0 ;;
821 sparc:Linux:*:* | sparc64:Linux:*:*)
822 echo ${UNAME_MACHINE}-unknown-linux-gnu
823 exit 0 ;;
824 x86_64:Linux:*:*)
825 echo x86_64-unknown-linux-gnu
826 exit 0 ;;
827 i*86:Linux:*:*)
828 # The BFD linker knows what the default object file format is, so
829 # first see if it will tell us. cd to the root directory to prevent
830 # problems with other programs or directories called `ld' in the path.
831 ld_supported_targets=`cd /; ld --help 2>&1 \
832 | sed -ne '/supported targets:/!d
833 s/[ ][ ]*/ /g
834 s/.*supported targets: *//
835 s/ .*//
836 p'`
837 case "$ld_supported_targets" in
838 elf32-i386)
839 TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
840 ;;
841 a.out-i386-linux)
842 echo "${UNAME_MACHINE}-pc-linux-gnuaout"
843 exit 0 ;;
844 coff-i386)
845 echo "${UNAME_MACHINE}-pc-linux-gnucoff"
846 exit 0 ;;
847 "")
848 # Either a pre-BFD a.out linker (linux-gnuoldld) or
849 # one that does not give us useful --help.
850 echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
851 exit 0 ;;
852 esac
853 # Determine whether the default compiler is a.out or elf
854 cat >$dummy.c <<EOF
855#include <features.h>
856#ifdef __cplusplus
857#include <stdio.h> /* for printf() prototype */
858 int main (int argc, char *argv[]) {
859#else
860 int main (argc, argv) int argc; char *argv[]; {
861#endif
862#ifdef __ELF__
863# ifdef __GLIBC__
864# if __GLIBC__ >= 2
865 printf ("%s-pc-linux-gnu\n", argv[1]);
866# else
867 printf ("%s-pc-linux-gnulibc1\n", argv[1]);
868# endif
869# else
870 printf ("%s-pc-linux-gnulibc1\n", argv[1]);
871# endif
872#else
873 printf ("%s-pc-linux-gnuaout\n", argv[1]);
874#endif
875 return 0;
876}
877EOF
878 eval $set_cc_for_build
879 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
880 rm -f $dummy.c $dummy
881 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
882 ;;
883 i*86:DYNIX/ptx:4*:*)
884 # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
885 # earlier versions are messed up and put the nodename in both
886 # sysname and nodename.
887 echo i386-sequent-sysv4
888 exit 0 ;;
889 i*86:UNIX_SV:4.2MP:2.*)
890 # Unixware is an offshoot of SVR4, but it has its own version
891 # number series starting with 2...
892 # I am not positive that other SVR4 systems won't match this,
893 # I just have to hope. -- rms.
894 # Use sysv4.2uw... so that sysv4* matches it.
895 echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
896 exit 0 ;;
897 i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
898 UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
899 if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
900 echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
901 else
902 echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
903 fi
904 exit 0 ;;
905 i*86:*:5:[78]*)
906 case `/bin/uname -X | grep "^Machine"` in
907 *486*) UNAME_MACHINE=i486 ;;
908 *Pentium) UNAME_MACHINE=i586 ;;
909 *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
910 esac
911 echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
912 exit 0 ;;
913 i*86:*:3.2:*)
914 if test -f /usr/options/cb.name; then
915 UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
916 echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
917 elif /bin/uname -X 2>/dev/null >/dev/null ; then
918 UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
919 (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
920 (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
921 && UNAME_MACHINE=i586
922 (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
923 && UNAME_MACHINE=i686
924 (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
925 && UNAME_MACHINE=i686
926 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
927 else
928 echo ${UNAME_MACHINE}-pc-sysv32
929 fi
930 exit 0 ;;
931 i*86:*DOS:*:*)
932 echo ${UNAME_MACHINE}-pc-msdosdjgpp
933 exit 0 ;;
934 pc:*:*:*)
935 # Left here for compatibility:
936 # uname -m prints for DJGPP always 'pc', but it prints nothing about
937 # the processor, so we play safe by assuming i386.
938 echo i386-pc-msdosdjgpp
939 exit 0 ;;
940 Intel:Mach:3*:*)
941 echo i386-pc-mach3
942 exit 0 ;;
943 paragon:*:*:*)
944 echo i860-intel-osf1
945 exit 0 ;;
946 i860:*:4.*:*) # i860-SVR4
947 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
948 echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
949 else # Add other i860-SVR4 vendors below as they are discovered.
950 echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
951 fi
952 exit 0 ;;
953 mini*:CTIX:SYS*5:*)
954 # "miniframe"
955 echo m68010-convergent-sysv
956 exit 0 ;;
957 M68*:*:R3V[567]*:*)
958 test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
959 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
960 OS_REL=''
961 test -r /etc/.relid \
962 && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
963 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
964 && echo i486-ncr-sysv4.3${OS_REL} && exit 0
965 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
966 && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
967 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
968 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
969 && echo i486-ncr-sysv4 && exit 0 ;;
970 m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
971 echo m68k-unknown-lynxos${UNAME_RELEASE}
972 exit 0 ;;
973 mc68030:UNIX_System_V:4.*:*)
974 echo m68k-atari-sysv4
975 exit 0 ;;
976 i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
977 echo i386-unknown-lynxos${UNAME_RELEASE}
978 exit 0 ;;
979 TSUNAMI:LynxOS:2.*:*)
980 echo sparc-unknown-lynxos${UNAME_RELEASE}
981 exit 0 ;;
982 rs6000:LynxOS:2.*:*)
983 echo rs6000-unknown-lynxos${UNAME_RELEASE}
984 exit 0 ;;
985 PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
986 echo powerpc-unknown-lynxos${UNAME_RELEASE}
987 exit 0 ;;
988 SM[BE]S:UNIX_SV:*:*)
989 echo mips-dde-sysv${UNAME_RELEASE}
990 exit 0 ;;
991 RM*:ReliantUNIX-*:*:*)
992 echo mips-sni-sysv4
993 exit 0 ;;
994 RM*:SINIX-*:*:*)
995 echo mips-sni-sysv4
996 exit 0 ;;
997 *:SINIX-*:*:*)
998 if uname -p 2>/dev/null >/dev/null ; then
999 UNAME_MACHINE=`(uname -p) 2>/dev/null`
1000 echo ${UNAME_MACHINE}-sni-sysv4
1001 else
1002 echo ns32k-sni-sysv
1003 fi
1004 exit 0 ;;
1005 PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
1006 # says <Richard.M.Bartel@ccMail.Census.GOV>
1007 echo i586-unisys-sysv4
1008 exit 0 ;;
1009 *:UNIX_System_V:4*:FTX*)
1010 # From Gerald Hewes <hewes@openmarket.com>.
1011 # How about differentiating between stratus architectures? -djm
1012 echo hppa1.1-stratus-sysv4
1013 exit 0 ;;
1014 *:*:*:FTX*)
1015 # From seanf@swdc.stratus.com.
1016 echo i860-stratus-sysv4
1017 exit 0 ;;
1018 *:VOS:*:*)
1019 # From Paul.Green@stratus.com.
1020 echo hppa1.1-stratus-vos
1021 exit 0 ;;
1022 mc68*:A/UX:*:*)
1023 echo m68k-apple-aux${UNAME_RELEASE}
1024 exit 0 ;;
1025 news*:NEWS-OS:6*:*)
1026 echo mips-sony-newsos6
1027 exit 0 ;;
1028 R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
1029 if [ -d /usr/nec ]; then
1030 echo mips-nec-sysv${UNAME_RELEASE}
1031 else
1032 echo mips-unknown-sysv${UNAME_RELEASE}
1033 fi
1034 exit 0 ;;
1035 BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
1036 echo powerpc-be-beos
1037 exit 0 ;;
1038 BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
1039 echo powerpc-apple-beos
1040 exit 0 ;;
1041 BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
1042 echo i586-pc-beos
1043 exit 0 ;;
1044 SX-4:SUPER-UX:*:*)
1045 echo sx4-nec-superux${UNAME_RELEASE}
1046 exit 0 ;;
1047 SX-5:SUPER-UX:*:*)
1048 echo sx5-nec-superux${UNAME_RELEASE}
1049 exit 0 ;;
1050 Power*:Rhapsody:*:*)
1051 echo powerpc-apple-rhapsody${UNAME_RELEASE}
1052 exit 0 ;;
1053 *:Rhapsody:*:*)
1054 echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
1055 exit 0 ;;
1056 *:Darwin:*:*)
1057 echo `uname -p`-apple-darwin${UNAME_RELEASE}
1058 exit 0 ;;
1059 *:procnto*:*:* | *:QNX:[0123456789]*:*)
1060 if test "${UNAME_MACHINE}" = "x86pc"; then
1061 UNAME_MACHINE=pc
1062 fi
1063 echo `uname -p`-${UNAME_MACHINE}-nto-qnx
1064 exit 0 ;;
1065 *:QNX:*:4*)
1066 echo i386-pc-qnx
1067 exit 0 ;;
1068 NSR-[KW]:NONSTOP_KERNEL:*:*)
1069 echo nsr-tandem-nsk${UNAME_RELEASE}
1070 exit 0 ;;
1071 *:NonStop-UX:*:*)
1072 echo mips-compaq-nonstopux
1073 exit 0 ;;
1074 BS2000:POSIX*:*:*)
1075 echo bs2000-siemens-sysv
1076 exit 0 ;;
1077 DS/*:UNIX_System_V:*:*)
1078 echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
1079 exit 0 ;;
1080 *:Plan9:*:*)
1081 # "uname -m" is not consistent, so use $cputype instead. 386
1082 # is converted to i386 for consistency with other x86
1083 # operating systems.
1084 if test "$cputype" = "386"; then
1085 UNAME_MACHINE=i386
1086 else
1087 UNAME_MACHINE="$cputype"
1088 fi
1089 echo ${UNAME_MACHINE}-unknown-plan9
1090 exit 0 ;;
1091 i*86:OS/2:*:*)
1092 # If we were able to find `uname', then EMX Unix compatibility
1093 # is probably installed.
1094 echo ${UNAME_MACHINE}-pc-os2-emx
1095 exit 0 ;;
1096 *:TOPS-10:*:*)
1097 echo pdp10-unknown-tops10
1098 exit 0 ;;
1099 *:TENEX:*:*)
1100 echo pdp10-unknown-tenex
1101 exit 0 ;;
1102 KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
1103 echo pdp10-dec-tops20
1104 exit 0 ;;
1105 XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
1106 echo pdp10-xkl-tops20
1107 exit 0 ;;
1108 *:TOPS-20:*:*)
1109 echo pdp10-unknown-tops20
1110 exit 0 ;;
1111 *:ITS:*:*)
1112 echo pdp10-unknown-its
1113 exit 0 ;;
1114 i*86:XTS-300:*:STOP)
1115 echo ${UNAME_MACHINE}-unknown-stop
1116 exit 0 ;;
1117esac
1118
1119#echo '(No uname command or uname output not recognized.)' 1>&2
1120#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
1121
1122cat >$dummy.c <<EOF
1123#ifdef _SEQUENT_
1124# include <sys/types.h>
1125# include <sys/utsname.h>
1126#endif
1127main ()
1128{
1129#if defined (sony)
1130#if defined (MIPSEB)
1131 /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
1132 I don't know.... */
1133 printf ("mips-sony-bsd\n"); exit (0);
1134#else
1135#include <sys/param.h>
1136 printf ("m68k-sony-newsos%s\n",
1137#ifdef NEWSOS4
1138 "4"
1139#else
1140 ""
1141#endif
1142 ); exit (0);
1143#endif
1144#endif
1145
1146#if defined (__arm) && defined (__acorn) && defined (__unix)
1147 printf ("arm-acorn-riscix"); exit (0);
1148#endif
1149
1150#if defined (hp300) && !defined (hpux)
1151 printf ("m68k-hp-bsd\n"); exit (0);
1152#endif
1153
1154#if defined (NeXT)
1155#if !defined (__ARCHITECTURE__)
1156#define __ARCHITECTURE__ "m68k"
1157#endif
1158 int version;
1159 version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
1160 if (version < 4)
1161 printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
1162 else
1163 printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
1164 exit (0);
1165#endif
1166
1167#if defined (MULTIMAX) || defined (n16)
1168#if defined (UMAXV)
1169 printf ("ns32k-encore-sysv\n"); exit (0);
1170#else
1171#if defined (CMU)
1172 printf ("ns32k-encore-mach\n"); exit (0);
1173#else
1174 printf ("ns32k-encore-bsd\n"); exit (0);
1175#endif
1176#endif
1177#endif
1178
1179#if defined (__386BSD__)
1180 printf ("i386-pc-bsd\n"); exit (0);
1181#endif
1182
1183#if defined (sequent)
1184#if defined (i386)
1185 printf ("i386-sequent-dynix\n"); exit (0);
1186#endif
1187#if defined (ns32000)
1188 printf ("ns32k-sequent-dynix\n"); exit (0);
1189#endif
1190#endif
1191
1192#if defined (_SEQUENT_)
1193 struct utsname un;
1194
1195 uname(&un);
1196
1197 if (strncmp(un.version, "V2", 2) == 0) {
1198 printf ("i386-sequent-ptx2\n"); exit (0);
1199 }
1200 if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
1201 printf ("i386-sequent-ptx1\n"); exit (0);
1202 }
1203 printf ("i386-sequent-ptx\n"); exit (0);
1204
1205#endif
1206
1207#if defined (vax)
1208# if !defined (ultrix)
1209# include <sys/param.h>
1210# if defined (BSD)
1211# if BSD == 43
1212 printf ("vax-dec-bsd4.3\n"); exit (0);
1213# else
1214# if BSD == 199006
1215 printf ("vax-dec-bsd4.3reno\n"); exit (0);
1216# else
1217 printf ("vax-dec-bsd\n"); exit (0);
1218# endif
1219# endif
1220# else
1221 printf ("vax-dec-bsd\n"); exit (0);
1222# endif
1223# else
1224 printf ("vax-dec-ultrix\n"); exit (0);
1225# endif
1226#endif
1227
1228#if defined (alliant) && defined (i860)
1229 printf ("i860-alliant-bsd\n"); exit (0);
1230#endif
1231
1232 exit (1);
1233}
1234EOF
1235
1236eval $set_cc_for_build
1237$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
1238rm -f $dummy.c $dummy
1239
1240# Apollos put the system type in the environment.
1241
1242test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
1243
1244# Convex versions that predate uname can use getsysinfo(1)
1245
1246if [ -x /usr/convex/getsysinfo ]
1247then
1248 case `getsysinfo -f cpu_type` in
1249 c1*)
1250 echo c1-convex-bsd
1251 exit 0 ;;
1252 c2*)
1253 if getsysinfo -f scalar_acc
1254 then echo c32-convex-bsd
1255 else echo c2-convex-bsd
1256 fi
1257 exit 0 ;;
1258 c34*)
1259 echo c34-convex-bsd
1260 exit 0 ;;
1261 c38*)
1262 echo c38-convex-bsd
1263 exit 0 ;;
1264 c4*)
1265 echo c4-convex-bsd
1266 exit 0 ;;
1267 esac
1268fi
1269
1270cat >&2 <<EOF
1271$0: unable to guess system type
1272
1273This script, last modified $timestamp, has failed to recognize
1274the operating system you are using. It is advised that you
1275download the most up to date version of the config scripts from
1276
1277 ftp://ftp.gnu.org/pub/gnu/config/
1278
1279If the version you run ($0) is already up to date, please
1280send the following data and any information you think might be
1281pertinent to <config-patches@gnu.org> in order to provide the needed
1282information to handle your system.
1283
1284config.guess timestamp = $timestamp
1285
1286uname -m = `(uname -m) 2>/dev/null || echo unknown`
1287uname -r = `(uname -r) 2>/dev/null || echo unknown`
1288uname -s = `(uname -s) 2>/dev/null || echo unknown`
1289uname -v = `(uname -v) 2>/dev/null || echo unknown`
1290
1291/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
1292/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
1293
1294hostinfo = `(hostinfo) 2>/dev/null`
1295/bin/universe = `(/bin/universe) 2>/dev/null`
1296/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
1297/bin/arch = `(/bin/arch) 2>/dev/null`
1298/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
1299/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
1300
1301UNAME_MACHINE = ${UNAME_MACHINE}
1302UNAME_RELEASE = ${UNAME_RELEASE}
1303UNAME_SYSTEM = ${UNAME_SYSTEM}
1304UNAME_VERSION = ${UNAME_VERSION}
1305EOF
1306
1307exit 1
1308
1309# Local variables:
1310# eval: (add-hook 'write-file-hooks 'time-stamp)
1311# time-stamp-start: "timestamp='"
1312# time-stamp-format: "%:y-%02m-%02d"
1313# time-stamp-end: "'"
1314# End:
diff --git a/config.sub b/config.sub
deleted file mode 100755
index 12ebc78..0000000
--- a/config.sub
+++ /dev/null
@@ -1,1410 +0,0 @@
1#! /bin/sh
2# Configuration validation subroutine script.
3# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
4# Free Software Foundation, Inc.
5
6timestamp='2001-08-13'
7
8# This file is (in principle) common to ALL GNU software.
9# The presence of a machine in this file suggests that SOME GNU software
10# can handle that machine. It does not imply ALL GNU software can.
11#
12# This file is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
24# Foundation, Inc., 59 Temple Place - Suite 330,
25# Boston, MA 02111-1307, USA.
26
27# As a special exception to the GNU General Public License, if you
28# distribute this file as part of a program that contains a
29# configuration script generated by Autoconf, you may include it under
30# the same distribution terms that you use for the rest of that program.
31
32# Please send patches to <config-patches@gnu.org>.
33#
34# Configuration subroutine to validate and canonicalize a configuration type.
35# Supply the specified configuration type as an argument.
36# If it is invalid, we print an error message on stderr and exit with code 1.
37# Otherwise, we print the canonical config type on stdout and succeed.
38
39# This file is supposed to be the same for all GNU packages
40# and recognize all the CPU types, system types and aliases
41# that are meaningful with *any* GNU software.
42# Each package is responsible for reporting which valid configurations
43# it does not support. The user should be able to distinguish
44# a failure to support a valid configuration from a meaningless
45# configuration.
46
47# The goal of this file is to map all the various variations of a given
48# machine specification into a single specification in the form:
49# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
50# or in some cases, the newer four-part form:
51# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
52# It is wrong to echo any other type of specification.
53
54me=`echo "$0" | sed -e 's,.*/,,'`
55
56usage="\
57Usage: $0 [OPTION] CPU-MFR-OPSYS
58 $0 [OPTION] ALIAS
59
60Canonicalize a configuration name.
61
62Operation modes:
63 -h, --help print this help, then exit
64 -t, --time-stamp print date of last modification, then exit
65 -v, --version print version number, then exit
66
67Report bugs and patches to <config-patches@gnu.org>."
68
69version="\
70GNU config.sub ($timestamp)
71
72Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
73Free Software Foundation, Inc.
74
75This is free software; see the source for copying conditions. There is NO
76warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
77
78help="
79Try \`$me --help' for more information."
80
81# Parse command line
82while test $# -gt 0 ; do
83 case $1 in
84 --time-stamp | --time* | -t )
85 echo "$timestamp" ; exit 0 ;;
86 --version | -v )
87 echo "$version" ; exit 0 ;;
88 --help | --h* | -h )
89 echo "$usage"; exit 0 ;;
90 -- ) # Stop option processing
91 shift; break ;;
92 - ) # Use stdin as input.
93 break ;;
94 -* )
95 echo "$me: invalid option $1$help"
96 exit 1 ;;
97
98 *local*)
99 # First pass through any local machine types.
100 echo $1
101 exit 0;;
102
103 * )
104 break ;;
105 esac
106done
107
108case $# in
109 0) echo "$me: missing argument$help" >&2
110 exit 1;;
111 1) ;;
112 *) echo "$me: too many arguments$help" >&2
113 exit 1;;
114esac
115
116# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
117# Here we must recognize all the valid KERNEL-OS combinations.
118maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
119case $maybe_os in
120 nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
121 os=-$maybe_os
122 basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
123 ;;
124 *)
125 basic_machine=`echo $1 | sed 's/-[^-]*$//'`
126 if [ $basic_machine != $1 ]
127 then os=`echo $1 | sed 's/.*-/-/'`
128 else os=; fi
129 ;;
130esac
131
132### Let's recognize common machines as not being operating systems so
133### that things like config.sub decstation-3100 work. We also
134### recognize some manufacturers as not being operating systems, so we
135### can provide default operating systems below.
136case $os in
137 -sun*os*)
138 # Prevent following clause from handling this invalid input.
139 ;;
140 -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
141 -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
142 -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
143 -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
144 -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
145 -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
146 -apple | -axis)
147 os=
148 basic_machine=$1
149 ;;
150 -sim | -cisco | -oki | -wec | -winbond)
151 os=
152 basic_machine=$1
153 ;;
154 -scout)
155 ;;
156 -wrs)
157 os=-vxworks
158 basic_machine=$1
159 ;;
160 -chorusos*)
161 os=-chorusos
162 basic_machine=$1
163 ;;
164 -chorusrdb)
165 os=-chorusrdb
166 basic_machine=$1
167 ;;
168 -hiux*)
169 os=-hiuxwe2
170 ;;
171 -sco5)
172 os=-sco3.2v5
173 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
174 ;;
175 -sco4)
176 os=-sco3.2v4
177 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
178 ;;
179 -sco3.2.[4-9]*)
180 os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
181 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
182 ;;
183 -sco3.2v[4-9]*)
184 # Don't forget version if it is 3.2v4 or newer.
185 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
186 ;;
187 -sco*)
188 os=-sco3.2v2
189 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
190 ;;
191 -udk*)
192 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
193 ;;
194 -isc)
195 os=-isc2.2
196 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
197 ;;
198 -clix*)
199 basic_machine=clipper-intergraph
200 ;;
201 -isc*)
202 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
203 ;;
204 -lynx*)
205 os=-lynxos
206 ;;
207 -ptx*)
208 basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
209 ;;
210 -windowsnt*)
211 os=`echo $os | sed -e 's/windowsnt/winnt/'`
212 ;;
213 -psos*)
214 os=-psos
215 ;;
216 -mint | -mint[0-9]*)
217 basic_machine=m68k-atari
218 os=-mint
219 ;;
220esac
221
222# Decode aliases for certain CPU-COMPANY combinations.
223case $basic_machine in
224 # Recognize the basic CPU types without company name.
225 # Some are omitted here because they have special meanings below.
226 1750a | 580 \
227 | a29k \
228 | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
229 | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
230 | c4x | clipper \
231 | d10v | d30v | dsp16xx \
232 | fr30 \
233 | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
234 | i370 | i860 | i960 | ia64 \
235 | m32r | m68000 | m68k | m88k | mcore \
236 | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
237 | mips64vr4100 | mips64vr4100el | mips64vr4300 \
238 | mips64vr4300el | mips64vr5000 | mips64vr5000el \
239 | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \
240 | mn10200 | mn10300 \
241 | ns16k | ns32k \
242 | openrisc \
243 | pdp10 | pdp11 | pj | pjl \
244 | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
245 | pyramid \
246 | s390 | s390x \
247 | sh | sh[34] | sh[34]eb | shbe | shle \
248 | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
249 | strongarm \
250 | tahoe | thumb | tic80 | tron \
251 | v850 \
252 | we32k \
253 | x86 | xscale \
254 | z8k)
255 basic_machine=$basic_machine-unknown
256 ;;
257 m6811 | m68hc11 | m6812 | m68hc12)
258 # Motorola 68HC11/12.
259 basic_machine=$basic_machine-unknown
260 os=-none
261 ;;
262 m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
263 ;;
264
265 # We use `pc' rather than `unknown'
266 # because (1) that's what they normally are, and
267 # (2) the word "unknown" tends to confuse beginning users.
268 i*86 | x86_64)
269 basic_machine=$basic_machine-pc
270 ;;
271 # Object if more than one company name word.
272 *-*-*)
273 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
274 exit 1
275 ;;
276 # Recognize the basic CPU types with company name.
277 580-* \
278 | a29k-* \
279 | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
280 | alphapca5[67]-* | arc-* \
281 | arm-* | armbe-* | armle-* | armv*-* \
282 | bs2000-* \
283 | c[123]* | c30-* | [cjt]90-* | c54x-* \
284 | clipper-* | cray2-* | cydra-* \
285 | d10v-* | d30v-* \
286 | elxsi-* \
287 | f30[01]-* | f700-* | fr30-* | fx80-* \
288 | h8300-* | h8500-* \
289 | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
290 | i*86-* | i860-* | i960-* | ia64-* \
291 | m32r-* \
292 | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
293 | m88110-* | m88k-* | mcore-* \
294 | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
295 | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
296 | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \
297 | mipsle-* | mipstx39-* | mipstx39el-* \
298 | none-* | np1-* | ns16k-* | ns32k-* \
299 | orion-* \
300 | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
301 | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
302 | pyramid-* \
303 | romp-* | rs6000-* \
304 | s390-* | s390x-* \
305 | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
306 | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
307 | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
308 | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
309 | v850-* | vax-* \
310 | we32k-* \
311 | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
312 | ymp-* \
313 | z8k-*)
314 ;;
315 # Recognize the various machine names and aliases which stand
316 # for a CPU type and a company and sometimes even an OS.
317 386bsd)
318 basic_machine=i386-unknown
319 os=-bsd
320 ;;
321 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
322 basic_machine=m68000-att
323 ;;
324 3b*)
325 basic_machine=we32k-att
326 ;;
327 a29khif)
328 basic_machine=a29k-amd
329 os=-udi
330 ;;
331 adobe68k)
332 basic_machine=m68010-adobe
333 os=-scout
334 ;;
335 alliant | fx80)
336 basic_machine=fx80-alliant
337 ;;
338 altos | altos3068)
339 basic_machine=m68k-altos
340 ;;
341 am29k)
342 basic_machine=a29k-none
343 os=-bsd
344 ;;
345 amdahl)
346 basic_machine=580-amdahl
347 os=-sysv
348 ;;
349 amiga | amiga-*)
350 basic_machine=m68k-unknown
351 ;;
352 amigaos | amigados)
353 basic_machine=m68k-unknown
354 os=-amigaos
355 ;;
356 amigaunix | amix)
357 basic_machine=m68k-unknown
358 os=-sysv4
359 ;;
360 apollo68)
361 basic_machine=m68k-apollo
362 os=-sysv
363 ;;
364 apollo68bsd)
365 basic_machine=m68k-apollo
366 os=-bsd
367 ;;
368 aux)
369 basic_machine=m68k-apple
370 os=-aux
371 ;;
372 balance)
373 basic_machine=ns32k-sequent
374 os=-dynix
375 ;;
376 convex-c1)
377 basic_machine=c1-convex
378 os=-bsd
379 ;;
380 convex-c2)
381 basic_machine=c2-convex
382 os=-bsd
383 ;;
384 convex-c32)
385 basic_machine=c32-convex
386 os=-bsd
387 ;;
388 convex-c34)
389 basic_machine=c34-convex
390 os=-bsd
391 ;;
392 convex-c38)
393 basic_machine=c38-convex
394 os=-bsd
395 ;;
396 cray | ymp)
397 basic_machine=ymp-cray
398 os=-unicos
399 ;;
400 cray2)
401 basic_machine=cray2-cray
402 os=-unicos
403 ;;
404 [cjt]90)
405 basic_machine=${basic_machine}-cray
406 os=-unicos
407 ;;
408 crds | unos)
409 basic_machine=m68k-crds
410 ;;
411 cris | cris-* | etrax*)
412 basic_machine=cris-axis
413 ;;
414 da30 | da30-*)
415 basic_machine=m68k-da30
416 ;;
417 decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
418 basic_machine=mips-dec
419 ;;
420 delta | 3300 | motorola-3300 | motorola-delta \
421 | 3300-motorola | delta-motorola)
422 basic_machine=m68k-motorola
423 ;;
424 delta88)
425 basic_machine=m88k-motorola
426 os=-sysv3
427 ;;
428 dpx20 | dpx20-*)
429 basic_machine=rs6000-bull
430 os=-bosx
431 ;;
432 dpx2* | dpx2*-bull)
433 basic_machine=m68k-bull
434 os=-sysv3
435 ;;
436 ebmon29k)
437 basic_machine=a29k-amd
438 os=-ebmon
439 ;;
440 elxsi)
441 basic_machine=elxsi-elxsi
442 os=-bsd
443 ;;
444 encore | umax | mmax)
445 basic_machine=ns32k-encore
446 ;;
447 es1800 | OSE68k | ose68k | ose | OSE)
448 basic_machine=m68k-ericsson
449 os=-ose
450 ;;
451 fx2800)
452 basic_machine=i860-alliant
453 ;;
454 genix)
455 basic_machine=ns32k-ns
456 ;;
457 gmicro)
458 basic_machine=tron-gmicro
459 os=-sysv
460 ;;
461 go32)
462 basic_machine=i386-pc
463 os=-go32
464 ;;
465 h3050r* | hiux*)
466 basic_machine=hppa1.1-hitachi
467 os=-hiuxwe2
468 ;;
469 h8300hms)
470 basic_machine=h8300-hitachi
471 os=-hms
472 ;;
473 h8300xray)
474 basic_machine=h8300-hitachi
475 os=-xray
476 ;;
477 h8500hms)
478 basic_machine=h8500-hitachi
479 os=-hms
480 ;;
481 harris)
482 basic_machine=m88k-harris
483 os=-sysv3
484 ;;
485 hp300-*)
486 basic_machine=m68k-hp
487 ;;
488 hp300bsd)
489 basic_machine=m68k-hp
490 os=-bsd
491 ;;
492 hp300hpux)
493 basic_machine=m68k-hp
494 os=-hpux
495 ;;
496 hp3k9[0-9][0-9] | hp9[0-9][0-9])
497 basic_machine=hppa1.0-hp
498 ;;
499 hp9k2[0-9][0-9] | hp9k31[0-9])
500 basic_machine=m68000-hp
501 ;;
502 hp9k3[2-9][0-9])
503 basic_machine=m68k-hp
504 ;;
505 hp9k6[0-9][0-9] | hp6[0-9][0-9])
506 basic_machine=hppa1.0-hp
507 ;;
508 hp9k7[0-79][0-9] | hp7[0-79][0-9])
509 basic_machine=hppa1.1-hp
510 ;;
511 hp9k78[0-9] | hp78[0-9])
512 # FIXME: really hppa2.0-hp
513 basic_machine=hppa1.1-hp
514 ;;
515 hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
516 # FIXME: really hppa2.0-hp
517 basic_machine=hppa1.1-hp
518 ;;
519 hp9k8[0-9][13679] | hp8[0-9][13679])
520 basic_machine=hppa1.1-hp
521 ;;
522 hp9k8[0-9][0-9] | hp8[0-9][0-9])
523 basic_machine=hppa1.0-hp
524 ;;
525 hppa-next)
526 os=-nextstep3
527 ;;
528 hppaosf)
529 basic_machine=hppa1.1-hp
530 os=-osf
531 ;;
532 hppro)
533 basic_machine=hppa1.1-hp
534 os=-proelf
535 ;;
536 i370-ibm* | ibm*)
537 basic_machine=i370-ibm
538 ;;
539# I'm not sure what "Sysv32" means. Should this be sysv3.2?
540 i*86v32)
541 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
542 os=-sysv32
543 ;;
544 i*86v4*)
545 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
546 os=-sysv4
547 ;;
548 i*86v)
549 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
550 os=-sysv
551 ;;
552 i*86sol2)
553 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
554 os=-solaris2
555 ;;
556 i386mach)
557 basic_machine=i386-mach
558 os=-mach
559 ;;
560 i386-vsta | vsta)
561 basic_machine=i386-unknown
562 os=-vsta
563 ;;
564 iris | iris4d)
565 basic_machine=mips-sgi
566 case $os in
567 -irix*)
568 ;;
569 *)
570 os=-irix4
571 ;;
572 esac
573 ;;
574 isi68 | isi)
575 basic_machine=m68k-isi
576 os=-sysv
577 ;;
578 m88k-omron*)
579 basic_machine=m88k-omron
580 ;;
581 magnum | m3230)
582 basic_machine=mips-mips
583 os=-sysv
584 ;;
585 merlin)
586 basic_machine=ns32k-utek
587 os=-sysv
588 ;;
589 mingw32)
590 basic_machine=i386-pc
591 os=-mingw32
592 ;;
593 miniframe)
594 basic_machine=m68000-convergent
595 ;;
596 *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
597 basic_machine=m68k-atari
598 os=-mint
599 ;;
600 mipsel*-linux*)
601 basic_machine=mipsel-unknown
602 os=-linux-gnu
603 ;;
604 mips*-linux*)
605 basic_machine=mips-unknown
606 os=-linux-gnu
607 ;;
608 mips3*-*)
609 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
610 ;;
611 mips3*)
612 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
613 ;;
614 mmix*)
615 basic_machine=mmix-knuth
616 os=-mmixware
617 ;;
618 monitor)
619 basic_machine=m68k-rom68k
620 os=-coff
621 ;;
622 msdos)
623 basic_machine=i386-pc
624 os=-msdos
625 ;;
626 mvs)
627 basic_machine=i370-ibm
628 os=-mvs
629 ;;
630 ncr3000)
631 basic_machine=i486-ncr
632 os=-sysv4
633 ;;
634 netbsd386)
635 basic_machine=i386-unknown
636 os=-netbsd
637 ;;
638 netwinder)
639 basic_machine=armv4l-rebel
640 os=-linux
641 ;;
642 news | news700 | news800 | news900)
643 basic_machine=m68k-sony
644 os=-newsos
645 ;;
646 news1000)
647 basic_machine=m68030-sony
648 os=-newsos
649 ;;
650 news-3600 | risc-news)
651 basic_machine=mips-sony
652 os=-newsos
653 ;;
654 necv70)
655 basic_machine=v70-nec
656 os=-sysv
657 ;;
658 next | m*-next )
659 basic_machine=m68k-next
660 case $os in
661 -nextstep* )
662 ;;
663 -ns2*)
664 os=-nextstep2
665 ;;
666 *)
667 os=-nextstep3
668 ;;
669 esac
670 ;;
671 nh3000)
672 basic_machine=m68k-harris
673 os=-cxux
674 ;;
675 nh[45]000)
676 basic_machine=m88k-harris
677 os=-cxux
678 ;;
679 nindy960)
680 basic_machine=i960-intel
681 os=-nindy
682 ;;
683 mon960)
684 basic_machine=i960-intel
685 os=-mon960
686 ;;
687 nonstopux)
688 basic_machine=mips-compaq
689 os=-nonstopux
690 ;;
691 np1)
692 basic_machine=np1-gould
693 ;;
694 nsr-tandem)
695 basic_machine=nsr-tandem
696 ;;
697 op50n-* | op60c-*)
698 basic_machine=hppa1.1-oki
699 os=-proelf
700 ;;
701 OSE68000 | ose68000)
702 basic_machine=m68000-ericsson
703 os=-ose
704 ;;
705 os68k)
706 basic_machine=m68k-none
707 os=-os68k
708 ;;
709 pa-hitachi)
710 basic_machine=hppa1.1-hitachi
711 os=-hiuxwe2
712 ;;
713 paragon)
714 basic_machine=i860-intel
715 os=-osf
716 ;;
717 pbd)
718 basic_machine=sparc-tti
719 ;;
720 pbb)
721 basic_machine=m68k-tti
722 ;;
723 pc532 | pc532-*)
724 basic_machine=ns32k-pc532
725 ;;
726 pentium | p5 | k5 | k6 | nexgen)
727 basic_machine=i586-pc
728 ;;
729 pentiumpro | p6 | 6x86 | athlon)
730 basic_machine=i686-pc
731 ;;
732 pentiumii | pentium2)
733 basic_machine=i686-pc
734 ;;
735 pentium-* | p5-* | k5-* | k6-* | nexgen-*)
736 basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
737 ;;
738 pentiumpro-* | p6-* | 6x86-* | athlon-*)
739 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
740 ;;
741 pentiumii-* | pentium2-*)
742 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
743 ;;
744 pn)
745 basic_machine=pn-gould
746 ;;
747 power) basic_machine=power-ibm
748 ;;
749 ppc) basic_machine=powerpc-unknown
750 ;;
751 ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
752 ;;
753 ppcle | powerpclittle | ppc-le | powerpc-little)
754 basic_machine=powerpcle-unknown
755 ;;
756 ppcle-* | powerpclittle-*)
757 basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
758 ;;
759 ppc64) basic_machine=powerpc64-unknown
760 ;;
761 ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
762 ;;
763 ppc64le | powerpc64little | ppc64-le | powerpc64-little)
764 basic_machine=powerpc64le-unknown
765 ;;
766 ppc64le-* | powerpc64little-*)
767 basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
768 ;;
769 ps2)
770 basic_machine=i386-ibm
771 ;;
772 pw32)
773 basic_machine=i586-unknown
774 os=-pw32
775 ;;
776 rom68k)
777 basic_machine=m68k-rom68k
778 os=-coff
779 ;;
780 rm[46]00)
781 basic_machine=mips-siemens
782 ;;
783 rtpc | rtpc-*)
784 basic_machine=romp-ibm
785 ;;
786 sa29200)
787 basic_machine=a29k-amd
788 os=-udi
789 ;;
790 sequent)
791 basic_machine=i386-sequent
792 ;;
793 sh)
794 basic_machine=sh-hitachi
795 os=-hms
796 ;;
797 sparclite-wrs)
798 basic_machine=sparclite-wrs
799 os=-vxworks
800 ;;
801 sps7)
802 basic_machine=m68k-bull
803 os=-sysv2
804 ;;
805 spur)
806 basic_machine=spur-unknown
807 ;;
808 st2000)
809 basic_machine=m68k-tandem
810 ;;
811 stratus)
812 basic_machine=i860-stratus
813 os=-sysv4
814 ;;
815 sun2)
816 basic_machine=m68000-sun
817 ;;
818 sun2os3)
819 basic_machine=m68000-sun
820 os=-sunos3
821 ;;
822 sun2os4)
823 basic_machine=m68000-sun
824 os=-sunos4
825 ;;
826 sun3os3)
827 basic_machine=m68k-sun
828 os=-sunos3
829 ;;
830 sun3os4)
831 basic_machine=m68k-sun
832 os=-sunos4
833 ;;
834 sun4os3)
835 basic_machine=sparc-sun
836 os=-sunos3
837 ;;
838 sun4os4)
839 basic_machine=sparc-sun
840 os=-sunos4
841 ;;
842 sun4sol2)
843 basic_machine=sparc-sun
844 os=-solaris2
845 ;;
846 sun3 | sun3-*)
847 basic_machine=m68k-sun
848 ;;
849 sun4)
850 basic_machine=sparc-sun
851 ;;
852 sun386 | sun386i | roadrunner)
853 basic_machine=i386-sun
854 ;;
855 sv1)
856 basic_machine=sv1-cray
857 os=-unicos
858 ;;
859 symmetry)
860 basic_machine=i386-sequent
861 os=-dynix
862 ;;
863 t3e)
864 basic_machine=t3e-cray
865 os=-unicos
866 ;;
867 tic54x | c54x*)
868 basic_machine=tic54x-unknown
869 os=-coff
870 ;;
871 tx39)
872 basic_machine=mipstx39-unknown
873 ;;
874 tx39el)
875 basic_machine=mipstx39el-unknown
876 ;;
877 tower | tower-32)
878 basic_machine=m68k-ncr
879 ;;
880 udi29k)
881 basic_machine=a29k-amd
882 os=-udi
883 ;;
884 ultra3)
885 basic_machine=a29k-nyu
886 os=-sym1
887 ;;
888 v810 | necv810)
889 basic_machine=v810-nec
890 os=-none
891 ;;
892 vaxv)
893 basic_machine=vax-dec
894 os=-sysv
895 ;;
896 vms)
897 basic_machine=vax-dec
898 os=-vms
899 ;;
900 vpp*|vx|vx-*)
901 basic_machine=f301-fujitsu
902 ;;
903 vxworks960)
904 basic_machine=i960-wrs
905 os=-vxworks
906 ;;
907 vxworks68)
908 basic_machine=m68k-wrs
909 os=-vxworks
910 ;;
911 vxworks29k)
912 basic_machine=a29k-wrs
913 os=-vxworks
914 ;;
915 w65*)
916 basic_machine=w65-wdc
917 os=-none
918 ;;
919 w89k-*)
920 basic_machine=hppa1.1-winbond
921 os=-proelf
922 ;;
923 windows32)
924 basic_machine=i386-pc
925 os=-windows32-msvcrt
926 ;;
927 xmp)
928 basic_machine=xmp-cray
929 os=-unicos
930 ;;
931 xps | xps100)
932 basic_machine=xps100-honeywell
933 ;;
934 z8k-*-coff)
935 basic_machine=z8k-unknown
936 os=-sim
937 ;;
938 none)
939 basic_machine=none-none
940 os=-none
941 ;;
942
943# Here we handle the default manufacturer of certain CPU types. It is in
944# some cases the only manufacturer, in others, it is the most popular.
945 w89k)
946 basic_machine=hppa1.1-winbond
947 ;;
948 op50n)
949 basic_machine=hppa1.1-oki
950 ;;
951 op60c)
952 basic_machine=hppa1.1-oki
953 ;;
954 mips)
955 if [ x$os = x-linux-gnu ]; then
956 basic_machine=mips-unknown
957 else
958 basic_machine=mips-mips
959 fi
960 ;;
961 romp)
962 basic_machine=romp-ibm
963 ;;
964 rs6000)
965 basic_machine=rs6000-ibm
966 ;;
967 vax)
968 basic_machine=vax-dec
969 ;;
970 pdp10)
971 # there are many clones, so DEC is not a safe bet
972 basic_machine=pdp10-unknown
973 ;;
974 pdp11)
975 basic_machine=pdp11-dec
976 ;;
977 we32k)
978 basic_machine=we32k-att
979 ;;
980 sh3 | sh4 | sh3eb | sh4eb)
981 basic_machine=sh-unknown
982 ;;
983 sparc | sparcv9 | sparcv9b)
984 basic_machine=sparc-sun
985 ;;
986 cydra)
987 basic_machine=cydra-cydrome
988 ;;
989 orion)
990 basic_machine=orion-highlevel
991 ;;
992 orion105)
993 basic_machine=clipper-highlevel
994 ;;
995 mac | mpw | mac-mpw)
996 basic_machine=m68k-apple
997 ;;
998 pmac | pmac-mpw)
999 basic_machine=powerpc-apple
1000 ;;
1001 c4x*)
1002 basic_machine=c4x-none
1003 os=-coff
1004 ;;
1005 *-unknown)
1006 # Make sure to match an already-canonicalized machine name.
1007 ;;
1008 *)
1009 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
1010 exit 1
1011 ;;
1012esac
1013
1014# Here we canonicalize certain aliases for manufacturers.
1015case $basic_machine in
1016 *-digital*)
1017 basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
1018 ;;
1019 *-commodore*)
1020 basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
1021 ;;
1022 *)
1023 ;;
1024esac
1025
1026# Decode manufacturer-specific aliases for certain operating systems.
1027
1028if [ x"$os" != x"" ]
1029then
1030case $os in
1031 # First match some system type aliases
1032 # that might get confused with valid system types.
1033 # -solaris* is a basic system type, with this one exception.
1034 -solaris1 | -solaris1.*)
1035 os=`echo $os | sed -e 's|solaris1|sunos4|'`
1036 ;;
1037 -solaris)
1038 os=-solaris2
1039 ;;
1040 -svr4*)
1041 os=-sysv4
1042 ;;
1043 -unixware*)
1044 os=-sysv4.2uw
1045 ;;
1046 -gnu/linux*)
1047 os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
1048 ;;
1049 # First accept the basic system types.
1050 # The portable systems comes first.
1051 # Each alternative MUST END IN A *, to match a version number.
1052 # -sysv* is not here because it comes later, after sysvr4.
1053 -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
1054 | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
1055 | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
1056 | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
1057 | -aos* \
1058 | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
1059 | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
1060 | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
1061 | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
1062 | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
1063 | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
1064 | -chorusos* | -chorusrdb* \
1065 | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
1066 | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
1067 | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
1068 | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
1069 | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
1070 | -os2* | -vos*)
1071 # Remember, each alternative MUST END IN *, to match a version number.
1072 ;;
1073 -qnx*)
1074 case $basic_machine in
1075 x86-* | i*86-*)
1076 ;;
1077 *)
1078 os=-nto$os
1079 ;;
1080 esac
1081 ;;
1082 -nto*)
1083 os=-nto-qnx
1084 ;;
1085 -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
1086 | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
1087 | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
1088 ;;
1089 -mac*)
1090 os=`echo $os | sed -e 's|mac|macos|'`
1091 ;;
1092 -linux*)
1093 os=`echo $os | sed -e 's|linux|linux-gnu|'`
1094 ;;
1095 -sunos5*)
1096 os=`echo $os | sed -e 's|sunos5|solaris2|'`
1097 ;;
1098 -sunos6*)
1099 os=`echo $os | sed -e 's|sunos6|solaris3|'`
1100 ;;
1101 -opened*)
1102 os=-openedition
1103 ;;
1104 -wince*)
1105 os=-wince
1106 ;;
1107 -osfrose*)
1108 os=-osfrose
1109 ;;
1110 -osf*)
1111 os=-osf
1112 ;;
1113 -utek*)
1114 os=-bsd
1115 ;;
1116 -dynix*)
1117 os=-bsd
1118 ;;
1119 -acis*)
1120 os=-aos
1121 ;;
1122 -386bsd)
1123 os=-bsd
1124 ;;
1125 -ctix* | -uts*)
1126 os=-sysv
1127 ;;
1128 -ns2 )
1129 os=-nextstep2
1130 ;;
1131 -nsk*)
1132 os=-nsk
1133 ;;
1134 # Preserve the version number of sinix5.
1135 -sinix5.*)
1136 os=`echo $os | sed -e 's|sinix|sysv|'`
1137 ;;
1138 -sinix*)
1139 os=-sysv4
1140 ;;
1141 -triton*)
1142 os=-sysv3
1143 ;;
1144 -oss*)
1145 os=-sysv3
1146 ;;
1147 -svr4)
1148 os=-sysv4
1149 ;;
1150 -svr3)
1151 os=-sysv3
1152 ;;
1153 -sysvr4)
1154 os=-sysv4
1155 ;;
1156 # This must come after -sysvr4.
1157 -sysv*)
1158 ;;
1159 -ose*)
1160 os=-ose
1161 ;;
1162 -es1800*)
1163 os=-ose
1164 ;;
1165 -xenix)
1166 os=-xenix
1167 ;;
1168 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
1169 os=-mint
1170 ;;
1171 -none)
1172 ;;
1173 *)
1174 # Get rid of the `-' at the beginning of $os.
1175 os=`echo $os | sed 's/[^-]*-//'`
1176 echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
1177 exit 1
1178 ;;
1179esac
1180else
1181
1182# Here we handle the default operating systems that come with various machines.
1183# The value should be what the vendor currently ships out the door with their
1184# machine or put another way, the most popular os provided with the machine.
1185
1186# Note that if you're going to try to match "-MANUFACTURER" here (say,
1187# "-sun"), then you have to tell the case statement up towards the top
1188# that MANUFACTURER isn't an operating system. Otherwise, code above
1189# will signal an error saying that MANUFACTURER isn't an operating
1190# system, and we'll never get to this point.
1191
1192case $basic_machine in
1193 *-acorn)
1194 os=-riscix1.2
1195 ;;
1196 arm*-rebel)
1197 os=-linux
1198 ;;
1199 arm*-semi)
1200 os=-aout
1201 ;;
1202 pdp10-*)
1203 os=-tops20
1204 ;;
1205 pdp11-*)
1206 os=-none
1207 ;;
1208 *-dec | vax-*)
1209 os=-ultrix4.2
1210 ;;
1211 m68*-apollo)
1212 os=-domain
1213 ;;
1214 i386-sun)
1215 os=-sunos4.0.2
1216 ;;
1217 m68000-sun)
1218 os=-sunos3
1219 # This also exists in the configure program, but was not the
1220 # default.
1221 # os=-sunos4
1222 ;;
1223 m68*-cisco)
1224 os=-aout
1225 ;;
1226 mips*-cisco)
1227 os=-elf
1228 ;;
1229 mips*-*)
1230 os=-elf
1231 ;;
1232 *-tti) # must be before sparc entry or we get the wrong os.
1233 os=-sysv3
1234 ;;
1235 sparc-* | *-sun)
1236 os=-sunos4.1.1
1237 ;;
1238 *-be)
1239 os=-beos
1240 ;;
1241 *-ibm)
1242 os=-aix
1243 ;;
1244 *-wec)
1245 os=-proelf
1246 ;;
1247 *-winbond)
1248 os=-proelf
1249 ;;
1250 *-oki)
1251 os=-proelf
1252 ;;
1253 *-hp)
1254 os=-hpux
1255 ;;
1256 *-hitachi)
1257 os=-hiux
1258 ;;
1259 i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
1260 os=-sysv
1261 ;;
1262 *-cbm)
1263 os=-amigaos
1264 ;;
1265 *-dg)
1266 os=-dgux
1267 ;;
1268 *-dolphin)
1269 os=-sysv3
1270 ;;
1271 m68k-ccur)
1272 os=-rtu
1273 ;;
1274 m88k-omron*)
1275 os=-luna
1276 ;;
1277 *-next )
1278 os=-nextstep
1279 ;;
1280 *-sequent)
1281 os=-ptx
1282 ;;
1283 *-crds)
1284 os=-unos
1285 ;;
1286 *-ns)
1287 os=-genix
1288 ;;
1289 i370-*)
1290 os=-mvs
1291 ;;
1292 *-next)
1293 os=-nextstep3
1294 ;;
1295 *-gould)
1296 os=-sysv
1297 ;;
1298 *-highlevel)
1299 os=-bsd
1300 ;;
1301 *-encore)
1302 os=-bsd
1303 ;;
1304 *-sgi)
1305 os=-irix
1306 ;;
1307 *-siemens)
1308 os=-sysv4
1309 ;;
1310 *-masscomp)
1311 os=-rtu
1312 ;;
1313 f30[01]-fujitsu | f700-fujitsu)
1314 os=-uxpv
1315 ;;
1316 *-rom68k)
1317 os=-coff
1318 ;;
1319 *-*bug)
1320 os=-coff
1321 ;;
1322 *-apple)
1323 os=-macos
1324 ;;
1325 *-atari*)
1326 os=-mint
1327 ;;
1328 *)
1329 os=-none
1330 ;;
1331esac
1332fi
1333
1334# Here we handle the case where we know the os, and the CPU type, but not the
1335# manufacturer. We pick the logical manufacturer.
1336vendor=unknown
1337case $basic_machine in
1338 *-unknown)
1339 case $os in
1340 -riscix*)
1341 vendor=acorn
1342 ;;
1343 -sunos*)
1344 vendor=sun
1345 ;;
1346 -aix*)
1347 vendor=ibm
1348 ;;
1349 -beos*)
1350 vendor=be
1351 ;;
1352 -hpux*)
1353 vendor=hp
1354 ;;
1355 -mpeix*)
1356 vendor=hp
1357 ;;
1358 -hiux*)
1359 vendor=hitachi
1360 ;;
1361 -unos*)
1362 vendor=crds
1363 ;;
1364 -dgux*)
1365 vendor=dg
1366 ;;
1367 -luna*)
1368 vendor=omron
1369 ;;
1370 -genix*)
1371 vendor=ns
1372 ;;
1373 -mvs* | -opened*)
1374 vendor=ibm
1375 ;;
1376 -ptx*)
1377 vendor=sequent
1378 ;;
1379 -vxsim* | -vxworks*)
1380 vendor=wrs
1381 ;;
1382 -aux*)
1383 vendor=apple
1384 ;;
1385 -hms*)
1386 vendor=hitachi
1387 ;;
1388 -mpw* | -macos*)
1389 vendor=apple
1390 ;;
1391 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
1392 vendor=atari
1393 ;;
1394 -vos*)
1395 vendor=stratus
1396 ;;
1397 esac
1398 basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
1399 ;;
1400esac
1401
1402echo $basic_machine$os
1403exit 0
1404
1405# Local variables:
1406# eval: (add-hook 'write-file-hooks 'time-stamp)
1407# time-stamp-start: "timestamp='"
1408# time-stamp-format: "%:y-%02m-%02d"
1409# time-stamp-end: "'"
1410# End:
diff --git a/configure.ac b/configure.ac
index ee2d474..395398f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,15 +1,17 @@
1dnl Required initializer 1dnl Required initializer
2AC_INIT(mod_log_sql, 1.101) 2AC_INIT([mod_log_sql],[1.102])
3OOO_CONFIG_NICE(config.nice) 3OOO_CONFIG_NICE(config.nice)
4AC_PREREQ(2.53) 4AC_PREREQ(2.59)
5AC_CONFIG_HEADERS(config.h) 5AC_CONFIG_HEADERS(include/autoconfig.h)
6 6AC_CONFIG_SRCDIR(src/mod_log_sql.c)
7AC_CONFIG_SRCDIR(mod_log_sql.c)
8 7
9OOO_MAINTAIN_MODE 8OOO_MAINTAIN_MODE
10 9
11dnl Add a test for a compiler. 10dnl Add a test for a compiler.
12AC_PROG_CC 11AC_PROG_CC
12AC_PROG_LIBTOOL
13
14PKG_CHECK_MODULES(PCRE,libpcre)
13 15
14APACHE20_VERSION=2.0.40 16APACHE20_VERSION=2.0.40
15APACHE13_VERSION=1.3.20 17APACHE13_VERSION=1.3.20
@@ -18,7 +20,7 @@ CHECK_APACHE($APACHE13_VERSION,$APACHE20_VERSION,
18 :, 20 :,
19 AC_MSG_ERROR([*** The correct version Apache was not found!]) 21 AC_MSG_ERROR([*** The correct version Apache was not found!])
20 AC_MSG_ERROR([*** You need either Apache 1.3 version $APACHE13_VERSION or greater]) 22 AC_MSG_ERROR([*** You need either Apache 1.3 version $APACHE13_VERSION or greater])
21 AC_MSG_ERROR([*** or Apache 2.0/2.1 version $APACHE20_VERSION or greater!]) 23 AC_MSG_ERROR([*** or Apache 2.0/2.2 version $APACHE20_VERSION or greater!])
22 ) 24 )
23 25
24if test $AP_VERSION = "2.0"; then 26if test $AP_VERSION = "2.0"; then
@@ -26,8 +28,16 @@ if test $AP_VERSION = "2.0"; then
26else 28else
27 WANT_LOGIO_MOD=0 29 WANT_LOGIO_MOD=0
28fi 30fi
31
29AC_SUBST(WANT_LOGIO_MOD) 32AC_SUBST(WANT_LOGIO_MOD)
30 33
34CHECK_APU_HEADERS([apr_dbd.h],
35 WANT_DBD_MOD=1,
36 WANT_DBD_MOD=0)
37
38AC_SUBST(WANT_DBD_MOD)
39CHECK_APU_FUNCS(apr_dbd_transaction_mode_get)
40
31CHECK_MYSQL( 41CHECK_MYSQL(
32 WANT_MYSQL_MOD=1, 42 WANT_MYSQL_MOD=1,
33 AC_MSG_WARN([*** Mysql client libraries not found!]) 43 AC_MSG_WARN([*** Mysql client libraries not found!])
@@ -75,9 +85,12 @@ AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
75 85
76dnl Write config.status and the Makefile 86dnl Write config.status and the Makefile
77 87
78AC_OUTPUT(Makefile 88AC_CONFIG_FILES([Makefile
89src/Makefile
79docs/Makefile 90docs/Makefile
80contrib/Makefile) 91utility/Makefile
92contrib/Makefile])
93AC_OUTPUT
81 94
82 95
83AC_MSG_RESULT([------------------------------------]) 96AC_MSG_RESULT([------------------------------------])
@@ -105,6 +118,9 @@ fi
105if test $WANT_DBI_MOD -eq 1; then 118if test $WANT_DBI_MOD -eq 1; then
106 AC_MSG_RESULT([ libDBI Driver]) 119 AC_MSG_RESULT([ libDBI Driver])
107fi 120fi
121if test $WANT_DBD_MOD -eq 1; then
122 AC_MSG_RESULT([ APR DBD Driver])
123fi
108if test $OOO_MAINTAIN -eq 1; then 124if test $OOO_MAINTAIN -eq 1; then
109 AC_MSG_RESULT([Maintainer mode is on. -Werror is in effect]) 125 AC_MSG_RESULT([Maintainer mode is on. -Werror is in effect])
110fi 126fi
diff --git a/contrib/Makefile.in b/contrib/Makefile.in
index b384fd0..c2bd203 100644
--- a/contrib/Makefile.in
+++ b/contrib/Makefile.in
@@ -17,60 +17,17 @@ STD_DIST = Makefile.in
17 17
18DISTFILES = $(STD_DIST) $(EXTRA_DIST) 18DISTFILES = $(STD_DIST) $(EXTRA_DIST)
19 19
20all: all-subdirs 20all:
21 21
22all-subdirs install-subdirs update-subdirs clean-subdirs distclean-subdirs: 22install:
23 @otarget=`echo $@|sed s/-subdirs//`; \
24 list=' $(SUBDIRS)'; \
25 for i in $$list; do \
26 if test -d "$$i"; then \
27 target="$$otarget"; \
28 echo "Making $$target in $$i"; \
29 if test "$$i" = "."; then \
30 made_local=yes; \
31 target="local-$$target"; \
32 fi; \
33 (cd $$i && $(MAKE) $$target) || exit 1; \
34 fi; \
35 done; \
36 23
37include: 24update:
38 rm -rf include
39 ln -s @APACHE_INCDIR@ include
40 25
41install: install-subdirs 26clean:
42 27
43update: update-subdirs 28distclean: clean
44
45clean: clean-subdirs
46
47distclean: clean distclean-subdirs
48 $(RM) Makefile 29 $(RM) Makefile
49 30
50DESTDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@
51DESTTGZ = $(DESTDIR).tar.gz
52dist:
53 @rm -rf $(DESTDIR); \
54 list=' $(SUBDIRS)'; \
55 for i in $$list; do \
56 if test -d "$$i"; then \
57 target=local-dist; \
58 echo "Making $$target in $$i"; \
59 if test "$$i" = "."; then \
60 made_local=yes; \
61 target="local-dist"; \
62 fi; \
63 NEWDESTDIR=$(builddir)/$(DESTDIR)/$$i; \
64 echo $(NEWDESTDIR); \
65 (cd $$i && $(MAKE) DESTDIR=$(builddir)/$(DESTDIR)/$$i $$target) || exit 1; \
66 fi; \
67 done;
68 if test "$$made_local" != "yes"; then \
69 $(MAKE) "local-dist" || exit 1; \
70 fi
71 tar -zcf $(DESTTGZ) $(DESTDIR)
72 rm -rf $(DESTDIR)
73
74local-dist: $(DISTFILES) 31local-dist: $(DISTFILES)
75 mkdir -p $(DESTDIR) 32 mkdir -p $(DESTDIR)
76 cp -dp --parents $(DISTFILES) $(DESTDIR) 33 cp -dp --parents $(DISTFILES) $(DESTDIR)
diff --git a/docs/Makefile.in b/docs/Makefile.in
index fa1bd2e..d88e72b 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -52,30 +52,6 @@ clean: clean-subdirs
52distclean: clean distclean-subdirs 52distclean: clean distclean-subdirs
53 $(RM) Makefile 53 $(RM) Makefile
54 54
55DESTDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@
56DESTTGZ = $(DESTDIR).tar.gz
57dist:
58 @rm -rf $(DESTDIR); \
59 list=' $(SUBDIRS)'; \
60 for i in $$list; do \
61 if test -d "$$i"; then \
62 target=local-dist; \
63 echo "Making $$target in $$i"; \
64 if test "$$i" = "."; then \
65 made_local=yes; \
66 target="local-dist"; \
67 fi; \
68 NEWDESTDIR=$(builddir)/$(DESTDIR)/$$i; \
69 echo $(NEWDESTDIR); \
70 (cd $$i && $(MAKE) DESTDIR=$(builddir)/$(DESTDIR)/$$i $$target) || exit 1; \
71 fi; \
72 done;
73 if test "$$made_local" != "yes"; then \
74 $(MAKE) "local-dist" || exit 1; \
75 fi
76 tar -zcf $(DESTTGZ) $(DESTDIR)
77 rm -rf $(DESTDIR)
78
79local-dist: $(DISTFILES) 55local-dist: $(DISTFILES)
80 mkdir -p $(DESTDIR) 56 mkdir -p $(DESTDIR)
81 cp -dp --parents $(DISTFILES) $(DESTDIR) 57 cp -dp --parents $(DISTFILES) $(DESTDIR)
diff --git a/gen_todo.pl b/gen_todo.pl
deleted file mode 100755
index 20b0894..0000000
--- a/gen_todo.pl
+++ /dev/null
@@ -1,64 +0,0 @@
1#!/usr/bin/perl
2
3# Copyright 2003-2004 Edward Rudd
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17use strict;
18my $rootdir = ".";
19opendir(MYDIR, $rootdir) or die "Unable to open directory";
20print "Building TODO file for source directory\n";
21my $todo_header = "* Things TODO *\n\n";
22if (open ( TODOFILE, "TODO.in")) {
23 $todo_header = do { local $/; <TODOFILE> };
24 close (TODOFILE);
25}
26open (TODOFILE, "> TODO");
27print TODOFILE $todo_header;
28print "Parsing...";
29while (my $entry = readdir(MYDIR)) {
30 next if (!($entry =~ /\.[ch]$/));
31 print "$entry...";
32 open(DAFILE, $rootdir.'/'.$entry) or die "Unable to open file\n";
33 my $linenumber = 0;
34 my $status = 0; # 0=no comment 1=comment 2=in todo block
35 while (my $line = <DAFILE>) {
36 $linenumber++;
37 if ($status==0) {
38 if ( ($line =~ /\/\/\s+TODO: (.*)/) || ($line =~ /\/\*\s+TODO: (.*)\s*\*\//) ){
39 print TODOFILE $entry.":".$linenumber.": ".$1."\n";
40 } else {
41 if ($line =~ /\/\*\*/) {
42 $status = 1;
43 }
44 }
45 } else {
46 if ($line =~ /\*\//) {
47 $status = 0;
48 } else {
49 if ($status==1) {
50 if ($line =~ /TODO:/) {
51 $status=2;
52 }
53 } else {
54 if ($line =~ /\* \s+-?\s*(.*)/) {
55 print TODOFILE $entry.":".$linenumber.": ".$1."\n";
56 }
57 }
58 }
59 }
60 }
61 close(DAFILE);
62}
63print "\n";
64closedir(MYDIR);
diff --git a/apache13.h b/include/apache13.h
index 77bf0ce..5659420 100644
--- a/apache13.h
+++ b/include/apache13.h
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id: apache13.h 175 2007-10-20 13:18:20Z urkle@drip.ws $ */
2#ifndef APACHE13_H 2#ifndef APACHE13_H
3#define APACHE13_H 3#define APACHE13_H
4 4
@@ -47,7 +47,7 @@
47/* Functions */ 47/* Functions */
48#define ap_get_remote_host(a,b,c,d) ap_get_remote_host(a,b,c) 48#define ap_get_remote_host(a,b,c,d) ap_get_remote_host(a,b,c)
49#define ap_set_deprecated NULL 49#define ap_set_deprecated NULL
50 50
51#define apr_uri_unparse ap_unparse_uri_components 51#define apr_uri_unparse ap_unparse_uri_components
52#define apr_uri_parse ap_parse_uri_components 52#define apr_uri_parse ap_parse_uri_components
53#define ap_add_version_component(p,s) ap_add_version_component(s) 53#define ap_add_version_component(p,s) ap_add_version_component(s)
@@ -75,15 +75,18 @@
75#define apr_array_cat ap_array_cat 75#define apr_array_cat ap_array_cat
76#define apr_is_empty_array(t) (((t) == NULL)||((t)->nelts == 0)) 76#define apr_is_empty_array(t) (((t) == NULL)||((t)->nelts == 0))
77 77
78#define apr_file_t FILE
79#define apr_file_printf fprintf
80
78#define apr_tolower ap_tolower 81#define apr_tolower ap_tolower
79 82
80void log_error(char *file, int line, int level, apr_status_t status, 83void log_error(char *file, int line, int level, apr_status_t status,
81 const server_rec *s, const char *fmt, ...) __attribute__ ((format (printf, 6,7))); 84 const server_rec *s, const char *fmt, ...) __attribute__ ((format (printf, 6,7)));
82 85
83#ifndef WIN32 86#ifndef WIN32
84inline 87inline
85#endif 88#endif
86void log_error(char *file, int line, int level, 89void log_error(char *file, int line, int level,
87 apr_status_t status, const server_rec *s, const char *fmt, ...) 90 apr_status_t status, const server_rec *s, const char *fmt, ...)
88{ 91{
89 static char buff[MAX_STRING_LEN]; 92 static char buff[MAX_STRING_LEN];
diff --git a/apache20.h b/include/apache20.h
index 9d87588..4c755ab 100644
--- a/apache20.h
+++ b/include/apache20.h
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id: apache20.h 125 2004-04-29 18:05:25Z urkle@drip.ws $ */
2#ifndef APACHE20_H 2#ifndef APACHE20_H
3#define APACHE20_H 3#define APACHE20_H
4 4
diff --git a/mod_log_sql.h b/include/mod_log_sql.h
index 6bcd6cb..c1d9bff 100644
--- a/mod_log_sql.h
+++ b/include/mod_log_sql.h
@@ -24,13 +24,40 @@
24#define LOGSQL_DECLARE_DATA __declspec(dllimport) 24#define LOGSQL_DECLARE_DATA __declspec(dllimport)
25#endif 25#endif
26 26
27#define LOG_SQL_PLUGIN_VERSION 20080318
28
27/* Registration function for extract functions */ 29/* Registration function for extract functions */
28 30
29typedef const char *logsql_item_func(request_rec *r, char *a); 31typedef const char *logsql_item_func(request_rec *r, char *a);
30 32
31LOGSQL_DECLARE(void) log_sql_register_item(server_rec *s, apr_pool_t *p, 33
32 char key, logsql_item_func *func, const char *sql_field_name, 34typedef enum {
33 int want_orig_default, int string_contents); 35 LOGSQL_FUNCTION_REQ_FINAL = 0,
36 LOGSQL_FUNCTION_REQ_ORIG
37} logsql_function_req;
38
39LOGSQL_DECLARE(void) log_sql_register_function(apr_pool_t *p,
40 const char *alias, logsql_item_func *func,
41 logsql_function_req want_orig_default);
42
43LOGSQL_DECLARE(void) log_sql_register_alias(server_rec *s, apr_pool_t *p,
44 char key, const char *alias);
45
46typedef enum {
47 LOGSQL_DATATYPE_INT = 0,
48 LOGSQL_DATATYPE_SMALLINT,
49 LOGSQL_DATATYPE_VARCHAR,
50 LOGSQL_DATATYPE_CHAR,
51 LOGSQL_DATATYPE_BIGINT
52} logsql_field_datatype;
53
54LOGSQL_DECLARE(void) log_sql_register_field(apr_pool_t *p,
55 const char *alias,
56 const char *funcalias, const char *param,
57 const char *sql_field_name,
58 logsql_field_datatype datatype, apr_size_t size);
59
60LOGSQL_DECLARE(void) log_sql_register_finish(server_rec *s);
34 61
35/* DB Connection structure holds connection handle */ 62/* DB Connection structure holds connection handle */
36typedef struct { 63typedef struct {
@@ -88,7 +115,7 @@ typedef struct {
88 /* disconnect from the underlying database layer */ 115 /* disconnect from the underlying database layer */
89 void (*disconnect)(logsql_dbconnection *db); 116 void (*disconnect)(logsql_dbconnection *db);
90 /* escape the SQL statement according to database rules */ 117 /* escape the SQL statement according to database rules */
91 const char *(*escape)(const char *from_str, apr_pool_t *p, 118 const char *(*escape)(request_rec *r,const char *from_str, apr_pool_t *p,
92 logsql_dbconnection *db); 119 logsql_dbconnection *db);
93 /* insert a SQL query statement */ 120 /* insert a SQL query statement */
94 logsql_query_ret (*insert)(request_rec *r,logsql_dbconnection *db, 121 logsql_query_ret (*insert)(request_rec *r,logsql_dbconnection *db,
@@ -102,35 +129,38 @@ LOGSQL_DECLARE(void) log_sql_register_driver(apr_pool_t *p,
102 logsql_dbdriver *driver); 129 logsql_dbdriver *driver);
103 130
104/* Module initialization Macros */ 131/* Module initialization Macros */
132#define LOGSQL_MODULE(driver) log_sql_##driver##_module
105#if defined(WITH_APACHE20) 133#if defined(WITH_APACHE20)
134# define LOGSQL_MODULE_FORWARD(driver) module AP_MODULE_DECLARE_DATA LOGSQL_MODULE(driver)
106# define LOGSQL_REGISTER(driver) \ 135# define LOGSQL_REGISTER(driver) \
107 static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s); \ 136 static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s); \
108 static void register_hooks(apr_pool_t *p) { \ 137 static void register_hooks(apr_pool_t *p) { \
109 ap_hook_post_config(post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); \ 138 ap_hook_post_config(post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); \
110 } \ 139 } \
111 \ 140 \
112 module AP_MODULE_DECLARE_DATA log_sql_##driver##_module = { \ 141 LOGSQL_MODULE_FORWARD(driver) = { \
113 STANDARD20_MODULE_STUFF, \ 142 STANDARD20_MODULE_STUFF, \
114 NULL, NULL, NULL, NULL, NULL, register_hooks }; \ 143 NULL, NULL, NULL, NULL, NULL, register_hooks }; \
115 static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) 144 static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
116#elif defined(WITH_APACHE13) 145#elif defined(WITH_APACHE13)
146# define LOGSQL_MODULE_FORWARD(driver) module MODULE_VAR_EXPORT LOGSQL_MODULE(driver)
117# define LOGSQL_REGISTER(driver) \ 147# define LOGSQL_REGISTER(driver) \
118 static void module_init(server_rec *s, apr_pool_t *p); \ 148 static void module_init(server_rec *s, apr_pool_t *p); \
119 module MODULE_VAR_EXPORT log_sql_##driver##_module = { \ 149 LOGSQL_MODULE_FORWARD(driver) = { \
120 STANDARD_MODULE_STUFF, module_init }; \ 150 STANDARD_MODULE_STUFF, module_init }; \
121 static void module_init(server_rec *s, apr_pool_t *p) 151 static void module_init(server_rec *s, apr_pool_t *p)
122#endif 152#endif
123 153
124#if defined(WITH_APACHE20) 154#if defined(WITH_APACHE20)
125# define LOGSQL_SHUTDOWN \ 155# define LOGSQL_SHUTDOWN \
126 static 156 static
127#endif 157#endif
128 158
129 159
130#if defined(WITH_APACHE20) 160#if defined(WITH_APACHE20)
131#define LOGSQL_REGISTER_RETURN return OK; 161#define LOGSQL_REGISTER_RETURN log_sql_register_finish(s); return OK;
132#elif defined(WITH_APACHE13) 162#elif defined(WITH_APACHE13)
133#define LOGSQL_REGISTER_RETURN 163#define LOGSQL_REGISTER_RETURN log_sql_register_finish(s);
134#endif 164#endif
135 165
136#endif /* MOD_LOG_SQL_H */ 166#endif /* MOD_LOG_SQL_H */
diff --git a/winconfig.h b/include/winconfig.h
index 702c35f..702c35f 100644
--- a/winconfig.h
+++ b/include/winconfig.h
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..5a5dd6a
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,168 @@
1# @configure_input@
2
3top_srcdir = @top_srcdir@
4srcdir = @abs_srcdir@
5builddir = @abs_builddir@
6
7HEADERS = ../include/mod_log_sql.h \
8 functions.h \
9 functions13.h \
10 functions20.h \
11 ../include/apache13.h \
12 ../include/apache20.h \
13 ../include/winconfig.h
14
15CFLAGS = -Wc,-Wall -Wc,-fno-strict-aliasing -I$(top_srcdir)/include
16
17ifeq (@OOO_MAINTAIN@,1)
18CFLAGS += -Wc,-Werror
19endif
20
21coreSOURCES = @PACKAGE_NAME@.c
22coreTARGET = @PACKAGE_NAME@@APXS_EXTENSION@
23coreLDADD = @RT_LIBS@
24coreCFLAGS =
25coreNAME = log_sql
26TARGETS = $(coreTARGET)
27
28sslSOURCES = @PACKAGE_NAME@_ssl.c
29sslTARGET = @PACKAGE_NAME@_ssl@APXS_EXTENSION@
30sslLDADD =
31sslCFLAGS = @MOD_SSL_CFLAGS@
32sslNAME = log_sql_ssl
33
34ifeq (@WANT_SSL_MOD@,1)
35TARGETS += $(sslTARGET)
36endif
37
38logioSOURCES = @PACKAGE_NAME@_logio.c
39logioTARGET = @PACKAGE_NAME@_logio@APXS_EXTENSION@
40logioLDADD =
41logioCFLAGS =
42logioNAME = log_sql_logio
43
44ifeq (@WANT_LOGIO_MOD@,1)
45TARGETS += $(logioTARGET)
46endif
47
48mysqlSOURCES = @PACKAGE_NAME@_mysql.c
49mysqlTARGET = @PACKAGE_NAME@_mysql@APXS_EXTENSION@
50mysqlLDADD = @MYSQL_LDFLAGS@ @MYSQL_LIBS@
51mysqlCFLAGS = @MYSQL_CFLAGS@
52mysqlNAME = log_sql_mysql
53
54ifeq (@WANT_MYSQL_MOD@,1)
55TARGETS += $(mysqlTARGET)
56endif
57
58pgsqlSOURCES = @PACKAGE_NAME@_pgsql.c
59pgsqlTARGET = @PACKAGE_NAME@_pgsql@APXS_EXTENSION@
60pgsqlLDADD = @PGSQL_LDFLAGS@ @PGSQL_LIBS@
61pgsqlCFLAGS = @PGSQL_CFLAGS@
62pgsqlNAME = log_sql_pgsql
63
64ifeq (@WANT_PGSQL_MOD@,1)
65TARGETS += $(pgsqlTARGET)
66endif
67
68dbiSOURCES = @PACKAGE_NAME@_dbi.c
69dbiTARGET = @PACKAGE_NAME@_dbi@APXS_EXTENSION@
70dbiLDADD = @DBI_LDFLAGS@ @DBI_LIBS@
71dbiCFLAGS = @DBI_CFLAGS@
72dbiNAME = log_sql_dbi
73
74ifeq (@WANT_DBI_MOD@,1)
75TARGETS += $(dbiTARGET)
76endif
77
78dbdSOURCES = @PACKAGE_NAME@_dbd.c
79dbdTARGET = @PACKAGE_NAME@_dbd@APXS_EXTENSION@
80dbdLDADD =
81dbdCFLAGS =
82dbdNAME = log_sql_dbd
83
84ifeq (@WANT_DBD_MOD@,1)
85TARGETS += $(dbdTARGET)
86endif
87
88OBJ = $(coreSOURCES:.c=.o) $(logioSOURCES:.c=.o) $(sslSOURCES:.c=.o) $(mysqlSOURCES:.c=.o) \
89 $(dbiSOURCES:.c=.o) $(pgsqlSOURCES:.c=.o) $(dbdSOURCES:.c=.o)
90
91LO = $(coreSOURCES:.c=.lo) $(logioSOURCES:.c=.lo) $(sslSOURCES:.c=.lo) $(mysqlSOURCES:.c=.lo) \
92 $(dbiSOURCES:.c=.lo) $(pgsqlSOURCES:.c=.lo) $(dbdSOURCES:.c=.lo)
93
94SLO = $(coreSOURCES:.c=.slo) $(logioSOURCES:.c=.slo) $(sslSOURCES:.c=.slo) $(mysqlSOURCES:.c=.slo) \
95 $(dbiSOURCES:.c=.slo) $(pgsqlSOURCES:.c=.slo) $(dbdSOURCES:.c=.slo)
96
97STD_DIST = Makefile.in
98
99DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(coreSOURCES) $(HEADERS) \
100 $(sslSOURCES) $(logioSOURCES) $(mysqlSOURCES) $(pgsqlSOURCES) $(dbiSOURCES) $(dbdSOURCES)
101
102all: $(TARGETS)
103
104$(coreTARGET): $(coreSOURCES) $(HEADERS)
105 @@APXS_BIN@ -c -o $(coreTARGET) $(coreCFLAGS) $(CFLAGS) \
106 @DEFS@ @AP_DEFS@ $(coreLDADD) $(coreSOURCES)
107
108$(logioTARGET): $(logioSOURCES) $(HEADERS)
109 @@APXS_BIN@ -c -o $(logioTARGET) $(logioCFLAGS) $(CFLAGS) \
110 @DEFS@ @AP_DEFS@ $(logioLDADD) $(logioSOURCES)
111
112$(sslTARGET): $(sslSOURCES) $(HEADERS)
113 @@APXS_BIN@ -c -o $(sslTARGET) $(sslCFLAGS) $(CFLAGS) \
114 @DEFS@ @AP_DEFS@ $(sslLDADD) $(sslSOURCES)
115
116$(mysqlTARGET): $(mysqlSOURCES) $(HEADERS)
117 @@APXS_BIN@ -c -o $(mysqlTARGET) $(mysqlCFLAGS) $(CFLAGS) \
118 @DEFS@ @AP_DEFS@ $(mysqlLDADD) $(mysqlSOURCES)
119
120$(pgsqlTARGET): $(pgsqlSOURCES) $(HEADERS)
121 @@APXS_BIN@ -c -o $(pgsqlTARGET) $(pgsqlCFLAGS) $(CFLAGS) \
122 @DEFS@ @AP_DEFS@ $(pgsqlLDADD) $(pgsqlSOURCES)
123
124$(dbiTARGET): $(dbiSOURCES) $(HEADERS)
125 @@APXS_BIN@ -c -o $(dbiTARGET) $(dbiCFLAGS) $(CFLAGS) \
126 @DEFS@ @AP_DEFS@ $(dbiLDADD) $(dbiSOURCES)
127
128$(dbdTARGET): $(dbdSOURCES) $(HEADERS)
129 @@APXS_BIN@ -c -o $(dbdTARGET) $(dbdCFLAGS) $(CFLAGS) \
130 @DEFS@ @AP_DEFS@ $(dbdLDADD) $(dbdSOURCES)
131
132install: $(TARGETS)
133 @@APXS_BIN@ -n $(coreNAME) -i $(coreTARGET); \
134 if test @WANT_MYSQL_MOD@ -eq 1; then \
135 @APXS_BIN@ -n $(mysqlNAME) -i $(mysqlTARGET); \
136 fi; \
137 if test @WANT_PGSQL_MOD@ -eq 1; then \
138 @APXS_BIN@ -n $(pgsqlNAME) -i $(pgsqlTARGET); \
139 fi; \
140 if test @WANT_DBI_MOD@ -eq 1; then \
141 @APXS_BIN@ -n $(dbiNAME) -i $(dbiTARGET); \
142 fi; \
143 if test @WANT_DBD_MOD@ -eq 1; then \
144 @APXS_BIN@ -n $(dbdNAME) -i $(dbdTARGET); \
145 fi; \
146 if test @WANT_SSL_MOD@ -eq 1; then \
147 @APXS_BIN@ -n $(sslNAME) -i $(sslTARGET); \
148 fi; \
149 if test @WANT_LOGIO_MOD@ -eq 1; then \
150 @APXS_BIN@ -n $(logioNAME) -i $(logioTARGET); \
151 fi;
152
153activate:
154 @@APXS_BIN@ -n $(coreNAME) -i -a $(coreTARGET); \
155 if test @WANT_SSL_MOD@ -eq 1; then \
156 @APXS_BIN@ -n $(sslNAME) -i -a $(sslTARGET); \
157 fi
158
159clean:
160 $(RM) $(OBJ) $(SLO) $(LO) $(TARGETS)
161 $(RM) -r .libs
162
163local-dist: $(DISTFILES)
164 mkdir -p $(DESTDIR)
165 cp -dp --parents $(DISTFILES) $(DESTDIR)
166
167Makefile: Makefile.in ../config.status
168 cd .. && ./config.status
diff --git a/functions.h b/src/functions.h
index b35634a..07711d2 100644
--- a/functions.h
+++ b/src/functions.h
@@ -52,11 +52,11 @@ static const char *extract_request_line(request_rec *r, char *a)
52 * (note the truncation before the protocol string for HTTP/0.9 requests) 52 * (note the truncation before the protocol string for HTTP/0.9 requests)
53 * (note also that r->the_request contains the unmodified request) 53 * (note also that r->the_request contains the unmodified request)
54 */ 54 */
55 return (r->parsed_uri.password) 55 return (r->parsed_uri.password)
56 ? apr_pstrcat(r->pool, r->method, " ", 56 ? apr_pstrcat(r->pool, r->method, " ",
57 apr_uri_unparse(r->pool, 57 apr_uri_unparse(r->pool,
58 &r->parsed_uri, 0), 58 &r->parsed_uri, 0),
59 r->assbackwards ? NULL : " ", 59 r->assbackwards ? NULL : " ",
60 r->protocol, NULL) 60 r->protocol, NULL)
61 : r->the_request; 61 : r->the_request;
62} 62}
@@ -239,13 +239,13 @@ static const char *extract_specific_cookie(request_rec *r, char *a)
239 return "-"; 239 return "-";
240} 240}
241 241
242static const char *extract_cookie(request_rec *r, char *a) 242/*static const char *extract_cookie(request_rec *r, char *a)
243{ 243{
244 logsql_state *cls = ap_get_module_config(r->server->module_config, 244 logsql_state *cls = ap_get_module_config(r->server->module_config,
245 &log_sql_module); 245 &log_sql_module);
246 246
247 return extract_specific_cookie(r, (char *)cls->cookie_name); 247 return extract_specific_cookie(r, (char *)cls->cookie_name);
248} 248}*/
249 249
250static const char *extract_unique_id(request_rec *r, char *a) 250static const char *extract_unique_id(request_rec *r, char *a)
251{ 251{
diff --git a/functions13.h b/src/functions13.h
index 54e3138..54e3138 100644
--- a/functions13.h
+++ b/src/functions13.h
diff --git a/functions20.h b/src/functions20.h
index 5220b7c..5220b7c 100644
--- a/functions20.h
+++ b/src/functions20.h
diff --git a/mod_log_sql.c b/src/mod_log_sql.c
index 1892eec..be4e1f9 100644
--- a/mod_log_sql.c
+++ b/src/mod_log_sql.c
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id:mod_log_sql.c 180 2008-09-21 15:54:12Z urkle@drip.ws $ */
2 2
3#if defined(WITH_APACHE20) 3#if defined(WITH_APACHE20)
4# include "apache20.h" 4# include "apache20.h"
@@ -18,7 +18,7 @@
18#undef PACKAGE_TARNAME 18#undef PACKAGE_TARNAME
19#undef PACKAGE_VERSION 19#undef PACKAGE_VERSION
20 20
21#include "config.h" 21#include "autoconfig.h"
22#endif 22#endif
23 23
24#if APR_HAVE_UNISTD_H 24#if APR_HAVE_UNISTD_H
@@ -59,18 +59,37 @@ typedef struct {
59 int announce; 59 int announce;
60 logsql_dbconnection db; 60 logsql_dbconnection db;
61 logsql_dbdriver *driver; 61 logsql_dbdriver *driver;
62 /** Show config support */
63 char *showconfig;
64 apr_file_t *showconfig_fp;
62} global_config_t; 65} global_config_t;
63 66
64static global_config_t global_config; 67static global_config_t global_config;
65 68
66/* structure to hold helper function info */ 69/* structure to hold helper function info */
67typedef struct { 70typedef struct {
68 char key; /* item letter character */ 71 const char *alias; /* The function alias */
69 logsql_item_func *func; /* its extraction function */ 72 logsql_item_func *func; /* The extraction function pointer */
73 int want_orig_req; /* if it requires the original request prior to internal redirection */
74} logsql_function;
75
76/* list of logsql_functions's for log types */
77static apr_array_header_t *logsql_function_list;
78
79/* structure to hold sqlfield mappings */
80typedef struct {
81 const char *alias; /* long name for item */
82 const char *funcalias; /* The function alias */
83 logsql_function *func; /* its extraction function */
84 char *param; /* Parameter for function */
70 const char *sql_field_name; /* its column in SQL */ 85 const char *sql_field_name; /* its column in SQL */
71 int want_orig_default; /* if it requires the original request prior to internal redirection */ 86 char string_contents; /* Whether this is a string field or not */
72 int string_contents; /* if it returns a string */ 87 logsql_field_datatype datatype; /* the field data type */
73} logsql_item; 88 apr_size_t size; /* The size of the data type */
89} logsql_field;
90
91/* list of logsql_item's for log types */
92static apr_array_header_t *logsql_field_list;
74 93
75/* But the contents of this structure will vary by virtual server. 94/* But the contents of this structure will vary by virtual server.
76 * This permits each virtual server to vary its configuration slightly 95 * This permits each virtual server to vary its configuration slightly
@@ -91,45 +110,140 @@ typedef struct {
91 const char *hin_table_name; 110 const char *hin_table_name;
92 const char *cookie_table_name; 111 const char *cookie_table_name;
93 const char *transfer_table_name; 112 const char *transfer_table_name;
94 const char *transfer_log_format; 113 apr_array_header_t *transfer_log_format;
95 apr_pool_t *parsed_pool; 114 apr_pool_t *parsed_pool;
96 logsql_item **parsed_log_format; 115 logsql_field **parsed_log_format;
97 const char *preserve_file; 116 const char *preserve_file;
98 const char *cookie_name; 117 const char *cookie_name;
99} logsql_state; 118} logsql_state;
100 119
120/** Registration function for extract functions
121 *
122 * This functions registers an alias for a function
123 *
124 * @note This is exported from the module
125 */
126LOGSQL_DECLARE(void) log_sql_register_function(apr_pool_t *p,
127 const char *alias, logsql_item_func *func,
128 logsql_function_req want_orig_req)
129{
130 logsql_function *item;
131 if (!logsql_function_list)
132 logsql_function_list = apr_array_make(p,10, sizeof(logsql_function));
101 133
102/* list of "handlers" for log types */ 134 item = apr_array_push(logsql_function_list);
103static apr_array_header_t *logsql_item_list; 135 item->alias = alias;
104 136 item->func = func;
105/* Registration function for extract functions * 137 item->want_orig_req = want_orig_req;
106 * and update parse cache for transfer_log_format * 138 if (global_config.showconfig_fp) {
107 * this is exported from the module */ 139 apr_file_printf(global_config.showconfig_fp," Function : %s\n",alias);
108LOGSQL_DECLARE(void) log_sql_register_item(server_rec *s, apr_pool_t *p, 140 }
109 char key, logsql_item_func *func, const char *sql_field_name, 141}
110 int want_orig_default, int string_contents) 142/** Register a old style sql mapping to the new style
143 *
144 * @note This is exported from the module
145 */
146LOGSQL_DECLARE(void) log_sql_register_alias(server_rec *s, apr_pool_t *p,
147 char key, const char *alias)
111{ 148{
112 server_rec *ts; 149 server_rec *ts;
113 logsql_item *item; 150 for (ts = s; ts; ts = ts->next) {
114 if (!logsql_item_list) 151 logsql_state *cfg = ap_get_module_config(ts->module_config,
115 logsql_item_list = apr_array_make(p,10, sizeof(logsql_item)); 152 &log_sql_module);
153 int itr;
154 for (itr = 0; itr < cfg->transfer_log_format->nelts; itr++) {
155 const char *logformat = ((const char **)cfg->transfer_log_format->elts)[itr];
156 //log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Testing Logformat %s against %c for %s",logformat,key,alias);
157 // Check if it is only one character AND it is our key
158 if (logformat[1]=='\0' && logformat[0]==key) {
159 ((const char **)cfg->transfer_log_format->elts)[itr] = alias;
160 }
161 }
162 }
163}
116 164
117 item= apr_array_push(logsql_item_list); 165
118 item->key = key; 166/** Registration sqlfield aliases to functions
119 item->func = func; 167 *
120 item->sql_field_name = sql_field_name; 168 * And update parse cache for transfer_log_format
121 item->want_orig_default = want_orig_default; 169 *
122 item->string_contents = string_contents; 170 * @note This is exported from the module
171 */
172LOGSQL_DECLARE(void) log_sql_register_field(apr_pool_t *p,
173 const char *alias,
174 const char *funcalias, const char *param,
175 const char *sql_field_name,
176 logsql_field_datatype datatype, apr_size_t size)
177{
178 logsql_field *item;
179
180 if (!logsql_field_list)
181 logsql_field_list = apr_array_make(p,10, sizeof(logsql_field));
182
183 item = apr_array_push(logsql_field_list);
184 item->func = NULL;
185 item->alias = apr_pstrdup(p, alias);
186 item->funcalias = apr_pstrdup(p, funcalias);
187 item->param = apr_pstrdup(p, param);
188 item->sql_field_name = apr_pstrdup(p,sql_field_name);
189 item->datatype = datatype;
190 item->string_contents = 0;
191 if (datatype == LOGSQL_DATATYPE_CHAR || datatype == LOGSQL_DATATYPE_VARCHAR) {
192 item->string_contents = 1;
193 }
194 item->size = size;
195}
196
197/**
198 * Links sql field items with their functions
199 */
200LOGSQL_DECLARE(void) log_sql_register_finish(server_rec *s)
201{
202 server_rec *ts;
203 int itr, f;
204 logsql_field *item;
205 logsql_function *func;
206 for (itr = 0; itr < logsql_field_list->nelts; itr++) {
207 item = &((logsql_field *)logsql_field_list->elts)[itr];
208 if (item->func) continue;
209 /* Find function alias in function list */
210 for (f = 0; f < logsql_function_list->nelts; f++) {
211 func = &((logsql_function *)logsql_function_list->elts)[f];
212 if (strcmp(func->alias,item->funcalias)==0) {
213 item->func = func;
214 if (global_config.showconfig_fp) {
215 apr_file_printf(global_config.showconfig_fp," Item : %s using function %s(%s)\n"
216 "\tStoring in field %s of type %s(%"APR_SIZE_T_FMT")\n",
217 item->alias, item->funcalias, item->param,
218 item->sql_field_name, item->string_contents ? "TEXT":"NUMERIC", item->size);
219 }
220 break;
221 }
222 }
223 if (!item->func) {
224 log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
225 "Could not find function %s for item %s",item->funcalias, item->alias);
226 }
227 }
123 /* some voodoo here to post parse logitems in all servers * 228 /* some voodoo here to post parse logitems in all servers *
124 * so a "cached" list is used in the main logging loop for speed */ 229 * so a "cached" list is used in the main logging loop for speed */
125 for (ts = s; ts; ts = ts->next) { 230 for (ts = s; ts; ts = ts->next) {
126 logsql_state *cfg = ap_get_module_config(ts->module_config, 231 logsql_state *cfg = ap_get_module_config(ts->module_config,
127 &log_sql_module); 232 &log_sql_module);
128 char *pos;
129 233
130 if (cfg->transfer_log_format) { 234 if (!cfg->parsed_log_format) {
131 if ( (pos = ap_strchr_c(cfg->transfer_log_format,key))!=NULL) { 235 cfg->parsed_log_format = apr_pcalloc(cfg->parsed_pool,
132 cfg->parsed_log_format[pos - cfg->transfer_log_format] = item; 236 cfg->transfer_log_format->nelts * sizeof(logsql_field *));
237 }
238
239 for (itr = 0; itr < cfg->transfer_log_format->nelts; itr++) {
240 const char *logformat = ((char **)cfg->transfer_log_format->elts)[itr];
241 for (f = 0; f < logsql_field_list->nelts; f++) {
242 item = &((logsql_field *)logsql_field_list->elts)[f];
243 if (item->func && strcmp(logformat,item->alias)==0) {
244 cfg->parsed_log_format[itr] = item;
245 break;
246 }
133 } 247 }
134 } 248 }
135 } 249 }
@@ -157,7 +271,7 @@ static logsql_opendb_ret log_sql_opendb_link(server_rec* s)
157 return LOGSQL_OPENDB_FAIL; 271 return LOGSQL_OPENDB_FAIL;
158 } 272 }
159 if (global_config.forcepreserve) { 273 if (global_config.forcepreserve) {
160 //global_config.db.connected = 1; 274 /*global_config.db.connected = 1;*/
161 return LOGSQL_OPENDB_PRESERVE; 275 return LOGSQL_OPENDB_PRESERVE;
162 } 276 }
163 if (global_config.db.connected) { 277 if (global_config.db.connected) {
@@ -187,13 +301,9 @@ static void preserve_entry(request_rec *r, const char *query)
187{ 301{
188 logsql_state *cls = ap_get_module_config(r->server->module_config, 302 logsql_state *cls = ap_get_module_config(r->server->module_config,
189 &log_sql_module); 303 &log_sql_module);
190 #if defined(WITH_APACHE20) 304 apr_status_t result;
191 apr_file_t *fp; 305 apr_file_t *fp;
192 apr_status_t result; 306
193 #elif defined(WITH_APACHE13)
194 FILE *fp;
195 int result;
196 #endif
197 /* If preserve file is disabled bail out */ 307 /* If preserve file is disabled bail out */
198 if (global_config.disablepreserve) 308 if (global_config.disablepreserve)
199 return; 309 return;
@@ -207,11 +317,10 @@ static void preserve_entry(request_rec *r, const char *query)
207 log_error(APLOG_MARK, APLOG_ERR, result, r->server, 317 log_error(APLOG_MARK, APLOG_ERR, result, r->server,
208 "attempted append of local preserve file '%s' but failed.",cls->preserve_file); 318 "attempted append of local preserve file '%s' but failed.",cls->preserve_file);
209 } else { 319 } else {
320 apr_file_printf(fp,"%s;\n", query);
210 #if defined(WITH_APACHE20) 321 #if defined(WITH_APACHE20)
211 apr_file_printf(fp,"%s;\n", query);
212 apr_file_close(fp); 322 apr_file_close(fp);
213 #elif defined(WITH_APACHE13) 323 #elif defined(WITH_APACHE13)
214 fprintf(fp,"%s;\n", query);
215 ap_pfclose(r->pool, fp); 324 ap_pfclose(r->pool, fp);
216 #endif 325 #endif
217 log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, 326 log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
@@ -262,6 +371,7 @@ static const char *set_global_string_slot(cmd_parms *cmd,
262 *(const char **)((char *)ptr + offset) = apr_pstrdup(cmd->pool,arg); 371 *(const char **)((char *)ptr + offset) = apr_pstrdup(cmd->pool,arg);
263 return NULL; 372 return NULL;
264} 373}
374
265static const char *set_server_string_slot(cmd_parms *cmd, 375static const char *set_server_string_slot(cmd_parms *cmd,
266 void *struct_ptr, 376 void *struct_ptr,
267 const char *arg) 377 const char *arg)
@@ -296,18 +406,25 @@ static const char *set_server_file_slot(cmd_parms *cmd,
296 return NULL; 406 return NULL;
297} 407}
298 408
299static const char *set_logformat_slot(cmd_parms *cmd, 409static apr_array_header_t *create_logformat_default(apr_pool_t *p)
300 void *struct_ptr,
301 const char *arg)
302{ 410{
303 logsql_state *cfg = ap_get_module_config(cmd->server->module_config, 411 apr_array_header_t *logformat;
304 &log_sql_module); 412 char **addme;
305 413
306 cfg->transfer_log_format = arg; 414 logformat = apr_array_make(p, 12, sizeof(char *));
307/* apr_pool_clear(cfg->parsed_pool);*/ 415 addme = apr_array_push(logformat); *addme = "useragent";
308 cfg->parsed_log_format = apr_pcalloc(cfg->parsed_pool, 416 addme = apr_array_push(logformat); *addme = "bytes_sent";
309 strlen(arg) * sizeof(logsql_item *)); 417 addme = apr_array_push(logformat); *addme = "request_protocol";
310 return NULL; 418 addme = apr_array_push(logformat); *addme = "remote_host";
419 addme = apr_array_push(logformat); *addme = "request_method";
420 addme = apr_array_push(logformat); *addme = "referer";
421 addme = apr_array_push(logformat); *addme = "timestamp";
422 addme = apr_array_push(logformat); *addme = "status";
423 addme = apr_array_push(logformat); *addme = "request_duration";
424 addme = apr_array_push(logformat); *addme = "request_uri";
425 addme = apr_array_push(logformat); *addme = "remote_user";
426 addme = apr_array_push(logformat); *addme = "virtual_host";
427 return logformat;
311} 428}
312 429
313static const char *set_server_nmv_string_slot(cmd_parms *parms, 430static const char *set_server_nmv_string_slot(cmd_parms *parms,
@@ -404,6 +521,60 @@ static const char *add_server_string_slot(cmd_parms *cmd,
404 return NULL; 521 return NULL;
405} 522}
406 523
524static const char *set_logformat_slot(cmd_parms *cmd,
525 void *struct_ptr,
526 const char *arg)
527{
528 const char *t;
529 char t2[2] = {'\0','\0'};
530 for (t = arg; *t != '\0'; t++) {
531 t2[0] = *t;
532 add_server_string_slot(cmd, NULL, t2);
533 }
534 return NULL;
535}
536
537static const char *set_register_field(cmd_parms *cmd,
538 void *struct_ptr,
539 const char *arg)
540{
541 char *alias, *funcalias, *param, *field, *datatype_s, *size_s;
542 logsql_field_datatype datatype;
543 apr_size_t size;
544
545 alias = ap_getword_white(cmd->pool, &arg);
546 funcalias = ap_getword_white(cmd->pool, &arg);
547 param = ap_getword_conf(cmd->pool, &arg);
548 field = ap_getword_white(cmd->pool, &arg);
549 datatype_s = ap_getword_white(cmd->pool, &arg);
550 size_s = ap_getword_white(cmd->pool, &arg);
551
552 if (strcasecmp("VARCHAR",datatype_s)==0) {
553 datatype = LOGSQL_DATATYPE_VARCHAR;
554 } else if (strcasecmp("INT",datatype_s)==0) {
555 datatype = LOGSQL_DATATYPE_INT;
556 } else if (strcasecmp("CHAR",datatype_s)==0) {
557 datatype = LOGSQL_DATATYPE_CHAR;
558 } else if (strcasecmp("SMALLINT",datatype_s)==0) {
559 datatype = LOGSQL_DATATYPE_SMALLINT;
560 } else if (strcasecmp("BIGINT",datatype_s)==0) {
561 datatype = LOGSQL_DATATYPE_BIGINT;
562 } else {
563 return apr_psprintf(cmd->pool, "Unknown data type %s",datatype_s);
564 }
565
566 size = atoi(size_s);
567
568 log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server,
569 "%s, %s, %s, %s, %s(%d), %s(%"APR_SIZE_T_FMT")",
570 alias, funcalias, param, field, datatype_s, datatype, size_s, size);
571
572 log_sql_register_field(cmd->pool, alias, funcalias, param,
573 field, datatype, size);
574
575 return NULL;
576}
577
407/*------------------------------------------------------------* 578/*------------------------------------------------------------*
408 * Apache-specific hooks into the module code * 579 * Apache-specific hooks into the module code *
409 * that are defined in the array 'mysql_lgog_module' (at EOF) * 580 * that are defined in the array 'mysql_lgog_module' (at EOF) *
@@ -460,6 +631,8 @@ static void log_sql_child_init(server_rec *s, apr_pool_t *p)
460 } 631 }
461} 632}
462 633
634static apr_array_header_t *do_merge_array(apr_array_header_t *parent, apr_array_header_t *child, apr_pool_t *p);
635
463/* post_config / module_init */ 636/* post_config / module_init */
464#if defined(WITH_APACHE20) 637#if defined(WITH_APACHE20)
465static int log_sql_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) 638static int log_sql_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
@@ -467,47 +640,161 @@ static int log_sql_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptem
467static void log_sql_module_init(server_rec *s, apr_pool_t *p) 640static void log_sql_module_init(server_rec *s, apr_pool_t *p)
468#endif 641#endif
469{ 642{
470 /* TODO: Add local_address, remote_address, server_name, connection_status */ 643 server_rec *cur_s;
644 const char *default_p = ap_server_root_relative(p, DEFAULT_PRESERVE_FILE);
645 apr_array_header_t *parent = NULL;
646
647 if (global_config.showconfig != NULL) {
648 const char *tempfile = ap_server_root_relative(p, global_config.showconfig);
649 apr_status_t result;
650 #if defined(WITH_APACHE20)
651 result = apr_file_open(&global_config.showconfig_fp, tempfile,APR_TRUNCATE | APR_WRITE | APR_CREATE, APR_OS_DEFAULT, p);
652 #elif defined(WITH_APACHE13)
653 global_config.showconfig_fp = ap_pfopen(p, tempfile, "w");
654 result = (fp)?0:errno;
655 #endif
656 if (result != APR_SUCCESS) {
657 log_error(APLOG_MARK, APLOG_ERR, result, s,
658 "attempted open of showconfig file '%s' failed.",tempfile);
659 global_config.showconfig_fp = NULL;
660 } else {
661 #if defined(WITH_APACHE20)
662 char temp_time[APR_RFC822_DATE_LEN];
663 apr_rfc822_date(temp_time,apr_time_now());
664 #elif defined(WITH_APACHE13)
665 char *temp_time = ap_get_time());
666 #endif
667 apr_file_printf(global_config.showconfig_fp,"Mod_log_sql Config dump created on %s\n", temp_time);
668 }
669 }
670
671 for (cur_s = s; cur_s != NULL; cur_s= cur_s->next) {
672 logsql_state *cls = ap_get_module_config(cur_s->module_config,
673 &log_sql_module);
674 /* ap_server_root_relative any default preserve file locations */
675 if (cls->preserve_file == DEFAULT_PRESERVE_FILE)
676 cls->preserve_file = default_p;
677
678 /* Post-process logformats */
679 if (!cur_s->is_virtual) {
680 parent = create_logformat_default(p);
681 cls->transfer_log_format = do_merge_array(parent, cls->transfer_log_format, p);
682 parent = cls->transfer_log_format;
683 } else {
684 cls->transfer_log_format = do_merge_array(parent, cls->transfer_log_format, p);
685 }
686 }
687
688 /* TODO: Add local_address, remote_address, connection_status */
689 /** Register functions */
690 /** register_function(p, funcname, func_ptr, which request_rec); */
691 log_sql_register_function(p, "useragent", extract_agent, LOGSQL_FUNCTION_REQ_ORIG);
692 log_sql_register_function(p, "request_args", extract_request_query, LOGSQL_FUNCTION_REQ_ORIG);
693 log_sql_register_function(p, "bytes_sent", extract_bytes_sent, LOGSQL_FUNCTION_REQ_FINAL);
694 log_sql_register_function(p, "cookie", extract_specific_cookie,LOGSQL_FUNCTION_REQ_FINAL);
695 log_sql_register_function(p, "request_file", extract_request_file, LOGSQL_FUNCTION_REQ_FINAL);
696 log_sql_register_function(p, "request_protocol",extract_request_protocol,LOGSQL_FUNCTION_REQ_FINAL);
697 log_sql_register_function(p, "remote_host", extract_remote_host, LOGSQL_FUNCTION_REQ_FINAL);
698 log_sql_register_function(p, "unique_id", extract_unique_id, LOGSQL_FUNCTION_REQ_FINAL);
699 log_sql_register_function(p, "remote_logname", extract_remote_logname, LOGSQL_FUNCTION_REQ_FINAL);
700 log_sql_register_function(p, "request_method", extract_request_method, LOGSQL_FUNCTION_REQ_FINAL);
701 log_sql_register_function(p, "machine_id", extract_machine_id, LOGSQL_FUNCTION_REQ_FINAL);
702 log_sql_register_function(p, "child_pid", extract_child_pid, LOGSQL_FUNCTION_REQ_FINAL);
703 log_sql_register_function(p, "server_port", extract_server_port, LOGSQL_FUNCTION_REQ_FINAL);
704 log_sql_register_function(p, "referrer", extract_referer, LOGSQL_FUNCTION_REQ_ORIG);
705 log_sql_register_function(p, "request_line", extract_request_line, LOGSQL_FUNCTION_REQ_ORIG);
706 log_sql_register_function(p, "timestamp", extract_request_timestamp,LOGSQL_FUNCTION_REQ_FINAL);
707 log_sql_register_function(p, "status", extract_status, LOGSQL_FUNCTION_REQ_ORIG);
708 log_sql_register_function(p, "request_duration",extract_request_duration,LOGSQL_FUNCTION_REQ_ORIG);
709 log_sql_register_function(p, "request_time", extract_request_time, LOGSQL_FUNCTION_REQ_FINAL);
710 log_sql_register_function(p, "remote_user", extract_remote_user, LOGSQL_FUNCTION_REQ_FINAL);
711 log_sql_register_function(p, "request_uri", extract_request_uri, LOGSQL_FUNCTION_REQ_ORIG);
712 log_sql_register_function(p, "virtual_host", extract_virtual_host, LOGSQL_FUNCTION_REQ_FINAL);
713 log_sql_register_function(p, "server_name", extract_server_name, LOGSQL_FUNCTION_REQ_FINAL);
714
715 /** Old style aliases */
716 /** register_alias(s, shortname, longname) */
717 log_sql_register_alias(s,p,'A',"useragent");
718 log_sql_register_alias(s,p,'a',"request_args");
719 log_sql_register_alias(s,p,'b',"bytes_sent");
720 log_sql_register_alias(s,p,'c',"cookie");
721 log_sql_register_alias(s,p,'f',"request_file");
722 log_sql_register_alias(s,p,'H',"request_protocol");
723 log_sql_register_alias(s,p,'h',"remote_host");
724 log_sql_register_alias(s,p,'I',"unique_id");
725 log_sql_register_alias(s,p,'l',"remote_logname");
726 log_sql_register_alias(s,p,'m',"request_method");
727 log_sql_register_alias(s,p,'M',"machine_id");
728 log_sql_register_alias(s,p,'P',"child_pid");
729 log_sql_register_alias(s,p,'p',"server_port");
730 log_sql_register_alias(s,p,'R',"referrer");
731 log_sql_register_alias(s,p,'r',"request_line");
732 log_sql_register_alias(s,p,'S',"timestamp");
733 log_sql_register_alias(s,p,'s',"status");
734 log_sql_register_alias(s,p,'T',"request_duration");
735 log_sql_register_alias(s,p,'t',"request_time");
736 log_sql_register_alias(s,p,'u',"remote_user");
737 log_sql_register_alias(s,p,'U',"request_uri");
738 log_sql_register_alias(s,p,'v',"virtual_host");
739 log_sql_register_alias(s,p,'V',"server_name");
740
471 /* Register handlers */ 741 /* Register handlers */
472 log_sql_register_item(s,p,'A', extract_agent, "agent", 1, 1); 742 /** register_field(s,p, longname, funcalias, arg,
473 log_sql_register_item(s,p,'a', extract_request_query, "request_args", 1, 1); 743 * sqlfieldname, DATATYPE, DATA LENGTH); */
474 log_sql_register_item(s,p,'b', extract_bytes_sent, "bytes_sent", 0, 0); 744 log_sql_register_field(p,"useragent", "useragent",NULL,
475 log_sql_register_item(s,p,'c', extract_cookie, "cookie", 0, 1); 745 "agent", LOGSQL_DATATYPE_VARCHAR, 0);
476 /* TODO: Document */ 746 log_sql_register_field(p,"request_args", "request_args",NULL,
477 log_sql_register_item(s,p,'f', extract_request_file, "request_file", 0, 1); 747 "request_args",LOGSQL_DATATYPE_VARCHAR,0);
478 log_sql_register_item(s,p,'H', extract_request_protocol, "request_protocol", 0, 1); 748 log_sql_register_field(p,"bytes_sent", "bytes_sent",NULL,
479 log_sql_register_item(s,p,'h', extract_remote_host, "remote_host", 0, 1); 749 "bytes_sent",LOGSQL_DATATYPE_INT,0);
480 log_sql_register_item(s,p,'I', extract_unique_id, "id", 0, 1); 750 log_sql_register_field(p,"cookie", "cookie","Apache",
481 log_sql_register_item(s,p,'l', extract_remote_logname, "remote_logname", 0, 1); 751 "cookie",LOGSQL_DATATYPE_VARCHAR,0);
482 log_sql_register_item(s,p,'m', extract_request_method, "request_method", 0, 1); 752 log_sql_register_field(p,"request_file", "request_file",NULL,
483 log_sql_register_item(s,p,'M', extract_machine_id, "machine_id", 0, 1); 753 "request_file",LOGSQL_DATATYPE_VARCHAR,0);
484 log_sql_register_item(s,p,'P', extract_child_pid, "child_pid", 0, 0); 754 log_sql_register_field(p,"request_protocol", "request_protocol",NULL,
485 log_sql_register_item(s,p,'p', extract_server_port, "server_port", 0, 0); 755 "request_protocol",LOGSQL_DATATYPE_VARCHAR,0);
486 log_sql_register_item(s,p,'R', extract_referer, "referer", 1, 1); 756 log_sql_register_field(p,"remote_host", "remote_host",NULL,
487 log_sql_register_item(s,p,'r', extract_request_line, "request_line", 1, 1); 757 "remote_host",LOGSQL_DATATYPE_VARCHAR,0);
488 log_sql_register_item(s,p,'S', extract_request_timestamp, "time_stamp", 0, 0); 758 log_sql_register_field(p,"unique_id", "unique_id",NULL,
489 log_sql_register_item(s,p,'s', extract_status, "status", 1, 0); 759 "id",LOGSQL_DATATYPE_VARCHAR,0);
490 log_sql_register_item(s,p,'T', extract_request_duration, "request_duration", 1, 0); 760 log_sql_register_field(p,"remote_logname", "remote_logname",NULL,
491 log_sql_register_item(s,p,'t', extract_request_time, "request_time", 0, 1); 761 "remote_logname",LOGSQL_DATATYPE_VARCHAR,0);
492 log_sql_register_item(s,p,'u', extract_remote_user, "remote_user", 0, 1); 762 log_sql_register_field(p,"request_method", "request_method",NULL,
493 log_sql_register_item(s,p,'U', extract_request_uri, "request_uri", 1, 1); 763 "request_method",LOGSQL_DATATYPE_VARCHAR,0);
494 log_sql_register_item(s,p,'v', extract_virtual_host, "virtual_host", 0, 1); 764 log_sql_register_field(p,"machine_id", "machine_id",NULL,
495 log_sql_register_item(s,p,'V', extract_server_name, "virtual_host", 0, 1); 765 "machine_id",LOGSQL_DATATYPE_VARCHAR,0);
766 log_sql_register_field(p,"child_pid", "child_pid",NULL,
767 "child_pid",LOGSQL_DATATYPE_INT,0);
768 log_sql_register_field(p,"server_port", "server_port",NULL,
769 "server_port",LOGSQL_DATATYPE_INT,0);
770 log_sql_register_field(p,"referer", "referrer",NULL,
771 "referer",LOGSQL_DATATYPE_VARCHAR,0);
772 log_sql_register_field(p,"referrer", "referrer",NULL,
773 "referer",LOGSQL_DATATYPE_VARCHAR,0);
774 log_sql_register_field(p,"request_line", "request_line",NULL,
775 "request_line",LOGSQL_DATATYPE_VARCHAR,0);
776 log_sql_register_field(p,"timestamp", "timestamp",NULL,
777 "time_stamp",LOGSQL_DATATYPE_INT,0);
778 log_sql_register_field(p,"status", "status",NULL,
779 "status",LOGSQL_DATATYPE_INT,0);
780 log_sql_register_field(p,"request_duration", "request_duration",NULL,
781 "request_duration",LOGSQL_DATATYPE_INT,0);
782 log_sql_register_field(p,"request_time", "request_time",NULL,
783 "request_time",LOGSQL_DATATYPE_VARCHAR,0);
784 log_sql_register_field(p,"remote_user", "remote_user",NULL,
785 "remote_user",LOGSQL_DATATYPE_VARCHAR,0);
786 log_sql_register_field(p,"request_uri", "request_uri",NULL,
787 "request_uri",LOGSQL_DATATYPE_VARCHAR,0);
788 log_sql_register_field(p,"virtual_host", "virtual_host",NULL,
789 "virtual_host",LOGSQL_DATATYPE_VARCHAR,0);
790 log_sql_register_field(p,"server_name", "server_name",NULL,
791 "virtual_host",LOGSQL_DATATYPE_VARCHAR,0);
792
793 log_sql_register_finish(s);
496 794
497 if (global_config.announce) { 795 if (global_config.announce) {
498 ap_add_version_component(p, PACKAGE_NAME"/"PACKAGE_VERSION); 796 ap_add_version_component(p, PACKAGE_NAME"/"PACKAGE_VERSION);
499 } 797 }
500 /* ap_server_root_relative any default preserve file locations */
501 {
502 server_rec *cur_s;
503 const char *default_p = ap_server_root_relative(p, DEFAULT_PRESERVE_FILE);
504 for (cur_s = s; cur_s != NULL; cur_s= cur_s->next) {
505 logsql_state *cls = ap_get_module_config(cur_s->module_config,
506 &log_sql_module);
507 if (cls->preserve_file == DEFAULT_PRESERVE_FILE)
508 cls->preserve_file = default_p;
509 }
510 }
511 global_config.db.p = p; 798 global_config.db.p = p;
512 799
513#if defined(WITH_APACHE20) 800#if defined(WITH_APACHE20)
@@ -639,10 +926,9 @@ static void *log_sql_make_state(apr_pool_t *p, server_rec *s)
639 logsql_state *cls = (logsql_state *) apr_pcalloc(p, sizeof(logsql_state)); 926 logsql_state *cls = (logsql_state *) apr_pcalloc(p, sizeof(logsql_state));
640 927
641 /* These defaults are overridable in the httpd.conf file. */ 928 /* These defaults are overridable in the httpd.conf file. */
642 cls->transfer_log_format = DEFAULT_TRANSFER_LOG_FMT; 929 cls->transfer_log_format = apr_array_make(p, 1, sizeof(char *));
643 apr_pool_create(&cls->parsed_pool, p); 930 cls->parsed_pool = p;
644 cls->parsed_log_format = apr_pcalloc(cls->parsed_pool, 931
645 strlen(cls->transfer_log_format) * sizeof(logsql_item *));
646 cls->notes_table_name = DEFAULT_NOTES_TABLE_NAME; 932 cls->notes_table_name = DEFAULT_NOTES_TABLE_NAME;
647 cls->hin_table_name = DEFAULT_HIN_TABLE_NAME; 933 cls->hin_table_name = DEFAULT_HIN_TABLE_NAME;
648 cls->hout_table_name = DEFAULT_HOUT_TABLE_NAME; 934 cls->hout_table_name = DEFAULT_HOUT_TABLE_NAME;
@@ -656,7 +942,6 @@ static void *log_sql_make_state(apr_pool_t *p, server_rec *s)
656 cls->hin_list = apr_array_make(p, 1, sizeof(char *)); 942 cls->hin_list = apr_array_make(p, 1, sizeof(char *));
657 cls->hout_list = apr_array_make(p, 1, sizeof(char *)); 943 cls->hout_list = apr_array_make(p, 1, sizeof(char *));
658 cls->cookie_list = apr_array_make(p, 1, sizeof(char *)); 944 cls->cookie_list = apr_array_make(p, 1, sizeof(char *));
659
660 return (void *) cls; 945 return (void *) cls;
661} 946}
662 947
@@ -675,43 +960,52 @@ static int in_array(apr_array_header_t *ary, const char *elem)
675} 960}
676 961
677 962
678/* Parse through cookie lists and merge based on +/- prefixes */ 963/* Parse through lists and merge based on +/- prefixes */
679/* TODO: rewrite as a function */ 964static apr_array_header_t *do_merge_array(apr_array_header_t *parent, apr_array_header_t *child, apr_pool_t *p)
680#define DO_MERGE_ARRAY(parent,child,pool) \ 965{
681if (apr_is_empty_array(child)) { \ 966 apr_array_header_t *ret;
682 apr_array_cat(child, parent); \ 967 ret = apr_array_make(p, 1, sizeof(char *));
683} else { \ 968 if (apr_is_empty_array(child)) {
684 apr_array_header_t *addlist, *dellist; \ 969 apr_array_cat(ret, parent);
685 char **elem, **ptr = (char **)(child->elts); \ 970 } else {
686 int itr, overwrite = 0; \ 971 apr_array_header_t *addlist, *dellist;
687 addlist = apr_array_make(pool,5,sizeof(char *)); \ 972 apr_pool_t *subp;
688 dellist = apr_array_make(subp,5,sizeof(char *)); \ 973 char **elem, **ptr = (char **)(child->elts);
689\ 974 int itr, overwrite = 0;
690 for (itr=0; itr<child->nelts; itr++) { \ 975
691 if (*ptr[itr] == '+') { \ 976 apr_pool_create(&subp,p);
692 elem = (char **)apr_array_push(addlist); \ 977
693 *elem = (ptr[itr]+1); \ 978 addlist = apr_array_make(subp,5,sizeof(char *));
694 } else if (*ptr[itr] == '-') { \ 979 dellist = apr_array_make(subp,5,sizeof(char *));
695 elem = (char **)apr_array_push(dellist); \ 980
696 *elem = (ptr[itr]+1); \ 981 for (itr=0; itr<child->nelts; itr++) {
697 } else { \ 982 if (*ptr[itr] == '+') {
698 overwrite = 1; \ 983 elem = (char **)apr_array_push(addlist);
699 elem = (char **)apr_array_push(addlist); \ 984 *elem = (ptr[itr]+1);
700 *elem = ptr[itr]; \ 985 } else if (*ptr[itr] == '-') {
701 } \ 986 elem = (char **)apr_array_push(dellist);
702 } \ 987 *elem = (ptr[itr]+1);
703 child = apr_array_make(p,1,sizeof(char *)); \ 988 } else {
704 ptr = (char **)(parent->elts); \ 989 overwrite = 1;
705 if (overwrite==0) { \ 990 elem = (char **)apr_array_push(addlist);
706 /* if we are not overwriting the existing then prepare for merge */ \ 991 *elem = ptr[itr];
707 for (itr=0; itr<parent->nelts; itr++) { \ 992 }
708 if (!in_array(addlist, ptr[itr]) && !in_array(dellist,ptr[itr])) { \ 993 }
709 elem = apr_array_push(child); \ 994 child = apr_array_make(p,1,sizeof(char *));
710 *elem = apr_pstrdup(p, ptr[itr]); \ 995 ptr = (char **)(parent->elts);
711 } \ 996 if (overwrite==0) {
712 } \ 997 /* if we are not overwriting the existing then prepare for merge */
713 } \ 998 for (itr=0; itr<parent->nelts; itr++) {
714 apr_array_cat(child, addlist); \ 999 if (!in_array(addlist, ptr[itr]) && !in_array(dellist,ptr[itr])) {
1000 elem = apr_array_push(ret);
1001 *elem = apr_pstrdup(p, ptr[itr]);
1002 }
1003 }
1004 }
1005 apr_array_cat(ret, addlist);
1006 apr_pool_destroy(subp);
1007 }
1008 return ret;
715} 1009}
716 1010
717static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv) 1011static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv)
@@ -720,10 +1014,6 @@ static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv)
720 logsql_state *parent = (logsql_state *) basev; 1014 logsql_state *parent = (logsql_state *) basev;
721 logsql_state *child = (logsql_state *) addv; 1015 logsql_state *child = (logsql_state *) addv;
722 1016
723 apr_pool_t *subp;
724
725 apr_pool_create(&subp,p);
726
727 /* Child can override these, otherwise they default to parent's choice. 1017 /* Child can override these, otherwise they default to parent's choice.
728 * If the parent didn't set them, create reasonable defaults for the 1018 * If the parent didn't set them, create reasonable defaults for the
729 * ones that should have such default settings. Leave the others null. */ 1019 * ones that should have such default settings. Leave the others null. */
@@ -734,13 +1024,6 @@ static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv)
734 child->transfer_table_name = parent->transfer_table_name; 1024 child->transfer_table_name = parent->transfer_table_name;
735 } 1025 }
736 1026
737 if (child->transfer_log_format == DEFAULT_TRANSFER_LOG_FMT) {
738 child->transfer_log_format = parent->transfer_log_format;
739 /*apr_pool_clear(child->parsed_pool);*/
740 child->parsed_log_format = apr_pcalloc(child->parsed_pool,
741 strlen(child->transfer_log_format) * sizeof(logsql_item *));
742 }
743
744 if (child->preserve_file == DEFAULT_PRESERVE_FILE) 1027 if (child->preserve_file == DEFAULT_PRESERVE_FILE)
745 child->preserve_file = parent->preserve_file; 1028 child->preserve_file = parent->preserve_file;
746 /* server_root_relative the preserve file location */ 1029 /* server_root_relative the preserve file location */
@@ -759,15 +1042,13 @@ static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv)
759 if (child->cookie_table_name == DEFAULT_COOKIE_TABLE_NAME) 1042 if (child->cookie_table_name == DEFAULT_COOKIE_TABLE_NAME)
760 child->cookie_table_name = parent->cookie_table_name; 1043 child->cookie_table_name = parent->cookie_table_name;
761 1044
762 DO_MERGE_ARRAY(parent->transfer_ignore_list, child->transfer_ignore_list, subp); 1045 child->transfer_ignore_list = do_merge_array(parent->transfer_ignore_list, child->transfer_ignore_list, p);
763 DO_MERGE_ARRAY(parent->transfer_accept_list, child->transfer_accept_list, subp); 1046 child->transfer_accept_list = do_merge_array(parent->transfer_accept_list, child->transfer_accept_list, p);
764 DO_MERGE_ARRAY(parent->remhost_ignore_list, child->remhost_ignore_list, subp); 1047 child->remhost_ignore_list = do_merge_array(parent->remhost_ignore_list, child->remhost_ignore_list, p);
765 DO_MERGE_ARRAY(parent->notes_list, child->notes_list, subp); 1048 child->notes_list = do_merge_array(parent->notes_list, child->notes_list, p);
766 DO_MERGE_ARRAY(parent->hin_list, child->hin_list, subp); 1049 child->hin_list = do_merge_array(parent->hin_list, child->hin_list, p);
767 DO_MERGE_ARRAY(parent->hout_list, child->hout_list, subp); 1050 child->hout_list = do_merge_array(parent->hout_list, child->hout_list, p);
768 DO_MERGE_ARRAY(parent->cookie_list,child->cookie_list, subp); 1051 child->cookie_list = do_merge_array(parent->cookie_list,child->cookie_list, p);
769
770 apr_pool_destroy(subp);
771 1052
772 if (!child->cookie_name) 1053 if (!child->cookie_name)
773 child->cookie_name = parent->cookie_name; 1054 child->cookie_name = parent->cookie_name;
@@ -844,7 +1125,7 @@ static int log_sql_transaction(request_rec *orig)
844 char *cookie_query = NULL; 1125 char *cookie_query = NULL;
845 const char *unique_id; 1126 const char *unique_id;
846 const char *formatted_item; 1127 const char *formatted_item;
847 int i,length; 1128 int i, showcomma;
848 int proceed; 1129 int proceed;
849 1130
850 for (r = orig; r->next; r = r->next) { 1131 for (r = orig; r->next; r = r->next) {
@@ -885,7 +1166,7 @@ static int log_sql_transaction(request_rec *orig)
885 thehost = ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME, NULL); 1166 thehost = ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_NAME, NULL);
886 if (thehost) { 1167 if (thehost) {
887 for (ptrptr = (char **) cls->remhost_ignore_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->remhost_ignore_list->elt_size)) 1168 for (ptrptr = (char **) cls->remhost_ignore_list->elts; ptrptr < ptrptr2; ptrptr = (char **) ((char *) ptrptr + cls->remhost_ignore_list->elt_size))
888 if (ap_strstr(thehost, *ptrptr)) { 1169 if (ap_strstr_c(thehost, *ptrptr)) {
889 return OK; 1170 return OK;
890 } 1171 }
891 } 1172 }
@@ -893,18 +1174,19 @@ static int log_sql_transaction(request_rec *orig)
893 1174
894 /* Iterate through the format characters and set up the INSERT string according to 1175 /* Iterate through the format characters and set up the INSERT string according to
895 * what the user has configured. */ 1176 * what the user has configured. */
896 length = strlen(cls->transfer_log_format); 1177 showcomma = 0;
897 for (i = 0; i<length; i++) { 1178 for (i = 0; i<cls->transfer_log_format->nelts; i++) {
898 logsql_item *item = cls->parsed_log_format[i]; 1179 logsql_field *item = cls->parsed_log_format[i];
899 if (item==NULL) { 1180 if (item==NULL || item->func==NULL) {
900 log_error(APLOG_MARK, APLOG_ERR, 0, orig->server, 1181 log_error(APLOG_MARK, APLOG_ERR, 0, orig->server,
901 "Log Format '%c' unknown",cls->transfer_log_format[i]); 1182 "Log Format '%s' unknown or incomplete",((char **)cls->transfer_log_format->elts)[i]);
902 continue; 1183 continue;
903 } 1184 }
904 1185
905 /* Yes, this key is one of the configured keys. 1186 /* Yes, this key is one of the configured keys.
906 * Call the key's function and put the returned value into 'formatted_item' */ 1187 * Call the key's function and put the returned value into 'formatted_item' */
907 formatted_item = item->func(item->want_orig_default ? orig : r, ""); 1188 formatted_item = item->func->func(item->func->want_orig_req ? orig : r,
1189 item->param ? item->param : "");
908 1190
909 /* Massage 'formatted_item' for proper SQL eligibility... */ 1191 /* Massage 'formatted_item' for proper SQL eligibility... */
910 if (!formatted_item) { 1192 if (!formatted_item) {
@@ -916,10 +1198,11 @@ static int log_sql_transaction(request_rec *orig)
916 } 1198 }
917 1199
918 /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */ 1200 /* Append the fieldname and value-to-insert to the appropriate strings, quoting stringvals with ' as appropriate */
919 fields = apr_pstrcat(r->pool, fields, (i ? "," : ""), 1201 fields = apr_pstrcat(r->pool, fields, (showcomma ? "," : ""),
920 item->sql_field_name, NULL); 1202 item->sql_field_name, NULL);
921 values = apr_pstrcat(r->pool, values, (i ? "," : ""), 1203 values = apr_pstrcat(r->pool, values, (showcomma ? "," : ""),
922 global_config.driver->escape(formatted_item, r->pool,&global_config.db), NULL); 1204 global_config.driver->escape(r, formatted_item, r->pool,&global_config.db), NULL);
1205 showcomma = 1;
923 } 1206 }
924 1207
925 /* Work through the list of notes defined by LogSQLWhichNotes */ 1208 /* Work through the list of notes defined by LogSQLWhichNotes */
@@ -933,11 +1216,11 @@ static int log_sql_transaction(request_rec *orig)
933 itemsets = apr_pstrcat(r->pool, itemsets, 1216 itemsets = apr_pstrcat(r->pool, itemsets,
934 (i > 0 ? "," : ""), 1217 (i > 0 ? "," : ""),
935 "(", 1218 "(",
936 global_config.driver->escape(unique_id, r->pool, &global_config.db), 1219 global_config.driver->escape(r, unique_id, r->pool, &global_config.db),
937 ",", 1220 ",",
938 global_config.driver->escape(*ptrptr, r->pool,&global_config.db), 1221 global_config.driver->escape(r, *ptrptr, r->pool,&global_config.db),
939 ",", 1222 ",",
940 global_config.driver->escape(theitem, r->pool,&global_config.db), 1223 global_config.driver->escape(r, theitem, r->pool,&global_config.db),
941 ")", 1224 ")",
942 NULL); 1225 NULL);
943 i++; 1226 i++;
@@ -961,11 +1244,11 @@ static int log_sql_transaction(request_rec *orig)
961 itemsets = apr_pstrcat(r->pool, itemsets, 1244 itemsets = apr_pstrcat(r->pool, itemsets,
962 (i > 0 ? "," : ""), 1245 (i > 0 ? "," : ""),
963 "(", 1246 "(",
964 global_config.driver->escape(unique_id, r->pool, &global_config.db), 1247 global_config.driver->escape(r,unique_id, r->pool, &global_config.db),
965 ",", 1248 ",",
966 global_config.driver->escape(*ptrptr, r->pool,&global_config.db), 1249 global_config.driver->escape(r,*ptrptr, r->pool,&global_config.db),
967 ",", 1250 ",",
968 global_config.driver->escape(theitem, r->pool,&global_config.db), 1251 global_config.driver->escape(r,theitem, r->pool,&global_config.db),
969 ")", 1252 ")",
970 NULL); 1253 NULL);
971 i++; 1254 i++;
@@ -990,11 +1273,11 @@ static int log_sql_transaction(request_rec *orig)
990 itemsets = apr_pstrcat(r->pool, itemsets, 1273 itemsets = apr_pstrcat(r->pool, itemsets,
991 (i > 0 ? "," : ""), 1274 (i > 0 ? "," : ""),
992 "(", 1275 "(",
993 global_config.driver->escape(unique_id, r->pool, &global_config.db), 1276 global_config.driver->escape(r,unique_id, r->pool, &global_config.db),
994 ",", 1277 ",",
995 global_config.driver->escape(*ptrptr, r->pool,&global_config.db), 1278 global_config.driver->escape(r,*ptrptr, r->pool,&global_config.db),
996 ",", 1279 ",",
997 global_config.driver->escape(theitem, r->pool,&global_config.db), 1280 global_config.driver->escape(r,theitem, r->pool,&global_config.db),
998 ")", 1281 ")",
999 NULL); 1282 NULL);
1000 i++; 1283 i++;
@@ -1019,11 +1302,11 @@ static int log_sql_transaction(request_rec *orig)
1019 itemsets = apr_pstrcat(r->pool, itemsets, 1302 itemsets = apr_pstrcat(r->pool, itemsets,
1020 (i > 0 ? "," : ""), 1303 (i > 0 ? "," : ""),
1021 "(", 1304 "(",
1022 global_config.driver->escape(unique_id, r->pool, &global_config.db), 1305 global_config.driver->escape(r,unique_id, r->pool, &global_config.db),
1023 ",", 1306 ",",
1024 global_config.driver->escape(*ptrptr, r->pool,&global_config.db), 1307 global_config.driver->escape(r,*ptrptr, r->pool,&global_config.db),
1025 ",", 1308 ",",
1026 global_config.driver->escape(theitem, r->pool,&global_config.db), 1309 global_config.driver->escape(r,theitem, r->pool,&global_config.db),
1027 ")", 1310 ")",
1028 NULL); 1311 NULL);
1029 i++; 1312 i++;
@@ -1171,10 +1454,19 @@ static const command_rec log_sql_cmds[] = {
1171 (void *)APR_OFFSETOF(logsql_state, cookie_table_name), RSRC_CONF, 1454 (void *)APR_OFFSETOF(logsql_state, cookie_table_name), RSRC_CONF,
1172 "The database table that holds the cookie info") 1455 "The database table that holds the cookie info")
1173 , 1456 ,
1174 /* Log format */ 1457 /* New Log Format */
1175 AP_INIT_TAKE1("LogSQLTransferLogFormat", set_logformat_slot, 1458 AP_INIT_ITERATE("LogSQLTransferLogItems", add_server_string_slot,
1459 (void *)APR_OFFSETOF(logsql_state, transfer_log_format), RSRC_CONF,
1460 "What fields to log to the database transfer log")
1461 ,
1462 AP_INIT_RAW_ARGS("LogSQLRegisterItem", set_register_field,
1176 NULL, RSRC_CONF, 1463 NULL, RSRC_CONF,
1177 "Instruct the module what information to log to the database transfer log") 1464 "Register a new Item for logging, Arguments: ItemName function argument sqlfield datatype datalen<br>"
1465 "datatypes are INT, SMALLINT, VARCHAR, CHAR<br>")
1466 ,
1467 AP_INIT_TAKE1("LogSQLShowConfig", set_global_string_slot,
1468 (void *)APR_OFFSETOF(global_config_t, showconfig), RSRC_CONF,
1469 "Add this to export the entire running function and dfield configuration to the named file")
1178 , 1470 ,
1179 /* Machine ID */ 1471 /* Machine ID */
1180 AP_INIT_TAKE1("LogSQLMachineID", set_global_string_slot, 1472 AP_INIT_TAKE1("LogSQLMachineID", set_global_string_slot,
@@ -1194,7 +1486,7 @@ static const command_rec log_sql_cmds[] = {
1194 (void *)APR_OFFSETOF(logsql_state, remhost_ignore_list), RSRC_CONF, 1486 (void *)APR_OFFSETOF(logsql_state, remhost_ignore_list), RSRC_CONF,
1195 "List of remote hosts to ignore. Accesses that match will not be logged to database") 1487 "List of remote hosts to ignore. Accesses that match will not be logged to database")
1196 , 1488 ,
1197 /* Special loggin table configuration */ 1489 /* Special logging table configuration */
1198 AP_INIT_TAKE1("LogSQLWhichCookie", set_server_string_slot, 1490 AP_INIT_TAKE1("LogSQLWhichCookie", set_server_string_slot,
1199 (void *)APR_OFFSETOF(logsql_state, cookie_name), RSRC_CONF, 1491 (void *)APR_OFFSETOF(logsql_state, cookie_name), RSRC_CONF,
1200 "The single cookie that you want logged in the access_log when using the 'c' config directive") 1492 "The single cookie that you want logged in the access_log when using the 'c' config directive")
@@ -1219,6 +1511,10 @@ static const command_rec log_sql_cmds[] = {
1219 "<br><b>Deprecated</b><br>The following Commands are deprecated and should not be used.. <br>Read the documentation for more information<br><b>Deprecated</b>") 1511 "<br><b>Deprecated</b><br>The following Commands are deprecated and should not be used.. <br>Read the documentation for more information<br><b>Deprecated</b>")
1220 , 1512 ,
1221 /* Deprecated commands */ 1513 /* Deprecated commands */
1514 AP_INIT_TAKE1("LogSQLTransferLogFormat", set_logformat_slot,
1515 (void *)APR_OFFSETOF(logsql_state, transfer_log_format), RSRC_CONF,
1516 "<b>(Deprecated) Use LogSQLTransferLogItem to specify symbolic log items instead")
1517 ,
1222 AP_INIT_TAKE1("LogSQLDatabase", set_dbparam_slot, 1518 AP_INIT_TAKE1("LogSQLDatabase", set_dbparam_slot,
1223 (void *)"database", RSRC_CONF, 1519 (void *)"database", RSRC_CONF,
1224 "<b>(Deprecated) Use LogSQLDBParam database dbname.</b> The name of the database database for logging") 1520 "<b>(Deprecated) Use LogSQLDBParam database dbname.</b> The name of the database database for logging")
diff --git a/src/mod_log_sql_dbd.c b/src/mod_log_sql_dbd.c
new file mode 100644
index 0000000..e641c35
--- /dev/null
+++ b/src/mod_log_sql_dbd.c
@@ -0,0 +1,132 @@
1/* $Id: mod_log_sql_dbi.c 120 2004-04-17 15:14:12Z urkle@drip.ws $ */
2
3#if defined(WITH_APACHE20)
4# include "apache20.h"
5#else
6# error Unsupported Apache version
7#endif
8
9
10#ifdef HAVE_CONFIG_H
11/* Undefine these to prevent conflicts between Apache ap_config_auto.h and
12 * my config.h. Only really needed for Apache < 2.0.48, but it can't hurt.
13 */
14#undef PACKAGE_BUGREPORT
15#undef PACKAGE_NAME
16#undef PACKAGE_STRING
17#undef PACKAGE_TARNAME
18#undef PACKAGE_VERSION
19
20#include "autoconfig.h"
21#endif
22
23#include "mod_log_sql.h"
24
25#include "apr_dbd.h"
26#include "mod_dbd.h"
27
28typedef struct {
29 ap_dbd_t *dbd;
30} request_config_t;
31
32LOGSQL_MODULE_FORWARD(dbd);
33
34static ap_dbd_t *(*dbd_acquire_fn)(request_rec*) = NULL;
35
36static ap_dbd_t *log_sql_dbd_getconnection(request_rec *r)
37{
38 request_config_t *rconf = ap_get_module_config(r->request_config, &LOGSQL_MODULE(dbd));
39 if (!rconf) {
40 rconf = apr_pcalloc(r->pool, sizeof(request_config_t));
41 ap_set_module_config(r->request_config, &LOGSQL_MODULE(dbd), (void *)rconf);
42 rconf->dbd = dbd_acquire_fn(r);
43 }
44 return rconf->dbd;
45}
46
47/* Connect to the database */
48static logsql_opendb_ret log_sql_dbd_connect(server_rec *s, logsql_dbconnection *db)
49{
50 // We are using mod_dbd so we don't do anything here
51 if (!dbd_acquire_fn) {
52 // no mod_dbd return failure
53 log_error(APLOG_MARK,APLOG_ERR,0, s,"mod_log_sql_dbd: mod_dbd is not loaded or available");
54 return LOGSQL_OPENDB_FAIL;
55 } else {
56 return LOGSQL_OPENDB_SUCCESS;
57 }
58}
59
60/* Close the DB link */
61static void log_sql_dbd_close(logsql_dbconnection *db)
62{
63 // mod_dbd handles this, so do nothing
64}
65
66/* Routine to escape the 'dangerous' characters that would otherwise
67 * corrupt the INSERT string: ', \, and "
68 */
69static const char *log_sql_dbd_escape(request_rec *r, const char *from_str, apr_pool_t *p,
70 logsql_dbconnection *db)
71{
72 // Acquire a DBD connection from mod_dbd
73 ap_dbd_t *dbd = log_sql_dbd_getconnection(r);
74 if (!dbd) return NULL;
75
76 if (!from_str)
77 return NULL;
78
79 return apr_pstrcat(p, "'",apr_dbd_escape(dbd->driver, p, from_str, dbd->handle),"'",NULL);
80}
81
82/* Run an insert query and return a categorized error or success */
83static logsql_query_ret log_sql_dbd_query(request_rec *r,logsql_dbconnection *db,
84 const char *query)
85{
86 int ret;
87 const char *err;
88 int affected;
89 // Acquire a DBD connection from mod_dbd
90 ap_dbd_t *dbd = log_sql_dbd_getconnection(r);
91 if (!dbd) return LOGSQL_QUERY_NOLINK;
92
93 // Run the query
94 ret = apr_dbd_query(dbd->driver, dbd->handle, &affected, query);
95 if (ret == 0) {
96 return LOGSQL_QUERY_SUCCESS;
97 } else {
98 // attempt to detect error message
99 err = apr_dbd_error(dbd->driver, dbd->handle, ret);
100 log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "DB Returned error: (%d) %s", ret, err);
101 // Unable to check if "NO SUCH TABLE" due to apr_dbd not mapping error codes to a standard set.
102 return LOGSQL_QUERY_FAIL;
103 }
104}
105
106/* Create table table_name of type table_type. */
107static logsql_table_ret log_sql_dbd_create(request_rec *r, logsql_dbconnection *db,
108 logsql_tabletype table_type, const char *table_name)
109{
110 return LOGSQL_TABLE_FAIL;
111}
112
113static const char *supported_drivers[] = {"dbd",NULL};
114static logsql_dbdriver log_sql_dbd_driver = {
115 "dbd",
116 supported_drivers,
117 log_sql_dbd_connect,/* open DB connection */
118 log_sql_dbd_close, /* close DB connection */
119 log_sql_dbd_escape, /* escape query */
120 log_sql_dbd_query, /* insert query */
121 log_sql_dbd_create /* create table */
122};
123
124LOGSQL_REGISTER(dbd) {
125 dbd_acquire_fn = APR_RETRIEVE_OPTIONAL_FN(ap_dbd_acquire);
126 if (dbd_acquire_fn == NULL) {
127 log_error(APLOG_MARK,APLOG_ERR,0,s,"You must load mod_dbd to enable AuthDBD functions");
128 }
129
130 log_sql_register_driver(p,&log_sql_dbd_driver);
131 LOGSQL_REGISTER_RETURN;
132}
diff --git a/mod_log_sql_dbi.c b/src/mod_log_sql_dbi.c
index 8afd844..5b83836 100644
--- a/mod_log_sql_dbi.c
+++ b/src/mod_log_sql_dbi.c
@@ -19,7 +19,7 @@
19#undef PACKAGE_TARNAME 19#undef PACKAGE_TARNAME
20#undef PACKAGE_VERSION 20#undef PACKAGE_VERSION
21 21
22#include "config.h" 22#include "autoconfig.h"
23#endif 23#endif
24 24
25#include "mod_log_sql.h" 25#include "mod_log_sql.h"
@@ -90,7 +90,7 @@ static void log_sql_dbi_close(logsql_dbconnection *db)
90/* Routine to escape the 'dangerous' characters that would otherwise 90/* Routine to escape the 'dangerous' characters that would otherwise
91 * corrupt the INSERT string: ', \, and " 91 * corrupt the INSERT string: ', \, and "
92 */ 92 */
93static const char *log_sql_dbi_escape(const char *from_str, apr_pool_t *p, 93static const char *log_sql_dbi_escape(request_rec *r,const char *from_str, apr_pool_t *p,
94 logsql_dbconnection *db) 94 logsql_dbconnection *db)
95{ 95{
96 dbi_conn_rec *dblink = db->handle; 96 dbi_conn_rec *dblink = db->handle;
diff --git a/mod_log_sql_logio.c b/src/mod_log_sql_logio.c
index 95d1763..ebdeddd 100644
--- a/mod_log_sql_logio.c
+++ b/src/mod_log_sql_logio.c
@@ -16,11 +16,13 @@
16#undef PACKAGE_TARNAME 16#undef PACKAGE_TARNAME
17#undef PACKAGE_VERSION 17#undef PACKAGE_VERSION
18 18
19#include "config.h" 19#include "autoconfig.h"
20#endif 20#endif
21 21
22#include "mod_log_sql.h" 22#include "mod_log_sql.h"
23 23
24#include "http_connection.h"
25
24module AP_MODULE_DECLARE_DATA log_sql_logio_module; 26module AP_MODULE_DECLARE_DATA log_sql_logio_module;
25 27
26// From apachge 2.2's mod_logio.c to provide logging ACTUAL incoming and outgoing bytes 28// From apachge 2.2's mod_logio.c to provide logging ACTUAL incoming and outgoing bytes
@@ -96,7 +98,7 @@ static apr_status_t logio_out_filter(ap_filter_t *f,
96} 98}
97 99
98static int logio_pre_conn(conn_rec *c, void *csd) { 100static int logio_pre_conn(conn_rec *c, void *csd) {
99 logio_config_t *cf = apr_pcalloc(c->pool, sizeof(*cf)); 101 logio_config_t *cf = apr_pcalloc(c->pool, sizeof(logio_config_t));
100 102
101 ap_set_module_config(c->conn_config, &log_sql_logio_module, cf); 103 ap_set_module_config(c->conn_config, &log_sql_logio_module, cf);
102 104
@@ -108,10 +110,21 @@ static int logio_pre_conn(conn_rec *c, void *csd) {
108 110
109static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) 111static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
110{ 112{
111 log_sql_register_item(s,p,'i', log_bytes_in, "bytes_in", 0, 0); 113 log_sql_register_function(p, "bytes_in", log_bytes_in, LOGSQL_FUNCTION_REQ_FINAL);
112 log_sql_register_item(s,p,'o', log_bytes_out, "bytes_out", 0, 0); 114 log_sql_register_function(p, "bytes_out", log_bytes_out, LOGSQL_FUNCTION_REQ_FINAL);
115
116 log_sql_register_alias(s,p,'i', "bytes_in");
117 log_sql_register_alias(s,p,'o', "bytes_out");
118
119 log_sql_register_field(p, "bytes_in", "bytes_in", NULL,
120 "bytes_in", LOGSQL_DATATYPE_INT, 0);
121 log_sql_register_field(p, "bytes_out", "bytes_out", NULL,
122 "bytes_out", LOGSQL_DATATYPE_INT, 0);
123
124 log_sql_register_finish(s);
113 return OK; 125 return OK;
114} 126}
127
115static void register_hooks(apr_pool_t *p) { 128static void register_hooks(apr_pool_t *p) {
116 static const char *pre[] = { "mod_log_sql.c", NULL }; 129 static const char *pre[] = { "mod_log_sql.c", NULL };
117 130
diff --git a/mod_log_sql_mysql.c b/src/mod_log_sql_mysql.c
index 7631b14..902cadf 100644
--- a/mod_log_sql_mysql.c
+++ b/src/mod_log_sql_mysql.c
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id:mod_log_sql_mysql.c 180 2008-09-21 15:54:12Z urkle@drip.ws $ */
2 2
3#if defined(WITH_APACHE20) 3#if defined(WITH_APACHE20)
4# include "apache20.h" 4# include "apache20.h"
@@ -18,7 +18,7 @@
18#undef PACKAGE_TARNAME 18#undef PACKAGE_TARNAME
19#undef PACKAGE_VERSION 19#undef PACKAGE_VERSION
20 20
21#include "config.h" 21#include "autoconfig.h"
22#endif 22#endif
23 23
24#include "mod_log_sql.h" 24#include "mod_log_sql.h"
@@ -74,7 +74,7 @@ static void log_sql_mysql_close(logsql_dbconnection *db)
74/* Routine to escape the 'dangerous' characters that would otherwise 74/* Routine to escape the 'dangerous' characters that would otherwise
75 * corrupt the INSERT string: ', \, and " 75 * corrupt the INSERT string: ', \, and "
76 */ 76 */
77static const char *log_sql_mysql_escape(const char *from_str, apr_pool_t *p, 77static const char *log_sql_mysql_escape(request_rec *r, const char *from_str, apr_pool_t *p,
78 logsql_dbconnection *db) 78 logsql_dbconnection *db)
79{ 79{
80 /* Return "NULL" for empty strings */ 80 /* Return "NULL" for empty strings */
@@ -147,10 +147,10 @@ static logsql_query_ret log_sql_mysql_query(request_rec *r,logsql_dbconnection *
147 SIGNAL_RELEASE 147 SIGNAL_RELEASE
148 return LOGSQL_QUERY_SUCCESS; 148 return LOGSQL_QUERY_SUCCESS;
149 } 149 }
150 log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
151 "mysql_query returned (%d)", retval);
152 /* Check to see if the error is "nonexistent table" */
153 real_error = mysql_errno(dblink); 150 real_error = mysql_errno(dblink);
151 log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
152 "mysql_query returned (%d) \"%s\"", real_error, MYSQL_ERROR(dblink));
153 /* Check to see if the error is "nonexistent table" */
154 154
155 if (real_error == ER_NO_SUCH_TABLE) { 155 if (real_error == ER_NO_SUCH_TABLE) {
156 log_error(APLOG_MARK,APLOG_ERR,0, r->server,"table does not exist, preserving query"); 156 log_error(APLOG_MARK,APLOG_ERR,0, r->server,"table does not exist, preserving query");
diff --git a/mod_log_sql_pgsql.c b/src/mod_log_sql_pgsql.c
index 4e12920..dcfbd73 100644
--- a/mod_log_sql_pgsql.c
+++ b/src/mod_log_sql_pgsql.c
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id:mod_log_sql_pgsql.c 180 2008-09-21 15:54:12Z urkle@drip.ws $ */
2 2
3#if defined(WITH_APACHE20) 3#if defined(WITH_APACHE20)
4# include "apache20.h" 4# include "apache20.h"
@@ -19,7 +19,7 @@
19#undef PACKAGE_TARNAME 19#undef PACKAGE_TARNAME
20#undef PACKAGE_VERSION 20#undef PACKAGE_VERSION
21 21
22#include "config.h" 22#include "autoconfig.h"
23#endif 23#endif
24 24
25#include "mod_log_sql.h" 25#include "mod_log_sql.h"
diff --git a/mod_log_sql_ssl.c b/src/mod_log_sql_ssl.c
index d94a79f..b3a4929 100644
--- a/mod_log_sql_ssl.c
+++ b/src/mod_log_sql_ssl.c
@@ -1,4 +1,4 @@
1/* $Id$ */ 1/* $Id:mod_log_sql_ssl.c 180 2008-09-21 15:54:12Z urkle@drip.ws $ */
2 2
3#if defined(WITH_APACHE20) 3#if defined(WITH_APACHE20)
4# include "apache20.h" 4# include "apache20.h"
@@ -9,7 +9,7 @@
9#endif 9#endif
10 10
11#ifdef HAVE_CONFIG_H 11#ifdef HAVE_CONFIG_H
12/* Undefine these to prevent conflicts between Apache ap_config_auto.h and 12/* Undefine these to prevent conflicts between Apache ap_config_auto.h and
13 * my config.h. Only really needed for Apache < 2.0.48, but it can't hurt. 13 * my config.h. Only really needed for Apache < 2.0.48, but it can't hurt.
14 */ 14 */
15#undef PACKAGE_BUGREPORT 15#undef PACKAGE_BUGREPORT
@@ -18,7 +18,7 @@
18#undef PACKAGE_TARNAME 18#undef PACKAGE_TARNAME
19#undef PACKAGE_VERSION 19#undef PACKAGE_VERSION
20 20
21#include "config.h" 21#include "autoconfig.h"
22#endif 22#endif
23 23
24#include "mod_log_sql.h" 24#include "mod_log_sql.h"
@@ -52,7 +52,7 @@ static const char *extract_ssl_keysize(request_rec *r, char *a)
52static const char *extract_ssl_maxkeysize(request_rec *r, char *a) 52static const char *extract_ssl_maxkeysize(request_rec *r, char *a)
53{ 53{
54 char *result = NULL; 54 char *result = NULL;
55 if (TEST_SSL(r) != NULL) 55 if (TEST_SSL(r) != NULL)
56 { 56 {
57 result = header_ssl_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_ALGKEYSIZE"); 57 result = header_ssl_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER_ALGKEYSIZE");
58 log_error(APLOG_MARK,APLOG_DEBUG,0, r->server,"SSL_ALGKEYSIZE: %s", result); 58 log_error(APLOG_MARK,APLOG_DEBUG,0, r->server,"SSL_ALGKEYSIZE: %s", result);
@@ -84,9 +84,21 @@ static const char *extract_ssl_cipher(request_rec *r, char *a)
84 84
85LOGSQL_REGISTER(ssl) 85LOGSQL_REGISTER(ssl)
86{ 86{
87 log_sql_register_item(s,p,'q', extract_ssl_keysize, "ssl_keysize", 0, 1); 87 log_sql_register_function(p, "ssl_keysize", extract_ssl_keysize, LOGSQL_FUNCTION_REQ_FINAL);
88 log_sql_register_item(s,p,'Q', extract_ssl_maxkeysize, "ssl_maxkeysize", 0, 1); 88 log_sql_register_function(p, "ssl_maxkeysize", extract_ssl_maxkeysize, LOGSQL_FUNCTION_REQ_FINAL);
89 log_sql_register_item(s,p,'z', extract_ssl_cipher, "ssl_cipher", 0, 1); 89 log_sql_register_function(p, "ssl_cipher", extract_ssl_cipher, LOGSQL_FUNCTION_REQ_FINAL);
90
91 log_sql_register_alias(s,p,'q', "ssl_keysize");
92 log_sql_register_alias(s,p,'Q', "ssl_maxkeysize");
93 log_sql_register_alias(s,p,'z', "ssl_cipher");
94
95 log_sql_register_field(p, "ssl_keysize", "ssl_keysize", NULL,
96 "ssl_keysize", LOGSQL_DATATYPE_VARCHAR, 0);
97 log_sql_register_field(p, "ssl_maxkeysize", "ssl_maxkeysize", NULL,
98 "ssl_maxkeysize", LOGSQL_DATATYPE_VARCHAR, 0);
99 log_sql_register_field(p, "ssl_cipher", "ssl_cipher", NULL,
100 "ssl_cipher", LOGSQL_DATATYPE_VARCHAR, 0);
101
90#if defined(WITH_APACHE20) 102#if defined(WITH_APACHE20)
91 header_ssl_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup); 103 header_ssl_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup);
92#endif 104#endif
diff --git a/utility/Makefile.in b/utility/Makefile.in
new file mode 100644
index 0000000..fdc3846
--- /dev/null
+++ b/utility/Makefile.in
@@ -0,0 +1,49 @@
1# @configure_input@
2
3top_srcdir = @top_srcdir@
4srcdir = @abs_srcdir@
5top_builddir = @top_builddir@
6builddir = @abs_builddir@
7
8LIBTOOL=@LIBTOOL@
9CFLAGS = -g3 -Wall -fno-strict-aliasing \
10 @APR_INCLUDES@ @APU_INCLUDES@ @PCRE_CFLAGS@ \
11 -I$(top_srcdir)/include
12CPPFLAGS = @APR_CPPFLAGS@
13LDFLAGS = @APR_LIBTOOL@ @APU_LIBTOOL@ @PCRE_LIBS@
14
15ifeq (@OOO_MAINTAIN@,1)
16CFLAGS += -Werror
17endif
18
19STD_DIST = Makefile.in
20
21DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(SOURCES) $(HEADERS)
22
23SOURCES = shell.c config.c logparse.c ap_pcre.c util.c database.c
24HEADERS = shell.h config.h logparse.h ap_pcre.h util.h database.h
25OBJECTS = $(SOURCES:.c=.o)
26DEPS = $(SOURCES:.c=.d)
27TARGETS = mod_log_sql
28
29all: $(TARGETS)
30
31mod_log_sql: $(OBJECTS) $(HEADERS)
32 $(LIBTOOL) --tag=CC --mode=link $(CC) -o $@ $(OBJECTS) $(LDFLAGS)
33
34%.o: %.c %.d
35 gcc -c $(CFLAGS) $(CPPFLAGS) $< -o $@
36%.d: %.c
37 gcc -MM $(CFLAGS) $(CPPFLAGS) $< -o $@
38
39-include $(DEPS)
40
41clean:
42 $(RM) $(OBJECTS) $(TARGETS) $(DEPS)
43
44local-dist: $(DISTFILES)
45 mkdir -p $(DESTDIR)
46 cp -dp --parents $(DISTFILES) $(DESTDIR)
47
48Makefile: Makefile.in ../config.status
49 cd .. && ./config.status
diff --git a/utility/ap_pcre.c b/utility/ap_pcre.c
new file mode 100644
index 0000000..b2b9767
--- /dev/null
+++ b/utility/ap_pcre.c
@@ -0,0 +1,344 @@
1/*************************************************
2 * Perl-Compatible Regular Expressions *
3 *************************************************/
4
5/*
6 This is a library of functions to support regular expressions whose syntax
7 and semantics are as close as possible to those of the Perl 5 language. See
8 the file Tech.Notes for some information on the internals.
9
10 This module is a wrapper that provides a POSIX API to the underlying PCRE
11 functions.
12
13 Written by: Philip Hazel <ph10@cam.ac.uk>
14
15 Copyright (c) 1997-2004 University of Cambridge
16
17 -----------------------------------------------------------------------------
18 Redistribution and use in source and binary forms, with or without
19 modification, are permitted provided that the following conditions are met:
20
21 * Redistributions of source code must retain the above copyright notice,
22 this list of conditions and the following disclaimer.
23
24 * Redistributions in binary form must reproduce the above copyright
25 notice, this list of conditions and the following disclaimer in the
26 documentation and/or other materials provided with the distribution.
27
28 * Neither the name of the University of Cambridge nor the names of its
29 contributors may be used to endorse or promote products derived from
30 this software without specific prior written permission.
31
32 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
33 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
36 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
37 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
38 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
40 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 POSSIBILITY OF SUCH DAMAGE.
43 -----------------------------------------------------------------------------
44 */
45
46#include "apr_lib.h"
47#include "apr_strings.h"
48#include "ap_pcre.h"
49#include "pcre.h"
50
51#define APR_WANT_STRFUNC
52#include "apr_want.h"
53
54#ifndef POSIX_MALLOC_THRESHOLD
55#define POSIX_MALLOC_THRESHOLD (10)
56#endif
57
58/* Table of error strings corresponding to POSIX error codes; must be
59 * kept in synch with include/ap_regex.h's AP_REG_E* definitions. */
60
61static const char *const pstring[] = {
62 "", /* Dummy for value 0 */
63 "internal error", /* AP_REG_ASSERT */
64 "failed to get memory", /* AP_REG_ESPACE */
65 "bad argument", /* AP_REG_INVARG */
66 "match failed" /* AP_REG_NOMATCH */
67};
68
69apr_size_t ap_regerror(int errcode, const ap_regex_t *preg, char *errbuf,
70 apr_size_t errbuf_size)
71{
72 const char *message, *addmessage;
73 apr_size_t length, addlength;
74
75 message
76 = (errcode >= (int)(sizeof(pstring)/sizeof(char *))) ? "unknown error code"
77 : pstring[errcode];
78 length = strlen(message) + 1;
79
80 addmessage = " at offset ";
81 addlength
82 = (preg != NULL && (int)preg->re_erroffset != -1) ? strlen(addmessage)
83 + 6
84 : 0;
85
86 if (errbuf_size > 0) {
87 if (addlength > 0 && errbuf_size >= length + addlength)
88 apr_snprintf(errbuf, sizeof errbuf, "%s%s%-6d", message,
89 addmessage, (int)preg->re_erroffset);
90 else {
91 strncpy(errbuf, message, errbuf_size - 1);
92 errbuf[errbuf_size-1] = 0;
93 }
94 }
95
96 return length + addlength;
97}
98
99/*************************************************
100 * Free store held by a regex *
101 *************************************************/
102
103void ap_regfree(ap_regex_t *preg)
104{
105 (pcre_free)(preg->re_pcre);
106}
107
108/*************************************************
109 * Compile a regular expression *
110 *************************************************/
111
112/*
113 Arguments:
114 preg points to a structure for recording the compiled expression
115 pattern the pattern to compile
116 cflags compilation flags
117
118 Returns: 0 on success
119 various non-zero codes on failure
120 */
121
122int ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags)
123{
124 const char *errorptr;
125 int erroffset;
126 int options = 0;
127
128 if ((cflags & AP_REG_ICASE) != 0)
129 options |= PCRE_CASELESS;
130 if ((cflags & AP_REG_NEWLINE) != 0)
131 options |= PCRE_MULTILINE;
132
133 preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
134 preg->re_erroffset = erroffset;
135
136 if (preg->re_pcre == NULL)
137 return AP_REG_INVARG;
138
139 preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
140 return 0;
141}
142
143/*************************************************
144 * Match a regular expression *
145 *************************************************/
146
147/* Unfortunately, PCRE requires 3 ints of working space for each captured
148 substring, so we have to get and release working store instead of just using
149 the POSIX structures as was done in earlier releases when PCRE needed only 2
150 ints. However, if the number of possible capturing brackets is small, use a
151 block of store on the stack, to reduce the use of malloc/free. The threshold is
152 in a macro that can be changed at configure time. */
153
154int ap_regexec(const ap_regex_t *preg, const char *string, apr_size_t nmatch,
155 ap_regmatch_t pmatch[], int eflags)
156{
157 int rc;
158 int options = 0;
159 int *ovector= NULL;
160 int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
161 int allocated_ovector = 0;
162
163 if ((eflags & AP_REG_NOTBOL) != 0)
164 options |= PCRE_NOTBOL;
165 if ((eflags & AP_REG_NOTEOL) != 0)
166 options |= PCRE_NOTEOL;
167
168 ((ap_regex_t *)preg)->re_erroffset = (apr_size_t)(-1); /* Only has meaning after compile */
169
170 if (nmatch > 0) {
171 if (nmatch <= POSIX_MALLOC_THRESHOLD) {
172 ovector = &(small_ovector[0]);
173 } else {
174 ovector = (int *)malloc(sizeof(int) * nmatch * 3);
175 if (ovector == NULL)
176 return AP_REG_ESPACE;
177 allocated_ovector = 1;
178 }
179 }
180
181 rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string,
182 (int)strlen(string), 0, options, ovector, nmatch * 3);
183
184 if (rc == 0)
185 rc = nmatch; /* All captured slots were filled in */
186
187 if (rc >= 0) {
188 apr_size_t i;
189 for (i = 0; i < (apr_size_t)rc; i++) {
190 pmatch[i].rm_so = ovector[i*2];
191 pmatch[i].rm_eo = ovector[i*2+1];
192 }
193 if (allocated_ovector)
194 free(ovector);
195 for (; i < nmatch; i++)
196 pmatch[i].rm_so = pmatch[i].rm_eo = -1;
197 return 0;
198 }
199
200 else {
201 if (allocated_ovector)
202 free(ovector);
203 switch (rc) {
204 case PCRE_ERROR_NOMATCH:
205 return AP_REG_NOMATCH;
206 case PCRE_ERROR_NULL:
207 return AP_REG_INVARG;
208 case PCRE_ERROR_BADOPTION:
209 return AP_REG_INVARG;
210 case PCRE_ERROR_BADMAGIC:
211 return AP_REG_INVARG;
212 case PCRE_ERROR_UNKNOWN_NODE:
213 return AP_REG_ASSERT;
214 case PCRE_ERROR_NOMEMORY:
215 return AP_REG_ESPACE;
216#ifdef PCRE_ERROR_MATCHLIMIT
217 case PCRE_ERROR_MATCHLIMIT: return AP_REG_ESPACE;
218#endif
219#ifdef PCRE_ERROR_BADUTF8
220 case PCRE_ERROR_BADUTF8: return AP_REG_INVARG;
221#endif
222#ifdef PCRE_ERROR_BADUTF8_OFFSET
223 case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG;
224#endif
225 default:
226 return AP_REG_ASSERT;
227 }
228 }
229}
230
231/*
232 * Here's a pool-based interface to the POSIX-esque ap_regcomp().
233 * Note that we return ap_regex_t instead of being passed one.
234 * The reason is that if you use an already-used ap_regex_t structure,
235 * the memory that you've already allocated gets forgotten, and
236 * regfree() doesn't clear it. So we don't allow it.
237 */
238
239static apr_status_t regex_cleanup(void *preg)
240{
241 ap_regfree((ap_regex_t *) preg);
242 return APR_SUCCESS;
243}
244
245ap_regex_t *ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags)
246{
247 ap_regex_t *preg = apr_palloc(p, sizeof *preg);
248
249 if (ap_regcomp(preg, pattern, cflags)) {
250 return NULL;
251 }
252
253 apr_pool_cleanup_register(p, (void *) preg, regex_cleanup,
254 apr_pool_cleanup_null);
255
256 return preg;
257}
258
259void ap_pregfree(apr_pool_t *p, ap_regex_t *reg)
260{
261 ap_regfree(reg);
262 apr_pool_cleanup_kill(p, (void *) reg, regex_cleanup);
263}
264
265/* This function substitutes for $0-$9, filling in regular expression
266 * submatches. Pass it the same nmatch and pmatch arguments that you
267 * passed ap_regexec(). pmatch should not be greater than the maximum number
268 * of subexpressions - i.e. one more than the re_nsub member of ap_regex_t.
269 *
270 * input should be the string with the $-expressions, source should be the
271 * string that was matched against.
272 *
273 * It returns the substituted string, or NULL on error.
274 *
275 * Parts of this code are based on Henry Spencer's regsub(), from his
276 * AT&T V8 regexp package.
277 */
278
279char * ap_pregsub(apr_pool_t *p, const char *input, const char *source,
280 size_t nmatch, ap_regmatch_t pmatch[])
281{
282 const char *src = input;
283 char *dest, *dst;
284 char c;
285 size_t no;
286 int len;
287
288 if (!source)
289 return NULL;
290 if (!nmatch)
291 return apr_pstrdup(p, src);
292
293 /* First pass, find the size */
294
295 len = 0;
296
297 while ((c = *src++) != '\0') {
298 if (c == '&')
299 no = 0;
300 else if (c == '$' && apr_isdigit(*src))
301 no = *src++ - '0';
302 else
303 no = 10;
304
305 if (no> 9) { /* Ordinary character. */
306 if (c == '\\' && (*src == '$' || *src == '&'))
307 c = *src++;
308 len++;
309 } else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
310 len += pmatch[no].rm_eo - pmatch[no].rm_so;
311 }
312
313 }
314
315 dest = dst = apr_pcalloc(p, len + 1);
316
317 /* Now actually fill in the string */
318
319 src = input;
320
321 while ((c = *src++) != '\0') {
322 if (c == '&')
323 no = 0;
324 else if (c == '$' && apr_isdigit(*src))
325 no = *src++ - '0';
326 else
327 no = 10;
328
329 if (no> 9) { /* Ordinary character. */
330 if (c == '\\' && (*src == '$' || *src == '&'))
331 c = *src++;
332 *dst++ = c;
333 } else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
334 len = pmatch[no].rm_eo - pmatch[no].rm_so;
335 memcpy(dst, source + pmatch[no].rm_so, len);
336 dst += len;
337 }
338
339 }
340 *dst = '\0';
341
342 return dest;
343}
344/* End of pcreposix.c */
diff --git a/utility/ap_pcre.h b/utility/ap_pcre.h
new file mode 100644
index 0000000..e817dc2
--- /dev/null
+++ b/utility/ap_pcre.h
@@ -0,0 +1,178 @@
1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* Derived from PCRE's pcreposix.h.
18
19 Copyright (c) 1997-2004 University of Cambridge
20
21-----------------------------------------------------------------------------
22Redistribution and use in source and binary forms, with or without
23modification, are permitted provided that the following conditions are met:
24
25 * Redistributions of source code must retain the above copyright notice,
26 this list of conditions and the following disclaimer.
27
28 * Redistributions in binary form must reproduce the above copyright
29 notice, this list of conditions and the following disclaimer in the
30 documentation and/or other materials provided with the distribution.
31
32 * Neither the name of the University of Cambridge nor the names of its
33 contributors may be used to endorse or promote products derived from
34 this software without specific prior written permission.
35
36THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
37AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
40LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
41CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
42SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
43INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
44CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
46POSSIBILITY OF SUCH DAMAGE.
47-----------------------------------------------------------------------------
48*/
49
50/**
51 * @file ap_regex.h
52 * @brief Apache Regex defines
53 */
54
55#ifndef AP_REGEX_H
56#define AP_REGEX_H
57
58#include "apr.h"
59
60/* Allow for C++ users */
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/* Options for ap_regexec: */
67
68#define AP_REG_ICASE 0x01 /** use a case-insensitive match */
69#define AP_REG_NEWLINE 0x02 /** don't match newlines against '.' etc */
70#define AP_REG_NOTBOL 0x04 /** ^ will not match against start-of-string */
71#define AP_REG_NOTEOL 0x08 /** $ will not match against end-of-string */
72
73#define AP_REG_EXTENDED (0) /** unused */
74#define AP_REG_NOSUB (0) /** unused */
75
76#define AP_MAX_REG_MATCH 10
77
78/* Error values: */
79enum {
80 AP_REG_ASSERT = 1, /** internal error ? */
81 AP_REG_ESPACE, /** failed to get memory */
82 AP_REG_INVARG, /** invalid argument */
83 AP_REG_NOMATCH /** match failed */
84};
85
86/* The structure representing a compiled regular expression. */
87typedef struct {
88 void *re_pcre;
89 apr_size_t re_nsub;
90 apr_size_t re_erroffset;
91} ap_regex_t;
92
93/* The structure in which a captured offset is returned. */
94typedef struct {
95 int rm_so;
96 int rm_eo;
97} ap_regmatch_t;
98
99/* The functions */
100
101/**
102 * Compile a regular expression.
103 * @param preg Returned compiled regex
104 * @param regex The regular expression string
105 * @param cflags Must be zero (currently).
106 * @return Zero on success or non-zero on error
107 */
108int ap_regcomp(ap_regex_t *preg, const char *regex, int cflags);
109
110/**
111 * Match a NUL-terminated string against a pre-compiled regex.
112 * @param preg The pre-compiled regex
113 * @param string The string to match
114 * @param nmatch Provide information regarding the location of any matches
115 * @param pmatch Provide information regarding the location of any matches
116 * @param eflags Bitwise OR of any of AP_REG_* flags
117 * @return 0 for successful match, #REG_NOMATCH otherwise
118 */
119int ap_regexec(const ap_regex_t *preg, const char *string,
120 apr_size_t nmatch, ap_regmatch_t *pmatch, int eflags);
121
122/**
123 * Return the error code returned by regcomp or regexec into error messages
124 * @param errcode the error code returned by regexec or regcomp
125 * @param preg The precompiled regex
126 * @param errbuf A buffer to store the error in
127 * @param errbuf_size The size of the buffer
128 */
129apr_size_t ap_regerror(int errcode, const ap_regex_t *preg,
130 char *errbuf, apr_size_t errbuf_size);
131
132/** Destroy a pre-compiled regex.
133 * @param preg The pre-compiled regex to free.
134 */
135void ap_regfree(ap_regex_t *preg);
136
137/**
138 * Compile a regular expression to be used later
139 * @param p The pool to allocate from
140 * @param pattern the regular expression to compile
141 * @param cflags The bitwise or of one or more of the following:
142 * @li REG_EXTENDED - Use POSIX extended Regular Expressions
143 * @li REG_ICASE - Ignore case
144 * @li REG_NOSUB - Support for substring addressing of matches
145 * not required
146 * @li REG_NEWLINE - Match-any-character operators don't match new-line
147 * @return The compiled regular expression
148 */
149ap_regex_t * ap_pregcomp(apr_pool_t *p, const char *pattern,
150 int cflags);
151
152/**
153 * Free the memory associated with a compiled regular expression
154 * @param p The pool the regex was allocated from
155 * @param reg The regular expression to free
156 */
157void ap_pregfree(apr_pool_t *p, ap_regex_t *reg);
158
159/**
160 * After performing a successful regex match, you may use this function to
161 * perform a series of string substitutions based on subexpressions that were
162 * matched during the call to ap_regexec
163 * @param p The pool to allocate from
164 * @param input An arbitrary string containing $1 through $9. These are
165 * replaced with the corresponding matched sub-expressions
166 * @param source The string that was originally matched to the regex
167 * @param nmatch the nmatch returned from ap_pregex
168 * @param pmatch the pmatch array returned from ap_pregex
169 */
170char * ap_pregsub(apr_pool_t *p, const char *input, const char *source,
171 size_t nmatch, ap_regmatch_t pmatch[]);
172
173#ifdef __cplusplus
174} /* extern "C" */
175#endif
176
177#endif /* AP_REGEX_T */
178
diff --git a/utility/config.c b/utility/config.c
new file mode 100644
index 0000000..6867476
--- /dev/null
+++ b/utility/config.c
@@ -0,0 +1,534 @@
1#include "apr.h"
2#include "apr_file_info.h"
3#include "apr_file_io.h"
4#include "apr_strings.h"
5#include "apr_hash.h"
6#include "apr_uri.h"
7
8#include "shell.h"
9#include "config.h"
10#include "util.h"
11#include "logparse.h"
12#include "autoconfig.h"
13
14apr_hash_t *g_config_opts;
15
16static apr_status_t config_set_string(config_t *cfg, config_opt_t *opt,
17 int argc, const char **argv)
18{
19 int offset = (int)(long)opt->data;
20 char **data = (char **)((void *)cfg + offset);
21 if (argc != 2)
22 return APR_EINVAL;
23 *data = apr_pstrdup(cfg->pool, argv[1]);
24 return APR_SUCCESS;
25}
26
27static apr_status_t config_set_file(config_t *cfg, config_opt_t *opt,
28 int argc, const char **argv)
29{
30 int offset = (int)(long)opt->data;
31 char **data = (char **)((void *)cfg + offset);
32 if (argc != 2)
33 return APR_EINVAL;
34 apr_filepath_merge(data, NULL, argv[1],
35 APR_FILEPATH_TRUENAME, cfg->pool);
36 return APR_SUCCESS;
37}
38
39static apr_status_t config_set_int(config_t *cfg, config_opt_t *opt, int argc,
40 const char **argv)
41{
42 int offset = (int)(long)opt->data;
43 int *data = (int *)((void *)cfg + offset);
44 if (argc != 2)
45 return APR_EINVAL;
46 *data = apr_atoi64(argv[1]);
47 return APR_SUCCESS;
48}
49
50static apr_status_t config_set_flag(config_t *cfg, config_opt_t *opt, int argc,
51 const char **argv)
52{
53 int offset = (int)(long)opt->data;
54 int *data = (int *)((void *)cfg + offset);
55 if (argc != 2)
56 return APR_EINVAL;
57 *data = CHECK_YESNO(argv[1]);
58 return APR_SUCCESS;
59}
60
61static apr_status_t config_set_loglevel(config_t *cfg, config_opt_t *opt,
62 int argc, const char **argv)
63{
64 if (argc != 2)
65 return APR_EINVAL;
66 if (!strcasecmp(argv[1], "error")) {
67 cfg->loglevel = LOGLEVEL_ERROR;
68 } else if (!strcasecmp(argv[1], "notice")) {
69 cfg->loglevel = LOGLEVEL_NOTICE;
70 } else if (!strcasecmp(argv[1], "debug")) {
71 cfg->loglevel = LOGLEVEL_DEBUG;
72 } else {
73 cfg->loglevel = LOGLEVEL_ERROR;
74 }
75 return APR_SUCCESS;
76}
77
78static apr_status_t config_set_inputfile(config_t *cfg, config_opt_t *opt,
79 int argc, const char **argv)
80{
81 config_filestat_t *newp;
82 if (argc != 2)
83 return APR_EINVAL;
84 newp = (config_filestat_t *)apr_array_push(cfg->input_files);
85 char *temp;
86 apr_filepath_merge(&temp, NULL, argv[1],
87 APR_FILEPATH_TRUENAME, cfg->pool);
88 newp->fname = temp;
89 newp->result = "Not Parsed";
90 return APR_SUCCESS;
91}
92
93static apr_status_t config_set_dummy(config_t *cfg, config_opt_t *opt,
94 int argc, const char **argv)
95{
96 return APR_SUCCESS;
97}
98
99static apr_status_t config_set_logformat(config_t *cfg, config_opt_t *opt,
100 int argc, const char **argv)
101{
102 config_logformat_t *format;
103 config_logformat_field_t *field;
104
105 if (argc != 4)
106 return APR_EINVAL;
107
108 format = apr_hash_get(cfg->log_formats, argv[1], APR_HASH_KEY_STRING);
109 if (!format) {
110 format = apr_palloc(cfg->pool, sizeof(config_logformat_t));
111 format->name = apr_pstrdup(cfg->pool, argv[1]);
112 format->fields = apr_array_make(cfg->pool, 5,
113 sizeof(config_logformat_field_t));
114 apr_hash_set(cfg->log_formats, apr_pstrdup(cfg->pool,argv[1]), APR_HASH_KEY_STRING, format);
115 }
116 field = (config_logformat_field_t *)apr_array_push(format->fields);
117 field->name = apr_pstrdup(cfg->pool, argv[2]);
118 field->datatype = apr_pstrdup(cfg->pool, argv[3]);
119 return APR_SUCCESS;
120}
121
122static apr_status_t config_set_output_field(config_t *cfg, config_opt_t *opt,
123 int argc, const char **argv)
124{
125 config_output_field_t *field;
126 char *type, *size, *temp;
127
128 if (argc < 5)
129 return APR_EINVAL;
130 field = (config_output_field_t *)apr_array_push(cfg->output_fields);
131 field->field = apr_pstrdup(cfg->pool, argv[1]);
132 field->source = apr_pstrdup(cfg->pool, argv[4]);
133 field->def = apr_pstrdup(cfg->pool, argv[3]);
134 type = size = apr_pstrdup(cfg->pool, argv[2]);
135 while (*size!='\0' && *size!='(')
136 size++;
137 if (*size == '(') {
138 *size = '\0';
139 size++;
140 temp = size;
141 while (*temp != '\0' && *temp != ')')
142 temp++;
143 *temp = '\0';
144 field->size = apr_atoi64(size);
145 }
146 if (strcasecmp("VARCHAR", type)==0) {
147 field->datatype = LOGSQL_DATATYPE_VARCHAR;
148 } else if (strcasecmp("INT", type)==0) {
149 field->datatype = LOGSQL_DATATYPE_INT;
150 } else if (strcasecmp("CHAR", type)==0) {
151 field->datatype = LOGSQL_DATATYPE_CHAR;
152 } else if (strcasecmp("SMALLINT", type)==0) {
153 field->datatype = LOGSQL_DATATYPE_SMALLINT;
154 } else if (strcasecmp("BIGINT", type)==0) {
155 field->datatype = LOGSQL_DATATYPE_BIGINT;
156 } else {
157 return APR_EINVAL;
158 }
159
160 // Has a function
161 if (argc > 5) {
162 int i;
163 field->fname = apr_pstrdup(cfg->pool, argv[5]);
164 field->func = parser_get_func(field->fname);
165 field->args = apr_pcalloc(cfg->pool, sizeof(char *) * (argc-5+1));
166 for (i=6; i<=argc; i++) {
167 field->args[i-6] = apr_pstrdup(cfg->pool, argv[i]);
168 }
169 }
170
171 return APR_SUCCESS;
172}
173
174static apr_status_t config_set_filter(config_t *cfg, config_opt_t *opt,
175 int argc, const char **argv)
176{
177 int argn = 1;
178 config_filter_t *filter;
179 switch (opt->name[1]) {
180 case 'i': //line
181 filter = apr_array_push(cfg->linefilters);
182 break;
183 case 'r': //pre
184 filter = apr_array_push(cfg->prefilters);
185 break;
186 case 'o': //post
187 filter = apr_array_push(cfg->postfilters);
188 break;
189 }
190
191 if (opt->name[0]=='P') { // Pre or post 2-3 args
192 if (argc == 1)
193 return APR_EINVAL;
194 filter->field = apr_pstrdup(cfg->pool, argv[1]);
195 argn++;
196 } // Otherwise Line based only 1-2 args (no field)
197 if (argc <= argn)
198 return APR_EINVAL;
199 if (*argv[argn] == '+')
200 argn++;
201 if (*argv[argn] == '-') {
202 filter->negative = 1;
203 argn++;
204 }
205 if (filter->negative && argc == argn) {
206 // if no filter for negative.. that's ok.. Assume ALL
207 return APR_SUCCESS;
208 }
209 if (argc <= argn)
210 return APR_EINVAL;
211 filter->filter = apr_pstrdup(cfg->pool, argv[argn]);
212 filter->regex = ap_pregcomp(cfg->pool, filter->filter, AP_REG_EXTENDED|AP_REG_ICASE);
213 return APR_SUCCESS;
214}
215
216void config_dump(config_t *cfg)
217{
218 apr_hash_index_t *hi;
219 int i;
220 config_output_field_t *fields;
221 config_filter_t *filters;
222
223 printf("ErrorLog: %s\n", cfg->errorlog);
224 printf("LogLevel: %d\n", cfg->loglevel);
225
226 printf("BadLineFile: %s\n", cfg->badlinefile);
227 printf("BadLineMax: %d\n", cfg->badlinemax);
228
229 printf("InputDir: %s\n", cfg->input_dir);
230
231 printf("Split input files: %d\n", cfg->split_enabled);
232 printf("Split output directory: %s\n", cfg->split_dir);
233 printf("Split file count: %d\n", cfg->split_count);
234 printf("Split min lines: %'d\n", cfg->split_minimum);
235 printf("Split max lines: %'d\n", cfg->split_maximum);
236
237 printf("DB Driver: %s\n", cfg->dbdriver);
238 printf("DB Params: %s\n", cfg->dbparams);
239
240 printf("Table: %s\n", cfg->table);
241 printf("Transactions: %d\n", cfg->transactions);
242 printf("MachineID: %s\n", cfg->machineid);
243
244 printf("Log formats:\n");
245 for (hi = apr_hash_first(cfg->pool, cfg->log_formats); hi; hi
246 = apr_hash_next(hi)) {
247 config_logformat_t *format;
248 config_logformat_field_t *fields;
249 int i;
250
251 apr_hash_this(hi, NULL, NULL, (void **)&format);
252 printf(">> '%s'\n", format->name);
253 fields = (config_logformat_field_t *)format->fields->elts;
254 for (i=0; i<format->fields->nelts; i++) {
255 printf(">>>> %s:%s\n", fields[i].name, fields[i].datatype);
256 }
257 }
258 printf("Log Format: '%s'\n", cfg->logformat);
259
260 printf("Output Fields:\n");
261 fields = (config_output_field_t *)cfg->output_fields->elts;
262 for (i=0; i<cfg->output_fields->nelts; i++) {
263 printf(">> %s %s(%d) DEFAULT '%s': %s", fields[i].field,
264 logsql_field_datatyeName(fields[i].datatype),
265 fields[i].size, fields[i].def, fields[i].source);
266 if (fields[i].func) {
267 printf(" :: %s(", fields[i].fname);
268 if (fields[i].args) {
269 int a = 0;
270 while (fields[i].args[a]) {
271 printf("%s,", fields[i].args[a]);
272 a++;
273 }
274 }
275 printf(")");
276 }
277 printf("\n");
278 }
279 printf("Filters:\n>> Line:\n");
280 filters = (config_filter_t *)cfg->linefilters->elts;
281 for (i=0; i<cfg->linefilters->nelts; i++) {
282 printf(">>>> %c \"%s\" (%pp)\n",filters[i].negative ? '-':'+',
283 filters[i].filter, filters[i].regex);
284 }
285 printf(">> Pre:\n");
286 filters = (config_filter_t *)cfg->prefilters->elts;
287 for (i=0; i<cfg->prefilters->nelts; i++) {
288 printf(">>>> %s %c \"%s\" (%pp)\n",
289 filters[i].field, filters[i].negative ? '-':'+',
290 filters[i].filter, filters[i].regex);
291 }
292 printf(">> Post:\n");
293 filters = (config_filter_t *)cfg->postfilters->elts;
294 for (i=0; i<cfg->postfilters->nelts; i++) {
295 printf(">>>> %s %c \"%s\" (%pp)\n",
296 filters[i].field, filters[i].negative ? '-':'+',
297 filters[i].filter, filters[i].regex);
298 }
299
300 printf("DryRun: %d\n", cfg->dryrun);
301 printf("Summary: %d\n", cfg->summary);
302}
303
304#define config_get_option(name) apr_hash_get(g_config_opts, name, APR_HASH_KEY_STRING)
305
306static void config_add_option(apr_pool_t *p, const char *const name,
307 const char *const help, config_func_t func, void *data)
308{
309 config_opt_t *opt;
310 if (!g_config_opts) {
311 g_config_opts = apr_hash_make(p);
312 }
313 opt = apr_palloc(p, sizeof(config_opt_t));
314 opt->name = name;
315 opt->help = help;
316 opt->func = func;
317 opt->data = data;
318 apr_hash_set(g_config_opts, lowerstr(p, name), APR_HASH_KEY_STRING, opt);
319}
320
321void config_init(apr_pool_t *p)
322{
323 config_add_option(p, "ErrorLog", "File to log errors", config_set_file,
324 (void *)APR_OFFSETOF(config_t, errorlog));
325 config_add_option(p, "LogLevel", "Set Log Level (error, warn, debug, quiet)",
326 config_set_loglevel, NULL);
327
328 config_add_option(p, "BadLineFile", "File to log bad log lines", config_set_file,
329 (void *)APR_OFFSETOF(config_t, badlinefile));
330 config_add_option(p, "BadLineMax", "Max number of bad lines before aborting",
331 config_set_int, (void *)APR_OFFSETOF(config_t, badlinemax));
332
333
334 config_add_option(p, "InputDirectory", "Directory to scan for log files",
335 config_set_file, (void *)APR_OFFSETOF(config_t, input_dir));
336 config_add_option(p, "InputFile", "Parse only this file",
337 config_set_inputfile, NULL);
338
339 config_add_option(p, "SplitInput",
340 "Split the file into pieces, then process",
341 config_set_flag, (void *)APR_OFFSETOF(config_t, split_enabled));
342 config_add_option(p, "SplitCount",
343 "Split the file into N number of pieces",
344 config_set_int, (void *)APR_OFFSETOF(config_t, split_count));
345 config_add_option(p, "SplitMinLines",
346 "Each split piece will have a minumum of N lines",
347 config_set_int, (void *)APR_OFFSETOF(config_t, split_minimum));
348 config_add_option(p, "SplitMaxLines",
349 "Each split piece will have a maximum of N lines",
350 config_set_int, (void *)APR_OFFSETOF(config_t, split_maximum));
351 config_add_option(p, "SplitDirectory",
352 "Output directory to put intermediate split files",
353 config_set_file, (void *)APR_OFFSETOF(config_t, split_dir));
354
355 config_add_option(p, "ThreadCount",
356 "Numer of threads to use for processing the input files",
357 config_set_int, (void *)APR_OFFSETOF(config_t, thread_count));
358
359 config_add_option(p, "DBDDriver", "DBD Driver to use",
360 config_set_string, (void *)APR_OFFSETOF(config_t, dbdriver));
361 config_add_option(p, "DBDParams", "DBD Connection Parameters",
362 config_set_string, (void *)APR_OFFSETOF(config_t, dbparams));
363 config_add_option(p, "Table", "Table to import the log to",
364 config_set_string, (void *)APR_OFFSETOF(config_t, table));
365 config_add_option(p, "UseTransactions", "Enable Transactions?",
366 config_set_flag, (void *)APR_OFFSETOF(config_t, transactions));
367 config_add_option(p, "MachineID", "Machine ID to set",
368 config_set_string, (void *)APR_OFFSETOF(config_t, machineid));
369
370 config_add_option(p, "LogFormatConfig", "Define input log formats",
371 config_set_logformat, NULL);
372 config_add_option(p, "LogFormat", "Use this logformat when parsing files",
373 config_set_string, (void *)APR_OFFSETOF(config_t, logformat));
374
375 config_add_option(p, "LineFilter",
376 "A regular expression to apply to the input line",
377 config_set_filter, (void *)APR_OFFSETOF(config_t, linefilters));
378 config_add_option(p, "PreFilter",
379 "A regular expression to apply to a specific input field",
380 config_set_filter, (void *)APR_OFFSETOF(config_t, prefilters));
381 config_add_option(p, "PostFilter",
382 "A regular expression to apply to a specific SQL output field",
383 config_set_filter, (void *)APR_OFFSETOF(config_t, postfilters));
384
385 config_add_option(p, "OutputField",
386 "Define output fields: field datatype source optfunc optarg...",
387 config_set_output_field, NULL);
388
389 config_add_option(p, "DryRun", "Don't perform any actual database changes",
390 config_set_flag, (void *)APR_OFFSETOF(config_t, dryrun));
391 config_add_option(p, "Dump", "Dump Configuration and quit",
392 config_set_flag, (void *)APR_OFFSETOF(config_t, dump));
393 config_add_option(p, "Config", "Dummy to handle config directive",
394 config_set_dummy, NULL);
395 config_add_option(p, "Summary", "Show the summary before exit?",
396 config_set_flag, (void *)APR_OFFSETOF(config_t, summary));
397}
398
399config_t *config_create(apr_pool_t *p)
400{
401 config_t *cfg;
402 apr_pool_t *sp;
403 apr_pool_create(&sp, p);
404 cfg = apr_pcalloc(sp, sizeof(config_t));
405 cfg->pool = sp;
406 cfg->loglevel = LOGLEVEL_ERROR;
407 cfg->summary = 1;
408 cfg->transactions = 1;
409 cfg->thread_count = 0; // default zero thread (aka non-threaded)
410 cfg->split_count = 4;
411 cfg->split_minimum = 10000;
412 cfg->split_maximum = 50000;
413 cfg->input_files = apr_array_make(cfg->pool, 2, sizeof(config_filestat_t));
414 cfg->log_formats = apr_hash_make(cfg->pool);
415 cfg->output_fields = apr_array_make(cfg->pool, 10,
416 sizeof(config_output_field_t));
417 cfg->linefilters = apr_array_make(cfg->pool, 2, sizeof(config_filter_t));
418 cfg->prefilters = apr_array_make(cfg->pool, 2, sizeof(config_filter_t));
419 cfg->postfilters = apr_array_make(cfg->pool, 2, sizeof(config_filter_t));
420 return cfg;
421}
422
423apr_status_t config_check(config_t *cfg)
424{
425 apr_status_t ret = APR_SUCCESS;
426 if (!cfg->dbdriver || !cfg->dbparams) {
427 logging_log(cfg, LOGLEVEL_NOISE, "CONFIG: Database configuration is missing");
428 ret = APR_EINVAL;
429 }
430 if (!cfg->table) {
431 logging_log(cfg, LOGLEVEL_NOISE, "CONFIG: No Log Table defined");
432 ret = APR_EINVAL;
433 }
434 if (apr_is_empty_array(cfg->output_fields)) {
435 logging_log(cfg, LOGLEVEL_NOISE, "CONFIG: No Output Fields Defined");
436 ret = APR_EINVAL;
437 }
438 if (apr_hash_count(cfg->log_formats)==0) {
439 logging_log(cfg, LOGLEVEL_NOISE, "CONFIG: No Input Log Formats Defined");
440 ret = APR_EINVAL;
441 }
442#if !defined(HAVE_APR_DBD_TRANSACTION_MODE_GET)
443 if (cfg->transactions) {
444 logging_log(cfg, LOGLEVEL_NOISE, "CONFIG: Disabling Transaction Support. Requires apr-util 1.3.0 or higher");
445 cfg->transactions = 0;
446 }
447#endif
448 return ret;
449}
450
451static int config_merge(void *rec, const char *key, const char *value)
452{
453 config_t *cfg = (config_t *)rec;
454
455 config_opt_t *opt= config_get_option(key);
456 if (opt) {
457 const char *args[] = {
458 key,
459 value };
460 opt->func(cfg, opt, 2, args);
461 } else {
462 logging_log(cfg, LOGLEVEL_NOISE, "Unhandled: %s\n", key);
463 }
464 return 1;
465}
466
467apr_status_t config_read(config_t *cfg, const char *filename,
468 apr_table_t *merge)
469{
470 apr_finfo_t finfo;
471 apr_file_t *file;
472 apr_status_t rv, ret= APR_SUCCESS;
473 apr_pool_t *tp, *targp;
474 config_opt_t *opt;
475 char buff[1024];
476 char *ptr;
477 char **targv;
478 int targc;
479 int line;
480
481 apr_pool_create(&tp, cfg->pool);
482 apr_pool_create(&targp, tp);
483
484 if (apr_stat(&finfo, filename, APR_FINFO_MIN, tp) != APR_SUCCESS) {
485 return APR_ENOENT;
486 }
487 rv = apr_file_open(&file, filename, APR_FOPEN_READ | APR_BUFFERED,
488 APR_OS_DEFAULT, tp);
489 if (rv != APR_SUCCESS)
490 return rv;
491
492 line = 0;
493 do {
494 rv = apr_file_gets(buff, 1024, file);
495 if (rv == APR_SUCCESS) { // we read data
496 line++;
497
498 // skip leading white space
499 for (ptr = buff; *ptr == ' ' || *ptr == '\t'; ptr++)
500 ;
501 line_chomp(ptr);
502
503 // skip comments
504 if (*ptr == '#')
505 continue;
506 if (*ptr == '\0')
507 continue;
508 apr_pool_clear(targp);
509 parser_tokenize_line(ptr, &targv, targp);
510 targc = 0;
511 while (targv[targc])
512 targc++;
513 opt = config_get_option(lowerstr(targp,targv[0]));
514 if (opt) {
515 rv = opt->func(cfg, opt, targc, (const char **)targv);
516 if (APR_STATUS_IS_EINVAL(rv)) {
517 logging_log(cfg, LOGLEVEL_NOISE,
518 "Config Error: Invalid Arguments for %s\n\t%s\n",
519 opt->name, opt->help);
520 ret = rv;
521 }
522 } else {
523 logging_log(cfg, LOGLEVEL_NOISE, "Unhandled: %s\n", targv[0]);
524 }
525 }
526 } while (rv == APR_SUCCESS);
527
528 // Apply merges
529 apr_table_do(config_merge, (void *)cfg, merge, NULL);
530
531 apr_file_close(file);
532 apr_pool_destroy(tp);
533 return ret;
534}
diff --git a/utility/config.h b/utility/config.h
new file mode 100644
index 0000000..a9bd1b5
--- /dev/null
+++ b/utility/config.h
@@ -0,0 +1,190 @@
1#ifndef CONFIG_H_
2#define CONFIG_H_
3
4#include "apr_tables.h"
5#include "apr_hash.h"
6#include "apr_file_io.h"
7#include "ap_pcre.h"
8
9typedef enum {
10 LOGLEVEL_NOISE = 0,
11 LOGLEVEL_NONE,
12 LOGLEVEL_ERROR,
13 LOGLEVEL_NOTICE,
14 LOGLEVEL_DEBUG,
15} loglevel_e;
16
17typedef struct config_dbd_t config_dbd_t;
18typedef struct config_t config_t;
19struct config_t {
20 /** the structures pool (to ease function arguments) */
21 apr_pool_t *pool;
22
23 /** error log file */
24 const char *errorlog;
25 /** log level */
26 loglevel_e loglevel;
27 /** error_log */
28 apr_file_t *errorlog_fp;
29 apr_file_t *errorlog_fperr;
30 apr_pool_t *errorlog_p;
31
32 const char *badlinefile;
33 const char *badlastfile;
34 apr_file_t *badline_fp;
35 int badline_count;
36 int badlinemax;
37
38
39 /** input directory of log files */
40 const char *input_dir;
41 /** list of files to scan */
42 apr_array_header_t *input_files;
43
44 /** split the input file before processing */
45 int split_enabled;
46 /** the number of files to split each input file into */
47 int split_count;
48 /** the minimum number of lines for each piece */
49 int split_minimum;
50 /** the maximum number of lines for each piece */
51 int split_maximum;
52 /** directory to put ouput split files */
53 const char *split_dir;
54
55 /** the number of threads to run the import in */
56 int thread_count;
57
58 /** db connection configuration */
59 const char *dbdriver;
60 const char *dbparams;
61
62 /** Logging table */
63 const char *table;
64 /** Use transactons */
65 int transactions;
66 /** Machine ID */
67 const char *machineid;
68
69 /** Log file formats */
70 apr_hash_t *log_formats;
71 /** format to use to parse files */
72 const char *logformat;
73
74 /** output fields */
75 apr_array_header_t *output_fields;
76
77 /** filter configuration */
78 apr_array_header_t *linefilters;
79 apr_array_header_t *prefilters;
80 apr_array_header_t *postfilters;
81
82 /** Dry Run */
83 int dryrun;
84 /** dump configuration only */
85 int dump;
86
87 /* Show the summary */
88 int summary;
89};
90
91typedef struct config_filestat_t config_filestat_t;
92struct config_filestat_t {
93 const char *fname;
94 apr_size_t linesparsed;
95 apr_size_t lineskipped;
96 apr_size_t linesbad;
97 const char *result;
98 apr_time_t start;
99 apr_time_t stop;
100};
101
102typedef struct config_logformat_t config_logformat_t;
103struct config_logformat_t {
104 const char *name;
105 apr_array_header_t *fields;
106};
107
108typedef struct config_logformat_field_t config_logformat_field_t;
109struct config_logformat_field_t {
110 const char *name;
111 const char *datatype;
112};
113
114typedef struct config_opt_t config_opt_t;
115typedef apr_status_t (*config_func_t)(config_t *cfg, config_opt_t *opt,
116 int argc, const char **argv);
117struct config_opt_t {
118 const char *name;
119 const char *help;
120 config_func_t func;
121 void *data;
122};
123
124typedef struct config_filter_t config_filter_t;
125struct config_filter_t {
126 const char *field;
127 const char *filter;
128 int negative;
129 ap_regex_t *regex;
130};
131
132typedef enum {
133 LOGSQL_DATATYPE_INT = 0,
134 LOGSQL_DATATYPE_SMALLINT,
135 LOGSQL_DATATYPE_VARCHAR,
136 LOGSQL_DATATYPE_CHAR,
137 LOGSQL_DATATYPE_BIGINT
138} logsql_field_datatype;
139#define logsql_field_datatyeName(x) \
140 (x == LOGSQL_DATATYPE_INT ? "INT" \
141 : (x == LOGSQL_DATATYPE_SMALLINT ? "SMALLINT" \
142 : (x == LOGSQL_DATATYPE_VARCHAR ? "VARCHAR" \
143 : (x == LOGSQL_DATATYPE_CHAR ? "CHAR" \
144 : (x == LOGSQL_DATATYPE_BIGINT ? "BIGINT" : "ERR")))))
145
146typedef struct config_output_field_t config_output_field_t;
147
148typedef struct parser_func_t parser_func_t;
149
150struct config_output_field_t {
151 const char *field;
152 logsql_field_datatype datatype;
153 apr_size_t size;
154 const char *def;
155 const char *source;
156 const char *fname;
157 parser_func_t *func;
158 const char **args;
159 void *data;
160};
161
162#define CHECK_YESNO(c) ((!strcasecmp(c,"on") || !strcasecmp(c,"yes")) ? 1 : 0)
163
164/**
165 * Initialize the config parser
166 */
167void config_init(apr_pool_t *p);
168
169/**
170 * Dump the configuration to stdout
171 */
172void config_dump(config_t *cfg);
173
174/**
175 * Checks the configuration to ensure all the required settings are set
176 */
177apr_status_t config_check(config_t *cfg);
178
179/**
180 * Creates the default configuration
181 */
182config_t *config_create(apr_pool_t *p);
183
184/**
185 * Read in a configuration file
186 */
187apr_status_t config_read(config_t *cfg, const char *filename,
188 apr_table_t *merge);
189
190#endif /*CONFIG_H_*/
diff --git a/utility/database.c b/utility/database.c
new file mode 100644
index 0000000..ff81caa
--- /dev/null
+++ b/utility/database.c
@@ -0,0 +1,212 @@
1#include "database.h"
2#include "apu.h"
3#include "apr_dbd.h"
4#include "apr_strings.h"
5
6#include "util.h"
7#include "autoconfig.h"
8
9struct config_dbd_t {
10 const apr_dbd_driver_t *driver;
11 apr_dbd_t *dbd;
12 apr_dbd_prepared_t *stmt;
13 apr_dbd_transaction_t *txn;
14 const char **args;
15};
16
17void database_init(apr_pool_t *p)
18{
19 apr_dbd_init(p);
20}
21
22/** @todo split this into load and connect */
23apr_status_t database_connect(config_t *cfg, config_dbd_t **dbconn)
24{
25 apr_status_t rv;
26 if (!cfg->dbdriver || !cfg->dbparams)
27 return APR_EINVAL;
28 if (!*dbconn) {
29 *dbconn = apr_pcalloc(cfg->pool, sizeof(config_dbd_t));
30 }
31 rv = apr_dbd_get_driver(cfg->pool, cfg->dbdriver, &((*dbconn)->driver));
32 if (rv) {
33
34 logging_log(cfg, LOGLEVEL_ERROR,
35 "DB: Could not load database driver %s. Error %s",
36 cfg->dbdriver, logging_strerror(rv));
37 return rv;
38 }
39
40 rv = apr_dbd_open((*dbconn)->driver, cfg->pool, cfg->dbparams,
41 &((*dbconn)->dbd));
42 if (rv) {
43 logging_log(cfg, LOGLEVEL_ERROR,
44 "DB: Could not connect to database. Error (%d)%s", rv,
45 logging_strerror(rv));
46 return rv;
47 }
48
49 return APR_SUCCESS;
50}
51
52apr_status_t database_disconnect(config_dbd_t *dbconn)
53{
54 return apr_dbd_close(dbconn->driver, dbconn->dbd);
55}
56
57static apr_dbd_prepared_t *database_prepare_insert(config_t *cfg,
58 config_dbd_t *dbconn, apr_pool_t *p)
59{
60 apr_status_t rv;
61 char *sql;
62 int i, f;
63 struct iovec *vec;
64 apr_dbd_prepared_t *stmt= NULL;
65 int nfs = cfg->output_fields->nelts;
66 config_output_field_t *ofields;
67
68 ofields = (config_output_field_t *)cfg->output_fields->elts;
69
70 vec = apr_palloc(p, (nfs*2 + 5) * sizeof(struct iovec));
71 sql = apr_palloc(p, (nfs*3));
72
73 vec[0].iov_base = "INSERT INTO ";
74 vec[0].iov_len = 12;
75 vec[1].iov_base = (void *)cfg->table;
76 vec[1].iov_len = strlen(cfg->table);
77 vec[2].iov_base = " (";
78 vec[2].iov_len = 2;
79 for (i=3, f=0; f<nfs; f++, i+=2) {
80 vec[i].iov_base = (void *)ofields[f].field;
81 vec[i].iov_len = strlen(vec[i].iov_base);
82 vec[i+1].iov_base = ",";
83 vec[i+1].iov_len = 1;
84 memcpy(&sql[f*3], "%s,", 3);
85 }
86 sql[nfs*3-1] = '\0';
87 vec[i-1].iov_base = ") VALUES (";
88 vec[i-1].iov_len = 10;
89 vec[i].iov_base = sql;
90 vec[i].iov_len = nfs*3-1;
91 vec[i+1].iov_base = ")";
92 vec[i+1].iov_len = 1;
93
94 sql = apr_pstrcatv(p, vec, i+2, NULL);
95
96 logging_log(cfg, LOGLEVEL_DEBUG, "DB: Generated SQL: %s", sql);
97
98 rv = apr_dbd_prepare(dbconn->driver, cfg->pool, dbconn->dbd, sql,
99 "INSERT", &stmt);
100
101 if (rv) {
102 logging_log(cfg, LOGLEVEL_NOISE,
103 "DB: Unable to Prepare SQL insert: %s", apr_dbd_error(
104 dbconn->driver, dbconn->dbd, rv));
105 return NULL;
106 }
107 return stmt;
108}
109
110apr_status_t database_insert(config_t *cfg, config_dbd_t *dbconn,
111 apr_pool_t *p, apr_table_t *data)
112{
113 apr_status_t rv;
114 int f, nfs;
115 config_output_field_t *ofields;
116 ofields = (config_output_field_t *)cfg->output_fields->elts;
117 nfs = cfg->output_fields->nelts;
118 // Prepare statement
119 if (!dbconn->stmt) {
120 dbconn->stmt = database_prepare_insert(cfg, dbconn, p);
121 if (!dbconn->stmt) {
122 return APR_EINVAL;
123 }
124 dbconn->args = apr_palloc(cfg->pool, nfs * sizeof(char *));
125 }
126 for (f=0; f<nfs; f++) {
127 dbconn->args[f] = apr_table_get(data, ofields[f].field);
128 }
129 rv = apr_dbd_pquery(dbconn->driver, p, dbconn->dbd, &f,
130 dbconn->stmt, nfs, dbconn->args);
131 if (rv) {
132 logging_log(cfg, LOGLEVEL_ERROR, "DB: Unable to Insert SQL: %s",
133 apr_dbd_error(dbconn->driver, dbconn->dbd, rv));
134 return rv;
135 }
136 return APR_SUCCESS;
137}
138
139apr_status_t database_trans_start(config_t *cfg, config_dbd_t *dbconn,
140 apr_pool_t *p)
141{
142#if HAVE_APR_DBD_TRANSACTION_MODE_GET
143 apr_status_t rv;
144 if (!cfg->transactions)
145 return APR_SUCCESS;
146 if (dbconn->txn) {
147 logging_log(cfg, LOGLEVEL_NOISE,
148 "Transaction Already Started. Something is BROKE");
149 return APR_EINVAL;
150 }
151 logging_log(cfg, LOGLEVEL_DEBUG, "DB: Starting Transaction");
152 rv = apr_dbd_transaction_start(dbconn->driver, p, dbconn->dbd,
153 &dbconn->txn);
154 if (rv)
155 logging_log(cfg, LOGLEVEL_NOISE,
156 "DB: Error Starting Transaction: (%d)%s", rv, apr_dbd_error(
157 dbconn->driver, dbconn->dbd, rv));
158 return rv;
159#else
160 return APR_SUCCESS;
161#endif
162}
163
164apr_status_t database_trans_stop(config_t *cfg, config_dbd_t *dbconn,
165 apr_pool_t *p)
166{
167#if HAVE_APR_DBD_TRANSACTION_MODE_GET
168 apr_status_t rv;
169 if (!cfg->transactions)
170 return APR_SUCCESS;
171 if (!dbconn->txn) {
172 logging_log(cfg, LOGLEVEL_NOISE,
173 "No Transaction Started. Something is BROKE");
174 return APR_EINVAL;
175 }
176 logging_log(cfg, LOGLEVEL_DEBUG, "DB: Stopping Transaction");
177 rv = apr_dbd_transaction_end(dbconn->driver, p, dbconn->txn);
178 if (rv)
179 logging_log(cfg, LOGLEVEL_NOISE,
180 "DB: Error Stopping Transaction: (%d)%s", rv, apr_dbd_error(
181 dbconn->driver, dbconn->dbd, rv));
182
183 dbconn->txn = NULL;
184 return rv;
185#else
186 return APR_SUCCESS;
187#endif
188}
189
190apr_status_t database_trans_abort(config_t *cfg, config_dbd_t *dbconn)
191{
192#if HAVE_APR_DBD_TRANSACTION_MODE_GET
193 apr_status_t rv;
194 if (!cfg->transactions)
195 return APR_SUCCESS;
196 if (!dbconn->txn) {
197 logging_log(cfg, LOGLEVEL_NOISE,
198 "No Transaction Started. Something is BROKE");
199 return APR_EINVAL;
200 }
201 logging_log(cfg, LOGLEVEL_NOTICE, "DB: Aborting Transaction");
202 rv = apr_dbd_transaction_mode_set(dbconn->driver, dbconn->txn,
203 APR_DBD_TRANSACTION_ROLLBACK);
204 if (rv)
205 logging_log(cfg, LOGLEVEL_NOISE,
206 "DB: Error Aborting Transaction: (%d)%s", rv, apr_dbd_error(
207 dbconn->driver, dbconn->dbd, rv));
208 return rv;
209#else
210 return APR_SUCCESS;
211#endif
212}
diff --git a/utility/database.h b/utility/database.h
new file mode 100644
index 0000000..9797d51
--- /dev/null
+++ b/utility/database.h
@@ -0,0 +1,25 @@
1#ifndef DATABASE_H_
2#define DATABASE_H_
3
4#include "apr_pools.h"
5
6#include "config.h"
7
8void database_init(apr_pool_t *p);
9
10apr_status_t database_connect(config_t *cfg, config_dbd_t **dbconn);
11
12apr_status_t database_disconnect(config_dbd_t *dbconn);
13
14apr_status_t database_insert(config_t *cfg, config_dbd_t *dbconn,
15 apr_pool_t *p, apr_table_t *data);
16
17apr_status_t database_trans_start(config_t *cfg, config_dbd_t *dbconn,
18 apr_pool_t *p);
19
20apr_status_t database_trans_stop(config_t *cfg, config_dbd_t *dbconn,
21 apr_pool_t *p);
22
23apr_status_t database_trans_abort(config_t *cfg, config_dbd_t *dbconn);
24
25#endif /*DATABASE_H_*/
diff --git a/utility/logparse.c b/utility/logparse.c
new file mode 100644
index 0000000..1b3cc97
--- /dev/null
+++ b/utility/logparse.c
@@ -0,0 +1,768 @@
1#include "logparse.h"
2#include "apr_file_info.h"
3#include "apr_file_io.h"
4#include "apr_strings.h"
5#include "apr_time.h"
6
7#include "time.h"
8#include "stdlib.h"
9
10#include "util.h"
11#include "ap_pcre.h"
12#include "database.h"
13
14apr_hash_t *g_parser_funcs;
15void **g_parser_linedata;
16
17static apr_status_t parser_func_wrap(apr_pool_t *p, config_t *cfg,
18 config_output_field_t *field, const char *value, const char **ret)
19{
20 if (field->args[0] && field->args[1]) {
21 struct iovec vec[3];
22 apr_size_t len;
23
24 vec[0].iov_base = (void *)field->args[0];
25 vec[0].iov_len = strlen(field->args[0]);
26 vec[1].iov_base = (void *)value;
27 vec[1].iov_len = strlen(value);
28 vec[2].iov_base = (void *)field->args[1];
29 vec[2].iov_len = strlen(field->args[1]);
30
31 *ret = apr_pstrcatv(p, vec, 3, &len);
32 } else {
33 logging_log(cfg, LOGLEVEL_NOISE, "wrap requires before and after strings");
34 return APR_EINVAL;
35 }
36 return APR_SUCCESS;
37}
38
39static apr_status_t parser_func_regexmatch(apr_pool_t *p, config_t *cfg,
40 config_output_field_t *field, const char *value, const char **ret)
41{
42 struct {
43 ap_regex_t *rx;
44 const char *substr;
45 }*_data;
46 ap_regmatch_t regm[AP_MAX_REG_MATCH];
47 // Check if a regular expression configured
48 if (!field->args[0])
49 return APR_EINVAL;
50 if (!field->data) {
51 // pre compile the regex
52 _data = apr_palloc(cfg->pool, sizeof(ap_regex_t)+sizeof(const char *));
53 _data->rx = ap_pregcomp(cfg->pool, field->args[0],
54 AP_REG_EXTENDED|AP_REG_ICASE);
55 if (field->args[1]) {
56 _data->substr = field->args[1];
57 } else {
58 _data->substr = "$1";
59 }
60 if (!_data->rx) {
61 logging_log(cfg, LOGLEVEL_NOISE, "Failed to compile regular expression");
62 return APR_EINVAL;
63 }
64 field->data = _data;
65 } else
66 _data = field->data;
67
68 if (!ap_regexec(_data->rx, value, AP_MAX_REG_MATCH, regm, 0)) {
69 *ret = ap_pregsub(p, _data->substr, value, AP_MAX_REG_MATCH, regm);
70 }
71 logging_log(cfg, LOGLEVEL_DEBUG, "REGEX: matched %s against %s to %s", value,
72 field->args[0], *ret);
73 return APR_SUCCESS;
74}
75
76static apr_status_t parser_func_totimestamp(apr_pool_t *p, config_t *cfg,
77 config_output_field_t *field, const char *value, const char **ret)
78{
79 time_t time;
80 struct tm ts;
81
82 //memset(&ts,0,sizeof(struct tm));
83
84 strptime(value, "%d/%b/%Y:%H:%M:%S %z", &ts);
85 time = mktime(&ts);
86
87 *ret = apr_itoa(p, time);
88 return APR_SUCCESS;
89}
90
91static apr_status_t parser_func_machineid(apr_pool_t *p, config_t *cfg,
92 config_output_field_t *field, const char *value, const char **ret)
93{
94 if (cfg->machineid) {
95 *ret = apr_pstrdup(p, cfg->machineid);
96 }
97 return APR_SUCCESS;
98}
99
100static apr_status_t parser_func_queryarg(apr_pool_t *p, config_t *cfg,
101 config_output_field_t *field, const char *value, const char **ret)
102{
103 apr_table_t *query = parser_get_linedata(field->func);
104
105 if (!field->args[0]) {
106 logging_log(cfg, LOGLEVEL_NOISE, "queryarg requires name of query arg");
107 return APR_EINVAL;
108 }
109
110 if (!query) {
111 char *query_beg;
112
113 query = apr_table_make(p,3);
114
115 query_beg = strchr(value, '?');
116 // if we have a query string, rip it apart
117 if (query_beg) {
118 char *key;
119 char *value;
120 const char *delim = "&";
121 char *query_string;
122 char *strtok_state;
123 char *query_end = strrchr(++query_beg,' ');
124
125 query_string = apr_pstrndup(p, query_beg, query_end-query_beg);
126 logging_log(cfg, LOGLEVEL_DEBUG, "QUERY: Found String %pp, %pp, %s",
127 query_beg, query_end, query_string);
128 if (field->args[1]) {
129 delim = field->args[1];
130 }
131 key = apr_strtok(query_string, delim, &strtok_state);
132 while (key) {
133 value = strchr(key, '=');
134 if (value) {
135 *value = '\0'; /* Split the string in two */
136 value++; /* Skip past the = */
137 }
138 else {
139 value = "1";
140 }
141 ap_unescape_url(key);
142 ap_unescape_url(value);
143 apr_table_set(query, key, value);
144
145 logging_log(cfg, LOGLEVEL_DEBUG,
146 "QUERY: Found arg: %s = %s", key, value);
147
148 key = apr_strtok(NULL, delim, &strtok_state);
149 }
150 }
151 parser_set_linedata(field->func,query);
152 }
153 *ret = apr_table_get(query, field->args[0]);
154 return APR_SUCCESS;
155}
156
157parser_func_t *parser_get_func(const char *name)
158{
159 return apr_hash_get(g_parser_funcs, name, APR_HASH_KEY_STRING);
160}
161
162static void parser_add_func(apr_pool_t *p, const char *const name,
163 parser_func_f func, int id)
164{
165 parser_func_t *s;
166 if (!g_parser_funcs) {
167 g_parser_funcs = apr_hash_make(p);
168 }
169 s = apr_palloc(p, sizeof(parser_func_t));
170 s->func = func;
171 s->pos = id;
172 s->data = NULL;
173 s->linedata = &g_parser_linedata;
174 apr_hash_set(g_parser_funcs, lowerstr(p, name), APR_HASH_KEY_STRING, s);
175}
176
177void parser_init(apr_pool_t *p)
178{
179 int i = 0;
180 parser_add_func(p, "regexmatch", parser_func_regexmatch, ++i);
181 parser_add_func(p, "totimestamp", parser_func_totimestamp, ++i);
182 parser_add_func(p, "machineid", parser_func_machineid, ++i);
183 parser_add_func(p, "queryarg", parser_func_queryarg, ++i);
184 parser_add_func(p, "wrap", parser_func_wrap, ++i);
185 g_parser_linedata = apr_pcalloc(p, sizeof(void *) * (i+1));
186 g_parser_linedata[0] = (void *)i;
187}
188
189void parser_find_logs(config_t *cfg)
190{
191 apr_pool_t *tp;
192 apr_dir_t *dir;
193 apr_finfo_t finfo;
194 config_filestat_t *newp;
195
196 logging_log(cfg, LOGLEVEL_NOTICE, "Find Log files");
197 if (!cfg->input_dir)
198 return;
199 apr_pool_create(&tp, cfg->pool);
200 if (apr_dir_open(&dir, cfg->input_dir, tp)==APR_SUCCESS) {
201 while (apr_dir_read(&finfo, APR_FINFO_NAME | APR_FINFO_TYPE, dir)
202 == APR_SUCCESS) {
203 char *temp;
204 if (finfo.filetype == APR_DIR)
205 continue;
206 newp = (config_filestat_t *)apr_array_push(cfg->input_files);
207 newp->result = "Not Parsed";
208 apr_filepath_merge(&temp, cfg->input_dir, finfo.name,
209 APR_FILEPATH_TRUENAME, cfg->pool);
210 newp->fname = temp;
211 }
212 apr_dir_close(dir);
213 }
214 apr_pool_destroy(tp);
215}
216
217#define BUFFER_SIZE (16 * 1024)
218
219void parser_split_logs(config_t *cfg)
220{
221 apr_pool_t *tp, *tfp;
222 apr_array_header_t *foundfiles;
223 config_filestat_t *filelist;
224 config_filestat_t *newfile;
225 apr_file_t *infile;
226 int f, l;
227 apr_status_t rv;
228 apr_finfo_t finfo;
229 char buff[BUFFER_SIZE];
230 int linecount;
231 int piecesize;
232
233 if (!cfg->split_enabled) return;
234 if (!cfg->split_dir) {
235 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Missing Split Output directory");
236 return;
237 }
238 apr_pool_create(&tp, cfg->pool);
239 apr_pool_create(&tfp, tp);
240
241 if (APR_SUCCESS != apr_stat(&finfo, cfg->split_dir, APR_FINFO_MIN, tp)) {
242 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Directory %s does not exist", cfg->split_dir);
243 return;
244 }
245 foundfiles = apr_array_copy(tp, cfg->input_files);
246 apr_array_clear(cfg->input_files);
247
248 filelist = (config_filestat_t *)foundfiles->elts;
249 for (f=0, l=foundfiles->nelts; f < l; f++) {
250 apr_pool_clear(tfp);
251 logging_log(cfg, LOGLEVEL_NOTICE, "SPLITTER: Begin Splitting Log File '%s'", filelist[f].fname);
252 rv = apr_file_open(&infile, filelist[f].fname, APR_FOPEN_READ, APR_OS_DEFAULT, tfp);
253
254 if (rv != APR_SUCCESS) {
255 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Could not open %s", filelist[f].fname);
256 return;
257 }
258 linecount = 0;
259 while (apr_file_eof(infile) == APR_SUCCESS) {
260 apr_size_t read = BUFFER_SIZE;
261 char *p;
262 apr_file_read(infile, buff, &read);
263 p = buff;
264 while ((p = memchr(p, '\n', (buff + read) - p))) {
265 ++p;
266 ++linecount;
267 }
268 }
269 // now we know how long it is. Lets split up the file
270 piecesize = linecount / cfg->split_count;
271 if (piecesize < cfg->split_minimum)
272 piecesize = cfg->split_minimum;
273 if (piecesize > cfg->split_maximum && cfg->split_maximum > 0)
274 piecesize = cfg->split_maximum;
275 if (piecesize > linecount) {
276 // File is smaller than piece size just add it back in as is
277 newfile = (config_filestat_t *)apr_array_push(cfg->input_files);
278 newfile->result = "Not Parsed";
279 newfile->fname = filelist[f].fname;
280 } else {
281 //split apart the files
282 int cur_line = 0;
283 int file_count = 1;
284 int out_lines = 0;
285 const char *basefile, *file;
286 apr_file_t *outfile;
287 char trail[2048];
288 apr_size_t trail_size = 0;
289 apr_size_t write;
290 apr_off_t off = 0;
291
292 apr_file_seek(infile, APR_SET, &off);
293
294 basefile = apr_pstrdup(tfp, basename(apr_pstrdup(tfp, filelist[f].fname)));
295
296 file = apr_psprintf(tfp, "%s/%s-%d", cfg->split_dir, basefile, file_count++);
297 logging_log(cfg, LOGLEVEL_NOTICE, "SPLITTER: Creating output file %s", file);
298 rv = apr_file_open(&outfile, file, APR_FOPEN_WRITE | APR_FOPEN_CREATE | APR_FOPEN_TRUNCATE, APR_OS_DEFAULT, tfp);
299 if (rv != APR_SUCCESS) {
300 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Could not open %s (%d)", file, rv);
301 return;
302 }
303 newfile = (config_filestat_t *)apr_array_push(cfg->input_files);
304 newfile->result = "Not Parsed";
305 newfile->fname = apr_pstrdup(cfg->pool, file);
306
307 while (apr_file_eof(infile) == APR_SUCCESS) {
308 apr_size_t read = BUFFER_SIZE;
309 char *p, *pp, *buff_start;
310 apr_file_read(infile, buff, &read);
311 buff_start = p = pp = buff;
312 if (trail_size) {
313 p = memchr(p, '\n', (buff + read) - p);
314 if (p) {
315 //printf("Trail Line: %p, %p, %d\n", pp, p, (p - pp) + trail_size);
316 ++p;
317 pp = p;
318 ++cur_line;
319 ++out_lines;
320 // write out to file
321 apr_file_write(outfile, trail, &trail_size);
322 trail_size = 0;
323 } else {
324 if ((read + trail_size) > 2048) {
325 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Excessively long line %d in file %s", cur_line, filelist[f].fname);
326 exit(1);
327 } else {
328 memcpy(trail+trail_size, buff, read);
329 trail_size += read;
330 }
331 }
332 }
333 while ((p = memchr(p, '\n', (buff + read) - p))) {
334 //printf("Line: %p, %p, %d\n", pp, p, (p - pp));
335 if (out_lines == piecesize) {
336 // Write out to file
337 write = pp - buff_start;
338 apr_file_write(outfile, buff_start, &write);
339 buff_start = pp;
340 out_lines = 0;
341 // Open new file
342 file = apr_psprintf(tfp, "%s/%s-%d", cfg->split_dir, basefile, file_count++);
343 logging_log(cfg, LOGLEVEL_NOTICE, "SPLITTER: Creating output file %s", file);
344 rv = apr_file_open(&outfile, file, APR_FOPEN_WRITE | APR_FOPEN_CREATE | APR_FOPEN_TRUNCATE, APR_OS_DEFAULT, tfp);
345 if (rv != APR_SUCCESS) {
346 logging_log(cfg, LOGLEVEL_NOISE, "SPLITTER: Could not open %s (%d)", file, rv);
347 return;
348 }
349 newfile = (config_filestat_t *)apr_array_push(cfg->input_files);
350 newfile->result = "Not Parsed";
351 newfile->fname = apr_pstrdup(cfg->pool, file);
352 }
353 ++p;
354 pp = p;
355 ++cur_line;
356 ++out_lines;
357 }
358 // Write out to file
359 write = pp - buff_start;
360 apr_file_write(outfile, buff_start, &write);
361
362 trail_size = (buff+read) - pp;
363 if (trail_size) {
364 memcpy(trail, pp, trail_size);
365 }
366 }
367 }
368 }
369 apr_pool_destroy(tfp);
370 apr_pool_destroy(tp);
371}
372
373apr_status_t parser_logbadline(config_t *cfg, const char *filename,
374 const char *badline)
375{
376 apr_status_t rv = APR_SUCCESS;
377 apr_size_t len;
378 struct iovec vec[5];
379
380 if (cfg->badlinefile) {
381 if (!cfg->badline_fp) {
382 rv = apr_file_open(&cfg->badline_fp, cfg->badlinefile,
383 APR_FOPEN_CREATE | APR_FOPEN_WRITE | APR_FOPEN_APPEND,
384 APR_OS_DEFAULT, cfg->pool);
385 if (rv) {
386 logging_log(cfg, LOGLEVEL_NOISE,
387 "Error opening badline file %s\n", cfg->badlinefile);
388 cfg->badlinefile = NULL;
389 }
390 }
391 if (!rv) {
392 if (filename != cfg->badlastfile){
393 char date[APR_RFC822_DATE_LEN];
394 vec[0].iov_base = "Starting BadLines for \"";
395 vec[0].iov_len = sizeof("Starting BadLines for \"")-1;
396 vec[1].iov_base = (void *)filename;
397 vec[1].iov_len = strlen(filename);
398 vec[2].iov_base = "\" on ";
399 vec[2].iov_len = sizeof("\" on ")-1;
400 apr_rfc822_date(date, apr_time_now());
401 vec[3].iov_base = date;
402 vec[3].iov_len = APR_RFC822_DATE_LEN-1;
403 vec[4].iov_base = "\n";
404 vec[4].iov_len = 1;
405 apr_file_writev(cfg->badline_fp, vec,5, &len);
406 cfg->badlastfile = filename;
407 }
408
409 if ((++cfg->badline_count) > cfg->badlinemax) {
410 logging_log(cfg, LOGLEVEL_NOISE,
411 "Found more than %d bad lines (found %d)",
412 cfg->badlinemax, cfg->badline_count);
413 rv = APR_EINVAL;
414 } else {
415 vec[0].iov_base = (void *)badline;
416 vec[0].iov_len = strlen(badline);
417 vec[1].iov_base = "\n";
418 vec[1].iov_len = 1;
419 apr_file_writev(cfg->badline_fp, vec,2, &len);
420 }
421 }
422 }
423 return rv;
424}
425
426/*
427 * Modified version of apr_tokenize_to_argv to add [] as quoting characters
428 *
429 * token_context: Context from which pool allocations will occur.
430 * arg_str: Input string for conversion to argv[].
431 * argv_out: Output location. This is a pointer to an array
432 * of pointers to strings (ie. &(char *argv[]).
433 * This value will be allocated from the contexts
434 * pool and filled in with copies of the tokens
435 * found during parsing of the arg_str.
436 */
437apr_status_t parser_tokenize_line(const char *arg_str, char ***argv_out,
438 apr_pool_t *token_context)
439{
440 const char *cp;
441 const char *ct;
442 char *cleaned, *dirty;
443 int escaped;
444 int isquoted, numargs = 0, argnum;
445
446#define SKIP_WHITESPACE(cp) \
447 for ( ; *cp == ' ' || *cp == '\t'; ) { \
448 cp++; \
449 };
450
451#define CHECK_QUOTATION(cp,isquoted) \
452 isquoted = 0; \
453 if (*cp == '"') { \
454 isquoted = 1; \
455 cp++; \
456 } \
457 else if (*cp == '\'') { \
458 isquoted = 2; \
459 cp++; \
460 } \
461 else if (*cp == '[') { \
462 isquoted = 3; \
463 cp++; \
464 }
465
466 /* DETERMINE_NEXTSTRING:
467 * At exit, cp will point to one of the following: NULL, SPACE, TAB or QUOTE.
468 * NULL implies the argument string has been fully traversed.
469 */
470#define DETERMINE_NEXTSTRING(cp,isquoted) \
471 for ( ; *cp != '\0'; cp++) { \
472 if ( (*cp == '\\' && (*(cp+1) == ' ' || *(cp+1) == '\t' || \
473 *(cp+1) == '"' || *(cp+1) == '\'' || \
474 *(cp+1) == '[' || *(cp+1) == ']'))) { \
475 cp++; \
476 continue; \
477 } \
478 if ( (!isquoted && (*cp == ' ' || *cp == '\t')) \
479 || (isquoted == 1 && *cp == '"') \
480 || (isquoted == 2 && *cp == '\'') \
481 || (isquoted == 3 && *cp == ']') \
482 ) { \
483 break; \
484 } \
485 }
486
487 /* REMOVE_ESCAPE_CHARS:
488 * Compresses the arg string to remove all of the '\' escape chars.
489 * The final argv strings should not have any extra escape chars in it.
490 */
491#define REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped) \
492 escaped = 0; \
493 while(*dirty) { \
494 if (!escaped && *dirty == '\\') { \
495 escaped = 1; \
496 } \
497 else { \
498 escaped = 0; \
499 *cleaned++ = *dirty; \
500 } \
501 ++dirty; \
502 } \
503 *cleaned = 0; /* last line of macro... */
504
505 cp = arg_str;
506 SKIP_WHITESPACE(cp);
507 ct = cp;
508
509 /* This is ugly and expensive, but if anyone wants to figure a
510 * way to support any number of args without counting and
511 * allocating, please go ahead and change the code.
512 *
513 * Must account for the trailing NULL arg.
514 */
515 numargs = 1;
516 while (*ct != '\0') {
517 CHECK_QUOTATION(ct, isquoted)
518 ;
519 DETERMINE_NEXTSTRING(ct, isquoted);
520 if (*ct != '\0') {
521 ct++;
522 }
523 numargs++;
524 SKIP_WHITESPACE(ct);
525 }
526 *argv_out = apr_palloc(token_context, numargs * sizeof(char*));
527
528 /* determine first argument */
529 for (argnum = 0; argnum < (numargs-1); argnum++) {
530 SKIP_WHITESPACE(cp);
531 CHECK_QUOTATION(cp, isquoted)
532 ;
533 ct = cp;
534 DETERMINE_NEXTSTRING(cp, isquoted);
535 cp++;
536 (*argv_out)[argnum] = apr_palloc(token_context, cp - ct);
537 apr_cpystrn((*argv_out)[argnum], ct, cp - ct);
538 cleaned = dirty = (*argv_out)[argnum];
539 REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped)
540 ;
541 }
542 (*argv_out)[argnum] = NULL;
543
544 return APR_SUCCESS;
545}
546
547apr_status_t parser_parsefile(config_t *cfg, config_dbd_t *dbconn,
548 config_filestat_t *fstat)
549{
550 apr_pool_t *tp, *targp;
551 apr_file_t *file;
552 apr_status_t rv;
553 char buff[2048];
554 char readbuff[BUFFER_SIZE];
555 char **targv;
556 int targc;
557
558 apr_pool_create(&tp, cfg->pool);
559 apr_pool_create(&targp, tp);
560
561 logging_log(cfg, LOGLEVEL_NOTICE, "PARSER: Begin Parsing Log File '%s'", fstat->fname);
562
563 rv = apr_file_open(&file, fstat->fname, APR_FOPEN_READ, APR_OS_DEFAULT, tp);
564 apr_file_buffer_set(file, readbuff, BUFFER_SIZE);
565 if (rv != APR_SUCCESS) {
566 logging_log(cfg, LOGLEVEL_NOISE, "PARSER: Could not open %s", fstat->fname);
567 return rv;
568 }
569
570 fstat->linesparsed = 0;
571 // Start Transaction
572 fstat->start = apr_time_now();
573 if (!cfg->dryrun && database_trans_start(cfg, dbconn, tp)) {
574 fstat->result = "Database Transaction Error";
575 fstat->stop = apr_time_now();
576 return rv;
577 }
578
579 do {
580 rv = apr_file_gets(buff, 2048, file);
581 if (rv == APR_SUCCESS) {
582 int i,m, cont = 0;
583 config_filter_t *filters;
584
585 fstat->linesparsed++;
586 // chomp off newline
587 line_chomp(buff);
588 // Run line filters
589 for (i=0, m=cfg->linefilters->nelts,
590 filters = (config_filter_t *)cfg->linefilters->elts;
591 i<m; i++) {
592 if (!filters[i].regex || ap_regexec(filters[i].regex, buff, 0, NULL,0)==0) {
593 if (filters[i].negative) {
594 logging_log(cfg, LOGLEVEL_DEBUG,
595 "PARSER: LINEFILTER: Skipping Line %d due to Filter (%d)%s",
596 fstat->linesparsed, i, filters[i].filter);
597 fstat->lineskipped++;
598 cont = 1;
599 } else {
600 logging_log(cfg, LOGLEVEL_DEBUG,
601 "PARSER: LINEFILTER: Force Parsing Line %d due to Filter (%d)%s",
602 fstat->linesparsed, i, filters[i].filter);
603 }
604 break;
605 }
606 }
607 if (cont) continue;
608
609 apr_pool_clear(targp);
610 parser_tokenize_line(buff, &targv, targp);
611 targc = 0;
612 while (targv[targc])
613 targc++;
614 rv = parser_processline(targp, cfg, dbconn, fstat, targv, targc);
615 if (rv != APR_SUCCESS) {
616 int i;
617
618 fstat->linesbad++;
619 rv = parser_logbadline(cfg, fstat->fname, buff);
620 if (rv) {
621 if (!cfg->dryrun) database_trans_abort(cfg, dbconn);
622 logging_log(cfg, LOGLEVEL_ERROR, "Line %d(%d): %s", fstat->linesparsed,
623 targc, buff);
624 for (i = 0; targv[i]; i++) {
625 logging_log(cfg, LOGLEVEL_ERROR, "Arg (%d): '%s'", i,
626 targv[i]);
627 }
628 }
629 }
630 } else {
631 rv = APR_SUCCESS;
632 break;
633 }
634 } while (rv == APR_SUCCESS);
635 apr_file_close(file);
636 // Finish Transaction
637 if (!cfg->dryrun && database_trans_stop(cfg, dbconn, tp)) {
638 fstat->result = apr_psprintf(cfg->pool,
639 "Input line %d, Database Transaction Error",
640 fstat->linesparsed);
641 }
642
643 apr_pool_destroy(tp);
644 logging_log(cfg, LOGLEVEL_NOTICE,
645 "PARSER: Finish Parsing Log File '%s'. Lines: (%d/%d)",
646 fstat->fname, fstat->linesparsed - fstat->lineskipped, fstat->linesparsed);
647 if (!rv) {
648 fstat->result = "File Parsed Succesfully";
649 }
650 fstat->stop = apr_time_now();
651 return rv;
652}
653
654apr_status_t parser_processline(apr_pool_t *ptemp, config_t *cfg,
655 config_dbd_t *dbconn, config_filestat_t *fstat, char **argv, int argc)
656{
657 config_logformat_t *fmt;
658 config_logformat_field_t *ifields;
659 config_output_field_t *ofields;
660 config_filter_t *filters;
661 apr_table_t *datain;
662 apr_table_t *dataout;
663 apr_status_t rv= APR_SUCCESS;
664 int i,m;
665
666 fmt = apr_hash_get(cfg->log_formats, cfg->logformat, APR_HASH_KEY_STRING);
667 if (!fmt) {
668 logging_log(cfg, LOGLEVEL_NOISE, "PARSER: No Input Log format");
669 return APR_EINVAL;
670 }
671 if (fmt->fields->nelts != argc) {
672 logging_log(cfg, LOGLEVEL_NOISE,
673 "PARSER: Input line field number differs from expected. Expected %d got %d.",
674 fmt->fields->nelts, argc);
675 fstat->result = apr_psprintf(cfg->pool,
676 "Input line %d is badly formatted (wrong number of fields)",
677 fstat->linesparsed);
678 return APR_EINVAL;
679 }
680
681 datain = apr_table_make(ptemp, fmt->fields->nelts);
682 dataout = apr_table_make(ptemp, cfg->output_fields->nelts);
683
684 ifields = (config_logformat_field_t *)fmt->fields->elts;
685 for (i=0; i<fmt->fields->nelts; i++) {
686 apr_table_setn(datain, ifields[i].name, argv[i]);
687 }
688 // Run Pre Filters
689 for (i=0, m=cfg->prefilters->nelts,
690 filters = (config_filter_t *)cfg->prefilters->elts;
691 i<m; i++) {
692 const char *temp = apr_table_get(datain, filters[i].field);
693 if (temp && (!filters[i].regex || ap_regexec(filters[i].regex, temp, 0, NULL,0)==0)) {
694 if (filters[i].negative) {
695 logging_log(cfg, LOGLEVEL_DEBUG,
696 "PARSER: PREFILTER: Skipping Line %d due to Filter (%d)%s",
697 fstat->linesparsed, i, filters[i].filter);
698 fstat->lineskipped++;
699 return APR_SUCCESS;
700 } else {
701 logging_log(cfg, LOGLEVEL_DEBUG,
702 "PARSER: PREFILTER: Force Parsing Line %d due to Filter (%d)%s",
703 fstat->linesparsed, i, filters[i].filter);
704 }
705 break;
706 }
707 }
708
709 ofields = (config_output_field_t *)cfg->output_fields->elts;
710 // clear out ofield function per-line data
711 memset(&g_parser_linedata[1],0,sizeof(void *)*(int)g_parser_linedata[0]);
712 // Convert input fields to output fields
713 for (i=0,m=cfg->output_fields->nelts; i<m; i++) {
714 const char *val;
715 val = apr_table_get(datain, ofields[i].source);
716 // If we can't find the source field just continue
717 if (!val && !(ofields[i].source[0]=='\0' && ofields[i].func)) {
718 apr_table_setn(dataout, ofields[i].field, ofields[i].def);
719 continue;
720 }
721 if (!ofields[i].func) {
722 apr_table_setn(dataout, ofields[i].field, val);
723 } else {
724 const char *ret= NULL;
725 rv = ((parser_func_t *)ofields[i].func)->func(ptemp, cfg,
726 &ofields[i], val, &ret);
727 if (rv) {
728 fstat->result = apr_psprintf(cfg->pool,
729 "Input line %d, Parser function %s returned error (%d)%s",
730 fstat->linesparsed, ofields[i].fname, rv, logging_strerror(rv));
731 return rv;
732 }
733 apr_table_setn(dataout, ofields[i].field, ret ? ret : ofields[i].def);
734 }
735 }
736
737 // Run Post filters
738 for (i=0, m=cfg->postfilters->nelts,
739 filters = (config_filter_t *)cfg->postfilters->elts;
740 i<m; i++) {
741 const char *temp = apr_table_get(dataout, filters[i].field);
742 if (temp && (!filters[i].regex || ap_regexec(filters[i].regex, temp, 0, NULL,0)==0)) {
743 if (filters[i].negative) {
744 logging_log(cfg, LOGLEVEL_DEBUG,
745 "PARSER: POSTFILTER: Skipping Line %d due to Filter (%d)%s",
746 fstat->linesparsed, i, filters[i].filter);
747 fstat->lineskipped++;
748 return APR_SUCCESS;
749 } else {
750 logging_log(cfg, LOGLEVEL_DEBUG,
751 "PARSER: POSTFILTER: Force Parsing Line %d due to Filter (%d)%s",
752 fstat->linesparsed, i, filters[i].filter);
753 }
754 break;
755 }
756 }
757
758 // Process DB Query
759 if (!cfg->dryrun) {
760 rv = database_insert(cfg, dbconn, ptemp, dataout);
761 if (rv) {
762 fstat->result = apr_psprintf(cfg->pool,
763 "Input line %d, Database Error",
764 fstat->linesparsed);
765 }
766 }
767 return rv;
768}
diff --git a/utility/logparse.h b/utility/logparse.h
new file mode 100644
index 0000000..7ca0958
--- /dev/null
+++ b/utility/logparse.h
@@ -0,0 +1,37 @@
1#ifndef LOGPARSE_H_
2#define LOGPARSE_H_
3
4#include "config.h"
5
6typedef apr_status_t (*parser_func_f)(apr_pool_t *p, config_t *cfg,
7 config_output_field_t *field, const char *value, const char **ret);
8
9struct parser_func_t {
10 parser_func_f func;
11 int pos;
12 void *data;
13 void ***linedata;
14};
15
16#define parser_get_linedata(f) (*f->linedata)[f->pos]
17
18#define parser_set_linedata(f, v) (*f->linedata)[f->pos] = v
19
20parser_func_t *parser_get_func(const char *name);
21
22void parser_init(apr_pool_t *p);
23
24void parser_find_logs(config_t *cfg);
25
26void parser_split_logs(config_t *cfg);
27
28apr_status_t parser_tokenize_line(const char *arg_str, char ***argv_out,
29 apr_pool_t *token_context);
30
31apr_status_t parser_parsefile(config_t *cfg, config_dbd_t *dbconn,
32 config_filestat_t *fstat);
33
34apr_status_t parser_processline(apr_pool_t *ptemp, config_t *cfg,
35 config_dbd_t *dbconn, config_filestat_t *line, char **argv, int argc);
36
37#endif /*LOGPARSE_H_*/
diff --git a/utility/mod_log_sql.conf b/utility/mod_log_sql.conf
new file mode 100644
index 0000000..911fc18
--- /dev/null
+++ b/utility/mod_log_sql.conf
@@ -0,0 +1,70 @@
1InputDirectory ./logs
2ErrorLog ./error_log
3
4DBDDriver mysql
5DBDParams "host=localhost;user=root;dbname=apache_log"
6Table access_log
7MachineID 7of9
8UseTransactions on
9LogLevel notice
10DryRun off
11Summary on
12
13SplitInput on
14#SplitCount 4
15SplitMinLines 0
16SplitMaxLines 50000
17SplitDirectory ./split_temp
18
19#ThreadCount 0
20
21BadLineFile ./badlines.log
22BadLineMax 10
23
24LogFormatConfig CLF remhost String
25LogFormatConfig CLF ident String
26LogFormatConfig CLF user String
27LogFormatConfig CLF date Date
28LogFormatConfig CLF request String
29LogFormatConfig CLF status Number
30LogFormatConfig CLF bytes_sent Number
31
32LogFormatConfig Combined remhost String
33LogFormatConfig Combined ident String
34LogFormatConfig Combined user String
35LogFormatConfig Combined date Date
36LogFormatConfig Combined request String
37LogFormatConfig Combined status Number
38LogFormatConfig Combined bytes_sent Number
39LogFormatConfig Combined referer String
40LogFormatConfig Combined agent String
41
42LogFormat Combined
43
44#Linefilter - "BAD"
45#LineFilter "GOOD"
46#LineFilter + "BETTER"
47# the next filter ignores ALL lines
48#LineFilter -
49#PreFilter request - "Rebuild"
50#PostFilter request_method "GET"
51
52# Usage field datatype(size) default source [function [param]...]
53OutputField bytes_sent int 0 bytes_sent
54OutputField request_protocol varchar(10) "" request regexmatch "(HTTP/[\\d\\.]+)$"
55OutputField remote_host varchar(50) "" remhost
56OutputField request_method varchar(25) "" request regexmatch "^(\\w+)"
57OutputField time_stamp int 0 date totimestamp
58OutputField status smallint 0 status
59OutputField request_line varchar(255) "" request
60#OutputField request_uri varchar(255) "" request regexmatch "^\\w+ (.+) \\w+/[\\d\\.]+$"
61OutputField remote_user varchar(50) "" user
62OutputField remote_logname varchar(50) "" ident
63OutputField request_time char(28) "" date wrap "[" "]"
64#Only used for Combined log input, if standard CLF input, they are ignored
65OutputField agent varchar(255) "" agent
66OutputField referer varchar(255) "" referer
67OutputField machine_id varchar(25) "" "" machineid
68#VIZU Fields
69OutputField poll_id int 0 request queryarg n "&;"
70
diff --git a/utility/shell.c b/utility/shell.c
new file mode 100644
index 0000000..1b9e890
--- /dev/null
+++ b/utility/shell.c
@@ -0,0 +1,342 @@
1#include "apr.h"
2#include "apr_getopt.h"
3#include "apr_tables.h"
4
5#define APR_WANT_STDIO
6#include "apr_want.h"
7#include "stdlib.h"
8
9#include "shell.h"
10#include "config.h"
11#include "logparse.h"
12#include "database.h"
13#include "util.h"
14
15#if APR_HAS_THREADS
16#include "apr_queue.h"
17#include "apr_thread_pool.h"
18
19static apr_queue_t *queue;
20
21void run_multithreaded(config_t *cfg);
22#endif
23
24void run_singlethreaded(config_t *cfg);
25
26const apr_getopt_option_t _opt_config[] = {
27 {"machineid", 'm', 1, "Machine ID for the log file"},
28 {"transaction", 't', 1, "Use a Transaction (yes,no)"},
29 {"logformat", 'r', 1, "Use this logformat to parse files"},
30 {"file", 'f', 1, "Parse this single log file (input dir is NOT scanned)"},
31 {"inputdir", 'i', 1, "Input Directory to look for log files"},
32 {"config", 'c', 1, "Configuration file to use (default mod_log_sql.conf)"},
33 {"dryrun", 'n', 0, "Perform a dry run (do not actually alter the databse)"},
34 {"dump", 'd', 0, "Dump the configuration after parsing and quit"},
35 {"loglevel", 'l', 1, "Log Level (deubg, notice, error)"},
36 {"summary", 's', 1, "Summary (yes,no)"},
37 {"threadcount", 'p', 1, "Set thread count (a number greater than 0)"},
38 {"help", 'h', 0, "Show Help"},
39 {NULL}
40};
41
42void show_help(const char *prog, const apr_getopt_option_t *opts, FILE *output)
43{
44 int ptr = 0;
45 fprintf(output, "Usage: %s [OPTIONS] [files...]\n\n", prog);
46 while (opts[ptr].optch != 0) {
47 if (opts[ptr].optch > 255) {
48 if (opts[ptr].name) {
49 fprintf(output, " --%-10s", opts[ptr].name);
50 } else {
51 fprintf(output, " ");
52 }
53 } else {
54 if (opts[ptr].name) {
55 fprintf(output, " -%c --%-10s", opts[ptr].optch, opts[ptr].name);
56 } else {
57 fprintf(output, " -%c ", opts[ptr].optch);
58 }
59 }
60 if (opts[ptr].has_arg) {
61 fprintf(output, " (arg)");
62 } else {
63 fprintf(output, " ");
64 }
65 fprintf(output, " %s\n", opts[ptr].description);
66 ptr++;
67 }
68}
69
70void print_summary(config_t *cfg) {
71 config_filestat_t *fstat;
72 int i,m;
73 apr_time_t totaltime = 0;
74 apr_size_t totalparsed = 0, totalskipped = 0, totalbad = 0;
75
76 fstat = (config_filestat_t *)cfg->input_files->elts;
77
78 printf("Execution Summary\nParsed %d files\n", cfg->input_files->nelts);
79 for (i=0, m=cfg->input_files->nelts; i<m; i++) {
80 totaltime += fstat[i].stop - fstat[i].start;
81 totalparsed += fstat[i].linesparsed;
82 totalskipped += fstat[i].lineskipped;
83 totalbad += fstat[i].linesbad;
84 printf(" File: %s\n"
85 " Lines Added %'d out of %'d (Skipped %'d, Bad %'d)\n"
86 " Status: %s\n"
87 " Duration: %02"APR_TIME_T_FMT":%02"APR_TIME_T_FMT".%"APR_TIME_T_FMT" (minutes, seconds, and miliseconds)\n"
88 "\n",
89 fstat[i].fname,
90 fstat[i].linesparsed - fstat[i].lineskipped - fstat[i].linesbad,
91 fstat[i].linesparsed,
92 fstat[i].lineskipped,
93 fstat[i].linesbad,
94 fstat[i].result,
95 apr_time_sec(fstat[i].stop - fstat[i].start)/60,
96 apr_time_sec(fstat[i].stop - fstat[i].start) % 60,
97 apr_time_msec(fstat[i].stop - fstat[i].start)
98 );
99 }
100 printf("Totals\n"
101 " Lines Added %'d out of %'d (Skipped %'d, Bad %'d)\n"
102 " Duration: %02"APR_TIME_T_FMT":%02"APR_TIME_T_FMT".%"APR_TIME_T_FMT" (minutes, seconds, and miliseconds)\n"
103 "\n",
104 totalparsed - totalskipped - totalbad,
105 totalparsed,
106 totalskipped,
107 totalbad,
108 apr_time_sec(totaltime)/60,
109 apr_time_sec(totaltime) % 60,
110 apr_time_msec(totaltime)
111 );
112}
113
114int main(int argc, const char *const argv[])
115{
116 apr_pool_t *pool, *ptemp;
117 apr_getopt_t *opts;
118 int opt;
119 const char *opt_arg;
120 apr_status_t rv;
121 apr_table_t *args;
122 config_t *cfg;
123
124 apr_app_initialize(&argc, &argv, NULL);
125 atexit(apr_terminate);
126
127 if (apr_pool_create(&pool, NULL) != APR_SUCCESS) {
128 fprintf(stderr, "Failed to create memory pool!\n");
129 exit(1);
130 }
131 apr_pool_create(&ptemp, NULL);
132
133 /** Iterate over command line arguments
134 * shoving args in a apr_table for processing later*/
135 args = apr_table_make(ptemp, 5);
136 apr_table_setn(args, "config", "mod_log_sql.conf");
137 apr_getopt_init(&opts, ptemp, argc, argv);
138 while ((rv = apr_getopt_long(opts, _opt_config, &opt, &opt_arg)) == APR_SUCCESS) {
139 switch (opt) {
140 case 'c':
141 apr_table_setn(args,"config",opt_arg);
142 break;
143 case 'd':
144 apr_table_setn(args,"dump","yes");
145 break;
146 case 'f':
147 apr_table_setn(args,"inputfile",opt_arg);
148 break;
149 case 'h':
150 show_help(argv[0], _opt_config, stdout);
151 exit(1);
152 break;
153 case 'i':
154 apr_table_setn(args,"inputdirectory",opt_arg);
155 break;
156 case 'l':
157 apr_table_setn(args,"loglevel",opt_arg);
158 break;
159 case 'm':
160 apr_table_setn(args,"machineid",opt_arg);
161 break;
162 case 'n':
163 apr_table_setn(args,"dryrun","yes");
164 break;
165 case 'p':
166 apr_table_setn(args,"threadcount",opt_arg);
167 break;
168 case 'r':
169 apr_table_setn(args,"logformat",opt_arg);
170 break;
171 case 's':
172 apr_table_setn(args,"summary",opt_arg);
173 break;
174 case 't':
175 apr_table_setn(args,"usetransactions",opt_arg);
176 break;
177 }
178 }
179 if (rv != APR_EOF) {
180 show_help(argv[0], _opt_config, stderr);
181 exit(1);
182 }
183 // Check if no extra args were passed
184 if (opts->ind != opts->argc) {
185 show_help(argv[0], _opt_config, stderr);
186 fprintf(stderr, "\n%s: Extra unknown arguments passed\n\n",argv[0]);
187 exit(1);
188 }
189
190 // Initialize sub systems
191 parser_init(pool);
192 config_init(pool);
193 database_init(pool);
194 // Process configuration file
195 cfg = config_create(pool);
196 // initialize STD out error log
197 logging_preinit(cfg);
198 rv = config_read(cfg, apr_table_get(args,"Config"), args);
199 apr_pool_destroy(ptemp);
200
201 // Initialize Log system AFTER we parse the configuration
202 logging_init(cfg);
203
204 if (APR_STATUS_IS_ENOENT(rv)) {
205 logging_log(cfg,LOGLEVEL_NOISE,"Could not load configuration file: %s",apr_table_get(args,"config"));
206 } else if (rv) {
207 exit(1);
208 }
209 if (cfg->dump) {
210 config_dump(cfg);
211 exit(0);
212 }
213
214 if (config_check(cfg)) {
215 logging_log(cfg,LOGLEVEL_NOISE, "Please correct the configuration");
216 exit(1);
217 }
218
219 // Only Find files IF no filename was passed via the command line
220 if (apr_is_empty_array(cfg->input_files)) {
221 parser_find_logs(cfg);
222 }
223 if (!apr_is_empty_array(cfg->input_files)) {
224 parser_split_logs(cfg);
225#if APR_HAS_THREADS
226 if (cfg->thread_count > 0) {
227 run_multithreaded(cfg);
228 } else {
229#endif
230 run_singlethreaded(cfg);
231#if APR_HAS_THREADS
232 }
233#endif
234 } else {
235 logging_log(cfg,LOGLEVEL_NOISE,"No log files found to parse");
236 }
237
238 if (cfg->summary) {
239 print_summary(cfg);
240 }
241 return 0;
242}
243
244void run_singlethreaded(config_t *cfg)
245{
246 config_filestat_t *filelist;
247 config_dbd_t *dbconn = NULL;
248 int f, l;
249 apr_status_t rv;
250
251 if (!cfg->dryrun) {
252 if ((rv = database_connect(cfg, &dbconn))) {
253 logging_log(cfg,LOGLEVEL_NOISE, "Error Connecting to Database");
254 exit(1);
255 }
256 }
257
258 filelist = (config_filestat_t *)cfg->input_files->elts;
259 for (f=0, l=cfg->input_files->nelts; f < l; f++) {
260 rv = parser_parsefile(cfg, dbconn, &filelist[f]);
261 if (rv) {
262 logging_log(cfg, LOGLEVEL_NOISE,
263 "Error occured parsing log files. Aborting");
264 break;
265 }
266 }
267
268 if (!cfg->dryrun) {
269 database_disconnect(dbconn);
270 }
271}
272
273#if APR_HAS_THREADS
274void * APR_THREAD_FUNC run_filethread(apr_thread_t *thd, void *data)
275{
276 config_t *cfg = data;
277 config_dbd_t *dbconn = NULL;
278 config_filestat_t *fileentry;
279 apr_status_t rv;
280
281 if (!cfg->dryrun) {
282 if ((rv = database_connect(cfg, &dbconn))) {
283 logging_log(cfg,LOGLEVEL_NOISE, "Error Connecting to Database");
284 return NULL;
285 }
286 }
287
288 while (1) {
289 rv = apr_queue_pop(queue, (void **)&fileentry);
290 if (rv == APR_EINTR)
291 continue;
292 if (rv == APR_EOF)
293 break;
294 rv = parser_parsefile(cfg, dbconn, fileentry);
295 if (rv) {
296 logging_log(cfg, LOGLEVEL_NOISE,
297 "Error occured parsing log file %s", fileentry->fname);
298 }
299 }
300
301 if (!cfg->dryrun) {
302 database_disconnect(dbconn);
303 }
304 return NULL;
305}
306
307void run_multithreaded(config_t *cfg)
308{
309 logging_log(cfg, LOGLEVEL_NOISE, "Running Multithreaded");
310
311 config_filestat_t *filelist;
312 int f, l;
313 apr_status_t rv;
314 apr_pool_t *tp;
315 apr_thread_pool_t *thrp;
316 unsigned int count;
317
318 apr_pool_create(&tp, cfg->pool);
319 rv = apr_queue_create(&queue, cfg->input_files->nelts, tp);
320
321 rv = apr_thread_pool_create(&thrp, 0, cfg->thread_count, tp);
322
323 //populate queue
324 filelist = (config_filestat_t *)cfg->input_files->elts;
325 for (f=0, l=cfg->input_files->nelts; f < l; f++) {
326 rv = apr_queue_push(queue, &filelist[f]);
327 }
328 // populate the worker threads
329 for (f=0; f<cfg->thread_count; f++) {
330 rv = apr_thread_pool_push(thrp, run_filethread, cfg, 0, NULL);
331 }
332
333 do {
334 apr_sleep(apr_time_from_sec(1));
335 count = apr_queue_size(queue);
336 } while (count > 0);
337
338 rv = apr_queue_term(queue);
339
340 rv = apr_thread_pool_destroy(thrp);
341}
342#endif
diff --git a/utility/shell.h b/utility/shell.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/utility/shell.h
diff --git a/utility/util.c b/utility/util.c
new file mode 100644
index 0000000..dcfb028
--- /dev/null
+++ b/utility/util.c
@@ -0,0 +1,189 @@
1#include "util.h"
2#include "apr_strings.h"
3#include "apr_lib.h"
4#include "apr_file_io.h"
5#include "apr_time.h"
6
7#include "config.h"
8
9#include <stdarg.h>
10
11char *lowerstr(apr_pool_t *pool, const char *input)
12{
13 char *temp;
14 char *itr;
15 temp = apr_pstrdup(pool, input);
16 for (itr=temp; *itr!='\0'; itr++) {
17 *itr = apr_tolower(*itr);
18 }
19 return temp;
20}
21
22void line_chomp(char *str)
23{
24 int len;
25 // chomp off newline
26 len = strlen(str);
27 if (len) {
28 while (str[len-1] == '\r' || str[len-1] == '\n') {
29 str[len-1] = '\0';
30 len--;
31 }
32 }
33}
34
35/*
36 * *** Ripped from HTTPD util.c (why are so many PORTABLE things not in APR UTIL?)
37 */
38static char x2c(const char *what)
39{
40 register char digit;
41
42 digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10
43 : (what[0] - '0'));
44 digit *= 16;
45 digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10
46 : (what[1] - '0'));
47 return (digit);
48}
49
50/*
51 * *** Ripped from HTTPD util.c (why are so many PORTABLE things not in APR UTIL?)
52 *
53 * Unescapes a URL, leaving reserved characters intact.
54 * Returns 0 on success, non-zero on error
55 * Failure is due to
56 * bad % escape returns HTTP_BAD_REQUEST
57 *
58 * decoding %00 or a forbidden character returns HTTP_NOT_FOUND
59 */
60static int unescape_url(char *url, const char *forbid, const char *reserved)
61{
62 register int badesc, badpath;
63 char *x, *y;
64
65 badesc = 0;
66 badpath = 0;
67 /* Initial scan for first '%'. Don't bother writing values before
68 * seeing a '%' */
69 y = strchr(url, '%');
70 if (y == NULL) {
71 return APR_SUCCESS;
72 }
73 for (x = y; *y; ++x, ++y) {
74 if (*y != '%') {
75 *x = *y;
76 }
77 else {
78 if (!apr_isxdigit(*(y + 1)) || !apr_isxdigit(*(y + 2))) {
79 badesc = 1;
80 *x = '%';
81 }
82 else {
83 char decoded;
84 decoded = x2c(y + 1);
85 if ((decoded == '\0')
86 || (forbid && strchr(forbid, decoded))) {
87 badpath = 1;
88 *x = decoded;
89 y += 2;
90 }
91 else if (reserved && strchr(reserved, decoded)) {
92 *x++ = *y++;
93 *x++ = *y++;
94 *x = *y;
95 }
96 else {
97 *x = decoded;
98 y += 2;
99 }
100 }
101 }
102 }
103 *x = '\0';
104 if (badesc) {
105 return APR_EINVAL;
106 }
107 else if (badpath) {
108 return APR_EINVAL;
109 }
110 else {
111 return APR_SUCCESS;
112 }
113}
114
115/*
116 * *** Ripped from HTTPD util.c (why are so many PORTABLE things not in APR UTIL?)
117 */
118int ap_unescape_url(char *url)
119{
120 /* Traditional */
121#ifdef CASE_BLIND_FILESYSTEM
122 return unescape_url(url, "/\\", NULL);
123#else
124 return unescape_url(url, "/", NULL);
125#endif
126}
127
128void logging_preinit(config_t *cfg)
129{
130 apr_pool_create(&cfg->errorlog_p, cfg->pool);
131 apr_file_open_stderr(&cfg->errorlog_fperr, cfg->pool);
132}
133
134void logging_init(config_t *cfg)
135{
136 apr_status_t rv;
137 if (cfg->errorlog) {
138 rv = apr_file_open(&cfg->errorlog_fp, cfg->errorlog,
139 APR_FOPEN_CREATE | APR_FOPEN_WRITE | APR_FOPEN_APPEND,
140 APR_OS_DEFAULT,
141 cfg->pool);
142 if (rv) {
143 printf("Error opening %s\n",cfg->errorlog);
144 cfg->loglevel = LOGLEVEL_NONE;
145 }
146 logging_log(cfg, LOGLEVEL_ERROR, "Log file Opened");
147 } else {
148 cfg->loglevel = LOGLEVEL_NONE;
149 logging_log(cfg, LOGLEVEL_NOISE, "No Log file specified, disabled logging");
150 }
151}
152
153const char *logging_strerror(apr_status_t rv)
154{
155 char buff[256];
156 return apr_strerror(rv, buff, 256);
157}
158
159void logging_log(config_t *cfg, loglevel_e level, const char *fmt, ...)
160{
161 va_list ap;
162 char date[APR_RFC822_DATE_LEN];
163 struct iovec vec[4];
164 apr_size_t blen;
165
166 if (cfg->loglevel < level) return;
167
168 va_start(ap, fmt);
169 apr_pool_clear(cfg->errorlog_p);
170
171 apr_rfc822_date(date, apr_time_now());
172 vec[0].iov_base = date;
173 vec[0].iov_len = APR_RFC822_DATE_LEN-1;
174 vec[1].iov_base = " ";
175 vec[1].iov_len = 2;
176 vec[2].iov_base = apr_pvsprintf(cfg->errorlog_p, fmt, ap);
177 vec[2].iov_len = strlen(vec[2].iov_base);
178 vec[3].iov_base = "\n";
179 vec[3].iov_len = 1;
180
181 if (level == LOGLEVEL_NOISE) {
182 apr_file_writev(cfg->errorlog_fperr,&vec[2],2,&blen);
183 }
184 if (cfg->loglevel > LOGLEVEL_NONE && cfg->errorlog_fp) {
185 apr_file_writev(cfg->errorlog_fp,vec,4,&blen);
186 }
187
188 va_end(ap);
189}
diff --git a/utility/util.h b/utility/util.h
new file mode 100644
index 0000000..a5a7f7e
--- /dev/null
+++ b/utility/util.h
@@ -0,0 +1,26 @@
1#ifndef UTIL_H_
2#define UTIL_H_
3
4#include "apr_pools.h"
5
6#include "config.h"
7
8char *lowerstr(apr_pool_t *pool, const char *input);
9
10/**
11 * Chomp new line characters off the end of the line
12 */
13void line_chomp(char *str);
14
15int ap_unescape_url(char *url);
16
17void logging_preinit(config_t *cfg);
18
19void logging_init(config_t *cfg);
20
21void logging_log(config_t *cfg, loglevel_e level, const char *fmt, ...)
22 __attribute__((format(printf, 3, 4)));
23
24const char *logging_strerror(apr_status_t rv);
25
26#endif /*UTIL_H_*/