X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=actions.c;h=ab3bbd7b62df4a2731ea4d6a64f1a8c8e256ff04;hb=87bc31aeede80dbf3cfa8f76b16744de4776d426;hp=56706e4fc31160371e49359402ca99cdcd44aa09;hpb=22de1764b6460768a49d33328fe00e7320e7e618;p=privoxy.git diff --git a/actions.c b/actions.c index 56706e4f..ab3bbd7b 100644 --- a/actions.c +++ b/actions.c @@ -1,4 +1,4 @@ -const char actions_rcs[] = "$Id: actions.c,v 1.37 2007/03/11 15:56:12 fabiankeil Exp $"; +const char actions_rcs[] = "$Id: actions.c,v 1.39 2007/04/17 18:21:45 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.c,v $ @@ -33,6 +33,16 @@ const char actions_rcs[] = "$Id: actions.c,v 1.37 2007/03/11 15:56:12 fabiankeil * * Revisions : * $Log: actions.c,v $ + * Revision 1.39 2007/04/17 18:21:45 fabiankeil + * Split update_action_bits() into + * update_action_bits_for_all_tags() + * and update_action_bits_for_tag(). + * + * Revision 1.38 2007/04/15 16:39:20 fabiankeil + * Introduce tags as alternative way to specify which + * actions apply to a request. At the moment tags can be + * created based on client and server headers. + * * Revision 1.37 2007/03/11 15:56:12 fabiankeil * Add kludge to log unknown aliases and actions before exiting. * @@ -873,9 +883,9 @@ jb_err merge_current_action (struct current_action_spec *dest, /********************************************************************* * - * Function : update_action_bits + * Function : update_action_bits_for_all_tags * - * Description : Updates the action bits based on matching tags. + * Description : Updates the action bits based on all matching tags. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -884,46 +894,78 @@ jb_err merge_current_action (struct current_action_spec *dest, * 1 otherwise * *********************************************************************/ -int update_action_bits(struct client_state *csp) +int update_action_bits_for_all_tags(struct client_state *csp) +{ + struct list_entry *tag; + int updated = 0; + + for (tag = csp->tags->first; tag != NULL; tag = tag->next) + { + if (update_action_bits_for_tag(csp, tag->str)) + { + updated = 1; + } + } + + return updated; +} + + +/********************************************************************* + * + * Function : update_action_bits_for_tag + * + * Description : Updates the action bits based on the action sections + * whose tag patterns match a provided tag. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : tag = The tag on which the update should be based on + * + * Returns : 0 if no tag matched, or + * 1 otherwise + * + *********************************************************************/ +int update_action_bits_for_tag(struct client_state *csp, const char *tag) { struct file_list *fl; struct url_actions *b; - struct list_entry *tag; + int updated = 0; int i; - /* Take each tag, */ - for (tag = csp->tags->first; tag != NULL; tag = tag->next) + assert(tag); + assert(list_contains_item(csp->tags, tag)); + + /* Run through all action files, */ + for (i = 0; i < MAX_AF_FILES; i++) { - /* run through all action files, */ - for (i = 0; i < MAX_AF_FILES; i++) + if (((fl = csp->actions_list[i]) == NULL) || ((b = fl->f) == NULL)) { - if (((fl = csp->actions_list[i]) == NULL) || ((b = fl->f) == NULL)) + /* Skip empty files */ + continue; + } + + /* and through all the action patterns, */ + for (b = b->next; NULL != b; b = b->next) + { + /* skip the URL patterns, */ + if (NULL == b->url->tag_regex) { - /* Skip empty files */ continue; } - /* and through all the action patterns, */ - for (b = b->next; NULL != b; b = b->next) - { - /* skip the URL patterns, */ - if (NULL == b->url->tag_regex) - { - continue; - } - /* and check if one of the tag patterns matches this tag, */ - if (0 == regexec(b->url->tag_regex, tag->str, 0, NULL, 0)) + /* and check if one of the tag patterns matches the tag, */ + if (0 == regexec(b->url->tag_regex, tag, 0, NULL, 0)) + { + /* if it does, update the action bit map, */ + if (merge_current_action(csp->action, b->action)) { - /* if it does, update the action bit map, */ - if (merge_current_action(csp->action, b->action)) - { - log_error(LOG_LEVEL_ERROR, - "Out of memorey while changing action bits"); - } - /* and signal the change. */ - updated = 1; + log_error(LOG_LEVEL_ERROR, + "Out of memorey while changing action bits"); } + /* and signal the change. */ + updated = 1; } } } @@ -1139,8 +1181,9 @@ static int load_one_actions_file(struct client_state *csp, int fileid) } if (!fs) { - log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': error finding file: %E", - csp->config->actions_file[fileid]); + log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': %E. " + "Note that beginning with Privoxy 3.0.7, actions files have to be specified " + "with their complete file names.", csp->config->actions_file[fileid]); return 1; /* never get here */ } @@ -1305,7 +1348,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid) init_action(cur_action); /* trim { */ - strcpy(actions_buf, buf + 1); + strlcpy(actions_buf, buf + 1, sizeof(actions_buf)); /* check we have a trailing } and then trim it */ end = actions_buf + strlen(actions_buf) - 1; @@ -1447,7 +1490,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid) return 1; /* never get here */ } - strcpy(actions_buf, start); + strlcpy(actions_buf, start, sizeof(actions_buf)); if (get_actions(actions_buf, alias_list, new_alias->action)) {