📄 mod_usertrack.c
字号:
fp = fopen(session_gdbm, "r"); if(fp == NULL) { db = gdbm_open(session_gdbm, 2048, GDBM_WRITER|GDBM_WRCREAT|GDBM_SYNC|GDBM_NOLOCK, 0644 ,0); } else { db = gdbm_open(session_gdbm, 2048, GDBM_WRITER, 0644 ,0); } fclose(fp); if (db ==NULL) { fprintf(stderr, "create %s error\n",session_gdbm); } //iRet = gdbm_fdesc(db); name.dptr = sessionID; name.dsize = strlen(sessionID); iRet = gdbm_exists(db, name); if(iRet) { value = gdbm_fetch(db, name); if(value.dptr != NULL) { strcpy(sessions, value.dptr); sessions[value.dsize] = '\0'; strcat(sessions, sessionURL); strcat(sessions, ";"); sessions[strlen(sessions)] = '\0'; } else { fprintf(stderr, "error fetching gdbm lib file"); gdbm_close(db); return DECLINED; } } else { strcpy(sessions, sessionURL); strcat(sessions, ";"); sessions[strlen(sessions)] = '\0'; } value.dptr = sessions; value.dsize = strlen(sessions); iRet = gdbm_store(db, name, value, GDBM_REPLACE); gdbm_close(db); fp = fopen("/home/zhiyong/software/apache2/cgi-bin/sessions.txt", "a+"); fprintf(fp,"Your Session ID:%s\n", sessionID); fprintf(fp,"Your session url :%s\n", sessionURL); fclose(fp); return DECLINED; /* There's already a cookie, no new one */ } } make_cookie(r); return OK; /* We set our cookie */}static void *make_cookie_log_state(apr_pool_t *p, server_rec *s){ cookie_log_state *cls = (cookie_log_state *) apr_palloc(p, sizeof(cookie_log_state)); cls->expires = 0; return (void *) cls;}static void *make_cookie_dir(apr_pool_t *p, char *d){ cookie_dir_rec *dcfg; dcfg = (cookie_dir_rec *) apr_pcalloc(p, sizeof(cookie_dir_rec)); dcfg->cookie_name = COOKIE_NAME; dcfg->cookie_domain = NULL; dcfg->style = CT_UNSET; dcfg->enabled = 0; /* In case the user does not use the CookieName directive, * we need to compile the regexp for the default cookie name. */ set_and_comp_regexp(dcfg, p, COOKIE_NAME); return dcfg;}static const char *set_cookie_enable(cmd_parms *cmd, void *mconfig, int arg){ cookie_dir_rec *dcfg = mconfig; dcfg->enabled = arg; return NULL;}static const char *set_cookie_exp(cmd_parms *parms, void *dummy, const char *arg){ cookie_log_state *cls; time_t factor, modifier = 0; time_t num = 0; char *word; cls = ap_get_module_config(parms->server->module_config, &usertrack_module); /* The simple case first - all numbers (we assume) */ if (apr_isdigit(arg[0]) && apr_isdigit(arg[strlen(arg) - 1])) { cls->expires = atol(arg); return NULL; } /* * The harder case - stolen from mod_expires * * CookieExpires "[plus] {<num> <type>}*" */ word = ap_getword_conf(parms->pool, &arg); if (!strncasecmp(word, "plus", 1)) { word = ap_getword_conf(parms->pool, &arg); }; /* {<num> <type>}* */ while (word[0]) { /* <num> */ if (apr_isdigit(word[0])) num = atoi(word); else return "bad expires code, numeric value expected."; /* <type> */ word = ap_getword_conf(parms->pool, &arg); if (!word[0]) return "bad expires code, missing <type>"; factor = 0; if (!strncasecmp(word, "years", 1)) factor = 60 * 60 * 24 * 365; else if (!strncasecmp(word, "months", 2)) factor = 60 * 60 * 24 * 30; else if (!strncasecmp(word, "weeks", 1)) factor = 60 * 60 * 24 * 7; else if (!strncasecmp(word, "days", 1)) factor = 60 * 60 * 24; else if (!strncasecmp(word, "hours", 1)) factor = 60 * 60; else if (!strncasecmp(word, "minutes", 2)) factor = 60; else if (!strncasecmp(word, "seconds", 1)) factor = 1; else return "bad expires code, unrecognized type"; modifier = modifier + factor * num; /* next <num> */ word = ap_getword_conf(parms->pool, &arg); } cls->expires = modifier; return NULL;}static const char *set_cookie_name(cmd_parms *cmd, void *mconfig, const char *name){ cookie_dir_rec *dcfg = (cookie_dir_rec *) mconfig; dcfg->cookie_name = apr_pstrdup(cmd->pool, name); set_and_comp_regexp(dcfg, cmd->pool, name); if (dcfg->regexp == NULL) { return "Regular expression could not be compiled."; } if (dcfg->regexp->re_nsub + 1 != NUM_SUBS) { return apr_pstrcat(cmd->pool, "Invalid cookie name \"", name, "\"", NULL); } return NULL;}/* * Set the value for the 'Domain=' attribute. */static const char *set_cookie_domain(cmd_parms *cmd, void *mconfig, const char *name){ cookie_dir_rec *dcfg; dcfg = (cookie_dir_rec *) mconfig; /* * Apply the restrictions on cookie domain attributes. */ if (strlen(name) == 0) { return "CookieDomain values may not be null"; } if (name[0] != '.') { return "CookieDomain values must begin with a dot"; } if (ap_strchr_c(&name[1], '.') == NULL) { return "CookieDomain values must contain at least one embedded dot"; } dcfg->cookie_domain = apr_pstrdup(cmd->pool, name); return NULL;}/* * Make a note of the cookie style we should use. */static const char *set_cookie_style(cmd_parms *cmd, void *mconfig, const char *name){ cookie_dir_rec *dcfg; dcfg = (cookie_dir_rec *) mconfig; if (strcasecmp(name, "Netscape") == 0) { dcfg->style = CT_NETSCAPE; } else if ((strcasecmp(name, "Cookie") == 0) || (strcasecmp(name, "RFC2109") == 0)) { dcfg->style = CT_COOKIE; } else if ((strcasecmp(name, "Cookie2") == 0) || (strcasecmp(name, "RFC2965") == 0)) { dcfg->style = CT_COOKIE2; } else { return apr_psprintf(cmd->pool, "Invalid %s keyword: '%s'", cmd->cmd->name, name); } return NULL;}static const command_rec cookie_log_cmds[] = { AP_INIT_TAKE1("CookieExpires", set_cookie_exp, NULL, OR_FILEINFO, "an expiry date code"), AP_INIT_TAKE1("CookieDomain", set_cookie_domain, NULL, OR_FILEINFO, "domain to which this cookie applies"), AP_INIT_TAKE1("CookieStyle", set_cookie_style, NULL, OR_FILEINFO, "'Netscape', 'Cookie' (RFC2109), or 'Cookie2' (RFC2965)"), AP_INIT_FLAG("CookieTracking", set_cookie_enable, NULL, OR_FILEINFO, "whether or not to enable cookies"), AP_INIT_TAKE1("CookieName", set_cookie_name, NULL, OR_FILEINFO, "name of the tracking cookie"), {NULL}};static void register_hooks(apr_pool_t *p){ ap_hook_fixups(spot_cookie,NULL,NULL,APR_HOOK_MIDDLE);}module AP_MODULE_DECLARE_DATA usertrack_module = { STANDARD20_MODULE_STUFF, make_cookie_dir, /* dir config creater */ NULL, /* dir merger --- default is to override */ make_cookie_log_state, /* server config */ NULL, /* merge server configs */ cookie_log_cmds, /* command apr_table_t */ register_hooks /* register hooks */};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -