compat.c

Go to the documentation of this file.
00001 /* Compatibility routines.
00002  *
00003  * (C) 2003-2013 Anope Team
00004  * Contact us at team@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  *
00012  */
00013 
00014 #include "services.h"
00015 
00016 /*************************************************************************/
00017 
00018 #if !HAVE_SNPRINTF
00019 
00020 /* [v]snprintf: Like [v]sprintf, but don't write more than len bytes
00021  *              (including null terminator).  Return the number of bytes
00022  *              written.
00023  */
00024 
00025 #if BAD_SNPRINTF
00026 int vsnprintf(char *buf, size_t len, const char *fmt, va_list args)
00027 {
00028     if (len <= 0)
00029         return 0;
00030     *buf = 0;
00031     vsnprintf(buf, len, fmt, args);
00032     buf[len - 1] = 0;
00033     return strlen(buf);
00034 }
00035 #endif                          /* BAD_SNPRINTF */
00036 
00037 int snprintf(char *buf, size_t len, const char *fmt, ...)
00038 {
00039     va_list args;
00040     int ret = 0;
00041 
00042     va_start(args, fmt);
00043     ret = vsnprintf(buf, len, fmt, args);
00044     va_end(args);
00045     return ret;
00046 }
00047 
00048 #endif                          /* !HAVE_SNPRINTF */
00049 
00050 /*************************************************************************/
00051 
00052 #if !HAVE_STRICMP && !HAVE_STRCASECMP
00053 
00054 /* stricmp, strnicmp:  Case-insensitive versions of strcmp() and
00055  *                     strncmp().
00056  */
00057 
00058 int stricmp(const char *s1, const char *s2)
00059 {
00060     register int c;
00061 
00062     while ((c = tolower(*s1)) == tolower(*s2)) {
00063         if (c == 0)
00064             return 0;
00065         s1++;
00066         s2++;
00067     }
00068     if (c < tolower(*s2))
00069         return -1;
00070     return 1;
00071 }
00072 
00073 int strnicmp(const char *s1, const char *s2, size_t len)
00074 {
00075     register int c;
00076 
00077     if (!len)
00078         return 0;
00079     while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
00080         if (c == 0 || --len == 0)
00081             return 0;
00082         s1++;
00083         s2++;
00084     }
00085     if (c < tolower(*s2))
00086         return -1;
00087     return 1;
00088 }
00089 #endif
00090 
00091 /*************************************************************************/
00092 
00093 #if !HAVE_STRDUP
00094 char *strdup(const char *s)
00095 {
00096     char *new = calloc(strlen(s) + 1, 1);
00097     if (new)
00098         strcpy(new, s);
00099     return new;
00100 }
00101 #endif
00102 
00103 /*************************************************************************/
00104 
00105 #if !HAVE_STRSPN
00106 size_t strspn(const char *s, const char *accept)
00107 {
00108     size_t i = 0;
00109 
00110     while (*s && strchr(accept, *s))
00111         ++i, ++s;
00112     return i;
00113 }
00114 #endif
00115 
00116 /*************************************************************************/
00117 
00118 #if !HAVE_STRERROR
00119 # if HAVE_SYS_ERRLIST
00120 extern char *sys_errlist[];
00121 # endif
00122 
00123 char *strerror(int errnum)
00124 {
00125 # if HAVE_SYS_ERRLIST
00126     return sys_errlist[errnum];
00127 # else
00128     static char buf[20];
00129     snprintf(buf, sizeof(buf), "Error %d", errnum);
00130     return buf;
00131 # endif
00132 }
00133 #endif
00134 
00135 /*************************************************************************/
00136 
00137 #if !HAVE_STRSIGNAL
00138 /* Windows only supports 6 signals:
00139  * SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGTERM
00140  * -- codemastr
00141  */
00142 char *strsignal(int signum)
00143 {
00144     static char buf[32];
00145     switch (signum) {
00146 #ifndef _WIN32
00147     case SIGHUP:
00148         strscpy(buf, "Hangup", sizeof(buf));
00149         break;
00150 #endif
00151     case SIGINT:
00152         strscpy(buf, "Interrupt", sizeof(buf));
00153         break;
00154 #ifndef _WIN32
00155     case SIGQUIT:
00156         strscpy(buf, "Quit", sizeof(buf));
00157         break;
00158 #endif
00159 #ifdef SIGILL
00160     case SIGILL:
00161         strscpy(buf, "Illegal instruction", sizeof(buf));
00162         break;
00163 #endif
00164 #ifdef SIGABRT
00165     case SIGABRT:
00166         strscpy(buf, "Abort", sizeof(buf));
00167         break;
00168 #endif
00169 #if defined(SIGIOT) && (!defined(SIGABRT) || SIGIOT != SIGABRT)
00170     case SIGIOT:
00171         strscpy(buf, "IOT trap", sizeof(buf));
00172         break;
00173 #endif
00174 #ifdef SIGBUS
00175     case SIGBUS:
00176         strscpy(buf, "Bus error", sizeof(buf));
00177         break;
00178 #endif
00179     case SIGFPE:
00180         strscpy(buf, "Floating point exception", sizeof(buf));
00181         break;
00182 #ifndef _WIN32
00183     case SIGKILL:
00184         strscpy(buf, "Killed", sizeof(buf));
00185         break;
00186     case SIGUSR1:
00187         strscpy(buf, "User signal 1", sizeof(buf));
00188         break;
00189 #endif
00190     case SIGSEGV:
00191         strscpy(buf, "Segmentation fault", sizeof(buf));
00192         break;
00193 #ifndef _WIN32
00194     case SIGUSR2:
00195         strscpy(buf, "User signal 2", sizeof(buf));
00196         break;
00197     case SIGPIPE:
00198         strscpy(buf, "Broken pipe", sizeof(buf));
00199         break;
00200     case SIGALRM:
00201         strscpy(buf, "Alarm clock", sizeof(buf));
00202         break;
00203 #endif
00204     case SIGTERM:
00205         strscpy(buf, "Terminated", sizeof(buf));
00206         break;
00207 #ifndef _WIN32
00208     case SIGSTOP:
00209         strscpy(buf, "Suspended (signal)", sizeof(buf));
00210         break;
00211     case SIGTSTP:
00212         strscpy(buf, "Suspended", sizeof(buf));
00213         break;
00214     case SIGIO:
00215         strscpy(buf, "I/O error", sizeof(buf));
00216         break;
00217 #endif
00218     default:
00219         snprintf(buf, sizeof(buf), "Signal %d\n", signum);
00220         break;
00221     }
00222     return buf;
00223 }
00224 #endif
00225 
00226 
00227 /*************************************************************************/