constify
[exim.git] / src / src / lookups / json.c
index 013013a..f476db3 100644 (file)
 
 
 
+/* All use of allocations will be done against the POOL_SEARCH memory,
+which is freed once by search_tidyup(). Make the free call a dummy.
+This burns some 300kB in handling a 37kB JSON file, for the benefit of
+a fast free.  The alternative of staying with malloc is nearly as bad,
+eyeballing the activity there are 20% the number of free vs. alloc
+calls (before the big bunch at the end).
+
+Assume that the file is trusted, so no tainting */
+
+static void *
+json_malloc(size_t nbytes)
+{
+void * p = store_get((int)nbytes, FALSE);
+/* debug_printf("%s %d: %p\n", __FUNCTION__, (int)nbytes, p); */
+return p;
+}
+static void
+json_free(void * p)
+{
+/* debug_printf("%s: %p\n", __FUNCTION__, p); */
+}
+
 /*************************************************
 *              Open entry point                  *
 *************************************************/
 /* See local README for interface description */
 
 static void *
-json_open(uschar *filename, uschar **errmsg)
+json_open(const uschar * filename, uschar ** errmsg)
 {
-FILE *f = Ufopen(filename, "rb");
-if (f == NULL)
+FILE * f;
+
+json_set_alloc_funcs(json_malloc, json_free);
+
+if (!(f = Ufopen(filename, "rb")))
   {
   int save_errno = errno;
   *errmsg = string_open_failed(errno, "%s for json search", filename);
@@ -38,7 +63,7 @@ return f;
 *************************************************/
 
 static BOOL
-json_check(void *handle, uschar *filename, int modemask, uid_t *owners,
+json_check(void *handle, const uschar *filename, int modemask, uid_t *owners,
   gid_t *owngroups, uschar **errmsg)
 {
 return lf_check_file(fileno((FILE *)handle), filename, S_IFREG, modemask,
@@ -54,8 +79,8 @@ return lf_check_file(fileno((FILE *)handle), filename, S_IFREG, modemask,
 /* See local README for interface description */
 
 static int
-json_find(void *handle, uschar *filename, const uschar *keystring, int length,
-  uschar **result, uschar **errmsg, uint *do_cache)
+json_find(void * handle, const uschar * filename, const uschar * keystring,
+  int length, uschar ** result, uschar ** errmsg, uint * do_cache)
 {
 FILE * f = handle;
 json_t * j, * j0;
@@ -69,8 +94,8 @@ do_cache = do_cache;  /* Keep picky compilers happy */
 rewind(f);
 if (!(j = json_loadf(f, 0, &jerr)))
   {
-  enum json_error_code je = json_error_code(&jerr);
-  *errmsg = string_sprintf("json err %d on open", je);
+  *errmsg = string_sprintf("json error on open: %.*s\n",
+       JSON_ERROR_TEXT_LENGTH, jerr.text);
   return FAIL;
   }
 j0 = j;
@@ -85,7 +110,7 @@ for (int k = 1;  (key = string_nextinlist(&keystring, &sep, NULL, 0)); k++)
        : json_object_get(j, CCS key)
      ) )
     {
-    DEBUG(D_lookup) debug_printf("%s, for key %d: '%s'\n",
+    DEBUG(D_lookup) debug_printf_indent("%s, for key %d: '%s'\n",
       numeric
       ? US"bad index, or not json array"
       : US"no such key, or not json object",