Annotation of embedaddon/ntp/lib/isc/win32/strerror.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
        !             3:  * Copyright (C) 2001, 2002  Internet Software Consortium.
        !             4:  *
        !             5:  * Permission to use, copy, modify, and/or distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
        !            10:  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
        !            11:  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
        !            12:  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
        !            13:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
        !            14:  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
        !            15:  * PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17: 
        !            18: /* $Id: strerror.c,v 1.8 2007/06/19 23:47:19 tbox Exp $ */
        !            19: 
        !            20: #include <config.h>
        !            21: 
        !            22: #include <stdio.h>
        !            23: #include <string.h>
        !            24: #include <winsock2.h>
        !            25: 
        !            26: #include <isc/mutex.h>
        !            27: #include <isc/once.h>
        !            28: #include <isc/print.h>
        !            29: #include <isc/strerror.h>
        !            30: #include <isc/util.h>
        !            31: 
        !            32: /*
        !            33:  * Forward declarations
        !            34:  */
        !            35: 
        !            36: char *
        !            37: FormatError(int error);
        !            38: 
        !            39: char *
        !            40: GetWSAErrorMessage(int errval);
        !            41: 
        !            42: char *
        !            43: NTstrerror(int err, BOOL *bfreebuf);
        !            44: 
        !            45: /*
        !            46:  * We need to do this this way for profiled locks.
        !            47:  */
        !            48: 
        !            49: static isc_mutex_t isc_strerror_lock;
        !            50: static void init_lock(void) {
        !            51:        RUNTIME_CHECK(isc_mutex_init(&isc_strerror_lock) == ISC_R_SUCCESS);
        !            52: }
        !            53: 
        !            54: /*
        !            55:  * This routine needs to free up any buffer allocated by FormatMessage
        !            56:  * if that routine gets used.
        !            57:  */
        !            58: 
        !            59: void
        !            60: isc__strerror(int num, char *buf, size_t size) {
        !            61:        char *msg;
        !            62:        BOOL freebuf;
        !            63:        unsigned int unum = num;
        !            64:        static isc_once_t once = ISC_ONCE_INIT;
        !            65: 
        !            66:        REQUIRE(buf != NULL);
        !            67: 
        !            68:        RUNTIME_CHECK(isc_once_do(&once, init_lock) == ISC_R_SUCCESS);
        !            69: 
        !            70:        LOCK(&isc_strerror_lock);
        !            71:        freebuf = FALSE;
        !            72:        msg = NTstrerror(num, &freebuf);
        !            73:        if (msg != NULL)
        !            74:                snprintf(buf, size, "%s", msg);
        !            75:        else
        !            76:                snprintf(buf, size, "Unknown error: %u", unum);
        !            77:        if(freebuf && msg != NULL) {
        !            78:                LocalFree(msg);
        !            79:        }
        !            80:        UNLOCK(&isc_strerror_lock);
        !            81: }
        !            82: 
        !            83: /*
        !            84:  * Note this will cause a memory leak unless the memory allocated here
        !            85:  * is freed by calling LocalFree.  isc__strerror does this before unlocking.
        !            86:  * This only gets called if there is a system type of error and will likely
        !            87:  * be an unusual event.
        !            88:  */
        !            89: char *
        !            90: FormatError(int error) {
        !            91:        LPVOID lpMsgBuf = NULL;
        !            92:        FormatMessage( 
        !            93:                FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        !            94:                FORMAT_MESSAGE_FROM_SYSTEM | 
        !            95:                FORMAT_MESSAGE_IGNORE_INSERTS,
        !            96:                NULL,
        !            97:                error,
        !            98:                /* Default language */
        !            99:                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        !           100:                (LPTSTR) &lpMsgBuf,
        !           101:                0,
        !           102:                NULL); 
        !           103: 
        !           104:        return (lpMsgBuf);
        !           105: }
        !           106: 
        !           107: /*
        !           108:  * This routine checks the error value and calls the WSA Windows Sockets
        !           109:  * Error message function GetWSAErrorMessage below if it's within that range
        !           110:  * since those messages are not available in the system error messages.
        !           111:  */
        !           112: char *
        !           113: NTstrerror(int err, BOOL *bfreebuf) {
        !           114:        char *retmsg = NULL;
        !           115: 
        !           116:        /* Copy the error value first in case of other errors */        
        !           117:        DWORD errval = err; 
        !           118: 
        !           119:        *bfreebuf = FALSE;
        !           120: 
        !           121:        /* Get the Winsock2 error messages */
        !           122:        if (errval >= WSABASEERR && errval <= (WSABASEERR + 1015)) {
        !           123:                retmsg = GetWSAErrorMessage(errval);
        !           124:                if (retmsg != NULL)
        !           125:                        return (retmsg);
        !           126:        }
        !           127:        /*
        !           128:         * If it's not one of the standard Unix error codes,
        !           129:         * try a system error message
        !           130:         */
        !           131:        if (errval > (DWORD) _sys_nerr) {
        !           132:                *bfreebuf = TRUE;
        !           133:                return (FormatError(errval));
        !           134:        } else {
        !           135:                return (strerror(errval));
        !           136:        }
        !           137: }
        !           138: 
        !           139: /*
        !           140:  * This is a replacement for perror
        !           141:  */
        !           142: void __cdecl
        !           143: NTperror(char *errmsg) {
        !           144:        /* Copy the error value first in case of other errors */
        !           145:        int errval = errno; 
        !           146:        BOOL bfreebuf = FALSE;
        !           147:        char *msg;
        !           148: 
        !           149:        msg = NTstrerror(errval, &bfreebuf);
        !           150:        fprintf(stderr, "%s: %s\n", errmsg, msg);
        !           151:        if(bfreebuf == TRUE) {
        !           152:                LocalFree(msg);
        !           153:        }
        !           154: 
        !           155: }
        !           156: 
        !           157: /*
        !           158:  * Return the error string related to Winsock2 errors.
        !           159:  * This function is necessary since FormatMessage knows nothing about them
        !           160:  * and there is no function to get them.
        !           161:  */
        !           162: char *
        !           163: GetWSAErrorMessage(int errval) {
        !           164:        char *msg;
        !           165: 
        !           166:        switch (errval) {
        !           167: 
        !           168:        case WSAEINTR:
        !           169:                msg = "Interrupted system call";
        !           170:                break;
        !           171: 
        !           172:        case WSAEBADF:
        !           173:                msg = "Bad file number";
        !           174:                break;
        !           175: 
        !           176:        case WSAEACCES:
        !           177:                msg = "Permission denied";
        !           178:                break;
        !           179: 
        !           180:        case WSAEFAULT:
        !           181:                msg = "Bad address";
        !           182:                break;
        !           183: 
        !           184:        case WSAEINVAL:
        !           185:                msg = "Invalid argument";
        !           186:                break;
        !           187: 
        !           188:        case WSAEMFILE:
        !           189:                msg = "Too many open sockets";
        !           190:                break;
        !           191: 
        !           192:        case WSAEWOULDBLOCK:
        !           193:                msg = "Operation would block";
        !           194:                break;
        !           195: 
        !           196:        case WSAEINPROGRESS:
        !           197:                msg = "Operation now in progress";
        !           198:                break;
        !           199: 
        !           200:        case WSAEALREADY:
        !           201:                msg = "Operation already in progress";
        !           202:                break;
        !           203: 
        !           204:        case WSAENOTSOCK:
        !           205:                msg = "Socket operation on non-socket";
        !           206:                break;
        !           207: 
        !           208:        case WSAEDESTADDRREQ:
        !           209:                msg = "Destination address required";
        !           210:                break;
        !           211: 
        !           212:        case WSAEMSGSIZE:
        !           213:                msg = "Message too long";
        !           214:                break;
        !           215: 
        !           216:        case WSAEPROTOTYPE:
        !           217:                msg = "Protocol wrong type for socket";
        !           218:                break;
        !           219: 
        !           220:        case WSAENOPROTOOPT:
        !           221:                msg = "Bad protocol option";
        !           222:                break;
        !           223: 
        !           224:        case WSAEPROTONOSUPPORT:
        !           225:                msg = "Protocol not supported";
        !           226:                break;
        !           227: 
        !           228:        case WSAESOCKTNOSUPPORT:
        !           229:                msg = "Socket type not supported";
        !           230:                break;
        !           231: 
        !           232:        case WSAEOPNOTSUPP:
        !           233:                msg = "Operation not supported on socket";
        !           234:                break;
        !           235: 
        !           236:        case WSAEPFNOSUPPORT:
        !           237:                msg = "Protocol family not supported";
        !           238:                break;
        !           239: 
        !           240:        case WSAEAFNOSUPPORT:
        !           241:                msg = "Address family not supported";
        !           242:                break;
        !           243: 
        !           244:        case WSAEADDRINUSE:
        !           245:                msg = "Address already in use";
        !           246:                break;
        !           247: 
        !           248:        case WSAEADDRNOTAVAIL:
        !           249:                msg = "Can't assign requested address";
        !           250:                break;
        !           251: 
        !           252:        case WSAENETDOWN:
        !           253:                msg = "Network is down";
        !           254:                break;
        !           255: 
        !           256:        case WSAENETUNREACH:
        !           257:                msg = "Network is unreachable";
        !           258:                break;
        !           259: 
        !           260:        case WSAENETRESET:
        !           261:                msg = "Net connection reset";
        !           262:                break;
        !           263: 
        !           264:        case WSAECONNABORTED:
        !           265:                msg = "Software caused connection abort";
        !           266:                break;
        !           267: 
        !           268:        case WSAECONNRESET:
        !           269:                msg = "Connection reset by peer";
        !           270:                break;
        !           271: 
        !           272:        case WSAENOBUFS:
        !           273:                msg = "No buffer space available";
        !           274:                break;
        !           275: 
        !           276:        case WSAEISCONN:
        !           277:                msg = "Socket is already connected";
        !           278:                break;
        !           279: 
        !           280:        case WSAENOTCONN:
        !           281:                msg = "Socket is not connected";
        !           282:                break;
        !           283: 
        !           284:        case WSAESHUTDOWN:
        !           285:                msg = "Can't send after socket shutdown";
        !           286:                break;
        !           287: 
        !           288:        case WSAETOOMANYREFS:
        !           289:                msg = "Too many references: can't splice";
        !           290:                break;
        !           291: 
        !           292:        case WSAETIMEDOUT:
        !           293:                msg = "Connection timed out";
        !           294:                break;
        !           295: 
        !           296:        case WSAECONNREFUSED:
        !           297:                msg = "Connection refused";
        !           298:                break;
        !           299: 
        !           300:        case WSAELOOP:
        !           301:                msg = "Too many levels of symbolic links";
        !           302:                break;
        !           303: 
        !           304:        case WSAENAMETOOLONG:
        !           305:                msg = "File name too long";
        !           306:                break;
        !           307: 
        !           308:        case WSAEHOSTDOWN:
        !           309:                msg = "Host is down";
        !           310:                break;
        !           311: 
        !           312:        case WSAEHOSTUNREACH:
        !           313:                msg = "No route to host";
        !           314:                break;
        !           315: 
        !           316:        case WSAENOTEMPTY:
        !           317:                msg = "Directory not empty";
        !           318:                break;
        !           319: 
        !           320:        case WSAEPROCLIM:
        !           321:                msg = "Too many processes";
        !           322:                break;
        !           323: 
        !           324:        case WSAEUSERS:
        !           325:                msg = "Too many users";
        !           326:                break;
        !           327: 
        !           328:        case WSAEDQUOT:
        !           329:                msg = "Disc quota exceeded";
        !           330:                break;
        !           331: 
        !           332:        case WSAESTALE:
        !           333:                msg = "Stale NFS file handle";
        !           334:                break;
        !           335: 
        !           336:        case WSAEREMOTE:
        !           337:                msg = "Too many levels of remote in path";
        !           338:                break;
        !           339: 
        !           340:        case WSASYSNOTREADY:
        !           341:                msg = "Network system is unavailable";
        !           342:                break;
        !           343: 
        !           344:        case WSAVERNOTSUPPORTED:
        !           345:                msg = "Winsock version out of range";
        !           346:                break;
        !           347: 
        !           348:        case WSANOTINITIALISED:
        !           349:                msg = "WSAStartup not yet called";
        !           350:                break;
        !           351: 
        !           352:        case WSAEDISCON:
        !           353:                msg = "Graceful shutdown in progress";
        !           354:                break;
        !           355: /*
        !           356:        case WSAHOST_NOT_FOUND:
        !           357:                msg = "Host not found";
        !           358:                break;
        !           359: 
        !           360:        case WSANO_DATA:
        !           361:                msg = "No host data of that type was found";
        !           362:                break;
        !           363: */
        !           364:        default:
        !           365:                msg = NULL;
        !           366:                break;
        !           367:        }
        !           368:        return (msg);
        !           369: }
        !           370: 
        !           371: /*
        !           372:  * These error messages are more informative about CryptAPI Errors than the
        !           373:  * standard error messages
        !           374:  */
        !           375: 
        !           376: char *
        !           377: GetCryptErrorMessage(int errval) {
        !           378:        char *msg;
        !           379: 
        !           380:        switch (errval) {
        !           381: 
        !           382:        case NTE_BAD_FLAGS:
        !           383:                msg = "The dwFlags parameter has an illegal value.";
        !           384:                break;
        !           385:        case NTE_BAD_KEYSET:
        !           386:                msg = "The Registry entry for the key container "
        !           387:                        "could not be opened and may not exist.";
        !           388:                break;
        !           389:        case NTE_BAD_KEYSET_PARAM:
        !           390:                msg = "The pszContainer or pszProvider parameter "
        !           391:                        "is set to an illegal value.";
        !           392:                break;
        !           393:        case NTE_BAD_PROV_TYPE:
        !           394:                msg = "The value of the dwProvType parameter is out "
        !           395:                        "of range. All provider types must be from "
        !           396:                        "1 to 999, inclusive.";
        !           397:                break;
        !           398:        case NTE_BAD_SIGNATURE:
        !           399:                msg = "The provider DLL signature did not verify "
        !           400:                        "correctly. Either the DLL or the digital "
        !           401:                        "signature has been tampered with.";
        !           402:                break;
        !           403:        case NTE_EXISTS:
        !           404:                msg = "The dwFlags parameter is CRYPT_NEWKEYSET, but the key"
        !           405:                      " container already exists.";
        !           406:                break;
        !           407:        case NTE_KEYSET_ENTRY_BAD:
        !           408:                msg = "The Registry entry for the pszContainer key container "
        !           409:                      "was found (in the HKEY_CURRENT_USER window), but is "
        !           410:                      "corrupt. See the section System Administration for "
        !           411:                      " etails about CryptoAPI's Registry usage.";
        !           412:                break;
        !           413:        case NTE_KEYSET_NOT_DEF:
        !           414:                msg = "No Registry entry exists in the HKEY_CURRENT_USER "
        !           415:                        "window for the key container specified by "
        !           416:                        "pszContainer.";
        !           417:                break;
        !           418:        case NTE_NO_MEMORY:
        !           419:                msg = "The CSP ran out of memory during the operation.";
        !           420:                break;
        !           421:        case NTE_PROV_DLL_NOT_FOUND:
        !           422:                msg = "The provider DLL file does not exist or is not on the "
        !           423:                      "current path.";
        !           424:                break;
        !           425:        case NTE_PROV_TYPE_ENTRY_BAD:
        !           426:                msg = "The Registry entry for the provider type specified by "
        !           427:                      "dwProvType is corrupt. This error may relate to "
        !           428:                      "either the user default CSP list or the machine "
        !           429:                      "default CSP list. See the section System "
        !           430:                      "Administration for details about CryptoAPI's "
        !           431:                      "Registry usage.";
        !           432:                break;
        !           433:        case NTE_PROV_TYPE_NO_MATCH:
        !           434:                msg = "The provider type specified by dwProvType does not "
        !           435:                      "match the provider type found in the Registry. Note "
        !           436:                      "that this error can only occur when pszProvider "
        !           437:                      "specifies an actual CSP name.";
        !           438:                break;
        !           439:        case NTE_PROV_TYPE_NOT_DEF:
        !           440:                msg = "No Registry entry exists for the provider type "
        !           441:                      "specified by dwProvType.";
        !           442:                break;
        !           443:        case NTE_PROVIDER_DLL_FAIL:
        !           444:                msg = "The provider DLL file could not be loaded, and "
        !           445:                      "may not exist. If it exists, then the file is "
        !           446:                      "not a valid DLL.";
        !           447:                break;
        !           448:        case NTE_SIGNATURE_FILE_BAD:
        !           449:                msg = "An error occurred while loading the DLL file image, "
        !           450:                      "prior to verifying its signature.";
        !           451:                break;
        !           452: 
        !           453:        default:
        !           454:                msg = NULL;
        !           455:                break;
        !           456:        }
        !           457:        return msg;
        !           458: }
        !           459: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>