diff options
-rw-r--r-- | .cproject | 362 | ||||
-rw-r--r-- | .project | 60 | ||||
-rw-r--r-- | Makefile.in | 156 | ||||
-rw-r--r-- | TODO.in | 3 | ||||
-rwxr-xr-x | autogen.sh | 1 | ||||
-rwxr-xr-x | config.guess | 1314 | ||||
-rwxr-xr-x | config.sub | 1410 | ||||
-rw-r--r-- | configure.ac | 32 | ||||
-rw-r--r-- | contrib/Makefile.in | 53 | ||||
-rw-r--r-- | docs/Makefile.in | 24 | ||||
-rwxr-xr-x | gen_todo.pl | 64 | ||||
-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.in | 168 | ||||
-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.c | 132 | ||||
-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.in | 49 | ||||
-rw-r--r-- | utility/ap_pcre.c | 344 | ||||
-rw-r--r-- | utility/ap_pcre.h | 178 | ||||
-rw-r--r-- | utility/config.c | 534 | ||||
-rw-r--r-- | utility/config.h | 190 | ||||
-rw-r--r-- | utility/database.c | 212 | ||||
-rw-r--r-- | utility/database.h | 25 | ||||
-rw-r--r-- | utility/logparse.c | 768 | ||||
-rw-r--r-- | utility/logparse.h | 37 | ||||
-rw-r--r-- | utility/mod_log_sql.conf | 70 | ||||
-rw-r--r-- | utility/shell.c | 342 | ||||
-rw-r--r-- | utility/shell.h | 0 | ||||
-rw-r--r-- | utility/util.c | 189 | ||||
-rw-r--r-- | utility/util.h | 26 |
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=""${workspace_loc:/includes/2.2/apr-1}""/> | ||
35 | <listOptionValue builtIn="false" value=""${workspace_loc:/includes/2.2/httpd}""/> | ||
36 | <listOptionValue builtIn="false" value=""${workspace_loc:/Includes/mysql}""/> | ||
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> | ||
@@ -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. |
4 | SUBDIRS = docs contrib | 4 | SUBDIRS = docs contrib src utility |
5 | |||
6 | HEADERS = mod_log_sql.h \ | ||
7 | functions.h \ | ||
8 | functions13.h \ | ||
9 | functions20.h \ | ||
10 | apache13.h \ | ||
11 | apache20.h \ | ||
12 | winconfig.h | ||
13 | |||
14 | CFLAGS = -Wc,-Wall -Wc,-fno-strict-aliasing | ||
15 | |||
16 | ifeq (@OOO_MAINTAIN@,1) | ||
17 | CFLAGS += -Wc,-Werror | ||
18 | endif | ||
19 | 5 | ||
20 | EXTRA_DIST = AUTHORS INSTALL TODO LICENSE CHANGELOG \ | 6 | EXTRA_DIST = AUTHORS INSTALL TODO LICENSE CHANGELOG \ |
21 | build-apache13.bat build-apache2.bat \ | 7 | build-apache13.bat build-apache2.bat \ |
22 | 8 | ||
23 | coreSOURCES = @PACKAGE_NAME@.c | ||
24 | coreTARGET = @PACKAGE_NAME@@APXS_EXTENSION@ | ||
25 | coreLDADD = @RT_LIBS@ | ||
26 | coreCFLAGS = | ||
27 | coreNAME = log_sql | ||
28 | TARGETS = $(coreTARGET) | ||
29 | |||
30 | sslSOURCES = @PACKAGE_NAME@_ssl.c | ||
31 | sslTARGET = @PACKAGE_NAME@_ssl@APXS_EXTENSION@ | ||
32 | sslLDADD = | ||
33 | sslCFLAGS = @MOD_SSL_CFLAGS@ | ||
34 | sslNAME = log_sql_ssl | ||
35 | |||
36 | ifeq (@WANT_SSL_MOD@,1) | ||
37 | TARGETS += $(sslTARGET) | ||
38 | endif | ||
39 | |||
40 | logioSOURCES = @PACKAGE_NAME@_logio.c | ||
41 | logioTARGET = @PACKAGE_NAME@_logio@APXS_EXTENSION@ | ||
42 | logioLDADD = | ||
43 | logioCFLAGS = | ||
44 | logioNAME = log_sql_logio | ||
45 | |||
46 | ifeq (@WANT_LOGIO_MOD@,1) | ||
47 | TARGETS += $(logioTARGET) | ||
48 | endif | ||
49 | |||
50 | mysqlSOURCES = @PACKAGE_NAME@_mysql.c | ||
51 | mysqlTARGET = @PACKAGE_NAME@_mysql@APXS_EXTENSION@ | ||
52 | mysqlLDADD = @MYSQL_LDFLAGS@ @MYSQL_LIBS@ | ||
53 | mysqlCFLAGS = @MYSQL_CFLAGS@ | ||
54 | mysqlNAME = log_sql_mysql | ||
55 | |||
56 | ifeq (@WANT_MYSQL_MOD@,1) | ||
57 | TARGETS += $(mysqlTARGET) | ||
58 | endif | ||
59 | |||
60 | pgsqlSOURCES = @PACKAGE_NAME@_pgsql.c | ||
61 | pgsqlTARGET = @PACKAGE_NAME@_pgsql@APXS_EXTENSION@ | ||
62 | pgsqlLDADD = @PGSQL_LDFLAGS@ @PGSQL_LIBS@ | ||
63 | pgsqlCFLAGS = @PGSQL_CFLAGS@ | ||
64 | pgsqlNAME = log_sql_pgsql | ||
65 | |||
66 | ifeq (@WANT_PGSQL_MOD@,1) | ||
67 | TARGETS += $(pgsqlTARGET) | ||
68 | endif | ||
69 | |||
70 | dbiSOURCES = @PACKAGE_NAME@_dbi.c | ||
71 | dbiTARGET = @PACKAGE_NAME@_dbi@APXS_EXTENSION@ | ||
72 | dbiLDADD = @DBI_LDFLAGS@ @DBI_LIBS@ | ||
73 | dbiCFLAGS = @DBI_CFLAGS@ | ||
74 | dbiNAME = log_sql_dbi | ||
75 | |||
76 | ifeq (@WANT_DBI_MOD@,1) | ||
77 | TARGETS += $(dbiTARGET) | ||
78 | endif | ||
79 | |||
80 | #Don't modify anything below here | 9 | #Don't modify anything below here |
81 | 10 | ||
82 | PROVIDERS_SUBDIRS = @subdirs@ | 11 | top_srcdir = @top_srcdir@ |
83 | |||
84 | srcdir = @abs_srcdir@ | 12 | srcdir = @abs_srcdir@ |
85 | builddir = @abs_builddir@ | 13 | builddir = @abs_builddir@ |
86 | 14 | ||
87 | OBJ = $(coreSOURCES:.c=.o) $(logioSOURCES:.c=.o) $(sslSOURCES:.c=.o) $(mysqlSOURCES:.c=.o) \ | ||
88 | $(dbiSOURCES:.c=.o) $(pgsqlSOURCES:.c=.o) | ||
89 | |||
90 | LO = $(coreSOURCES:.c=.lo) $(logioSOURCES:.c=.lo) $(sslSOURCES:.c=.lo) $(mysqlSOURCES:.c=.lo) \ | ||
91 | $(dbiSOURCES:.c=.lo) $(pgsqlSOURCES:.c=.lo) | ||
92 | |||
93 | SLO = $(coreSOURCES:.c=.slo) $(logioSOURCES:.c=.slo) $(sslSOURCES:.c=.slo) $(mysqlSOURCES:.c=.slo) \ | ||
94 | $(dbiSOURCES:.c=.slo) $(pgsqlSOURCES:.c=.slo) | ||
95 | |||
96 | STD_DIST = install-sh \ | 15 | STD_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 | ||
106 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(coreSOURCES) $(HEADERS) \ | 25 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) |
107 | $(sslSOURCES) $(logioSOURCES) $(mysqlSOURCES) $(pgsqlSOURCES) $(dbiSOURCES) | ||
108 | 26 | ||
109 | all: $(TARGETS) all-subdirs | 27 | all: all-subdirs |
110 | 28 | ||
111 | all-subdirs install-subdirs activate-subdirs clean-subdirs distclean-subdirs: | 29 | all-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 | ||
126 | TODO: TODO.in | 44 | TODO: TODO.in |
127 | @./gen_todo.pl | 45 | @./m4/scripts/gen_todo.pl |
128 | 46 | ||
129 | $(coreTARGET): $(coreSOURCES) $(HEADERS) | 47 | install: 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 | |||
153 | install: $(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 | ||
185 | activate: activate-subdirs | 63 | activate: 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 | ||
191 | clean: clean-subdirs | 65 | clean: clean-subdirs |
192 | $(RM) $(OBJ) $(SLO) $(LO) $(TARGETS) | ||
193 | $(RM) -r .libs | ||
194 | 66 | ||
195 | distclean: clean distclean-subdirs | 67 | distclean: 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@ | |||
201 | DESTTGZ = $(DESTDIR).tar.gz | 73 | DESTTGZ = $(DESTDIR).tar.gz |
202 | dist: | 74 | dist: |
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 | ||
224 | local-dist: $(DISTFILES) | 96 | local-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 | ||
246 | Makefile: Makefile.in config.status | 118 | Makefile: Makefile.in config.status |
247 | ./config.status | 119 | ./config.status |
@@ -1,5 +1,5 @@ | |||
1 | TODO: | 1 | TODO: |
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?) |
@@ -12,5 +12,6 @@ fi | |||
12 | rm -rf autom4te.cache | 12 | rm -rf autom4te.cache |
13 | $ACLOCAL -I m4 | 13 | $ACLOCAL -I m4 |
14 | $AUTOHEADER | 14 | $AUTOHEADER |
15 | libtoolize -c --force | ||
15 | $AUTOCONF | 16 | $AUTOCONF |
16 | touch stamp-h.in | 17 | touch 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 | |||
6 | timestamp='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 | |||
37 | me=`echo "$0" | sed -e 's,.*/,,'` | ||
38 | |||
39 | usage="\ | ||
40 | Usage: $0 [OPTION] | ||
41 | |||
42 | Output the configuration name of the system \`$me' is run on. | ||
43 | |||
44 | Operation 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 | |||
49 | Report bugs and patches to <config-patches@gnu.org>." | ||
50 | |||
51 | version="\ | ||
52 | GNU config.guess ($timestamp) | ||
53 | |||
54 | Originally written by Per Bothner. | ||
55 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||
56 | Free Software Foundation, Inc. | ||
57 | |||
58 | This is free software; see the source for copying conditions. There is NO | ||
59 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." | ||
60 | |||
61 | help=" | ||
62 | Try \`$me --help' for more information." | ||
63 | |||
64 | # Parse command line | ||
65 | while 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 | ||
83 | done | ||
84 | |||
85 | if test $# != 0; then | ||
86 | echo "$me: too many arguments$help" >&2 | ||
87 | exit 1 | ||
88 | fi | ||
89 | |||
90 | |||
91 | dummy=dummy-$$ | ||
92 | trap '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 | |||
98 | set_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 ;; | ||
113 | esac' | ||
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) | ||
117 | if (test -f /.attbin/uname) >/dev/null 2>&1 ; then | ||
118 | PATH=$PATH:/.attbin ; export PATH | ||
119 | fi | ||
120 | |||
121 | UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown | ||
122 | UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown | ||
123 | UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown | ||
124 | UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown | ||
125 | |||
126 | # Note: order is significant - the case branches are not exclusive. | ||
127 | |||
128 | case "${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 | ||
192 | main: | ||
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 | ||
207 | EOF | ||
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 | } | ||
416 | EOF | ||
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 | } | ||
497 | EOF | ||
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 | } | ||
598 | EOF | ||
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 | } | ||
636 | EOF | ||
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 | } | ||
877 | EOF | ||
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 ;; | ||
1117 | esac | ||
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 | |||
1122 | cat >$dummy.c <<EOF | ||
1123 | #ifdef _SEQUENT_ | ||
1124 | # include <sys/types.h> | ||
1125 | # include <sys/utsname.h> | ||
1126 | #endif | ||
1127 | main () | ||
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 | } | ||
1234 | EOF | ||
1235 | |||
1236 | eval $set_cc_for_build | ||
1237 | $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 | ||
1238 | rm -f $dummy.c $dummy | ||
1239 | |||
1240 | # Apollos put the system type in the environment. | ||
1241 | |||
1242 | test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } | ||
1243 | |||
1244 | # Convex versions that predate uname can use getsysinfo(1) | ||
1245 | |||
1246 | if [ -x /usr/convex/getsysinfo ] | ||
1247 | then | ||
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 | ||
1268 | fi | ||
1269 | |||
1270 | cat >&2 <<EOF | ||
1271 | $0: unable to guess system type | ||
1272 | |||
1273 | This script, last modified $timestamp, has failed to recognize | ||
1274 | the operating system you are using. It is advised that you | ||
1275 | download the most up to date version of the config scripts from | ||
1276 | |||
1277 | ftp://ftp.gnu.org/pub/gnu/config/ | ||
1278 | |||
1279 | If the version you run ($0) is already up to date, please | ||
1280 | send the following data and any information you think might be | ||
1281 | pertinent to <config-patches@gnu.org> in order to provide the needed | ||
1282 | information to handle your system. | ||
1283 | |||
1284 | config.guess timestamp = $timestamp | ||
1285 | |||
1286 | uname -m = `(uname -m) 2>/dev/null || echo unknown` | ||
1287 | uname -r = `(uname -r) 2>/dev/null || echo unknown` | ||
1288 | uname -s = `(uname -s) 2>/dev/null || echo unknown` | ||
1289 | uname -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 | |||
1294 | hostinfo = `(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 | |||
1301 | UNAME_MACHINE = ${UNAME_MACHINE} | ||
1302 | UNAME_RELEASE = ${UNAME_RELEASE} | ||
1303 | UNAME_SYSTEM = ${UNAME_SYSTEM} | ||
1304 | UNAME_VERSION = ${UNAME_VERSION} | ||
1305 | EOF | ||
1306 | |||
1307 | exit 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 | |||
6 | timestamp='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 | |||
54 | me=`echo "$0" | sed -e 's,.*/,,'` | ||
55 | |||
56 | usage="\ | ||
57 | Usage: $0 [OPTION] CPU-MFR-OPSYS | ||
58 | $0 [OPTION] ALIAS | ||
59 | |||
60 | Canonicalize a configuration name. | ||
61 | |||
62 | Operation 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 | |||
67 | Report bugs and patches to <config-patches@gnu.org>." | ||
68 | |||
69 | version="\ | ||
70 | GNU config.sub ($timestamp) | ||
71 | |||
72 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||
73 | Free Software Foundation, Inc. | ||
74 | |||
75 | This is free software; see the source for copying conditions. There is NO | ||
76 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." | ||
77 | |||
78 | help=" | ||
79 | Try \`$me --help' for more information." | ||
80 | |||
81 | # Parse command line | ||
82 | while 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 | ||
106 | done | ||
107 | |||
108 | case $# 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;; | ||
114 | esac | ||
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. | ||
118 | maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` | ||
119 | case $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 | ;; | ||
130 | esac | ||
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. | ||
136 | case $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 | ;; | ||
220 | esac | ||
221 | |||
222 | # Decode aliases for certain CPU-COMPANY combinations. | ||
223 | case $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 | ;; | ||
1012 | esac | ||
1013 | |||
1014 | # Here we canonicalize certain aliases for manufacturers. | ||
1015 | case $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 | ;; | ||
1024 | esac | ||
1025 | |||
1026 | # Decode manufacturer-specific aliases for certain operating systems. | ||
1027 | |||
1028 | if [ x"$os" != x"" ] | ||
1029 | then | ||
1030 | case $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 | ;; | ||
1179 | esac | ||
1180 | else | ||
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 | |||
1192 | case $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 | ;; | ||
1331 | esac | ||
1332 | fi | ||
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. | ||
1336 | vendor=unknown | ||
1337 | case $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 | ;; | ||
1400 | esac | ||
1401 | |||
1402 | echo $basic_machine$os | ||
1403 | exit 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 @@ | |||
1 | dnl Required initializer | 1 | dnl Required initializer |
2 | AC_INIT(mod_log_sql, 1.101) | 2 | AC_INIT([mod_log_sql],[1.102]) |
3 | OOO_CONFIG_NICE(config.nice) | 3 | OOO_CONFIG_NICE(config.nice) |
4 | AC_PREREQ(2.53) | 4 | AC_PREREQ(2.59) |
5 | AC_CONFIG_HEADERS(config.h) | 5 | AC_CONFIG_HEADERS(include/autoconfig.h) |
6 | 6 | AC_CONFIG_SRCDIR(src/mod_log_sql.c) | |
7 | AC_CONFIG_SRCDIR(mod_log_sql.c) | ||
8 | 7 | ||
9 | OOO_MAINTAIN_MODE | 8 | OOO_MAINTAIN_MODE |
10 | 9 | ||
11 | dnl Add a test for a compiler. | 10 | dnl Add a test for a compiler. |
12 | AC_PROG_CC | 11 | AC_PROG_CC |
12 | AC_PROG_LIBTOOL | ||
13 | |||
14 | PKG_CHECK_MODULES(PCRE,libpcre) | ||
13 | 15 | ||
14 | APACHE20_VERSION=2.0.40 | 16 | APACHE20_VERSION=2.0.40 |
15 | APACHE13_VERSION=1.3.20 | 17 | APACHE13_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 | ||
24 | if test $AP_VERSION = "2.0"; then | 26 | if test $AP_VERSION = "2.0"; then |
@@ -26,8 +28,16 @@ if test $AP_VERSION = "2.0"; then | |||
26 | else | 28 | else |
27 | WANT_LOGIO_MOD=0 | 29 | WANT_LOGIO_MOD=0 |
28 | fi | 30 | fi |
31 | |||
29 | AC_SUBST(WANT_LOGIO_MOD) | 32 | AC_SUBST(WANT_LOGIO_MOD) |
30 | 33 | ||
34 | CHECK_APU_HEADERS([apr_dbd.h], | ||
35 | WANT_DBD_MOD=1, | ||
36 | WANT_DBD_MOD=0) | ||
37 | |||
38 | AC_SUBST(WANT_DBD_MOD) | ||
39 | CHECK_APU_FUNCS(apr_dbd_transaction_mode_get) | ||
40 | |||
31 | CHECK_MYSQL( | 41 | CHECK_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 | ||
76 | dnl Write config.status and the Makefile | 86 | dnl Write config.status and the Makefile |
77 | 87 | ||
78 | AC_OUTPUT(Makefile | 88 | AC_CONFIG_FILES([Makefile |
89 | src/Makefile | ||
79 | docs/Makefile | 90 | docs/Makefile |
80 | contrib/Makefile) | 91 | utility/Makefile |
92 | contrib/Makefile]) | ||
93 | AC_OUTPUT | ||
81 | 94 | ||
82 | 95 | ||
83 | AC_MSG_RESULT([------------------------------------]) | 96 | AC_MSG_RESULT([------------------------------------]) |
@@ -105,6 +118,9 @@ fi | |||
105 | if test $WANT_DBI_MOD -eq 1; then | 118 | if test $WANT_DBI_MOD -eq 1; then |
106 | AC_MSG_RESULT([ libDBI Driver]) | 119 | AC_MSG_RESULT([ libDBI Driver]) |
107 | fi | 120 | fi |
121 | if test $WANT_DBD_MOD -eq 1; then | ||
122 | AC_MSG_RESULT([ APR DBD Driver]) | ||
123 | fi | ||
108 | if test $OOO_MAINTAIN -eq 1; then | 124 | if 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]) |
110 | fi | 126 | fi |
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 | ||
18 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) | 18 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) |
19 | 19 | ||
20 | all: all-subdirs | 20 | all: |
21 | 21 | ||
22 | all-subdirs install-subdirs update-subdirs clean-subdirs distclean-subdirs: | 22 | install: |
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 | ||
37 | include: | 24 | update: |
38 | rm -rf include | ||
39 | ln -s @APACHE_INCDIR@ include | ||
40 | 25 | ||
41 | install: install-subdirs | 26 | clean: |
42 | 27 | ||
43 | update: update-subdirs | 28 | distclean: clean |
44 | |||
45 | clean: clean-subdirs | ||
46 | |||
47 | distclean: clean distclean-subdirs | ||
48 | $(RM) Makefile | 29 | $(RM) Makefile |
49 | 30 | ||
50 | DESTDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@ | ||
51 | DESTTGZ = $(DESTDIR).tar.gz | ||
52 | dist: | ||
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 | |||
74 | local-dist: $(DISTFILES) | 31 | local-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 | |||
52 | distclean: clean distclean-subdirs | 52 | distclean: clean distclean-subdirs |
53 | $(RM) Makefile | 53 | $(RM) Makefile |
54 | 54 | ||
55 | DESTDIR = @PACKAGE_NAME@-@PACKAGE_VERSION@ | ||
56 | DESTTGZ = $(DESTDIR).tar.gz | ||
57 | dist: | ||
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 | |||
79 | local-dist: $(DISTFILES) | 55 | local-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 | |||
17 | use strict; | ||
18 | my $rootdir = "."; | ||
19 | opendir(MYDIR, $rootdir) or die "Unable to open directory"; | ||
20 | print "Building TODO file for source directory\n"; | ||
21 | my $todo_header = "* Things TODO *\n\n"; | ||
22 | if (open ( TODOFILE, "TODO.in")) { | ||
23 | $todo_header = do { local $/; <TODOFILE> }; | ||
24 | close (TODOFILE); | ||
25 | } | ||
26 | open (TODOFILE, "> TODO"); | ||
27 | print TODOFILE $todo_header; | ||
28 | print "Parsing..."; | ||
29 | while (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 | } | ||
63 | print "\n"; | ||
64 | closedir(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 | ||
80 | void log_error(char *file, int line, int level, apr_status_t status, | 83 | void 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 |
84 | inline | 87 | inline |
85 | #endif | 88 | #endif |
86 | void log_error(char *file, int line, int level, | 89 | void 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 | ||
29 | typedef const char *logsql_item_func(request_rec *r, char *a); | 31 | typedef const char *logsql_item_func(request_rec *r, char *a); |
30 | 32 | ||
31 | LOGSQL_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, | 34 | typedef 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 | |||
39 | LOGSQL_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 | |||
43 | LOGSQL_DECLARE(void) log_sql_register_alias(server_rec *s, apr_pool_t *p, | ||
44 | char key, const char *alias); | ||
45 | |||
46 | typedef 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 | |||
54 | LOGSQL_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 | |||
60 | LOGSQL_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 */ |
36 | typedef struct { | 63 | typedef 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 | |||
3 | top_srcdir = @top_srcdir@ | ||
4 | srcdir = @abs_srcdir@ | ||
5 | builddir = @abs_builddir@ | ||
6 | |||
7 | HEADERS = ../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 | |||
15 | CFLAGS = -Wc,-Wall -Wc,-fno-strict-aliasing -I$(top_srcdir)/include | ||
16 | |||
17 | ifeq (@OOO_MAINTAIN@,1) | ||
18 | CFLAGS += -Wc,-Werror | ||
19 | endif | ||
20 | |||
21 | coreSOURCES = @PACKAGE_NAME@.c | ||
22 | coreTARGET = @PACKAGE_NAME@@APXS_EXTENSION@ | ||
23 | coreLDADD = @RT_LIBS@ | ||
24 | coreCFLAGS = | ||
25 | coreNAME = log_sql | ||
26 | TARGETS = $(coreTARGET) | ||
27 | |||
28 | sslSOURCES = @PACKAGE_NAME@_ssl.c | ||
29 | sslTARGET = @PACKAGE_NAME@_ssl@APXS_EXTENSION@ | ||
30 | sslLDADD = | ||
31 | sslCFLAGS = @MOD_SSL_CFLAGS@ | ||
32 | sslNAME = log_sql_ssl | ||
33 | |||
34 | ifeq (@WANT_SSL_MOD@,1) | ||
35 | TARGETS += $(sslTARGET) | ||
36 | endif | ||
37 | |||
38 | logioSOURCES = @PACKAGE_NAME@_logio.c | ||
39 | logioTARGET = @PACKAGE_NAME@_logio@APXS_EXTENSION@ | ||
40 | logioLDADD = | ||
41 | logioCFLAGS = | ||
42 | logioNAME = log_sql_logio | ||
43 | |||
44 | ifeq (@WANT_LOGIO_MOD@,1) | ||
45 | TARGETS += $(logioTARGET) | ||
46 | endif | ||
47 | |||
48 | mysqlSOURCES = @PACKAGE_NAME@_mysql.c | ||
49 | mysqlTARGET = @PACKAGE_NAME@_mysql@APXS_EXTENSION@ | ||
50 | mysqlLDADD = @MYSQL_LDFLAGS@ @MYSQL_LIBS@ | ||
51 | mysqlCFLAGS = @MYSQL_CFLAGS@ | ||
52 | mysqlNAME = log_sql_mysql | ||
53 | |||
54 | ifeq (@WANT_MYSQL_MOD@,1) | ||
55 | TARGETS += $(mysqlTARGET) | ||
56 | endif | ||
57 | |||
58 | pgsqlSOURCES = @PACKAGE_NAME@_pgsql.c | ||
59 | pgsqlTARGET = @PACKAGE_NAME@_pgsql@APXS_EXTENSION@ | ||
60 | pgsqlLDADD = @PGSQL_LDFLAGS@ @PGSQL_LIBS@ | ||
61 | pgsqlCFLAGS = @PGSQL_CFLAGS@ | ||
62 | pgsqlNAME = log_sql_pgsql | ||
63 | |||
64 | ifeq (@WANT_PGSQL_MOD@,1) | ||
65 | TARGETS += $(pgsqlTARGET) | ||
66 | endif | ||
67 | |||
68 | dbiSOURCES = @PACKAGE_NAME@_dbi.c | ||
69 | dbiTARGET = @PACKAGE_NAME@_dbi@APXS_EXTENSION@ | ||
70 | dbiLDADD = @DBI_LDFLAGS@ @DBI_LIBS@ | ||
71 | dbiCFLAGS = @DBI_CFLAGS@ | ||
72 | dbiNAME = log_sql_dbi | ||
73 | |||
74 | ifeq (@WANT_DBI_MOD@,1) | ||
75 | TARGETS += $(dbiTARGET) | ||
76 | endif | ||
77 | |||
78 | dbdSOURCES = @PACKAGE_NAME@_dbd.c | ||
79 | dbdTARGET = @PACKAGE_NAME@_dbd@APXS_EXTENSION@ | ||
80 | dbdLDADD = | ||
81 | dbdCFLAGS = | ||
82 | dbdNAME = log_sql_dbd | ||
83 | |||
84 | ifeq (@WANT_DBD_MOD@,1) | ||
85 | TARGETS += $(dbdTARGET) | ||
86 | endif | ||
87 | |||
88 | OBJ = $(coreSOURCES:.c=.o) $(logioSOURCES:.c=.o) $(sslSOURCES:.c=.o) $(mysqlSOURCES:.c=.o) \ | ||
89 | $(dbiSOURCES:.c=.o) $(pgsqlSOURCES:.c=.o) $(dbdSOURCES:.c=.o) | ||
90 | |||
91 | LO = $(coreSOURCES:.c=.lo) $(logioSOURCES:.c=.lo) $(sslSOURCES:.c=.lo) $(mysqlSOURCES:.c=.lo) \ | ||
92 | $(dbiSOURCES:.c=.lo) $(pgsqlSOURCES:.c=.lo) $(dbdSOURCES:.c=.lo) | ||
93 | |||
94 | SLO = $(coreSOURCES:.c=.slo) $(logioSOURCES:.c=.slo) $(sslSOURCES:.c=.slo) $(mysqlSOURCES:.c=.slo) \ | ||
95 | $(dbiSOURCES:.c=.slo) $(pgsqlSOURCES:.c=.slo) $(dbdSOURCES:.c=.slo) | ||
96 | |||
97 | STD_DIST = Makefile.in | ||
98 | |||
99 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(coreSOURCES) $(HEADERS) \ | ||
100 | $(sslSOURCES) $(logioSOURCES) $(mysqlSOURCES) $(pgsqlSOURCES) $(dbiSOURCES) $(dbdSOURCES) | ||
101 | |||
102 | all: $(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 | |||
132 | install: $(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 | |||
153 | activate: | ||
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 | |||
159 | clean: | ||
160 | $(RM) $(OBJ) $(SLO) $(LO) $(TARGETS) | ||
161 | $(RM) -r .libs | ||
162 | |||
163 | local-dist: $(DISTFILES) | ||
164 | mkdir -p $(DESTDIR) | ||
165 | cp -dp --parents $(DISTFILES) $(DESTDIR) | ||
166 | |||
167 | Makefile: 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 | ||
242 | static 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 | ||
250 | static const char *extract_unique_id(request_rec *r, char *a) | 250 | static 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 | ||
64 | static global_config_t global_config; | 67 | static global_config_t global_config; |
65 | 68 | ||
66 | /* structure to hold helper function info */ | 69 | /* structure to hold helper function info */ |
67 | typedef struct { | 70 | typedef 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 */ | ||
77 | static apr_array_header_t *logsql_function_list; | ||
78 | |||
79 | /* structure to hold sqlfield mappings */ | ||
80 | typedef 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 */ | ||
92 | static 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 | */ | ||
126 | LOGSQL_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); |
103 | static 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); |
108 | LOGSQL_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 | */ | ||
146 | LOGSQL_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 | */ | ||
172 | LOGSQL_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 | */ | ||
200 | LOGSQL_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 | |||
265 | static const char *set_server_string_slot(cmd_parms *cmd, | 375 | static 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 | ||
299 | static const char *set_logformat_slot(cmd_parms *cmd, | 409 | static 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 | ||
313 | static const char *set_server_nmv_string_slot(cmd_parms *parms, | 430 | static 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 | ||
524 | static 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 | |||
537 | static 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 | ||
634 | static 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) |
465 | static int log_sql_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) | 638 | static 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 | |||
467 | static void log_sql_module_init(server_rec *s, apr_pool_t *p) | 640 | static 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 */ | 964 | static 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 | { |
681 | if (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 | ||
717 | static void *log_sql_merge_state(apr_pool_t *p, void *basev, void *addv) | 1011 | static 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 | |||
28 | typedef struct { | ||
29 | ap_dbd_t *dbd; | ||
30 | } request_config_t; | ||
31 | |||
32 | LOGSQL_MODULE_FORWARD(dbd); | ||
33 | |||
34 | static ap_dbd_t *(*dbd_acquire_fn)(request_rec*) = NULL; | ||
35 | |||
36 | static 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 */ | ||
48 | static 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 */ | ||
61 | static 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 | */ | ||
69 | static 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 */ | ||
83 | static 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. */ | ||
107 | static 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 | |||
113 | static const char *supported_drivers[] = {"dbd",NULL}; | ||
114 | static 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 | |||
124 | LOGSQL_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 | */ |
93 | static const char *log_sql_dbi_escape(const char *from_str, apr_pool_t *p, | 93 | static 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 | |||
24 | module AP_MODULE_DECLARE_DATA log_sql_logio_module; | 26 | module 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 | ||
98 | static int logio_pre_conn(conn_rec *c, void *csd) { | 100 | static 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 | ||
109 | static int post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) | 111 | static 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 | |||
115 | static void register_hooks(apr_pool_t *p) { | 128 | static 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 | */ |
77 | static const char *log_sql_mysql_escape(const char *from_str, apr_pool_t *p, | 77 | static 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) | |||
52 | static const char *extract_ssl_maxkeysize(request_rec *r, char *a) | 52 | static 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 | ||
85 | LOGSQL_REGISTER(ssl) | 85 | LOGSQL_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 | |||
3 | top_srcdir = @top_srcdir@ | ||
4 | srcdir = @abs_srcdir@ | ||
5 | top_builddir = @top_builddir@ | ||
6 | builddir = @abs_builddir@ | ||
7 | |||
8 | LIBTOOL=@LIBTOOL@ | ||
9 | CFLAGS = -g3 -Wall -fno-strict-aliasing \ | ||
10 | @APR_INCLUDES@ @APU_INCLUDES@ @PCRE_CFLAGS@ \ | ||
11 | -I$(top_srcdir)/include | ||
12 | CPPFLAGS = @APR_CPPFLAGS@ | ||
13 | LDFLAGS = @APR_LIBTOOL@ @APU_LIBTOOL@ @PCRE_LIBS@ | ||
14 | |||
15 | ifeq (@OOO_MAINTAIN@,1) | ||
16 | CFLAGS += -Werror | ||
17 | endif | ||
18 | |||
19 | STD_DIST = Makefile.in | ||
20 | |||
21 | DISTFILES = $(STD_DIST) $(EXTRA_DIST) $(SOURCES) $(HEADERS) | ||
22 | |||
23 | SOURCES = shell.c config.c logparse.c ap_pcre.c util.c database.c | ||
24 | HEADERS = shell.h config.h logparse.h ap_pcre.h util.h database.h | ||
25 | OBJECTS = $(SOURCES:.c=.o) | ||
26 | DEPS = $(SOURCES:.c=.d) | ||
27 | TARGETS = mod_log_sql | ||
28 | |||
29 | all: $(TARGETS) | ||
30 | |||
31 | mod_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 | |||
41 | clean: | ||
42 | $(RM) $(OBJECTS) $(TARGETS) $(DEPS) | ||
43 | |||
44 | local-dist: $(DISTFILES) | ||
45 | mkdir -p $(DESTDIR) | ||
46 | cp -dp --parents $(DISTFILES) $(DESTDIR) | ||
47 | |||
48 | Makefile: 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 | |||
61 | static 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 | |||
69 | apr_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 | |||
103 | void 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 | |||
122 | int 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 | |||
154 | int 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 | |||
239 | static apr_status_t regex_cleanup(void *preg) | ||
240 | { | ||
241 | ap_regfree((ap_regex_t *) preg); | ||
242 | return APR_SUCCESS; | ||
243 | } | ||
244 | |||
245 | ap_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 | |||
259 | void 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 | |||
279 | char * 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 | ----------------------------------------------------------------------------- | ||
22 | Redistribution and use in source and binary forms, with or without | ||
23 | modification, 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 | |||
36 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
37 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
38 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
39 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
40 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
41 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
42 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
43 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
44 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
45 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
46 | POSSIBILITY 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 | ||
63 | extern "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: */ | ||
79 | enum { | ||
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. */ | ||
87 | typedef 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. */ | ||
94 | typedef 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 | */ | ||
108 | int 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 | */ | ||
119 | int 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 | */ | ||
129 | apr_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 | */ | ||
135 | void 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 | */ | ||
149 | ap_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 | */ | ||
157 | void 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 | */ | ||
170 | char * 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 | |||
14 | apr_hash_t *g_config_opts; | ||
15 | |||
16 | static 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 | |||
27 | static 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 | |||
39 | static 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 | |||
50 | static 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 | |||
61 | static 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 | |||
78 | static 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 | |||
93 | static 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 | |||
99 | static 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 | |||
122 | static 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 | |||
174 | static 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 | |||
216 | void 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 | |||
306 | static 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 | |||
321 | void 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 | |||
399 | config_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 | |||
423 | apr_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 | |||
451 | static 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 | |||
467 | apr_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 | |||
9 | typedef enum { | ||
10 | LOGLEVEL_NOISE = 0, | ||
11 | LOGLEVEL_NONE, | ||
12 | LOGLEVEL_ERROR, | ||
13 | LOGLEVEL_NOTICE, | ||
14 | LOGLEVEL_DEBUG, | ||
15 | } loglevel_e; | ||
16 | |||
17 | typedef struct config_dbd_t config_dbd_t; | ||
18 | typedef struct config_t config_t; | ||
19 | struct 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 | |||
91 | typedef struct config_filestat_t config_filestat_t; | ||
92 | struct 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 | |||
102 | typedef struct config_logformat_t config_logformat_t; | ||
103 | struct config_logformat_t { | ||
104 | const char *name; | ||
105 | apr_array_header_t *fields; | ||
106 | }; | ||
107 | |||
108 | typedef struct config_logformat_field_t config_logformat_field_t; | ||
109 | struct config_logformat_field_t { | ||
110 | const char *name; | ||
111 | const char *datatype; | ||
112 | }; | ||
113 | |||
114 | typedef struct config_opt_t config_opt_t; | ||
115 | typedef apr_status_t (*config_func_t)(config_t *cfg, config_opt_t *opt, | ||
116 | int argc, const char **argv); | ||
117 | struct config_opt_t { | ||
118 | const char *name; | ||
119 | const char *help; | ||
120 | config_func_t func; | ||
121 | void *data; | ||
122 | }; | ||
123 | |||
124 | typedef struct config_filter_t config_filter_t; | ||
125 | struct config_filter_t { | ||
126 | const char *field; | ||
127 | const char *filter; | ||
128 | int negative; | ||
129 | ap_regex_t *regex; | ||
130 | }; | ||
131 | |||
132 | typedef 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 | |||
146 | typedef struct config_output_field_t config_output_field_t; | ||
147 | |||
148 | typedef struct parser_func_t parser_func_t; | ||
149 | |||
150 | struct 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 | */ | ||
167 | void config_init(apr_pool_t *p); | ||
168 | |||
169 | /** | ||
170 | * Dump the configuration to stdout | ||
171 | */ | ||
172 | void config_dump(config_t *cfg); | ||
173 | |||
174 | /** | ||
175 | * Checks the configuration to ensure all the required settings are set | ||
176 | */ | ||
177 | apr_status_t config_check(config_t *cfg); | ||
178 | |||
179 | /** | ||
180 | * Creates the default configuration | ||
181 | */ | ||
182 | config_t *config_create(apr_pool_t *p); | ||
183 | |||
184 | /** | ||
185 | * Read in a configuration file | ||
186 | */ | ||
187 | apr_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 | |||
9 | struct 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 | |||
17 | void database_init(apr_pool_t *p) | ||
18 | { | ||
19 | apr_dbd_init(p); | ||
20 | } | ||
21 | |||
22 | /** @todo split this into load and connect */ | ||
23 | apr_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 | |||
52 | apr_status_t database_disconnect(config_dbd_t *dbconn) | ||
53 | { | ||
54 | return apr_dbd_close(dbconn->driver, dbconn->dbd); | ||
55 | } | ||
56 | |||
57 | static 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 | |||
110 | apr_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 | |||
139 | apr_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 | |||
164 | apr_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 | |||
190 | apr_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 | |||
8 | void database_init(apr_pool_t *p); | ||
9 | |||
10 | apr_status_t database_connect(config_t *cfg, config_dbd_t **dbconn); | ||
11 | |||
12 | apr_status_t database_disconnect(config_dbd_t *dbconn); | ||
13 | |||
14 | apr_status_t database_insert(config_t *cfg, config_dbd_t *dbconn, | ||
15 | apr_pool_t *p, apr_table_t *data); | ||
16 | |||
17 | apr_status_t database_trans_start(config_t *cfg, config_dbd_t *dbconn, | ||
18 | apr_pool_t *p); | ||
19 | |||
20 | apr_status_t database_trans_stop(config_t *cfg, config_dbd_t *dbconn, | ||
21 | apr_pool_t *p); | ||
22 | |||
23 | apr_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 | |||
14 | apr_hash_t *g_parser_funcs; | ||
15 | void **g_parser_linedata; | ||
16 | |||
17 | static 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 | |||
39 | static 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 | |||
76 | static 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 | |||
91 | static 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 | |||
100 | static 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 | |||
157 | parser_func_t *parser_get_func(const char *name) | ||
158 | { | ||
159 | return apr_hash_get(g_parser_funcs, name, APR_HASH_KEY_STRING); | ||
160 | } | ||
161 | |||
162 | static 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 | |||
177 | void 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 | |||
189 | void 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 | |||
219 | void 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 | |||
373 | apr_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 | */ | ||
437 | apr_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 | |||
547 | apr_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 | |||
654 | apr_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 | |||
6 | typedef 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 | |||
9 | struct 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 | |||
20 | parser_func_t *parser_get_func(const char *name); | ||
21 | |||
22 | void parser_init(apr_pool_t *p); | ||
23 | |||
24 | void parser_find_logs(config_t *cfg); | ||
25 | |||
26 | void parser_split_logs(config_t *cfg); | ||
27 | |||
28 | apr_status_t parser_tokenize_line(const char *arg_str, char ***argv_out, | ||
29 | apr_pool_t *token_context); | ||
30 | |||
31 | apr_status_t parser_parsefile(config_t *cfg, config_dbd_t *dbconn, | ||
32 | config_filestat_t *fstat); | ||
33 | |||
34 | apr_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 @@ | |||
1 | InputDirectory ./logs | ||
2 | ErrorLog ./error_log | ||
3 | |||
4 | DBDDriver mysql | ||
5 | DBDParams "host=localhost;user=root;dbname=apache_log" | ||
6 | Table access_log | ||
7 | MachineID 7of9 | ||
8 | UseTransactions on | ||
9 | LogLevel notice | ||
10 | DryRun off | ||
11 | Summary on | ||
12 | |||
13 | SplitInput on | ||
14 | #SplitCount 4 | ||
15 | SplitMinLines 0 | ||
16 | SplitMaxLines 50000 | ||
17 | SplitDirectory ./split_temp | ||
18 | |||
19 | #ThreadCount 0 | ||
20 | |||
21 | BadLineFile ./badlines.log | ||
22 | BadLineMax 10 | ||
23 | |||
24 | LogFormatConfig CLF remhost String | ||
25 | LogFormatConfig CLF ident String | ||
26 | LogFormatConfig CLF user String | ||
27 | LogFormatConfig CLF date Date | ||
28 | LogFormatConfig CLF request String | ||
29 | LogFormatConfig CLF status Number | ||
30 | LogFormatConfig CLF bytes_sent Number | ||
31 | |||
32 | LogFormatConfig Combined remhost String | ||
33 | LogFormatConfig Combined ident String | ||
34 | LogFormatConfig Combined user String | ||
35 | LogFormatConfig Combined date Date | ||
36 | LogFormatConfig Combined request String | ||
37 | LogFormatConfig Combined status Number | ||
38 | LogFormatConfig Combined bytes_sent Number | ||
39 | LogFormatConfig Combined referer String | ||
40 | LogFormatConfig Combined agent String | ||
41 | |||
42 | LogFormat 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]...] | ||
53 | OutputField bytes_sent int 0 bytes_sent | ||
54 | OutputField request_protocol varchar(10) "" request regexmatch "(HTTP/[\\d\\.]+)$" | ||
55 | OutputField remote_host varchar(50) "" remhost | ||
56 | OutputField request_method varchar(25) "" request regexmatch "^(\\w+)" | ||
57 | OutputField time_stamp int 0 date totimestamp | ||
58 | OutputField status smallint 0 status | ||
59 | OutputField request_line varchar(255) "" request | ||
60 | #OutputField request_uri varchar(255) "" request regexmatch "^\\w+ (.+) \\w+/[\\d\\.]+$" | ||
61 | OutputField remote_user varchar(50) "" user | ||
62 | OutputField remote_logname varchar(50) "" ident | ||
63 | OutputField request_time char(28) "" date wrap "[" "]" | ||
64 | #Only used for Combined log input, if standard CLF input, they are ignored | ||
65 | OutputField agent varchar(255) "" agent | ||
66 | OutputField referer varchar(255) "" referer | ||
67 | OutputField machine_id varchar(25) "" "" machineid | ||
68 | #VIZU Fields | ||
69 | OutputField 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 | |||
19 | static apr_queue_t *queue; | ||
20 | |||
21 | void run_multithreaded(config_t *cfg); | ||
22 | #endif | ||
23 | |||
24 | void run_singlethreaded(config_t *cfg); | ||
25 | |||
26 | const 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 | |||
42 | void 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 | |||
70 | void 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 | |||
114 | int 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 | |||
244 | void 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 | ||
274 | void * 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 | |||
307 | void 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 | |||
11 | char *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 | |||
22 | void 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 | */ | ||
38 | static 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 | */ | ||
60 | static 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 | */ | ||
118 | int 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 | |||
128 | void 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 | |||
134 | void 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 | |||
153 | const char *logging_strerror(apr_status_t rv) | ||
154 | { | ||
155 | char buff[256]; | ||
156 | return apr_strerror(rv, buff, 256); | ||
157 | } | ||
158 | |||
159 | void 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 | |||
8 | char *lowerstr(apr_pool_t *pool, const char *input); | ||
9 | |||
10 | /** | ||
11 | * Chomp new line characters off the end of the line | ||
12 | */ | ||
13 | void line_chomp(char *str); | ||
14 | |||
15 | int ap_unescape_url(char *url); | ||
16 | |||
17 | void logging_preinit(config_t *cfg); | ||
18 | |||
19 | void logging_init(config_t *cfg); | ||
20 | |||
21 | void logging_log(config_t *cfg, loglevel_e level, const char *fmt, ...) | ||
22 | __attribute__((format(printf, 3, 4))); | ||
23 | |||
24 | const char *logging_strerror(apr_status_t rv); | ||
25 | |||
26 | #endif /*UTIL_H_*/ | ||