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_*/ | ||
