⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_log_agent.c

📁 apache 安装教程 apache 安装教程
💻 C
字号:
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include "httpd.h"#include "http_config.h"#include "http_log.h"module agent_log_module;static int xfer_flags = (O_WRONLY | O_APPEND | O_CREAT);#ifdef OS2/* OS/2 dosen't support users and groups */static mode_t xfer_mode = (S_IREAD | S_IWRITE);#elsestatic mode_t xfer_mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);#endiftypedef struct {    char *fname;    int agent_fd;} agent_log_state;static void *make_agent_log_state(pool *p, server_rec *s){    agent_log_state *cls =    (agent_log_state *) ap_palloc(p, sizeof(agent_log_state));    cls->fname = "";    cls->agent_fd = -1;    return (void *) cls;}static const char *set_agent_log(cmd_parms *parms, void *dummy, char *arg){    agent_log_state *cls = ap_get_module_config(parms->server->module_config,                                             &agent_log_module);    cls->fname = arg;    return NULL;}static const command_rec agent_log_cmds[] ={    {"AgentLog", set_agent_log, NULL, RSRC_CONF, TAKE1,     "the filename of the agent log"},    {NULL}};static void open_agent_log(server_rec *s, pool *p){    agent_log_state *cls = ap_get_module_config(s->module_config,                                             &agent_log_module);    char *fname = ap_server_root_relative(p, cls->fname);    if (cls->agent_fd > 0)        return;                 /* virtual log shared w/main server */    if (*cls->fname == '|') {        piped_log *pl;        pl = ap_open_piped_log(p, cls->fname + 1);        if (pl == NULL) {	    ap_log_error(APLOG_MARK, APLOG_ERR, s,			 "couldn't spawn agent log pipe");            exit(1);        }        cls->agent_fd = ap_piped_log_write_fd(pl);    }    else if (*cls->fname != '\0') {        if ((cls->agent_fd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1))             < 0) {            ap_log_error(APLOG_MARK, APLOG_ERR, s,                         "could not open agent log file %s.", fname);            exit(1);        }    }}static void init_agent_log(server_rec *s, pool *p){    for (; s; s = s->next)        open_agent_log(s, p);}static int agent_log_transaction(request_rec *orig){    agent_log_state *cls = ap_get_module_config(orig->server->module_config,                                             &agent_log_module);    char str[HUGE_STRING_LEN];    const char *agent;    request_rec *r;    if (cls->agent_fd < 0)        return OK;    for (r = orig; r->next; r = r->next)        continue;    if (*cls->fname == '\0')    /* Don't log agent */        return DECLINED;    agent = ap_table_get(orig->headers_in, "User-Agent");    if (agent != NULL) {        ap_snprintf(str, sizeof(str), "%s\n", agent);        write(cls->agent_fd, str, strlen(str));    }    return OK;}module agent_log_module ={    STANDARD_MODULE_STUFF,    init_agent_log,             /* initializer */    NULL,                       /* create per-dir config */    NULL,                       /* merge per-dir config */    make_agent_log_state,       /* server config */    NULL,                       /* merge server config */    agent_log_cmds,             /* command table */    NULL,                       /* handlers */    NULL,                       /* filename translation */    NULL,                       /* check_user_id */    NULL,                       /* check auth */    NULL,                       /* check access */    NULL,                       /* type_checker */    NULL,                       /* fixups */    agent_log_transaction,      /* logger */    NULL,                       /* header parser */    NULL,                       /* child_init */    NULL,                       /* child_exit */    NULL                        /* post read-request */};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -