@@ -380,12 +380,109 @@ static flb_sds_t syslog_rfc3164 (flb_sds_t *s, struct flb_time *tms,
380380 return * s ;
381381}
382382
383+ static flb_sds_t msgpack_value_to_sd (struct flb_syslog * ctx ,
384+ flb_sds_t * s , const char * key , int key_len ,
385+ msgpack_object * v )
386+ {
387+ char temp [48 ] = {0 };
388+ flb_sds_t tmp ;
389+ int n , start_len , end_len ;
390+ const char * val = NULL ;
391+ int val_len = 0 ;
392+
393+ if (v -> type == MSGPACK_OBJECT_BOOLEAN ) {
394+ val = v -> via .boolean ? "true" : "false" ;
395+ val_len = v -> via .boolean ? 4 : 5 ;
396+ }
397+ else if (v -> type == MSGPACK_OBJECT_POSITIVE_INTEGER ) {
398+ val = temp ;
399+ val_len = snprintf (temp , sizeof (temp ) - 1 ,
400+ "%" PRIu64 , v -> via .u64 );
401+ }
402+ else if (v -> type == MSGPACK_OBJECT_NEGATIVE_INTEGER ) {
403+ val = temp ;
404+ val_len = snprintf (temp , sizeof (temp ) - 1 ,
405+ "%" PRId64 , v -> via .i64 );
406+ }
407+ else if (v -> type == MSGPACK_OBJECT_FLOAT ) {
408+ val = temp ;
409+ val_len = snprintf (temp , sizeof (temp ) - 1 ,
410+ "%f" , v -> via .f64 );
411+ }
412+ else if (v -> type == MSGPACK_OBJECT_STR ) {
413+ /* String value */
414+ val = v -> via .str .ptr ;
415+ val_len = v -> via .str .size ;
416+ }
417+ else if (v -> type == MSGPACK_OBJECT_BIN ) {
418+ /* Bin value */
419+ val = v -> via .bin .ptr ;
420+ val_len = v -> via .bin .size ;
421+ }
422+
423+ if (!val || !key ) {
424+ return NULL ;
425+ }
426+
427+ tmp = flb_sds_cat (* s , " " , 1 );
428+ if (!tmp ) {
429+ return NULL ;
430+ }
431+ * s = tmp ;
432+
433+ start_len = flb_sds_len (* s );
434+ if (ctx -> allow_longer_sd_id != FLB_TRUE && key_len > 32 ) {
435+ /*
436+ * RFC5424 defines
437+ * PARAM-NAME = SD-NAME
438+ * SD-NAME = 1*32PRINTUSASCII
439+ * ; except '=', SP, ']', %d34 (")
440+ *
441+ * https://www.rfc-editor.org/rfc/rfc5424#section-6
442+ */
443+ key_len = 32 ;
444+ }
445+ tmp = flb_sds_cat (* s , key , key_len );
446+ if (!tmp ) {
447+ return NULL ;
448+ }
449+ * s = tmp ;
450+
451+ end_len = flb_sds_len (* s );
452+ for (n = start_len ; n < end_len ; n ++ ) {
453+ if (!rfc5424_sp_name [(unsigned char )(* s )[n ]]) {
454+ (* s )[n ] = '_' ;
455+ }
456+ }
457+
458+ tmp = flb_sds_cat (* s , "=\"" , 2 );
459+ if (!tmp ) {
460+ return NULL ;
461+ }
462+ * s = tmp ;
463+
464+ tmp = flb_sds_cat_esc (* s , val , val_len ,
465+ rfc5424_sp_value , sizeof (rfc5424_sp_value ));
466+ if (!tmp ) {
467+ return NULL ;
468+ }
469+ * s = tmp ;
470+
471+ tmp = flb_sds_cat (* s , "\"" , 1 );
472+ if (!tmp ) {
473+ return NULL ;
474+ }
475+ * s = tmp ;
476+
477+ return * s ;
478+ }
479+
383480static flb_sds_t msgpack_to_sd (struct flb_syslog * ctx ,
384481 flb_sds_t * s , const char * sd , int sd_len ,
385482 msgpack_object * o )
386483{
387484 flb_sds_t tmp ;
388- int i ;
485+ int i , idx ;
389486 int loop ;
390487 int n , start_len , end_len ;
391488
@@ -430,11 +527,8 @@ static flb_sds_t msgpack_to_sd(struct flb_syslog *ctx,
430527 if (loop != 0 ) {
431528 msgpack_object_kv * p = o -> via .map .ptr ;
432529 for (i = 0 ; i < loop ; i ++ ) {
433- char temp [48 ] = {0 };
434530 const char * key = NULL ;
435531 int key_len = 0 ;
436- const char * val = NULL ;
437- int val_len = 0 ;
438532
439533 msgpack_object * k = & p [i ].key ;
440534 msgpack_object * v = & p [i ].val ;
@@ -452,89 +546,16 @@ static flb_sds_t msgpack_to_sd(struct flb_syslog *ctx,
452546 key_len = k -> via .bin .size ;
453547 }
454548
455- if (v -> type == MSGPACK_OBJECT_BOOLEAN ) {
456- val = v -> via .boolean ? "true" : "false" ;
457- val_len = v -> via .boolean ? 4 : 5 ;
458- }
459- else if (v -> type == MSGPACK_OBJECT_POSITIVE_INTEGER ) {
460- val = temp ;
461- val_len = snprintf (temp , sizeof (temp ) - 1 ,
462- "%" PRIu64 , v -> via .u64 );
463- }
464- else if (v -> type == MSGPACK_OBJECT_NEGATIVE_INTEGER ) {
465- val = temp ;
466- val_len = snprintf (temp , sizeof (temp ) - 1 ,
467- "%" PRId64 , v -> via .i64 );
468- }
469- else if (v -> type == MSGPACK_OBJECT_FLOAT ) {
470- val = temp ;
471- val_len = snprintf (temp , sizeof (temp ) - 1 ,
472- "%f" , v -> via .f64 );
473- }
474- else if (v -> type == MSGPACK_OBJECT_STR ) {
475- /* String value */
476- val = v -> via .str .ptr ;
477- val_len = v -> via .str .size ;
478- }
479- else if (v -> type == MSGPACK_OBJECT_BIN ) {
480- /* Bin value */
481- val = v -> via .bin .ptr ;
482- val_len = v -> via .bin .size ;
483- }
484-
485- if (!val || !key ) {
486- continue ;
487- }
488-
489- tmp = flb_sds_cat (* s , " " , 1 );
490- if (!tmp ) {
491- return NULL ;
492- }
493- * s = tmp ;
494-
495- start_len = flb_sds_len (* s );
496- if (ctx -> allow_longer_sd_id != FLB_TRUE && key_len > 32 ) {
497- /*
498- * RFC5424 defines
499- * PARAM-NAME = SD-NAME
500- * SD-NAME = 1*32PRINTUSASCII
501- * ; except '=', SP, ']', %d34 (")
502- *
503- * https://www.rfc-editor.org/rfc/rfc5424#section-6
504- */
505- key_len = 32 ;
506- }
507- tmp = flb_sds_cat (* s , key , key_len );
508- if (!tmp ) {
509- return NULL ;
510- }
511- * s = tmp ;
512-
513- end_len = flb_sds_len (* s );
514- for (n = start_len ; n < end_len ; n ++ ) {
515- if (!rfc5424_sp_name [(unsigned char )(* s )[n ]]) {
516- (* s )[n ] = '_' ;
549+ if (v -> type == MSGPACK_OBJECT_ARRAY ) {
550+ for (idx = 0 ;
551+ idx < v -> via .array .size ;
552+ idx ++ ) {
553+ msgpack_value_to_sd (ctx , s , key , key_len , & v -> via .array .ptr [idx ]);
517554 }
518555 }
519-
520- tmp = flb_sds_cat (* s , "=\"" , 2 );
521- if (!tmp ) {
522- return NULL ;
523- }
524- * s = tmp ;
525-
526- tmp = flb_sds_cat_esc (* s , val , val_len ,
527- rfc5424_sp_value , sizeof (rfc5424_sp_value ));
528- if (!tmp ) {
529- return NULL ;
530- }
531- * s = tmp ;
532-
533- tmp = flb_sds_cat (* s , "\"" , 1 );
534- if (!tmp ) {
535- return NULL ;
556+ else {
557+ msgpack_value_to_sd (ctx , s , key , key_len , v );
536558 }
537- * s = tmp ;
538559 }
539560 }
540561
0 commit comments