X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;ds=inline;f=afs.c;h=21035cda93710b3167d7374fd8e2e7f20ecbe41d;hb=db8b6df30d17d9f93c60758e156699067121cbb5;hp=f0fa57fcb6087a5d812fc282712eb7fd1701cc8f;hpb=a9bdbe2c8a73675be499fc95b935f3839e30c575;p=paraslash.git diff --git a/afs.c b/afs.c index f0fa57fc..21035cda 100644 --- a/afs.c +++ b/afs.c @@ -281,6 +281,36 @@ out: return num_dispatched; } +/** + * Wrapper for send_callback_request() which passes a lopsub parse result. + * + * \param f The callback function. + * \param cmd Needed for (de-)serialization. + * \param lpr Must match cmd. + * \param private_result_data Passed to send_callback_request(). + * + * This function serializes the parse result given by the lpr pointer into a + * buffer. The buffer is sent as the query to the afs process with the callback + * mechanism. + * + * \return The return value of the underlying call to send_callback_request(). + */ +int send_lls_callback_request(afs_callback *f, + const struct lls_command * const cmd, + struct lls_parse_result *lpr, void *private_result_data) +{ + struct osl_object query; + char *buf = NULL; + int ret = lls_serialize_parse_result(lpr, cmd, &buf, &query.size); + + assert(ret >= 0); + query.data = buf; + ret = send_callback_request(f, &query, afs_cb_result_handler, + private_result_data); + free(buf); + return ret; +} + /** * Send a callback request passing an options structure and an argument vector. * @@ -356,7 +386,7 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) struct pattern_match_data *pmd = data; struct osl_object name_obj; const char *p, *name; - int ret = osl(osl_get_object(pmd->table, row, pmd->match_col_num, &name_obj)); + int i, ret = osl(osl_get_object(pmd->table, row, pmd->match_col_num, &name_obj)); const char *pattern_txt = (const char *)pmd->patterns.data; if (ret < 0) @@ -364,22 +394,37 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) name = (char *)name_obj.data; if ((!name || !*name) && (pmd->pm_flags & PM_SKIP_EMPTY_NAME)) return 1; - if (pmd->patterns.size == 0 && - (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING)) { - pmd->num_matches++; - return pmd->action(pmd->table, row, name, pmd->data); + if ((pmd->lpr && lls_num_inputs(pmd->lpr) == 0) || pmd->patterns.size == 0) { + if (pmd->pm_flags & PM_NO_PATTERN_MATCHES_EVERYTHING) { + pmd->num_matches++; + return pmd->action(pmd->table, row, name, pmd->data); + } } - for (p = pattern_txt; p < pattern_txt + pmd->patterns.size; - p += strlen(p) + 1) { + p = pattern_txt; + i = 0; + for (;;) { + if (pmd->lpr) { + if (i >= lls_num_inputs(pmd->lpr)) + break; + p = lls_input(i, pmd->lpr); + } else { + if (p >= pattern_txt + pmd->patterns.size) + break; + } ret = fnmatch(p, name, pmd->fnmatch_flags); - if (ret == FNM_NOMATCH) - continue; - if (ret) - return -E_FNMATCH; - ret = pmd->action(pmd->table, row, name, pmd->data); - if (ret >= 0) - pmd->num_matches++; - return ret; + if (ret != FNM_NOMATCH) { + if (ret != 0) + return -E_FNMATCH; + ret = pmd->action(pmd->table, row, name, pmd->data); + if (ret >= 0) + pmd->num_matches++; + return ret; + + } + if (pmd->lpr) + i++; + else + p += strlen(p) + 1; } return 1; }