Show
Ignore:
Timestamp:
07/09/08 16:47:24 (10 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1215622044 +0000
git-parent:

[4f6de158923dd98b2ae05e8152eb38ec6e6b9d1d]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1215622044 +0000
Message:

svn merge -r 327:330 https://labs.omniti.com/reconnoiter/branches/dev/udns .

closes #38

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/noit_check_tools.c

    rd993405 r5a9b91b  
    66#include "noit_defines.h" 
    77#include "noit_check_tools.h" 
     8#include "utils/noit_str.h" 
    89 
    910#include <assert.h> 
     
    1516} recur_closure_t; 
    1617 
    17 int 
     18static noit_hash_table interpolation_operators = NOIT_HASH_EMPTY; 
     19 
     20static int 
     21interpolate_oper_copy(char *buff, int len, const char *replacement) { 
     22  strlcpy(buff, replacement, len); 
     23  return strlen(buff); 
     24
     25 
     26API_EXPORT(int) 
     27noit_check_interpolate_register_oper_fn(const char *name, 
     28                                        intperpolate_oper_fn f) { 
     29  noit_hash_replace(&interpolation_operators, 
     30                    strdup(name), strlen(name), 
     31                    f, 
     32                    free, NULL); 
     33  return 0; 
     34
     35 
     36API_EXPORT(int) 
    1837noit_check_interpolate(char *buff, int len, const char *fmt, 
    1938                       noit_hash_table *attrs, 
     
    3958            if(*fmte == closer) { 
    4059              /* We have a full key here */ 
    41               const char *replacement; 
     60              const char *replacement, *oper, *nkey; 
     61              intperpolate_oper_fn oper_sprint; 
     62 
     63              /* keys can be of the form: :operator:key */ 
     64              oper = key; 
     65              if(*oper == ':' && 
     66                 (nkey = strnstrn(":", 1, oper + 1, fmte - key - 1)) != NULL) { 
     67                oper++; 
     68                /* find oper, nkey-oper */ 
     69                if(!noit_hash_retrieve(&interpolation_operators, 
     70                                       oper, nkey - oper, 
     71                                       (void **)&oper_sprint)) { 
     72                  /* else oper <- copy */ 
     73                  oper_sprint = interpolate_oper_copy; 
     74                } 
     75                nkey++; 
     76              } 
     77              else { 
     78                oper_sprint = interpolate_oper_copy; 
     79                nkey = key; 
     80              } 
    4281              if(!noit_hash_retrieve((closer == '}') ?  config : attrs, 
    43                                      key, fmte - key, (void **)&replacement)) 
     82                                     nkey, fmte - nkey, (void **)&replacement)) 
    4483                replacement = ""; 
    4584              fmt = fmte + 1; /* Format points just after the end of the key */ 
    46               strlcpy(cp, replacement, end-cp); 
    47               cp += strlen(cp); 
     85              cp += oper_sprint(cp, end-cp, replacement); 
     86              *(end-1) = '\0'; /* In case the oper_sprint didn't teminate */ 
    4887              replaced_something = 1; 
    4988              break;