ClamAV is an open source (GPLv2) anti-virus toolkit.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
clamav/libclamav/json_api.c

167 lines
4.7 KiB

/*
* JSON Object API
*
* Copyright (C) 2014 Cisco Systems, Inc.
*
* Authors: Kevin Lin
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#if HAVE_CONFIG_H
#include "clamav-config.h"
#endif
#include <openssl/ssl.h>
#include <openssl/err.h>
#include "libclamav/crypto.h"
#include "cltypes.h"
#include "others.h"
#include "json_api.h"
#ifdef HAVE_JSON
int cli_jsonnull(json_object *obj, const char* key)
{
json_object *fpobj = json_object_new_object();
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonnull\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json string object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
int cli_jsonstr(json_object *obj, const char* key, const char* s)
{
json_object *fpobj = json_object_new_string(s);
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonstr\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json string object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
int cli_jsonint(json_object *obj, const char* key, int32_t val)
{
json_object *fpobj = json_object_new_int(val);
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonint\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json int object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
#ifdef JSON10
int cli_jsonint64(json_object *obj, const char* key, int64_t i)
{
json_object *fpobj = json_object_new_int64(i);
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonint64\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json int object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
#else
int cli_jsonint64(json_object *obj, const char* key, int64_t i)
{
int32_t li, hi;
json_object *fpobj0, *fpobj1;
json_object *fparr = json_object_new_array();
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonint64\n");
return CL_ENULLARG;
}
if (NULL == fparr) {
cli_errmsg("json: no memory for json array object.\n");
return CL_EMEM;
}
hi = (uint32_t)((i & 0xFFFFFFFF00000000) >> 32);
li = (uint32_t)(i & 0xFFFFFFFF);
fpobj0 = json_object_new_int(li);
if (NULL == fpobj0) {
cli_errmsg("json: no memory for json int object.\n");
json_object_put(fparr);
return CL_EMEM;
}
fpobj1 = json_object_new_int(hi);
if (NULL == fpobj1) {
cli_errmsg("json: no memory for json int object.\n");
json_object_put(fparr);
json_object_put(fpobj0);
return CL_EMEM;
}
/* little-endian array */
json_object_array_add(fparr, fpobj0);
json_object_array_add(fparr, fpobj1);
json_object_object_add(obj, key, fparr);
return CL_SUCCESS;
}
//#define cli_jsonint64(o,n,i) cli_dbgmsg("%s: %lld [%llx]\n", n, i, i)
#endif
int cli_jsonbool(json_object *obj, const char* key, int i)
{
json_object *fpobj = json_object_new_boolean(i);
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsonbool\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json boolean object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
int cli_jsondouble(json_object *obj, const char* key, double d)
{
json_object *fpobj = json_object_new_double(d);
if (NULL == obj) {
cli_errmsg("json: no parent object specified to cli_jsondouble\n");
return CL_ENULLARG;
}
if (NULL == fpobj) {
cli_errmsg("json: no memory for json double object.\n");
return CL_EMEM;
}
json_object_object_add(obj, key, fpobj);
return CL_SUCCESS;
}
#else
#endif