From c511a2674906fd93470f0a9b77340041771466e1 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Tue, 30 Jun 2009 16:40:38 +0000 Subject: Move Asterisk-addons modules into the main Asterisk source tree. Someone asked yesterday, "is there a good reason why we can't just put these modules in Asterisk?". After a brief discussion, as long as the modules are clearly set aside in their own directory and not enabled by default, it is perfectly fine. For more information about why a module goes in addons, see README-addons.txt. chan_ooh323 does not currently compile as it is behind some trunk API updates. However, it will not build by default, so it should be okay for now. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@204413 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- addons/ooh323c/src/errmgmt.c | 261 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 addons/ooh323c/src/errmgmt.c (limited to 'addons/ooh323c/src/errmgmt.c') diff --git a/addons/ooh323c/src/errmgmt.c b/addons/ooh323c/src/errmgmt.c new file mode 100644 index 000000000..d41bad102 --- /dev/null +++ b/addons/ooh323c/src/errmgmt.c @@ -0,0 +1,261 @@ +/* + * Copyright (C) 1997-2005 by Objective Systems, Inc. + * + * This software is furnished under an open source license and may be + * used and copied only in accordance with the terms of this license. + * The text of the license may generally be found in the root + * directory of this installation in the COPYING file. It + * can also be viewed online at the following URL: + * + * http://www.obj-sys.com/open/license.html + * + * Any redistributions of this file including modified versions must + * maintain this copyright notice. + * + *****************************************************************************/ + +/* Error management functions */ + +#include +#include "ooasn1.h" + +/* Error status text */ +static const char* g_status_text[] = { + "Encode buffer overflow", + "Unexpected end of buffer on decode", + "Unexpected tag encountered: expected = %s, parsed = %s", + "Invalid object identifier", + "Invalid field length detected", + "Enumerated value %s not in defined set", + "Duplicate element in SET", + "Missing required element in SET", + "Element with tag %s not part of SET", + "Max elements defined for SEQUENCE field exceeded", + "Element with tag %s is an invalid option in choice", + "No dynamic memory available", + "Invalid string type", + "Invalid hex string", + "Invalid binary string", + "Invalid real value", + "Max items in sized BIT or OCTET STRING field exceeded", + "Invalid value specification", + "No definition found for referenced defined value", + "No definition found for referenced defined type", + "Invalid tag value", + "Nesting level too deep", + "Value constraint violation: field %s, value %s", + "Value range error: lower bound is greater than upper", + "Unexpected end of file detected", + "Invalid UTF-8 character at index %d", + "List error: concurrent modification attempt while iterating", + "List error: illegal state for attempted operation", + "Array index out of bounds", + "Invalid parameter passed to function or method", + "Invalid time string format", + "Context is not initialized", + "ASN.1 value will not fit in target variable", + "Character is not within the defined character set", + "Invalid XML state for attempted operation", + "Error condition returned from XML parser:\n%s", + "SEQUENCE elements not in correct order", + "Invalid index for table constraint identifier", + "Invalid value for relational table constraint fixed type field", + "File not found", + "File read error", + "File write error", + "Invalid Base64 string", + "Socket error", + "XML interface library not found", + "Invalid XML interface library" +} ; + +#define ASN1_K_MAX_STAT (sizeof(g_status_text)/sizeof(char *)) + +/* Add an integer parameter to an error message */ + +int errAddIntParm (ASN1ErrInfo* pErrInfo, int errParm) +{ + char lbuf[16]; + sprintf (lbuf, "%d", errParm); + return errAddStrParm (pErrInfo, lbuf); +} + +/* Add a character string parameter to an error message */ + +int errAddStrParm (ASN1ErrInfo* pErrInfo, const char* errprm_p) +{ +#if defined(_NO_THREADS) || !defined(_NO_MALLOC) + if (pErrInfo->parmcnt < ASN_K_MAXERRP) { + char* tmpstr = (char*) ASN1CRTMALLOC0 (strlen(errprm_p)+1); + strcpy (tmpstr, errprm_p); + pErrInfo->parms[pErrInfo->parmcnt] = tmpstr; + pErrInfo->parmcnt++; + return TRUE; + } + else +#endif + return FALSE; +} + +/* Add an unsigned integer parameter to an error message */ + +int errAddUIntParm (ASN1ErrInfo* pErrInfo, unsigned int errParm) +{ + char lbuf[16]; + sprintf (lbuf, "%u", errParm); + return errAddStrParm (pErrInfo, lbuf); +} + +/* Free error parameter memory */ + +void errFreeParms (ASN1ErrInfo* pErrInfo) +{ +#if defined(_NO_THREADS) || !defined(_NO_MALLOC) + int i; + + for (i = 0; i < pErrInfo->parmcnt; i++) + ASN1CRTFREE0 ((char*)pErrInfo->parms[i]); +#endif + + pErrInfo->parmcnt = 0; + pErrInfo->status = 0; +} + +/* Reset error */ + +int errReset (ASN1ErrInfo* pErrInfo) +{ + errFreeParms (pErrInfo); + pErrInfo->stkx = 0; + return ASN_OK; +} + +/* Format error message */ + +char* errFmtMsg (ASN1ErrInfo* pErrInfo, char* bufp) +{ + const char* tp; + int i, j, pcnt; + + if (pErrInfo->status < 0) + { + i = abs (pErrInfo->status + 1); + + if (i >= 0 && i < ASN1_K_MAX_STAT) + { + /* Substitute error parameters into error message */ + + j = pcnt = 0; + tp = g_status_text[i]; + + while (*tp) + { + if (*tp == '%' && *(tp+1) == 's') + { + /* Plug in error parameter */ + + if (pcnt < pErrInfo->parmcnt && pErrInfo->parms[pcnt]) + { + strcpy (&bufp[j], pErrInfo->parms[pcnt]); + j += strlen (pErrInfo->parms[pcnt++]); + } + else + bufp[j++] = '?'; + + tp += 2; + } + else + bufp[j++] = *tp++; + } + + bufp[j] = '\0'; /* null terminate string */ + } + else + strcpy (bufp, "unrecognized completion status"); + } + else strcpy (bufp, "normal completion status"); + + return (bufp); +} + +/* Get error text in a dynamic memory buffer. This allocates memory */ +/* using the 'memAlloc' function. This memory is automatically freed */ +/* at the time the 'memFree' function is called. */ + +char* errGetText (OOCTXT* pctxt) +{ + char lbuf[500]; + char* pBuf = (char*) ASN1MALLOC (pctxt, + (sizeof(lbuf) + 100 * (2 + pctxt->errInfo.stkx)) * sizeof(char)); + + sprintf (pBuf, "ASN.1 ERROR: Status %d\n", pctxt->errInfo.status); + sprintf (lbuf, "%s\nStack trace:", errFmtMsg (&pctxt->errInfo, lbuf)); + strcat(pBuf, lbuf); + + while (pctxt->errInfo.stkx > 0) { + pctxt->errInfo.stkx--; + sprintf (lbuf, " Module: %s, Line %d\n", + pctxt->errInfo.stack[pctxt->errInfo.stkx].module, + pctxt->errInfo.stack[pctxt->errInfo.stkx].lineno); + strcat(pBuf, lbuf); + } + + errFreeParms (&pctxt->errInfo); + + return pBuf; +} + +/* Print error information to the standard output */ + +void errPrint (ASN1ErrInfo* pErrInfo) +{ + char lbuf[200]; + printf ("ASN.1 ERROR: Status %d\n", pErrInfo->status); + printf ("%s\n", errFmtMsg (pErrInfo, lbuf)); + printf ("Stack trace:"); + while (pErrInfo->stkx > 0) { + pErrInfo->stkx--; + printf (" Module: %s, Line %d\n", + pErrInfo->stack[pErrInfo->stkx].module, + pErrInfo->stack[pErrInfo->stkx].lineno); + } + errFreeParms (pErrInfo); +} + +/* Copy error data from one error structure to another */ + +int errCopyData (ASN1ErrInfo* pSrcErrInfo, ASN1ErrInfo* pDestErrInfo) +{ + int i; + pDestErrInfo->status = pSrcErrInfo->status; + + /* copy error parameters */ + + for (i = 0; i < pSrcErrInfo->parmcnt; i++) { + errAddStrParm (pDestErrInfo, pSrcErrInfo->parms[i]); + } + + /* copy stack info */ + + for (i = 0; i < pSrcErrInfo->stkx; i++) { + if (pDestErrInfo->stkx < ASN_K_MAXERRSTK) { + pDestErrInfo->stack[pDestErrInfo->stkx].module = + pSrcErrInfo->stack[i].module; + pDestErrInfo->stack[pDestErrInfo->stkx++].lineno = + pSrcErrInfo->stack[i].lineno; + } + } + + return (pSrcErrInfo->status); +} + + +int errSetData (ASN1ErrInfo* pErrInfo, int status, + const char* module, int lno) +{ + if (pErrInfo->status == 0) { + pErrInfo->status = status; + } + ooLogAsn1Error(status, module, lno); + return status; +} -- cgit v1.2.3