Prevent negative priorities on wrong error codes (fixes bug #135).

This commit is contained in:
Vreixo Formoso 2008-08-20 00:05:27 +02:00
parent 690e02a461
commit 7a87f47542
2 changed files with 74 additions and 74 deletions

View File

@ -1,4 +1,4 @@
#Fri Dec 28 21:07:56 CET 2007 #Tue Aug 19 23:58:44 CEST 2008
eclipse.preferences.version=1 eclipse.preferences.version=1
indexer/filesToParseUpFront= indexer/filesToParseUpFront=
indexer/indexAllFiles=true indexer/indexAllFiles=true

View File

@ -1,11 +1,11 @@
/* /*
* Copyright (c) 2007 Vreixo Formoso * Copyright (c) 2007 Vreixo Formoso
* *
* This file is part of the libisofs project; you can redistribute it and/or * This file is part of the libisofs project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2 as * modify it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. See COPYING file for details. * published by the Free Software Foundation. See COPYING file for details.
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
@ -14,9 +14,9 @@
#include "libisofs.h" #include "libisofs.h"
#include "messages.h" #include "messages.h"
/* /*
* error codes are 32 bit numbers, that follow the following conventions: * error codes are 32 bit numbers, that follow the following conventions:
* *
* bit 31 (MSB) -> 1 (to make the value always negative) * bit 31 (MSB) -> 1 (to make the value always negative)
* bits 30-24 -> Encoded severity (Use ISO_ERR_SEV to translate an error code * bits 30-24 -> Encoded severity (Use ISO_ERR_SEV to translate an error code
* to a LIBISO_MSGS_SEV_* constant) * to a LIBISO_MSGS_SEV_* constant)
@ -40,7 +40,7 @@
* bits 15-0 -> Error code * bits 15-0 -> Error code
*/ */
#define ISO_ERR_SEV(e) (e & 0x7F000000) #define ISO_ERR_SEV(e) (e & 0x7F000000)
#define ISO_ERR_PRIO(e) ((e & 0x00F00000) << 8) #define ISO_ERR_PRIO(e) ((e & 0x00700000) << 8)
#define ISO_ERR_CODE(e) ((e & 0x0000FFFF) | 0x00030000) #define ISO_ERR_CODE(e) ((e & 0x0000FFFF) | 0x00030000)
int iso_message_id = LIBISO_MSGS_ORIGIN_IMAGE_BASE; int iso_message_id = LIBISO_MSGS_ORIGIN_IMAGE_BASE;
@ -77,7 +77,7 @@ int iso_set_abort_severity(char *severity)
ret = libiso_msgs__text_to_sev(severity, &sevno, 0); ret = libiso_msgs__text_to_sev(severity, &sevno, 0);
if (ret <= 0) if (ret <= 0)
return ISO_WRONG_ARG_VALUE; return ISO_WRONG_ARG_VALUE;
if (sevno > LIBISO_MSGS_SEV_FAILURE || sevno < LIBISO_MSGS_SEV_NOTE) if (sevno > LIBISO_MSGS_SEV_FAILURE || sevno < LIBISO_MSGS_SEV_NOTE)
return ISO_WRONG_ARG_VALUE; return ISO_WRONG_ARG_VALUE;
ret = abort_threshold; ret = abort_threshold;
abort_threshold = sevno; abort_threshold = sevno;
@ -100,109 +100,109 @@ void iso_msg_debug(int imgid, const char *fmt, ...)
const char *iso_error_to_msg(int errcode) const char *iso_error_to_msg(int errcode)
{ {
switch(errcode) { switch(errcode) {
case ISO_CANCELED: case ISO_CANCELED:
return "Operation canceled"; return "Operation canceled";
case ISO_FATAL_ERROR: case ISO_FATAL_ERROR:
return "Unknown or unexpected fatal error"; return "Unknown or unexpected fatal error";
case ISO_ERROR: case ISO_ERROR:
return "Unknown or unexpected error"; return "Unknown or unexpected error";
case ISO_ASSERT_FAILURE: case ISO_ASSERT_FAILURE:
return "Internal programming error. Please report this bug"; return "Internal programming error. Please report this bug";
case ISO_NULL_POINTER: case ISO_NULL_POINTER:
return "NULL pointer as value for an arg. that doesn't allow NULL"; return "NULL pointer as value for an arg. that doesn't allow NULL";
case ISO_OUT_OF_MEM: case ISO_OUT_OF_MEM:
return "Memory allocation error"; return "Memory allocation error";
case ISO_INTERRUPTED: case ISO_INTERRUPTED:
return "Interrupted by a signal"; return "Interrupted by a signal";
case ISO_WRONG_ARG_VALUE: case ISO_WRONG_ARG_VALUE:
return "Invalid parameter value"; return "Invalid parameter value";
case ISO_THREAD_ERROR: case ISO_THREAD_ERROR:
return "Can't create a needed thread"; return "Can't create a needed thread";
case ISO_WRITE_ERROR: case ISO_WRITE_ERROR:
return "Write error"; return "Write error";
case ISO_BUF_READ_ERROR: case ISO_BUF_READ_ERROR:
return "Buffer read error"; return "Buffer read error";
case ISO_NODE_ALREADY_ADDED: case ISO_NODE_ALREADY_ADDED:
return "Trying to add to a dir a node already added to a dir"; return "Trying to add to a dir a node already added to a dir";
case ISO_NODE_NAME_NOT_UNIQUE: case ISO_NODE_NAME_NOT_UNIQUE:
return "Node with same name already exists"; return "Node with same name already exists";
case ISO_NODE_NOT_ADDED_TO_DIR: case ISO_NODE_NOT_ADDED_TO_DIR:
return "Trying to remove a node that was not added to dir"; return "Trying to remove a node that was not added to dir";
case ISO_NODE_DOESNT_EXIST: case ISO_NODE_DOESNT_EXIST:
return "A requested node does not exist"; return "A requested node does not exist";
case ISO_IMAGE_ALREADY_BOOTABLE: case ISO_IMAGE_ALREADY_BOOTABLE:
return "Try to set the boot image of an already bootable image"; return "Try to set the boot image of an already bootable image";
case ISO_BOOT_IMAGE_NOT_VALID: case ISO_BOOT_IMAGE_NOT_VALID:
return "Trying to use an invalid file as boot image"; return "Trying to use an invalid file as boot image";
case ISO_FILE_ERROR: case ISO_FILE_ERROR:
return "Error on file operation"; return "Error on file operation";
case ISO_FILE_ALREADY_OPENED: case ISO_FILE_ALREADY_OPENED:
return "Trying to open an already opened file"; return "Trying to open an already opened file";
case ISO_FILE_ACCESS_DENIED: case ISO_FILE_ACCESS_DENIED:
return "Access to file is not allowed"; return "Access to file is not allowed";
case ISO_FILE_BAD_PATH: case ISO_FILE_BAD_PATH:
return "Incorrect path to file"; return "Incorrect path to file";
case ISO_FILE_DOESNT_EXIST: case ISO_FILE_DOESNT_EXIST:
return "The file does not exist in the filesystem"; return "The file does not exist in the filesystem";
case ISO_FILE_NOT_OPENED: case ISO_FILE_NOT_OPENED:
return "Trying to read or close a file not opened"; return "Trying to read or close a file not opened";
case ISO_FILE_IS_DIR: case ISO_FILE_IS_DIR:
return "Directory used where no dir is expected"; return "Directory used where no dir is expected";
case ISO_FILE_READ_ERROR: case ISO_FILE_READ_ERROR:
return "Read error"; return "Read error";
case ISO_FILE_IS_NOT_DIR: case ISO_FILE_IS_NOT_DIR:
return "Not dir used where a dir is expected"; return "Not dir used where a dir is expected";
case ISO_FILE_IS_NOT_SYMLINK: case ISO_FILE_IS_NOT_SYMLINK:
return "Not symlink used where a symlink is expected"; return "Not symlink used where a symlink is expected";
case ISO_FILE_SEEK_ERROR: case ISO_FILE_SEEK_ERROR:
return "Can't seek to specified location"; return "Can't seek to specified location";
case ISO_FILE_IGNORED: case ISO_FILE_IGNORED:
return "File not supported in ECMA-119 tree and thus ignored"; return "File not supported in ECMA-119 tree and thus ignored";
case ISO_FILE_TOO_BIG: case ISO_FILE_TOO_BIG:
return "A file is bigger than supported by used standard"; return "A file is bigger than supported by used standard";
case ISO_FILE_CANT_WRITE: case ISO_FILE_CANT_WRITE:
return "File read error during image creation"; return "File read error during image creation";
case ISO_FILENAME_WRONG_CHARSET: case ISO_FILENAME_WRONG_CHARSET:
return "Can't convert filename to requested charset"; return "Can't convert filename to requested charset";
case ISO_FILE_CANT_ADD: case ISO_FILE_CANT_ADD:
return "File can't be added to the tree"; return "File can't be added to the tree";
case ISO_FILE_IMGPATH_WRONG: case ISO_FILE_IMGPATH_WRONG:
return "File path break specification constraints and will be ignored"; return "File path break specification constraints and will be ignored";
case ISO_CHARSET_CONV_ERROR: case ISO_CHARSET_CONV_ERROR:
return "Charset conversion error"; return "Charset conversion error";
case ISO_MANGLE_TOO_MUCH_FILES: case ISO_MANGLE_TOO_MUCH_FILES:
return "Too much files to mangle, can't guarantee unique file names"; return "Too much files to mangle, can't guarantee unique file names";
case ISO_WRONG_PVD: case ISO_WRONG_PVD:
return "Wrong or damaged Primary Volume Descriptor"; return "Wrong or damaged Primary Volume Descriptor";
case ISO_WRONG_RR: case ISO_WRONG_RR:
return "Wrong or damaged RR entry"; return "Wrong or damaged RR entry";
case ISO_UNSUPPORTED_RR: case ISO_UNSUPPORTED_RR:
return "Unsupported RR feature"; return "Unsupported RR feature";
case ISO_WRONG_ECMA119: case ISO_WRONG_ECMA119:
return "Wrong or damaged ECMA-119"; return "Wrong or damaged ECMA-119";
case ISO_UNSUPPORTED_ECMA119: case ISO_UNSUPPORTED_ECMA119:
return "Unsupported ECMA-119 feature"; return "Unsupported ECMA-119 feature";
case ISO_WRONG_EL_TORITO: case ISO_WRONG_EL_TORITO:
return "Wrong or damaged El-Torito catalog"; return "Wrong or damaged El-Torito catalog";
case ISO_UNSUPPORTED_EL_TORITO: case ISO_UNSUPPORTED_EL_TORITO:
return "Unsupported El-Torito feature"; return "Unsupported El-Torito feature";
case ISO_ISOLINUX_CANT_PATCH: case ISO_ISOLINUX_CANT_PATCH:
return "Can't patch isolinux boot image"; return "Can't patch isolinux boot image";
case ISO_UNSUPPORTED_SUSP: case ISO_UNSUPPORTED_SUSP:
return "Unsupported SUSP feature"; return "Unsupported SUSP feature";
case ISO_WRONG_RR_WARN: case ISO_WRONG_RR_WARN:
return "Error on a RR entry that can be ignored"; return "Error on a RR entry that can be ignored";
case ISO_SUSP_UNHANDLED: case ISO_SUSP_UNHANDLED:
return "Error on a RR entry that can be ignored"; return "Error on a RR entry that can be ignored";
case ISO_SUSP_MULTIPLE_ER: case ISO_SUSP_MULTIPLE_ER:
return "Multiple ER SUSP entries found"; return "Multiple ER SUSP entries found";
case ISO_UNSUPPORTED_VD: case ISO_UNSUPPORTED_VD:
return "Unsupported volume descriptor found"; return "Unsupported volume descriptor found";
case ISO_EL_TORITO_WARN: case ISO_EL_TORITO_WARN:
return "El-Torito related warning"; return "El-Torito related warning";
case ISO_IMAGE_WRITE_CANCELED: case ISO_IMAGE_WRITE_CANCELED:
return "Image write cancelled"; return "Image write cancelled";
case ISO_EL_TORITO_HIDDEN: case ISO_EL_TORITO_HIDDEN:
return "El-Torito image is hidden"; return "El-Torito image is hidden";
default: default:
return "Unknown error"; return "Unknown error";
@ -213,7 +213,7 @@ int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...)
{ {
char msg[MAX_MSG_LEN]; char msg[MAX_MSG_LEN];
va_list ap; va_list ap;
/* when called with ISO_CANCELED, we don't need to submit any message */ /* when called with ISO_CANCELED, we don't need to submit any message */
if (errcode == ISO_CANCELED && fmt == NULL) { if (errcode == ISO_CANCELED && fmt == NULL) {
return ISO_CANCELED; return ISO_CANCELED;
@ -227,12 +227,12 @@ int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...)
strncpy(msg, iso_error_to_msg(errcode), MAX_MSG_LEN); strncpy(msg, iso_error_to_msg(errcode), MAX_MSG_LEN);
} }
libiso_msgs_submit(libiso_msgr, imgid, ISO_ERR_CODE(errcode), libiso_msgs_submit(libiso_msgr, imgid, ISO_ERR_CODE(errcode),
ISO_ERR_SEV(errcode), ISO_ERR_PRIO(errcode), msg, 0, 0); ISO_ERR_SEV(errcode), ISO_ERR_PRIO(errcode), msg, 0, 0);
if (causedby != 0) { if (causedby != 0) {
snprintf(msg, MAX_MSG_LEN, " > Caused by: %s", snprintf(msg, MAX_MSG_LEN, " > Caused by: %s",
iso_error_to_msg(causedby)); iso_error_to_msg(causedby));
libiso_msgs_submit(libiso_msgr, imgid, ISO_ERR_CODE(causedby), libiso_msgs_submit(libiso_msgr, imgid, ISO_ERR_CODE(causedby),
LIBISO_MSGS_SEV_NOTE, LIBISO_MSGS_PRIO_LOW, msg, 0, 0); LIBISO_MSGS_SEV_NOTE, LIBISO_MSGS_PRIO_LOW, msg, 0, 0);
if (ISO_ERR_SEV(causedby) == LIBISO_MSGS_SEV_FATAL) { if (ISO_ERR_SEV(causedby) == LIBISO_MSGS_SEV_FATAL) {
return ISO_CANCELED; return ISO_CANCELED;
@ -246,11 +246,11 @@ int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...)
} }
} }
/** /**
* Control queueing and stderr printing of messages from libisofs. * Control queueing and stderr printing of messages from libisofs.
* Severity may be one of "NEVER", "FATAL", "SORRY", "WARNING", "HINT", * Severity may be one of "NEVER", "FATAL", "SORRY", "WARNING", "HINT",
* "NOTE", "UPDATE", "DEBUG", "ALL". * "NOTE", "UPDATE", "DEBUG", "ALL".
* *
* @param queue_severity Gives the minimum limit for messages to be queued. * @param queue_severity Gives the minimum limit for messages to be queued.
* Default: "NEVER". If you queue messages then you * Default: "NEVER". If you queue messages then you
* must consume them by iso_msgs_obtain(). * must consume them by iso_msgs_obtain().
@ -259,7 +259,7 @@ int iso_msg_submit(int imgid, int errcode, int causedby, const char *fmt, ...)
* @param print_id A text prefix to be printed before the message. * @param print_id A text prefix to be printed before the message.
* @return >0 for success, <=0 for error * @return >0 for success, <=0 for error
*/ */
int iso_set_msgs_severities(char *queue_severity, char *print_severity, int iso_set_msgs_severities(char *queue_severity, char *print_severity,
char *print_id) char *print_id)
{ {
int ret, queue_sevno, print_sevno; int ret, queue_sevno, print_sevno;
@ -277,15 +277,15 @@ int iso_set_msgs_severities(char *queue_severity, char *print_severity,
return 1; return 1;
} }
/** /**
* Obtain the oldest pending libisofs message from the queue which has at * Obtain the oldest pending libisofs message from the queue which has at
* least the given minimum_severity. This message and any older message of * least the given minimum_severity. This message and any older message of
* lower severity will get discarded from the queue and is then lost forever. * lower severity will get discarded from the queue and is then lost forever.
* *
* Severity may be one of "NEVER", "FATAL", "SORRY", "WARNING", "HINT", * Severity may be one of "NEVER", "FATAL", "SORRY", "WARNING", "HINT",
* "NOTE", "UPDATE", "DEBUG", "ALL". To call with minimum_severity "NEVER" * "NOTE", "UPDATE", "DEBUG", "ALL". To call with minimum_severity "NEVER"
* will discard the whole queue. * will discard the whole queue.
* *
* @param error_code Will become a unique error code as listed in messages.h * @param error_code Will become a unique error code as listed in messages.h
* @param imgid Id of the image that was issued the message. * @param imgid Id of the image that was issued the message.
* @param msg_text Must provide at least ISO_MSGS_MESSAGE_LEN bytes. * @param msg_text Must provide at least ISO_MSGS_MESSAGE_LEN bytes.
@ -305,7 +305,7 @@ int iso_obtain_msgs(char *minimum_severity, int *error_code, int *imgid,
ret = libiso_msgs__text_to_sev(minimum_severity, &minimum_sevno, 0); ret = libiso_msgs__text_to_sev(minimum_severity, &minimum_sevno, 0);
if (ret <= 0) if (ret <= 0)
return 0; return 0;
ret = libiso_msgs_obtain(libiso_msgr, &item, minimum_sevno, ret = libiso_msgs_obtain(libiso_msgr, &item, minimum_sevno,
LIBISO_MSGS_PRIO_ZERO, 0); LIBISO_MSGS_PRIO_ZERO, 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
@ -319,7 +319,7 @@ int iso_obtain_msgs(char *minimum_severity, int *error_code, int *imgid,
ret = libiso_msgs_item_get_origin(item, &timestamp, &pid, imgid, 0); ret = libiso_msgs_item_get_origin(item, &timestamp, &pid, imgid, 0);
if (ret <= 0) if (ret <= 0)
goto ex; goto ex;
severity[0]= 0; severity[0]= 0;
ret = libiso_msgs_item_get_rank(item, &sevno, &priority, 0); ret = libiso_msgs_item_get_rank(item, &sevno, &priority, 0);
if (ret <= 0) if (ret <= 0)
@ -394,7 +394,7 @@ int iso_sev_to_text(int severity_number, char **severity_name)
* may be used by related libraries to their own compatible * may be used by related libraries to their own compatible
* messenger objects and thus to direct their messages to the libisofs * messenger objects and thus to direct their messages to the libisofs
* message queue. See also: libburn, API function burn_set_messenger(). * message queue. See also: libburn, API function burn_set_messenger().
* *
* @return the handle. Do only use with compatible * @return the handle. Do only use with compatible
*/ */
void *iso_get_messenger() void *iso_get_messenger()