/* -*- c -*- */ /** * libgamma — Display server abstraction layer for gamma ramp adjustments * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . */ #include "libgamma-error.h" #include #include #include #include #include £>set -u £>cd src/extract £>export PATH=".:${PATH}" /** * Group that the user needs to be a member of if `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned. */ gid_t libgamma_group_gid = 0; /** * Group that the user needs to be a member of if `LIBGAMMA_DEVICE_REQUIRE_GROUP` is returned, * `NULL` if the name of the group `libgamma_group_gid` cannot be determined. */ const char* libgamma_group_name = NULL; /** * Prints an error to stderr in a `perror` fashion, * however this function will not translate the `libgamma` * errors into human-readable strings, it will simply * print the name of the error. If the value `error_code` * is the value of `LIBGAMMA_ERRNO_SET`, `perror` will be * used to print the current error stored in `errno`. * If `error_code` is non-negative (an `errno` value`), that * value will be stored in `errno` and `perror` will be * used to print it. Additionally, if the `error_code` is * the value of `LIBGAMMA_DEVICE_REQUIRE_GROUP` the * required group will be printed with its numerical value * and, if known, its name. * * @param name The text to add at the beginning. * @param value The error code, may be an `errno` value. */ void libgamma_perror(const char* name, int error_code) { if (error_code >= 0) { errno = error_code; perror(name); } else if (error_code == LIBGAMMA_ERRNO_SET) perror(name); else if (error_code == LIBGAMMA_DEVICE_REQUIRE_GROUP) { const char* error = libgamma_name_of_error(error_code); long int gid = (long int)libgamma_group_gid; if (libgamma_group_name == NULL) fprintf(stderr, "%s: %s: %ld\n", name, error, gid); else fprintf(stderr, "%s: %s: %s (%lid)\n", name, error, libgamma_group_name, gid); } else if (error_code < LIBGAMMA_ERROR_MIN) fprintf(stderr, "%s: (?)\n", name); else fprintf(stderr, "%s: %s\n", name, libgamma_name_of_error(error_code)); } /** * Returns the name of the definition associated with a `libgamma` error code. * * @param value The error code. * @return The name of the definition associated with the error code, * `NULL` if the error code does not exist. The return string * should not be `free`:d. */ const char* libgamma_name_of_error(int value) { static const char* error_names[] = { £>for error in $(libgamma-error-extract --list); do "£{error}", £>done }; if ((value < LIBGAMMA_ERROR_MIN) || (value >= 0)) return NULL; return error_names[-value - 1]; } /** * Return the value of a `libgamma` error definition refered to by name. * * @param name The name of the definition associated with the error code. * @return The error code, zero if the name does is `NULL` * or does not refer to a `libgamma` error. */ int libgamma_value_of_error(const char* name) { if (name == NULL) return 0; £>for error in $(libgamma-error-extract --list); do if (!strcmp(name, "£{error}")) return £{error}; £>done return 0; }