@@ -491,31 +491,33 @@ struct json_result {
491491 /* True if we haven't yet put an element in current wrapping */
492492 bool empty ;
493493
494- /* tal_count() of this is strlen() + 1 */
495- char * s ;
494+ /* The command we're attached to */
495+ struct command * cmd ;
496496};
497497
498498static void result_append (struct json_result * res , const char * str )
499499{
500- size_t len = tal_count ( res -> s ) - 1 ;
500+ struct json_connection * jcon = res -> cmd -> jcon ;
501501
502- tal_resize (& res -> s , len + strlen (str ) + 1 );
503- strcpy (res -> s + len , str );
502+ /* Don't do anything if they're disconnected. */
503+ if (!jcon )
504+ return ;
505+
506+ jcon_append (jcon , str );
504507}
505508
506509static void PRINTF_FMT (2 ,3 )
507510result_append_fmt (struct json_result * res , const char * fmt , ...)
508511{
509- size_t len = tal_count ( res -> s ) - 1 , fmtlen ;
512+ struct json_connection * jcon = res -> cmd -> jcon ;
510513 va_list ap ;
511514
512- va_start ( ap , fmt );
513- fmtlen = vsnprintf ( NULL , 0 , fmt , ap );
514- va_end ( ap ) ;
515+ /* Don't do anything if they're disconnected. */
516+ if (! jcon )
517+ return ;
515518
516- tal_resize (& res -> s , len + fmtlen + 1 );
517519 va_start (ap , fmt );
518- vsprintf ( res -> s + len , fmt , ap );
520+ jcon_append_vfmt ( jcon , fmt , ap );
519521 va_end (ap );
520522}
521523
@@ -707,7 +709,7 @@ static struct json_result *new_json_stream(struct command *cmd)
707709{
708710 struct json_result * r = tal (cmd , struct json_result );
709711
710- r -> s = tal_strdup ( r , "" ) ;
712+ r -> cmd = cmd ;
711713#if DEVELOPER
712714 r -> wrapping = tal_arr (r , jsmntype_t , 0 );
713715#endif
@@ -721,27 +723,33 @@ static struct json_result *new_json_stream(struct command *cmd)
721723
722724struct json_result * json_stream_success (struct command * cmd )
723725{
724- cmd -> failcode = 0 ;
725- return new_json_stream (cmd );
726+ struct json_result * r ;
727+ r = new_json_stream (cmd );
728+ result_append (r , "\"result\" : " );
729+ return r ;
726730}
727731
728- struct json_result * json_stream_fail (struct command * cmd ,
729- int code ,
730- const char * errmsg )
732+ struct json_result * json_stream_fail_nodata (struct command * cmd ,
733+ int code ,
734+ const char * errmsg )
731735{
736+ struct json_result * r = new_json_stream (cmd );
737+
732738 assert (code );
733739 assert (errmsg );
734- cmd -> failcode = code ;
735- cmd -> errmsg = tal_strdup (cmd , errmsg );
736- return new_json_stream (cmd );
740+
741+ result_append_fmt (r , " \"error\" : "
742+ "{ \"code\" : %d,"
743+ " \"message\" : \"%s\"" , code , errmsg );
744+ return r ;
737745}
738746
739- const char * json_result_string (const struct json_result * result )
747+ struct json_result * json_stream_fail (struct command * cmd ,
748+ int code ,
749+ const char * errmsg )
740750{
741- #if DEVELOPER
742- assert (tal_count (result -> wrapping ) == 0 );
743- #endif
744- assert (result -> indent == 0 );
745- assert (tal_count (result -> s ) == strlen (result -> s ) + 1 );
746- return result -> s ;
751+ struct json_result * r = json_stream_fail_nodata (cmd , code , errmsg );
752+
753+ result_append (r , ", \"data\" : " );
754+ return r ;
747755}
0 commit comments