@@ -323,39 +323,53 @@ static inline ssize_t zlog_stream_unbuffered_write(struct zlog_stream *stream, c
323
323
{
324
324
int finished = 0 ;
325
325
const char * append ;
326
- size_t append_len ;
326
+ size_t append_len = 0 , available_len ;
327
+ ssize_t written ;
328
+
329
+ if (stream -> len == 0 ) {
330
+ stream -> len = zlog_stream_prefix_ex (stream , stream -> function , stream -> line );
331
+ }
327
332
328
333
if (stream -> len + len >= zlog_limit ) {
329
334
if (stream -> wrap ) {
330
- if (stream -> wrap_prefix != NULL ) {
331
- zlog_stream_direct_write_ex (
332
- stream , stream -> wrap_prefix , stream -> wrap_prefix_len , NULL , 0 );
333
- }
334
- len = zlog_limit - stream -> len ;
335
+ available_len = zlog_limit - stream -> len ;
335
336
if (stream -> len + len == zlog_limit ) {
336
337
append = NULL ;
337
338
append_len = 0 ;
338
339
} else {
339
340
append = "\n" ;
340
341
append_len = 1 ;
341
342
}
342
- if (stream -> wrap_suffix ) {
343
- zlog_stream_direct_write (stream , buf , len );
343
+ if (stream -> wrap_suffix && append != NULL ) {
344
+ zlog_stream_direct_write (stream , buf , available_len );
344
345
zlog_stream_direct_write_ex (
345
346
stream , stream -> wrap_suffix , stream -> wrap_suffix_len , append , append_len );
346
347
} else {
347
- zlog_stream_direct_write_ex (stream , buf , len , append , append_len );
348
+ zlog_stream_direct_write_ex (stream , buf , available_len , append , append_len );
348
349
}
350
+ stream -> len = 0 ;
349
351
/* TODO: use loop to speed it up */
350
- return len + zlog_stream_unbuffered_write (stream , buf + len , len );
352
+ written = zlog_stream_unbuffered_write (stream , buf + available_len , len - available_len );
353
+ if (written > 0 ) {
354
+ return available_len + written ;
355
+ }
356
+
357
+ return written ;
351
358
}
352
359
stream -> finished = finished = 1 ;
353
360
append = (stream -> len + len == zlog_limit ) ? "\n" : "...\n" ;
354
361
append_len = sizeof (append ) - 1 ;
355
362
len = zlog_limit - stream -> len - append_len ;
356
363
}
357
364
358
- return zlog_stream_direct_write_ex (stream , buf , len , append , append_len );
365
+ written = zlog_stream_direct_write_ex (stream , buf , len , append , append_len );
366
+ if (written > 0 ) {
367
+ /* currently written will be always len as the write is blocking
368
+ * - this should be address if we change to non-blocking write */
369
+ stream -> len += written ;
370
+ }
371
+
372
+ return written ;
359
373
}
360
374
/* }}} */
361
375
@@ -456,14 +470,16 @@ ssize_t zlog_stream_set_wrapping_prefix(struct zlog_stream *stream, const char *
456
470
va_list args ;
457
471
458
472
va_start (args , fmt );
459
- len = vsnprintf (buf , MAX_WRAPPING_PREFIX_LENGTH , fmt , args );
473
+ len = vsnprintf (buf , MAX_WRAPPING_PREFIX_LENGTH - 1 , fmt , args );
460
474
va_end (args );
461
475
462
476
stream -> wrap_prefix = malloc (len );
463
- if (stream -> wrap_prefix ! = NULL ) {
477
+ if (stream -> wrap_prefix = = NULL ) {
464
478
return -1 ;
465
479
}
466
480
memcpy (stream -> wrap_prefix , buf , len );
481
+ stream -> wrap_prefix [len ] = 0 ;
482
+ stream -> wrap_prefix_len = len ;
467
483
468
484
return len ;
469
485
}
@@ -603,7 +619,12 @@ zlog_bool zlog_stream_finish(struct zlog_stream *stream) /* {{{ */
603
619
stream -> buf [stream -> len ++ ] = '\n' ;
604
620
zlog_stream_direct_write (stream , stream -> buf , stream -> len );
605
621
} else if (!stream -> finished ) {
606
- if (stream -> wrap_final_suffix != NULL ) {
622
+ if (stream -> wrap_suffix != NULL ) {
623
+ zlog_stream_direct_write_ex (
624
+ stream , stream -> wrap_suffix , stream -> wrap_suffix_len ,
625
+ stream -> wrap_final_suffix , stream -> wrap_final_suffix_len );
626
+ zlog_stream_direct_write (stream , "\n" , 1 );
627
+ } else if (stream -> wrap_final_suffix != NULL ) {
607
628
zlog_stream_direct_write_ex (
608
629
stream , stream -> wrap_final_suffix , stream -> wrap_final_suffix_len , "\n" , 1 );
609
630
} else {
0 commit comments