Annotation of embedaddon/lighttpd/src/mod_skeleton.c, revision 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>