@@ -290,59 +290,89 @@ inline static zlog_bool zlog_stream_buf_alloc(struct zlog_stream *stream) /* {{
290
290
}
291
291
/* }}} */
292
292
293
- static ssize_t zlog_stream_buf_append (struct zlog_stream * stream , const char * str , size_t len ) /* {{{ */
293
+ /* TODO: consider better handling of errors and do not use zend_quiet_write */
294
+ static inline ssize_t zlog_stream_direct_write_ex (
295
+ struct zlog_stream * stream , const char * buf , size_t len ,
296
+ int finished , const char * append , size_t append_len ) /* {{{ */
294
297
{
295
- int finished = 0 ;
296
-
297
- if (stream -> len + len > zlog_limit ) {
298
- stream -> finished = finished = 1 ;
299
- len = zlog_limit - stream -> len ;
300
- }
301
-
302
- if (stream -> buf_size - stream -> len <= len && !zlog_stream_buf_alloc_ex (stream , len )) {
303
- return -1 ;
298
+ if (stream -> use_fd ) {
299
+ zend_quiet_write (stream -> fd , buf , len );
300
+ if (finished ) {
301
+ zend_quiet_write (stream -> fd , append , append_len );
302
+ }
304
303
}
305
304
306
- memcpy (stream -> buf + stream -> len , str , len );
307
- stream -> len += len ;
308
-
309
- if ( finished ) {
310
- stream -> len = zlog_truncate_buf ( stream -> buf , stream -> len );
305
+ if (stream -> use_stderr ) {
306
+ zend_quiet_write ( STDERR_FILENO , buf , len ) ;
307
+ if ( finished ) {
308
+ zend_quiet_write ( STDERR_FILENO , append , append_len );
309
+ }
311
310
}
312
311
313
312
return len ;
314
313
}
314
+ /* }}} */
315
315
316
- static inline ssize_t zlog_stream_write (struct zlog_stream * stream , const char * buf , size_t len ) /* {{{ */
316
+ static ssize_t zlog_stream_direct_write (struct zlog_stream * stream , const char * buf , size_t len ) /* {{{ */
317
+ {
318
+ return zlog_stream_direct_write_ex (stream , buf , len , 0 , NULL , 0 );
319
+ }
320
+ /* }}} */
321
+
322
+ static inline ssize_t zlog_stream_unbuffered_write (struct zlog_stream * stream , const char * buf , size_t len ) /* {{{ */
317
323
{
318
324
int finished = 0 ;
319
325
const char * append ;
320
326
size_t append_len ;
321
327
322
328
if (stream -> len + len >= zlog_limit ) {
329
+ /* TODO: handle wrapping */
323
330
stream -> finished = finished = 1 ;
324
331
append = (stream -> len + len == zlog_limit ) ? "\n" : "...\n" ;
325
332
append_len = sizeof (append ) - 1 ;
326
333
len = zlog_limit - stream -> len - append_len ;
327
334
}
328
335
329
- if (stream -> use_fd ) {
330
- zend_quiet_write (stream -> fd , buf , len );
331
- if (finished ) {
332
- zend_quiet_write (stream -> fd , append , append_len );
333
- }
336
+ return zlog_stream_direct_write_ex (stream , buf , len , finished , append , append_len );
337
+ }
338
+ /* }}} */
339
+
340
+ /* TODO: handle errors from this function in all calls (check for -1) */
341
+ static ssize_t zlog_stream_buf_append (struct zlog_stream * stream , const char * str , size_t str_len ) /* {{{ */
342
+ {
343
+ int finished = 0 ;
344
+ size_t available_len ;
345
+
346
+ if (stream -> len + str_len > zlog_limit ) {
347
+ stream -> finished = finished = 1 ;
348
+ available_len = zlog_limit - stream -> len ;
349
+ } else {
350
+ available_len = str_len ;
334
351
}
335
352
336
- if (stream -> use_stderr ) {
337
- zend_quiet_write (STDERR_FILENO , buf , len );
338
- if (finished ) {
339
- zend_quiet_write (STDERR_FILENO , append , append_len );
340
- }
353
+ if (stream -> buf_size - stream -> len <= available_len && !zlog_stream_buf_alloc_ex (stream , available_len )) {
354
+ return -1 ;
341
355
}
342
356
343
- return len ;
357
+ memcpy (stream -> buf + stream -> len , str , available_len );
358
+ stream -> len += available_len ;
359
+
360
+ if (!finished ) {
361
+ return available_len ;
362
+ }
363
+
364
+ if (stream -> wrap ) {
365
+ /* TODO: append wrap_suffix before the write */
366
+ zlog_stream_direct_write (stream , stream -> buf , stream -> len );
367
+ stream -> len = 0 ;
368
+ /* TODO: use function and line from the initial call (remember them and call zlog_stream_prefix_ex) */
369
+ zlog_stream_prefix (stream );
370
+ return available_len + zlog_stream_buf_append (stream , str + available_len , str_len - available_len );
371
+ }
372
+
373
+ stream -> len = zlog_truncate_buf (stream -> buf , stream -> len );
374
+ return available_len ;
344
375
}
345
- /* }}} */
346
376
347
377
static inline void zlog_stream_init_ex (struct zlog_stream * stream , int flags , size_t capacity , int fd ) /* {{{ */
348
378
{
@@ -355,6 +385,7 @@ static inline void zlog_stream_init_ex(struct zlog_stream *stream, int flags, si
355
385
stream -> use_syslog = fd == ZLOG_SYSLOG ;
356
386
stream -> use_fd = !stream -> use_syslog ;
357
387
stream -> use_buffer = external_logger != NULL || stream -> use_syslog ;
388
+ /* TODO: require a minimal capacity when using buffer to make sure the prefix is not trimmed */
358
389
stream -> buf_size = capacity ;
359
390
stream -> use_stderr = fd != STDERR_FILENO && fd != STDOUT_FILENO && fd != -1 &&
360
391
!launched && (flags & ZLOG_LEVEL_MASK ) >= ZLOG_NOTICE ;
@@ -458,11 +489,19 @@ ssize_t zlog_stream_prefix_ex(struct zlog_stream *stream, const char *function,
458
489
}
459
490
len = zlog_buf_prefix (function , line , stream -> flags , stream -> buf , stream -> buf_size , stream -> use_syslog );
460
491
stream -> len = stream -> prefix_len = len ;
461
- return len ;
492
+ if (stream -> wrap_prefix != NULL ) {
493
+ zlog_stream_buf_append (stream , stream -> wrap_prefix , stream -> wrap_prefix_len );
494
+ }
495
+ return stream -> len ;
462
496
} else {
463
497
char sbuf [1024 ];
498
+ ssize_t written ;
464
499
len = zlog_buf_prefix (function , line , stream -> flags , sbuf , 1024 , stream -> use_syslog );
465
- return zlog_stream_write (stream , sbuf , len );
500
+ written = zlog_stream_direct_write (stream , sbuf , len );
501
+ if (stream -> wrap_prefix != NULL ) {
502
+ written += zlog_stream_direct_write (stream , stream -> wrap_prefix , stream -> wrap_prefix_len );
503
+ }
504
+ return written ;
466
505
}
467
506
}
468
507
/* }}} */
@@ -501,13 +540,14 @@ ssize_t zlog_stream_str(struct zlog_stream *stream, const char *str, size_t str_
501
540
return zlog_stream_buf_append (stream , str , str_len );
502
541
}
503
542
504
- return zlog_stream_write (stream , str , str_len );
543
+ return zlog_stream_unbuffered_write (stream , str , str_len );
505
544
}
506
545
/* }}} */
507
546
508
547
zlog_bool zlog_stream_finish (struct zlog_stream * stream ) /* {{{ */
509
548
{
510
549
if (stream -> use_buffer ) {
550
+ /* TODO: append stream->wrap_final_suffix */
511
551
if (external_logger != NULL ) {
512
552
external_logger (stream -> flags & ZLOG_LEVEL_MASK ,
513
553
stream -> buf + stream -> prefix_len , stream -> len - stream -> prefix_len );
@@ -520,9 +560,9 @@ zlog_bool zlog_stream_finish(struct zlog_stream *stream) /* {{{ */
520
560
}
521
561
#endif
522
562
stream -> buf [stream -> len ++ ] = '\n' ;
523
- zlog_stream_write (stream , stream -> buf , stream -> len );
563
+ zlog_stream_direct_write (stream , stream -> buf , stream -> len );
524
564
} else if (!stream -> finished ) {
525
- zlog_stream_write (stream , "\n" , 1 );
565
+ zlog_stream_direct_write (stream , "\n" , 1 );
526
566
}
527
567
528
568
stream -> finished = 1 ;
0 commit comments