@@ -632,6 +632,98 @@ pgagroal_log_mem(void* data, size_t size)
632632 }
633633}
634634
635+ static void *
636+ dynamic_buffer_append (void * orig , size_t orig_size ,
637+ void * append , size_t append_size ,
638+ size_t * new_size )
639+ {
640+ void * d = NULL ;
641+ size_t s ;
642+
643+ if (append != NULL )
644+ {
645+ s = orig_size + append_size ;
646+ d = realloc (orig , s );
647+ memcpy ((char * )d + orig_size , append , append_size );
648+ }
649+ else
650+ {
651+ s = orig_size ;
652+ d = orig ;
653+ }
654+
655+ * new_size = s ;
656+ return d ;
657+ }
658+
659+ static void * partial_buf = NULL ;
660+ static size_t partial_buf_size = 0 ;
661+
662+ void
663+ pgagroal_log_postgres (struct message * msg )
664+ {
665+ size_t offset = 0 ;
666+ size_t remaining = 0 ;
667+ uint8_t * buf = NULL ;
668+ void * new_buf = NULL ;
669+
670+ uint32_t msg_len = 0 ;
671+ uint8_t msg_type = ' ' ;
672+
673+ if (!msg )
674+ {
675+ return ;
676+ }
677+
678+ partial_buf = dynamic_buffer_append (partial_buf , partial_buf_size , msg -> data , msg -> length , & partial_buf_size );
679+
680+ buf = (uint8_t * )partial_buf ;
681+
682+ while (offset + 5 <= partial_buf_size )
683+ {
684+ memcpy (& msg_len , buf + offset + 1 , 4 );
685+ msg_len = ntohl (msg_len );
686+
687+ if (msg_len < 4 )
688+ {
689+ partial_buf_size = 0 ;
690+ break ;
691+ }
692+
693+ if (offset + 1 + msg_len > partial_buf_size )
694+ {
695+ break ;
696+ }
697+
698+ msg_type = buf [offset ];
699+ pgagroal_log_trace ("Message type: %c len: %u" , msg_type , msg_len );
700+
701+ offset += (1 + msg_len );
702+ }
703+
704+ if (offset > 0 )
705+ {
706+ remaining = partial_buf_size - offset ;
707+ if (remaining > 0 )
708+ {
709+ memmove (partial_buf , buf + offset , remaining );
710+
711+ new_buf = realloc (partial_buf , remaining );
712+ if (new_buf )
713+ {
714+ partial_buf = new_buf ;
715+ }
716+ }
717+ else
718+ {
719+ free (partial_buf );
720+ partial_buf = NULL ;
721+ }
722+
723+ partial_buf_size = remaining ;
724+ }
725+ }
726+
635727static void
636728output_log_line (char * l )
637729{
0 commit comments