lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20160531115643.3682df90@xeon-e3>
Date:	Tue, 31 May 2016 11:56:43 -0700
From:	Stephen Hemminger <stephen@...workplumber.org>
To:	Roopa Prabhu <roopa@...ulusnetworks.com>
Cc:	netdev@...r.kernel.org, anuradhak@...ulusnetworks.com,
	nikolay@...ulusnetworks.com, julien@...ulusnetworks.com
Subject: Re: [PATCH iproute2 net-next 1/5] json_writer: allow base json data
 type to be array or object

On Fri, 27 May 2016 21:37:12 -0700
Roopa Prabhu <roopa@...ulusnetworks.com> wrote:

> From: Anuradha Karuppiah <anuradhak@...ulusnetworks.com>
> 
> This patch adds a type qualifier to json_writer. Type can be a
> json object or array. This can be extended to other types like
> json-string, json-number etc in the future.
> 
> Signed-off-by: Anuradha Karuppiah <anuradhak@...ulusnetworks.com>
> ---
>  include/json_writer.h |  5 +++--
>  lib/json_writer.c     | 39 +++++++++++++++++++++++++++++++++++----
>  misc/ifstat.c         |  6 +++---
>  misc/lnstat.c         |  2 +-
>  misc/nstat.c          |  4 ++--
>  5 files changed, 44 insertions(+), 12 deletions(-)
> 
> diff --git a/include/json_writer.h b/include/json_writer.h
> index ab9a008..e04a40a 100644
> --- a/include/json_writer.h
> +++ b/include/json_writer.h
> @@ -21,8 +21,9 @@
>  /* Opaque class structure */
>  typedef struct json_writer json_writer_t;
>  
> -/* Create a new JSON stream */
> -json_writer_t *jsonw_new(FILE *f);
> +/* Create a new JSON stream with data type */
> +json_writer_t *jsonw_new_object(FILE *f);
> +json_writer_t *jsonw_new_array(FILE *f);
>  /* End output to JSON stream */
>  void jsonw_destroy(json_writer_t **self_p);
>  
> diff --git a/lib/json_writer.c b/lib/json_writer.c
> index 2af16e1..420cd87 100644
> --- a/lib/json_writer.c
> +++ b/lib/json_writer.c
> @@ -22,11 +22,17 @@
>  
>  #include "json_writer.h"
>  
> +enum jsonw_data_type {
> +	JSONW_TYPE_OBJECT,
> +	JSONW_TYPE_ARRAY
> +};
> +
>  struct json_writer {
>  	FILE		*out;	/* output file */
>  	unsigned	depth;  /* nesting */
>  	bool		pretty; /* optional whitepace */
>  	char		sep;	/* either nul or comma */
> +	int		type;	/* currently either object or array */
>  };
>  
>  /* indentation for pretty print */
> @@ -94,7 +100,7 @@ static void jsonw_puts(json_writer_t *self, const char *str)
>  }
>  
>  /* Create a new JSON stream */
> -json_writer_t *jsonw_new(FILE *f)
> +static json_writer_t *jsonw_new(FILE *f, int type)
>  {
>  	json_writer_t *self = malloc(sizeof(*self));
>  	if (self) {
> @@ -102,11 +108,29 @@ json_writer_t *jsonw_new(FILE *f)
>  		self->depth = 0;
>  		self->pretty = false;
>  		self->sep = '\0';
> -		putc('{', self->out);
> +		self->type = type;
> +		switch (self->type) {
> +		case JSONW_TYPE_OBJECT:
> +			putc('{', self->out);
> +			break;
> +		case JSONW_TYPE_ARRAY:
> +			putc('[', self->out);
> +			break;
> +		}
>  	}
>  	return self;
>  }
>  
> +json_writer_t *jsonw_new_object(FILE *f)
> +{
> +	return jsonw_new(f, JSONW_TYPE_OBJECT);
> +}
> +
> +json_writer_t *jsonw_new_array(FILE *f)
> +{
> +	return jsonw_new(f, JSONW_TYPE_ARRAY);
> +}
> +
>  /* End output to JSON stream */
>  void jsonw_destroy(json_writer_t **self_p)
>  {
> @@ -114,7 +138,14 @@ void jsonw_destroy(json_writer_t **self_p)
>  
>  	assert(self->depth == 0);
>  	jsonw_eol(self);
> -	fputs("}\n", self->out);
> +	switch (self->type) {
> +	case JSONW_TYPE_OBJECT:
> +		fputs("}\n", self->out);
> +		break;
> +	case JSONW_TYPE_ARRAY:
> +		fputs("]\n", self->out);
> +		break;
> +	}
>  	fflush(self->out);
>  	free(self);
>  	*self_p = NULL;
> @@ -267,7 +298,7 @@ void jsonw_null_field(json_writer_t *self, const char *prop)
>  #ifdef TEST
>  int main(int argc, char **argv)
>  {
> -	json_writer_t *wr = jsonw_new(stdout);
> +	json_writer_t *wr = jsonw_new_object(stdout);
>  
>  	jsonw_pretty(wr, true);
>  	jsonw_name(wr, "Vyatta");
> diff --git a/misc/ifstat.c b/misc/ifstat.c
> index abbb4e7..29aa63c 100644
> --- a/misc/ifstat.c
> +++ b/misc/ifstat.c
> @@ -240,7 +240,7 @@ static void load_raw_table(FILE *fp)
>  
>  static void dump_raw_db(FILE *fp, int to_hist)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct ifstat_ent *n, *h;
>  
>  	h = hist_db;
> @@ -447,7 +447,7 @@ static void print_one_if(FILE *fp, const struct ifstat_ent *n,
>  
>  static void dump_kern_db(FILE *fp)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct ifstat_ent *n;
>  
>  	if (jw) {
> @@ -473,7 +473,7 @@ static void dump_kern_db(FILE *fp)
>  static void dump_incr_db(FILE *fp)
>  {
>  	struct ifstat_ent *n, *h;
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  
>  	h = hist_db;
>  	if (jw) {
> diff --git a/misc/lnstat.c b/misc/lnstat.c
> index 659a01b..2988e9e 100644
> --- a/misc/lnstat.c
> +++ b/misc/lnstat.c
> @@ -110,7 +110,7 @@ static void print_line(FILE *of, const struct lnstat_file *lnstat_files,
>  static void print_json(FILE *of, const struct lnstat_file *lnstat_files,
>  		       const struct field_params *fp)
>  {
> -	json_writer_t *jw = jsonw_new(of);
> +	json_writer_t *jw = jsonw_new_object(of);
>  	int i;
>  
>  	jsonw_start_object(jw);
> diff --git a/misc/nstat.c b/misc/nstat.c
> index a9e0f20..7ca6204 100644
> --- a/misc/nstat.c
> +++ b/misc/nstat.c
> @@ -279,7 +279,7 @@ static void load_netstat(void)
>  
>  static void dump_kern_db(FILE *fp, int to_hist)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct nstat_ent *n, *h;
>  
>  	h = hist_db;
> @@ -323,7 +323,7 @@ static void dump_kern_db(FILE *fp, int to_hist)
>  
>  static void dump_incr_db(FILE *fp)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct nstat_ent *n, *h;
>  
>  	h = hist_db;

I would prefer that this not be done.
Why not make everything an an object.

It adds more code and makes it different from how the Java version works.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ