strerror.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* strerror.c - string error, string */
  2. /* Copyright 1992-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,16oct01,jn   use symFindSymbol for symbol lookup (SPR #7453)
  7. 01d,25feb93,jdi  documentation cleanup for 5.1.
  8. 01c,30nov92,jdi  fixed doc for strerror() - SPR 1825.
  9. 01b,20sep92,smb  documentation additions
  10. 01a,08jul92,smb  written and documented.
  11. */
  12. /*
  13. DESCRIPTION
  14. INCLUDE FILES: string.h
  15. SEE ALSO: American National Standard X3.159-1989
  16. NOMANUAL
  17. */
  18. #include "vxWorks.h"
  19. #include "string.h"
  20. #include "errno.h"
  21. #include "symLib.h"
  22. #include "limits.h"
  23. #include "stdio.h"
  24. #include "sysSymTbl.h"
  25. #include "private/funcBindP.h"
  26. /* forward declarations */
  27. LOCAL STATUS strerrorIf (int errcode, char *buf);
  28. /*******************************************************************************
  29. *
  30. * strerror_r - map an error number to an error string 
  31. *
  32. * This routine maps the error number in <errcode> to an error message string.
  33. * It stores the error string in <buffer>.  The size of <buffer> should be 
  34. * NAME_MAX + 1 - using a smaller buffer may lead to stack corruption.  NAME_MAX 
  35. * is defined in limits.h.
  36. *
  37. * This routine is the reentrant version of strerror().
  38. *
  39. * INCLUDE FILES: string.h
  40. *
  41. * RETURNS: OK or ERROR.
  42. *
  43. * SEE ALSO: strerror()
  44. */
  45. STATUS strerror_r 
  46.     (
  47.     int    errcode, /* error code */
  48.     char * buffer /* string buffer */
  49.     )
  50.     {
  51.     return (strerrorIf (errcode, buffer));
  52.     }
  53. /*******************************************************************************
  54. *
  55. * strerror - map an error number to an error string (ANSI)
  56. *
  57. * This routine maps the error number in <errcode> to an error message string.
  58. * It returns a pointer to a static buffer that holds the error string.
  59. *
  60. * INCLUDE: string.h
  61. *
  62. * RETURNS: A pointer to the buffer that holds the error string.
  63. *
  64. * SEE ALSO: strerror_r()
  65. */
  66. char * strerror
  67.     (
  68.     int errcode /* error code */
  69.     )
  70.     {
  71.     static char buffer [NAME_MAX+1]; /* NAME_MAX doesn't count the EOS. */
  72.     (void) strerror_r (errcode, buffer);
  73.     return (buffer);
  74.     }
  75. /*******************************************************************************
  76. *
  77. * strerrorIf - interface from libc to VxWorks for strerror_r
  78. *
  79. * RETURNS: OK, or ERROR if <buf> is null.
  80. * NOMANUAL
  81. */
  82. LOCAL STATUS strerrorIf 
  83.     (
  84.     int   errcode, /* error code */
  85.     char *buf /* string buffer */
  86.     )
  87.     {
  88.     void * value;
  89.     char * statName;
  90.     SYMBOL_ID   symId;
  91.     if (buf == NULL)
  92. return (ERROR);
  93.     if (errcode == 0)
  94. {
  95.         strcpy (buf, "OK");
  96. return (OK);
  97. }
  98.     /* 
  99.      * Only check one symLib function pointer (for performance's sake). 
  100.      * All symLib functions are provided by the same library, by convention.    
  101.      */
  102.     if ((_func_symFindSymbol != (FUNCPTR) NULL) && 
  103. (statSymTbl != NULL))
  104. {
  105. (* _func_symFindSymbol) (statSymTbl, NULL, (void *)errcode, 
  106.  SYM_MASK_NONE, SYM_MASK_NONE, &symId);
  107. (* _func_symNameGet) (symId, &statName);
  108. (* _func_symValueGet) (symId, &value);
  109. if (value == (void *)errcode)
  110.     {
  111.     strncpy (buf, statName, NAME_MAX+1);
  112.     return (OK);
  113.     }
  114. }
  115.     sprintf (buf, "errno = %#x", errcode);
  116.     return (OK);
  117.     }