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

📄 mod_imap.c

📁 apache 安装教程 apache 安装教程
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (value && *value) {	return ap_pstrcat(r->pool, my_base, value, NULL);    }    return my_base;}static int imap_reply(request_rec *r, char *redirect){    if (!strcasecmp(redirect, "error")) {        return SERVER_ERROR;    /* they actually requested an error! */    }    if (!strcasecmp(redirect, "nocontent")) {        return HTTP_NO_CONTENT; /* tell the client to keep the page it has */    }    if (redirect && *redirect) {        ap_table_setn(r->headers_out, "Location", redirect);        return REDIRECT;        /* must be a URL, so redirect to it */    }    return SERVER_ERROR;}static void menu_header(request_rec *r, char *menu){    r->content_type = "text/html";    ap_send_http_header(r);#ifdef CHARSET_EBCDIC    /* Server-generated response, converted */    ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, r->ebcdic.conv_out = 1);#endif    ap_hard_timeout("send menu", r);       /* killed in menu_footer */    ap_rvputs(r, DOCTYPE_HTML_3_2, "<html><head>\n<title>Menu for ", r->uri,           "</title>\n</head><body>\n", NULL);    if (!strcasecmp(menu, "formatted")) {        ap_rvputs(r, "<h1>Menu for ", r->uri, "</h1>\n<hr>\n\n", NULL);    }    return;}static void menu_blank(request_rec *r, char *menu){    if (!strcasecmp(menu, "formatted")) {        ap_rputs("\n", r);    }    if (!strcasecmp(menu, "semiformatted")) {        ap_rputs("<br>\n", r);    }    if (!strcasecmp(menu, "unformatted")) {        ap_rputs("\n", r);    }    return;}static void menu_comment(request_rec *r, char *menu, char *comment){    if (!strcasecmp(menu, "formatted")) {        ap_rputs("\n", r);         /* print just a newline if 'formatted' */    }    if (!strcasecmp(menu, "semiformatted") && *comment) {        ap_rvputs(r, comment, "\n", NULL);    }    if (!strcasecmp(menu, "unformatted") && *comment) {        ap_rvputs(r, comment, "\n", NULL);    }    return;                     /* comments are ignored in the                                   'formatted' form */}static void menu_default(request_rec *r, char *menu, char *href, char *text){    if (!strcasecmp(href, "error") || !strcasecmp(href, "nocontent")) {        return;                 /* don't print such lines, these aren't                                   really href's */    }    if (!strcasecmp(menu, "formatted")) {        ap_rvputs(r, "<pre>(Default) <a href=\"", href, "\">", text,               "</a></pre>\n", NULL);    }    if (!strcasecmp(menu, "semiformatted")) {        ap_rvputs(r, "<pre>(Default) <a href=\"", href, "\">", text,               "</a></pre>\n", NULL);    }    if (!strcasecmp(menu, "unformatted")) {        ap_rvputs(r, "<a href=\"", href, "\">", text, "</a>", NULL);    }    return;}static void menu_directive(request_rec *r, char *menu, char *href, char *text){    if (!strcasecmp(href, "error") || !strcasecmp(href, "nocontent")) {        return;                 /* don't print such lines, as this isn't                                   really an href */    }    if (!strcasecmp(menu, "formatted")) {        ap_rvputs(r, "<pre>          <a href=\"", href, "\">", text,               "</a></pre>\n", NULL);    }    if (!strcasecmp(menu, "semiformatted")) {        ap_rvputs(r, "<pre>          <a href=\"", href, "\">", text,               "</a></pre>\n", NULL);    }    if (!strcasecmp(menu, "unformatted")) {        ap_rvputs(r, "<a href=\"", href, "\">", text, "</a>", NULL);    }    return;}static void menu_footer(request_rec *r){    ap_rputs("\n\n</body>\n</html>\n", r);         /* finish the menu */    ap_kill_timeout(r);}static int imap_handler(request_rec *r){    char input[MAX_STRING_LEN];    char *directive;    char *value;    char *href_text;    char *base;    char *redirect;    char *mapdflt;    char *closest = NULL;    double closest_yet = -1;    double testpoint[2];    double pointarray[MAXVERTS + 1][2];    int vertex;    char *string_pos;    int showmenu = 0;    imap_conf_rec *icr = ap_get_module_config(r->per_dir_config, &imap_module);    char *imap_menu = icr->imap_menu ? icr->imap_menu : IMAP_MENU_DEFAULT;    char *imap_default = icr->imap_default			    ?  icr->imap_default : IMAP_DEFAULT_DEFAULT;    char *imap_base = icr->imap_base ? icr->imap_base : IMAP_BASE_DEFAULT;    configfile_t *imap;     if (r->method_number != M_GET) {	return DECLINED;    }    imap = ap_pcfg_openfile(r->pool, r->filename);    if (!imap) {        return NOT_FOUND;    }    base = imap_url(r, NULL, imap_base);         /* set base according                                                    to default */    if (!base) {	return HTTP_INTERNAL_SERVER_ERROR;    }    mapdflt = imap_url(r, NULL, imap_default);   /* and default to                                                    global default */    if (!mapdflt) {	return HTTP_INTERNAL_SERVER_ERROR;    }    testpoint[X] = get_x_coord(r->args);    testpoint[Y] = get_y_coord(r->args);    if ((testpoint[X] == -1 || testpoint[Y] == -1) ||        (testpoint[X] == 0 && testpoint[Y] == 0)) {        /* if either is -1 or if both are zero (new Lynx) */        /* we don't have valid coordinates */        testpoint[X] = -1;        testpoint[Y] = -1;        if (strncasecmp(imap_menu, "none", 2)) {            showmenu = 1;       /* show the menu _unless_ ImapMenu is                                   'none' or 'no' */	}    }    if (showmenu) {             /* send start of imagemap menu if                                   we're going to */        menu_header(r, imap_menu);    }    while (!ap_cfg_getline(input, sizeof(input), imap)) {        if (!input[0]) {            if (showmenu) {                menu_blank(r, imap_menu);            }            continue;        }        if (input[0] == '#') {            if (showmenu) {                menu_comment(r, imap_menu, input + 1);            }            continue;        }                       /* blank lines and comments are ignored                                   if we aren't printing a menu */	/* find the first two space delimited fields, recall that	 * ap_cfg_getline has removed leading/trailing whitespace.	 *	 * note that we're tokenizing as we go... if we were to use the	 * ap_getword() class of functions we would end up allocating extra	 * memory for every line of the map file	 */        string_pos = input;	if (!*string_pos) {		/* need at least two fields */	    goto need_2_fields;	}	directive = string_pos;	while (*string_pos && !ap_isspace(*string_pos)) {	/* past directive */	    ++string_pos;	}	if (!*string_pos) {		/* need at least two fields */	    goto need_2_fields;	}	*string_pos++ = '\0';	if (!*string_pos) {		/* need at least two fields */	    goto need_2_fields;	}	while(*string_pos && ap_isspace(*string_pos)) { /* past whitespace */	    ++string_pos;	}	value = string_pos;	while (*string_pos && !ap_isspace(*string_pos)) {	/* past value */	    ++string_pos;	}	if (ap_isspace(*string_pos)) {	    *string_pos++ = '\0';	}	else {	    /* end of input, don't advance past it */	    *string_pos = '\0';	}        if (!strncasecmp(directive, "base", 4)) {       /* base, base_uri */            base = imap_url(r, NULL, value);	    if (!base) {		goto menu_bail;	    }            continue;           /* base is never printed to a menu */        }        read_quoted(&string_pos, &href_text);        if (!strcasecmp(directive, "default")) {        /* default */            mapdflt = imap_url(r, NULL, value);	    if (!mapdflt) {		goto menu_bail;	    }            if (showmenu) {     /* print the default if there's a menu */                redirect = imap_url(r, base, mapdflt);		if (!redirect) {		    goto menu_bail;		}                menu_default(r, imap_menu, redirect,                             href_text ? href_text : mapdflt);            }            continue;        }        vertex = 0;        while (vertex < MAXVERTS &&               sscanf(string_pos, "%lf%*[, ]%lf",                      &pointarray[vertex][X], &pointarray[vertex][Y]) == 2) {            /* Now skip what we just read... we can't use ANSIism %n */            while (ap_isspace(*string_pos)) {      /* past whitespace */                string_pos++;	    }            while (ap_isdigit(*string_pos)) {      /* and the 1st number */                string_pos++;	    }            string_pos++;       /* skip the ',' */            while (ap_isspace(*string_pos)) {      /* past any more whitespace */                string_pos++;	    }            while (ap_isdigit(*string_pos)) {      /* 2nd number */                string_pos++;	    }            vertex++;        }                       /* so long as there are more vertices to                                   read, and we have room, read them in.                                   We start where we left off of the last                                   sscanf, not at the beginning. */        pointarray[vertex][X] = -1;     /* signals the end of vertices */        if (showmenu) {	    if (!href_text) {		read_quoted(&string_pos, &href_text);     /* href text could                                                             be here instead */	    }            redirect = imap_url(r, base, value);	    if (!redirect) {		goto menu_bail;	    }            menu_directive(r, imap_menu, redirect,                           href_text ? href_text : value);            continue;        }        /* note that we don't make it past here if we are making a menu */        if (testpoint[X] == -1 || pointarray[0][X] == -1) {            continue;           /* don't try the following tests if testpoints                                   are invalid, or if there are no                                   coordinates */	}        if (!strcasecmp(directive, "poly")) {   /* poly */            if (pointinpoly(testpoint, pointarray)) {		ap_cfg_closefile(imap);                redirect = imap_url(r, base, value);		if (!redirect) {		    return HTTP_INTERNAL_SERVER_ERROR;		}                return (imap_reply(r, redirect));            }            continue;        }        if (!strcasecmp(directive, "circle")) {         /* circle */            if (pointincircle(testpoint, pointarray)) {		ap_cfg_closefile(imap);                redirect = imap_url(r, base, value);		if (!redirect) {		    return HTTP_INTERNAL_SERVER_ERROR;		}                return (imap_reply(r, redirect));            }            continue;        }        if (!strcasecmp(directive, "rect")) {   /* rect */            if (pointinrect(testpoint, pointarray)) {		ap_cfg_closefile(imap);                redirect = imap_url(r, base, value);		if (!redirect) {		    return HTTP_INTERNAL_SERVER_ERROR;		}                return (imap_reply(r, redirect));            }            continue;        }        if (!strcasecmp(directive, "point")) {  /* point */            if (is_closer(testpoint, pointarray, &closest_yet)) {		closest = ap_pstrdup(r->pool, value);            }            continue;        }                       /* move on to next line whether it's                                   closest or not */    }                           /* nothing matched, so we get another line! */    ap_cfg_closefile(imap);        /* we are done with the map file; close it */    if (showmenu) {        menu_footer(r);         /* finish the menu and we are done */        return OK;    }    if (closest) {             /* if a 'point' directive has been seen */        redirect = imap_url(r, base, closest);	if (!redirect) {	    return HTTP_INTERNAL_SERVER_ERROR;	}        return (imap_reply(r, redirect));    }    if (mapdflt) {             /* a default should be defined, even if                                  only 'nocontent' */        redirect = imap_url(r, base, mapdflt);	if (!redirect) {	    return HTTP_INTERNAL_SERVER_ERROR;	}        return (imap_reply(r, redirect));    }    return HTTP_INTERNAL_SERVER_ERROR;        /* If we make it this far,                                                 we failed. They lose! */need_2_fields:    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,		"map file %s, line %d syntax error: requires at "                "least two fields", r->uri, imap->line_number);    /* fall through */menu_bail:    ap_cfg_closefile(imap);    if (showmenu) {	/* There's not much else we can do ... we've already sent the headers	 * to the client.	 */	ap_rputs("\n\n[an internal server error occured]\n", r);	menu_footer(r);	return OK;    }    return HTTP_INTERNAL_SERVER_ERROR;}static const handler_rec imap_handlers[] ={    {IMAP_MAGIC_TYPE, imap_handler},    {"imap-file", imap_handler},    {NULL}};module MODULE_VAR_EXPORT imap_module ={    STANDARD_MODULE_STUFF,    NULL,                       /* initializer */    create_imap_dir_config,     /* dir config creater */    merge_imap_dir_configs,     /* dir merger --- default is to override */    NULL,                       /* server config */    NULL,                       /* merge server config */    imap_cmds,                  /* command table */    imap_handlers,              /* handlers */    NULL,                       /* filename translation */    NULL,                       /* check_user_id */    NULL,                       /* check auth */    NULL,                       /* check access */    NULL,                       /* type_checker */    NULL,                       /* fixups */    NULL,                       /* logger */    NULL,                       /* header parser */    NULL,                       /* child_init */    NULL,                       /* child_exit */    NULL                        /* post read-request */};

⌨️ 快捷键说明

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