Blame example/logging.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2013 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* Simple program to show how to set log verbosity and how to write a
Packit dd8086
   custom log handler.
Packit dd8086
Packit dd8086
   Invoke with an argument level, e.g.
Packit dd8086
      logging debug
Packit dd8086
   or with a number like:
Packit dd8086
      logging 1 # same as debug
Packit dd8086
*/
Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_ERRNO_H
Packit dd8086
#include <errno.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_LIMITS_H
Packit dd8086
#include <limits.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/cd_types.h>
Packit dd8086
#include <cdio/logging.h>
Packit dd8086
Packit dd8086
Packit dd8086
/* Here is an example of a custom log handler. */
Packit dd8086
static void
Packit dd8086
custom_log_handler (cdio_log_level_t level, const char *message)
Packit dd8086
{
Packit dd8086
  switch(level) {
Packit dd8086
  case CDIO_LOG_DEBUG:
Packit dd8086
    printf("-- custom debug message: %s\n", message);
Packit dd8086
    return;
Packit dd8086
  case CDIO_LOG_INFO:
Packit dd8086
    printf("-- custom info message: %s\n", message);
Packit dd8086
    return;
Packit dd8086
  case CDIO_LOG_WARN:
Packit dd8086
    printf("-- custom warning message: %s\n", message);
Packit dd8086
    return;
Packit dd8086
  case CDIO_LOG_ERROR:
Packit dd8086
    printf("-- custom error message: %s\n", message);
Packit dd8086
    return;
Packit dd8086
  case CDIO_LOG_ASSERT:
Packit dd8086
    printf("-- custom assertion message: %s\n", message);
Packit dd8086
    return;
Packit dd8086
  default:
Packit dd8086
    printf("custom level %d message: %s\n", level, message);
Packit dd8086
  }
Packit dd8086
}
Packit dd8086
Packit dd8086
static long
Packit dd8086
parse_loglevel_arg(const char *ps_loglevel) {
Packit dd8086
    long loglevel;
Packit dd8086
    if (strncmp(ps_loglevel, "debug", strlen("debug")) == 0) {
Packit dd8086
	loglevel = CDIO_LOG_DEBUG;
Packit dd8086
    } else if (strncmp(ps_loglevel, "info", strlen("info")) == 0) {
Packit dd8086
	loglevel = CDIO_LOG_INFO;
Packit dd8086
    } else if (strncmp(ps_loglevel, "warn", strlen("warn")) == 0) {
Packit dd8086
	loglevel = CDIO_LOG_WARN;
Packit dd8086
    } else if (strncmp(ps_loglevel, "error", strlen("error")) == 0) {
Packit dd8086
	loglevel = CDIO_LOG_ERROR;
Packit dd8086
    } else if (strncmp(ps_loglevel, "assert", strlen("assert")) == 0) {
Packit dd8086
	loglevel = CDIO_LOG_ASSERT;
Packit dd8086
    } else {
Packit dd8086
        char *endptr;
Packit dd8086
	errno = 0;    /* To distinguish success/failure after call */
Packit dd8086
	loglevel = strtol(ps_loglevel, &endptr, 10);
Packit dd8086
Packit dd8086
	/* Check for various possible errors, in parsing the verbosity
Packit dd8086
	 * level. */
Packit dd8086
	if ((errno == ERANGE &&
Packit dd8086
	     (loglevel == LONG_MAX || loglevel == LONG_MIN))
Packit dd8086
		|| (errno != 0 && loglevel == 0)) {
Packit dd8086
	    perror("strtol conversion error of loglevel");
Packit dd8086
	    exit(EXIT_FAILURE);
Packit dd8086
	}
Packit dd8086
Packit dd8086
	if (endptr == ps_loglevel) {
Packit dd8086
	    fprintf(stderr, "No digits were found\n");
Packit dd8086
	    exit(EXIT_FAILURE);
Packit dd8086
	}
Packit dd8086
    }
Packit dd8086
    return loglevel;
Packit dd8086
}
Packit dd8086
Packit dd8086
static void
Packit dd8086
print_drives(void)
Packit dd8086
{
Packit dd8086
    char **ppsz_cd_drives=NULL, **c;
Packit dd8086
    /* Print out a list of CD-drives with the above set log level. */
Packit dd8086
    ppsz_cd_drives = cdio_get_devices(DRIVER_DEVICE);
Packit dd8086
    if (NULL != ppsz_cd_drives)
Packit dd8086
	for( c = ppsz_cd_drives; *c != NULL; c++ ) {
Packit dd8086
	    printf("-- Drive %s\n", *c);
Packit dd8086
	}
Packit dd8086
    cdio_free_device_list(ppsz_cd_drives);
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
    /* Set the log level to the warning verbosity. */
Packit dd8086
    cdio_loglevel_default = CDIO_LOG_WARN;
Packit dd8086
Packit dd8086
    /* Parse command arguemnts */
Packit dd8086
    if (argc > 2) {
Packit dd8086
	printf("Usage:\n%s <verbosity-level>\n"
Packit dd8086
	       "Shows drives.\n"
Packit dd8086
	       "A verbosity level is a name like 'debug', 'info', 'warn,'\n"
Packit dd8086
	       "or a number greater than 0.\n",
Packit dd8086
	       argv[0]);
Packit dd8086
	exit(EXIT_FAILURE);
Packit dd8086
    }
Packit dd8086
Packit dd8086
    if (argc == 2) {
Packit dd8086
	/* Set cdio's verbosity level. */
Packit dd8086
        cdio_loglevel_default = parse_loglevel_arg(argv[1]);
Packit dd8086
    }
Packit dd8086
Packit dd8086
    print_drives();
Packit dd8086
Packit dd8086
    /* Do the same thing again but with a custom log handler. */
Packit dd8086
    cdio_log_set_handler (custom_log_handler);
Packit dd8086
Packit dd8086
    print_drives();
Packit dd8086
    return 0;
Packit dd8086
}