slog2_parse_dynamic_buffer(), slog2_parse_static_buffer()
Parse a slogger2 buffer
Synopsis:
#include <slog2_parse.h>
int slog2_parse_dynamic_buffer( slog2_log_t log,
                                int buffer_index,
                                slog2_packet_info_t *packet_info,
                                slog2_packet_callback callback,
                                void *param );
int slog2_parse_static_buffer( slog2_log_t log,
                               int buffer_index,
                               slog2_packet_info_t *packet_info,
                               slog2_packet_callback callback,
                               void *param );
Arguments:
- log
 - A handle previously returned by slog2_open_log().
 - buffer_index
 - The buffer index; indexes range from 0 to (slog2_log_info.num_buffers - 1).
 - packet_info
 - A pointer to a slog2_packet_info_t structure, which gets populated and passed to the callback.
 - callback
 - A function of type slog2_packet_callback:
typedef int (*slog2_packet_callback)( slog2_packet_info_t *__info, void *__payload, void *__param );that's called to process each packet in the buffer; see below.
 - param
 - A pointer to additional data that you want to pass to the callback function.
 
Library:
libslog2parse
Use the -l slog2parse option to qcc to link against this library.
Description:
The slog2_parse_dynamic_buffer() and slog2_parse_static_buffer() functions parse through a live or static slogger2 buffer (respectively) from beginning to end, finding valid packets and calling the given callback function for each packet. If the callback returns a nonzero value, then these functions return immediately.
The prototype of the callback function is:
int callback( slog2_packet_info_t *info,
              void *payload,
              void *param );
The arguments are:
- info
 - A pointer to a slog2_packet_info_t structure that describes the current packet.
 - payload
 - A pointer to the packet payload.
 - param
 - A pointer to any additional data that you want to pass to the callback.
 
The callback should return 0 on success, or a nonzero value on failure.
Returns:
0 on success, or -1 on failure.
Examples:
#include <stdlib.h>
#include <stdio.h>
#include <sys/slog2.h>
#include <slog2_parse.h>
int my_callback (slog2_packet_info_t *info, void *payload, void *param)
{
        printf ("      Processing packet %d of size %d\n", info->sequence_number,
                info->data_size);
        switch (info->severity)
        {
           case SLOG2_SHUTDOWN: printf ("         SHUTDOWN: ");
                                break;
           case SLOG2_CRITICAL: printf ("         CRITICAL: ");
                                break;
           case SLOG2_ERROR:    printf ("         ERROR: ");
                                break;
           case SLOG2_WARNING:  printf ("         Warning: ");
                                break;
           case SLOG2_NOTICE:   printf ("         Notice: ");
                                break;
           case SLOG2_INFO:     printf ("         Info: ");
                                break;
           case SLOG2_DEBUG1:   printf ("         debug1: ");
                                break;
           case SLOG2_DEBUG2:   printf ("         debug2: ");
                                break;
           default: printf ("         Unknown: ");
        }
        printf ("%s\n", (char *)payload);
        return 0;
}
int main(int argc, char *argv[]) {
        char log_path[PATH_MAX] = "/dev/shmem/slogger2/slogger_two.184341";
        slog2_log_t my_log;
        slog2_log_info_t log_info = SLOG2_LOG_INFO_INIT;
        int buffer_index;
        slog2_packet_info_t packet_info = SLOG2_PACKET_INFO_INIT;
        slog2_buffer_info_t buffer_info = SLOG2_BUFFER_INFO_INIT;
        /* Open a log file */
        my_log = slog2_open_log(log_path);
        if (my_log == 0)
        {
                printf ("Couldn't open %s.\n", log_path);
                return EXIT_FAILURE;
        }
        /* What do we know about the log? */
        if (slog2_get_log_info(my_log, &log_info) == -1)
        {
                printf ("Couldn't get information about the log.\n");
                return EXIT_FAILURE;
        }
        printf ("Log information:\n");
        printf ("  Num buffers: %d\n", log_info.num_buffers);
        printf ("  Owner: %d\n", log_info.owner_pid);
        printf ("  Buffer set name: %s\n", log_info.buffer_set_name);
        printf ("  Verbosity: %d\n", log_info.verbosity_level);
        /* Parse the log file. */
        printf ("\nBuffers:\n");
        for (buffer_index = 0; buffer_index < log_info.num_buffers; buffer_index++)
        {
                if (slog2_get_buffer_info(my_log, buffer_index, &buffer_info) == -1)
                {
                        printf ("Couldn't get info about buffer %d.\n", buffer_index);
                        return EXIT_FAILURE;
                }
                printf ("  Buffer %d: size: %d  Name: %s\n", buffer_index,
                           buffer_info.buffer_size, buffer_info.buffer_name);
                if (slog2_parse_static_buffer( my_log, buffer_index, &packet_info,
                                               my_callback, NULL) == -1)
                {
                        printf ("slog2_parse_static_buffer() failed.\n");
                        return EXIT_FAILURE;
                }
        }
        /* Close the log file. */
        slog2_close_log( my_log);
        return EXIT_SUCCESS;
}
When run on the log produced by the example for slog2_register(), this program produces the following output:
Log information:
  Num buffers: 2
  Owner: 184341
  Buffer set name: slogger_two
  Verbosity: 5
Buffers:
  Buffer 0: size: 28672  Name: hi_rate_logging
      Processing packet 0 of size 63
         Info: Writing a formatted string into the buffer: ./root/slogger_two
      Processing packet 1 of size 43
         Info: Writing a constant string into the buffer.
      Processing packet 2 of size 37
         Warning: string:Hello world, some_number:5108
  Buffer 1: size: 4096  Name: lo_rate_logging
      Processing packet 3 of size 28
         Notice: This string will be logged.
Classification:
| Safety: | |
|---|---|
| Cancellation point | No | 
| Signal handler | No | 
| Thread | Yes | 
