Annotation of embedaddon/lighttpd/src/mod_skeleton.c, revision 1.1.1.1

1.1       misho       1: #include "base.h"
                      2: #include "log.h"
                      3: #include "buffer.h"
                      4: 
                      5: #include "plugin.h"
                      6: 
                      7: #include <ctype.h>
                      8: #include <stdlib.h>
                      9: #include <string.h>
                     10: 
                     11: /**
                     12:  * this is a skeleton for a lighttpd plugin
                     13:  *
                     14:  * just replaces every occurance of 'skeleton' by your plugin name
                     15:  *
                     16:  * e.g. in vim:
                     17:  *
                     18:  *   :%s/skeleton/myhandler/
                     19:  *
                     20:  */
                     21: 
                     22: 
                     23: 
                     24: /* plugin config for all request/connections */
                     25: 
                     26: typedef struct {
                     27:        array *match;
                     28: } plugin_config;
                     29: 
                     30: typedef struct {
                     31:        PLUGIN_DATA;
                     32: 
                     33:        buffer *match_buf;
                     34: 
                     35:        plugin_config **config_storage;
                     36: 
                     37:        plugin_config conf;
                     38: } plugin_data;
                     39: 
                     40: typedef struct {
                     41:        size_t foo;
                     42: } handler_ctx;
                     43: 
                     44: static handler_ctx * handler_ctx_init() {
                     45:        handler_ctx * hctx;
                     46: 
                     47:        hctx = calloc(1, sizeof(*hctx));
                     48: 
                     49:        return hctx;
                     50: }
                     51: 
                     52: static void handler_ctx_free(handler_ctx *hctx) {
                     53: 
                     54:        free(hctx);
                     55: }
                     56: 
                     57: /* init the plugin data */
                     58: INIT_FUNC(mod_skeleton_init) {
                     59:        plugin_data *p;
                     60: 
                     61:        p = calloc(1, sizeof(*p));
                     62: 
                     63:        p->match_buf = buffer_init();
                     64: 
                     65:        return p;
                     66: }
                     67: 
                     68: /* detroy the plugin data */
                     69: FREE_FUNC(mod_skeleton_free) {
                     70:        plugin_data *p = p_d;
                     71: 
                     72:        UNUSED(srv);
                     73: 
                     74:        if (!p) return HANDLER_GO_ON;
                     75: 
                     76:        if (p->config_storage) {
                     77:                size_t i;
                     78: 
                     79:                for (i = 0; i < srv->config_context->used; i++) {
                     80:                        plugin_config *s = p->config_storage[i];
                     81: 
                     82:                        if (!s) continue;
                     83: 
                     84:                        array_free(s->match);
                     85: 
                     86:                        free(s);
                     87:                }
                     88:                free(p->config_storage);
                     89:        }
                     90: 
                     91:        buffer_free(p->match_buf);
                     92: 
                     93:        free(p);
                     94: 
                     95:        return HANDLER_GO_ON;
                     96: }
                     97: 
                     98: /* handle plugin config and check values */
                     99: 
                    100: SETDEFAULTS_FUNC(mod_skeleton_set_defaults) {
                    101:        plugin_data *p = p_d;
                    102:        size_t i = 0;
                    103: 
                    104:        config_values_t cv[] = {
                    105:                { "skeleton.array",             NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION },       /* 0 */
                    106:                { NULL,                         NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
                    107:        };
                    108: 
                    109:        if (!p) return HANDLER_ERROR;
                    110: 
                    111:        p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *));
                    112: 
                    113:        for (i = 0; i < srv->config_context->used; i++) {
                    114:                plugin_config *s;
                    115: 
                    116:                s = calloc(1, sizeof(plugin_config));
                    117:                s->match    = array_init();
                    118: 
                    119:                cv[0].destination = s->match;
                    120: 
                    121:                p->config_storage[i] = s;
                    122: 
                    123:                if (0 != config_insert_values_global(srv, ((data_config *)srv->config_context->data[i])->value, cv)) {
                    124:                        return HANDLER_ERROR;
                    125:                }
                    126:        }
                    127: 
                    128:        return HANDLER_GO_ON;
                    129: }
                    130: 
                    131: #define PATCH(x) \
                    132:        p->conf.x = s->x;
                    133: static int mod_skeleton_patch_connection(server *srv, connection *con, plugin_data *p) {
                    134:        size_t i, j;
                    135:        plugin_config *s = p->config_storage[0];
                    136: 
                    137:        PATCH(match);
                    138: 
                    139:        /* skip the first, the global context */
                    140:        for (i = 1; i < srv->config_context->used; i++) {
                    141:                data_config *dc = (data_config *)srv->config_context->data[i];
                    142:                s = p->config_storage[i];
                    143: 
                    144:                /* condition didn't match */
                    145:                if (!config_check_cond(srv, con, dc)) continue;
                    146: 
                    147:                /* merge config */
                    148:                for (j = 0; j < dc->value->used; j++) {
                    149:                        data_unset *du = dc->value->data[j];
                    150: 
                    151:                        if (buffer_is_equal_string(du->key, CONST_STR_LEN("skeleton.array"))) {
                    152:                                PATCH(match);
                    153:                        }
                    154:                }
                    155:        }
                    156: 
                    157:        return 0;
                    158: }
                    159: #undef PATCH
                    160: 
                    161: URIHANDLER_FUNC(mod_skeleton_uri_handler) {
                    162:        plugin_data *p = p_d;
                    163:        int s_len;
                    164:        size_t k, i;
                    165: 
                    166:        UNUSED(srv);
                    167: 
                    168:        if (con->mode != DIRECT) return HANDLER_GO_ON;
                    169: 
                    170:        if (con->uri.path->used == 0) return HANDLER_GO_ON;
                    171: 
                    172:        mod_skeleton_patch_connection(srv, con, p);
                    173: 
                    174:        s_len = con->uri.path->used - 1;
                    175: 
                    176:        for (k = 0; k < p->conf.match->used; k++) {
                    177:                data_string *ds = (data_string *)p->conf.match->data[k];
                    178:                int ct_len = ds->value->used - 1;
                    179: 
                    180:                if (ct_len > s_len) continue;
                    181:                if (ds->value->used == 0) continue;
                    182: 
                    183:                if (0 == strncmp(con->uri.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {
                    184:                        con->http_status = 403;
                    185: 
                    186:                        return HANDLER_FINISHED;
                    187:                }
                    188:        }
                    189: 
                    190:        /* not found */
                    191:        return HANDLER_GO_ON;
                    192: }
                    193: 
                    194: /* this function is called at dlopen() time and inits the callbacks */
                    195: 
                    196: int mod_skeleton_plugin_init(plugin *p) {
                    197:        p->version     = LIGHTTPD_VERSION_ID;
                    198:        p->name        = buffer_init_string("skeleton");
                    199: 
                    200:        p->init        = mod_skeleton_init;
                    201:        p->handle_uri_clean  = mod_skeleton_uri_handler;
                    202:        p->set_defaults  = mod_skeleton_set_defaults;
                    203:        p->cleanup     = mod_skeleton_free;
                    204: 
                    205:        p->data        = NULL;
                    206: 
                    207:        return 0;
                    208: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>