00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <stdio.h>
00039 #include "error.h"
00040 #include "str.h"
00041 #include "parser/msg_parser.h"
00042 #include "mem/mem.h"
00043
00044
00045 int ser_error=-1;
00046
00047 int prev_ser_error=-1;
00048
00049 int err2reason_phrase(
00050 int ser_error,
00051 int *sip_error,
00052 char *phrase,
00053 int etl,
00054 char *signature )
00055 {
00056
00057 char *error_txt;
00058
00059 switch( ser_error ) {
00060 case E_IP_BLOCKED:
00061 error_txt="Filtered destination";
00062 *sip_error=-ser_error;
00063 break;
00064 case E_SEND:
00065 error_txt="Send failed";
00066 *sip_error=-ser_error;
00067 break;
00068 case E_BAD_ADDRESS:
00069 error_txt="Unresolvable destination";
00070 *sip_error=-ser_error;
00071 break;
00072 case E_BAD_REQ:
00073 error_txt="Bad Request";
00074 *sip_error=-ser_error;
00075 break;
00076 case E_BAD_URI:
00077 error_txt="Bad URI";
00078 *sip_error=-ser_error;
00079 break;
00080 case E_BAD_TUPEL:
00081 error_txt="Transaction tuple incomplete";
00082 *sip_error=-E_BAD_REQ;
00083 break;
00084 case E_BAD_TO:
00085 error_txt="Bad To";
00086 *sip_error=-E_BAD_REQ;
00087 break;
00088 case E_EXEC:
00089 error_txt="Error in external logic";
00090 *sip_error=-E_BAD_SERVER;
00091 break;
00092 case E_TOO_MANY_BRANCHES:
00093 error_txt="Forking capacity exceeded";
00094 *sip_error=-E_BAD_SERVER;
00095 break;
00096 case E_Q_INV_CHAR:
00097 error_txt="Invalid character in q parameter";
00098 *sip_error=-E_BAD_REQ;
00099 break;
00100 case E_Q_EMPTY:
00101 error_txt="Empty q parameter";
00102 *sip_error=-E_BAD_REQ;
00103 break;;
00104 case E_Q_TOO_BIG:
00105 error_txt="q parameter too big";
00106 *sip_error=-E_BAD_REQ;
00107 break;
00108 case E_Q_DEC_MISSING:
00109 error_txt="Decimal part missing in q";
00110 *sip_error=-E_BAD_REQ;
00111 break;
00112 case E_OUT_OF_MEM:
00113
00114 #ifdef DEBUG
00115 error_txt="Excuse me I ran out of memory";
00116 *sip_error=500;
00117 break;
00118 #endif
00119 default:
00120 error_txt="Server error occurred";
00121 *sip_error=500;
00122 break;
00123 }
00124 return snprintf( phrase, etl, "%s (%d/%s)", error_txt,
00125 -ser_error, signature );
00126 }
00127
00128 char *error_text( int code )
00129 {
00130 switch(code) {
00131
00132 case 100: return "Trying";
00133 case 180: return "Ringing";
00134 case 181: return "Call is Being Forwarded";
00135 case 182: return "Queued";
00136 case 183: return "Session Progress";
00137
00138 case 200: return "OK";
00139 case 202: return "Accepted";
00140
00141 case 300: return "Multiple Choices";
00142 case 301: return "Moved Permanently";
00143 case 302: return "Moved Temporarily";
00144 case 305: return "Use Proxy";
00145 case 380: return "Alternative Service";
00146
00147 case 400: return "Bad Request";
00148 case 401: return "Unauthorized";
00149 case 402: return "Payment Required";
00150 case 403: return "Forbidden";
00151 case 404: return "Not Found";
00152 case 405: return "Method not Allowed";
00153 case 406: return "Not Acceptable";
00154 case 407: return "Proxy Authentication Required";
00155 case 408: return "Request Timeout";
00156 case 409: return "Conflict";
00157 case 410: return "Gone";
00158 case 411: return "Length Required";
00159 case 412: return "Conditional Request Failed";
00160 case 413: return "Request Entity Too Large";
00161 case 414: return "Request-URI Too Long";
00162 case 415: return "Unsupported Media Type";
00163 case 416: return "Unsupported URI Scheme";
00164 case 417: return "Unknown Resource-Priority";
00165 case 420: return "Bad Extension";
00166 case 421: return "Extension Required";
00167 case 422: return "Session Interval Too Small";
00168 case 423: return "Interval Too Brief";
00169 case 428: return "Use Identity Header";
00170 case 429: return "Provide Referrer Identity";
00171 case 436: return "Bad Identity-Info";
00172 case 437: return "Unsupported Certificate";
00173 case 438: return "Invalid Identity Header";
00174 case 480: return "Temporarily Unavailable";
00175 case 481: return "Call/Transaction Does not Exist";
00176 case 482: return "Loop Detected";
00177 case 483: return "Too Many Hops";
00178 case 484: return "Address Incomplete";
00179 case 485: return "Ambiguous";
00180 case 486: return "Busy Here";
00181 case 487: return "Request Terminated";
00182 case 488: return "Not Acceptable Here";
00183 case 489: return "Bad Event";
00184 case 491: return "Request Pending";
00185 case 493: return "Undecipherable";
00186 case 494: return "Security Agreement Required";
00187
00188 case 500: return "Server Internal Error";
00189 case 501: return "Not Implemented";
00190 case 502: return "Bad Gateway";
00191 case 503: return "Service Unavailable";
00192 case 504: return "Server Time-out";
00193 case 505: return "Version Not Supported";
00194 case 513: return "Message Too Large";
00195 case 580: return "Precondition Failure";
00196
00197 case 600: return "Busy Everywhere";
00198 case 603: return "Decline";
00199 case 604: return "Does not Exist Anywhere";
00200 case 606: return "Not Acceptable";
00201
00202 }
00203
00204 if (code>=600) return "Global Failure";
00205 else if (code>=500) return "Server Failure";
00206 else if (code>=400) return "Request Failure";
00207 else if (code>=300) return "Redirection";
00208 else if (code>=200) return "Successful";
00209 else if (code>=100) return "Provisional";
00210 else return "Unspecified";
00211 }
00212
00213 void get_reply_status( str *status, struct sip_msg *reply, int code )
00214 {
00215 str phrase;
00216
00217 status->s=0;
00218
00219 if (reply==0) {
00220 LM_CRIT("called with 0 msg\n");
00221 return;
00222 }
00223
00224 if (reply==FAKED_REPLY) {
00225 phrase.s=error_text(code);
00226 phrase.len=strlen(phrase.s);
00227 } else {
00228 phrase=reply->first_line.u.reply.reason;
00229 }
00230 status->len=phrase.len+3+1;
00231 status->s=pkg_malloc(status->len+1);
00232 if (!status->s) {
00233 LM_ERR("no pkg mem\n");
00234 return;
00235 }
00236 status->s[3]=' ';
00237 status->s[2]='0'+code % 10; code=code/10;
00238 status->s[1]='0'+code% 10; code=code/10;
00239 status->s[0]='0'+code % 10;
00240 memcpy(&status->s[4], phrase.s, phrase.len);
00241 status->s[status->len]=0;
00242 }