/*
* Copyright (c) 2020 Red Hat, Inc.
*
* This program 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 2
* of the License, or (at your option) any later version.
*
* This program 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 program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/kernel/errors.h#1 $
*/
#ifndef ERRORS_H
#define ERRORS_H
#include <linux/types.h>
#include "uds-error.h"
enum udsInternalErrorCodes {
/** Used as a base value for reporting internal errors */
UDS_INTERNAL_ERROR_CODE_BASE = 66560,
/** Client/server protocol framing error */
UDS_PROTOCOL_ERROR = UDS_INTERNAL_ERROR_CODE_BASE + 0,
/** Index overflow */
UDS_OVERFLOW = UDS_INTERNAL_ERROR_CODE_BASE + 1,
/** Fill phase done (intended for albfill only) */
UDS_FILLDONE = UDS_INTERNAL_ERROR_CODE_BASE + 2,
/** Invalid argument passed to internal routine */
UDS_INVALID_ARGUMENT = UDS_INTERNAL_ERROR_CODE_BASE + 3,
/** UDS data structures are in an invalid state */
UDS_BAD_STATE = UDS_INTERNAL_ERROR_CODE_BASE + 4,
/** Attempt to enter the same name into an internal structure twice */
UDS_DUPLICATE_NAME = UDS_INTERNAL_ERROR_CODE_BASE + 5,
/** An internal protocol violation between system components */
UDS_UNEXPECTED_RESULT = UDS_INTERNAL_ERROR_CODE_BASE + 6,
/** An error created by test case processing */
UDS_INJECTED_ERROR = UDS_INTERNAL_ERROR_CODE_BASE + 7,
/** An assertion failed */
UDS_ASSERTION_FAILED = UDS_INTERNAL_ERROR_CODE_BASE + 8,
/** A file or stream is not scannable with the current scanner */
UDS_UNSCANNABLE = UDS_INTERNAL_ERROR_CODE_BASE + 9,
/** Not an actual error, but reporting that the result will be delayed */
UDS_QUEUED = UDS_INTERNAL_ERROR_CODE_BASE + 10,
/** Queue already connected */
UDS_QUEUE_ALREADY_CONNECTED = UDS_INTERNAL_ERROR_CODE_BASE + 11,
/** Fill phase not supported */
UDS_BAD_FILL_PHASE = UDS_INTERNAL_ERROR_CODE_BASE + 12,
/** A problem has occurred with a Buffer */
UDS_BUFFER_ERROR = UDS_INTERNAL_ERROR_CODE_BASE + 13,
/** A network connection was lost */
UDS_CONNECTION_LOST = UDS_INTERNAL_ERROR_CODE_BASE + 14,
/** A time out has occurred */
UDS_TIMEOUT = UDS_INTERNAL_ERROR_CODE_BASE + 15,
/** No directory was found where one was expected */
UDS_NO_DIRECTORY = UDS_INTERNAL_ERROR_CODE_BASE + 16,
/** Checkpoint not completed */
UDS_CHECKPOINT_INCOMPLETE = UDS_INTERNAL_ERROR_CODE_BASE + 17,
/** Invalid albGenTest server run ID */
UDS_INVALID_RUN_ID = UDS_INTERNAL_ERROR_CODE_BASE + 18,
/** albGenTest server run canceled */
UDS_RUN_CANCELED = UDS_INTERNAL_ERROR_CODE_BASE + 19,
/** this error range has already been registered */
UDS_ALREADY_REGISTERED = UDS_INTERNAL_ERROR_CODE_BASE + 20,
/** One more than the last UDS_INTERNAL error code */
UDS_INTERNAL_ERROR_CODE_LAST,
/** One more than the last error this block will ever use */
UDS_INTERNAL_ERROR_CODE_BLOCK_END = UDS_INTERNAL_ERROR_CODE_BASE + 440
};
enum {
ERRBUF_SIZE = 128 // default size for buffer passed to stringError
};
const char *stringError(int errnum, char *buf, size_t buflen);
const char *stringErrorName(int errnum, char *buf, size_t buflen);
int makeUnrecoverable(int resultCode) __attribute__((warn_unused_result));
bool isUnrecoverable(int resultCode) __attribute__((warn_unused_result));
int sansUnrecoverable(int resultCode) __attribute__((warn_unused_result));
typedef struct errorInfo {
const char *name;
const char *message;
} ErrorInfo;
/**
* Initialize UDS error code blocks.
*
* @note Must be called once, before any of the other routines in this
* file.
**/
void initializeStandardErrorBlocks(void);
/**
* Register an error code block for stringError and stringErrorName.
*
* @param blockName the name of the block of error codes
* @param firstError the first error code in the block
* @param lastReservedError one past the highest possible error in the block
* @param infos a pointer to the error info array for the block
* @param infoSize the size of the error info array, which determines
* the last actual error for which information is
* available
*
* @return a success or error code, particularly UDS_DUPLICATE_NAME if the
* block name is already present, or UDS_ALREADY_REGISTERED if a
* block with the specified error code is present
**/
int registerErrorBlock(const char *blockName,
int firstError,
int lastReservedError,
const ErrorInfo *infos,
size_t infoSize);
#endif /* ERRORS_H */