nsautherr.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. * END COPYRIGHT BLOCK **/
  6. /*
  7. * Description (nsautherr.c)
  8. *
  9. * This module provides facilities for handling authentication
  10. * errors.
  11. */
  12. #include <string.h>
  13. #include "base/systems.h"
  14. #include "prprf.h"
  15. #include "libaccess/nserror.h"
  16. #include "libaccess/nsautherr.h"
  17. /* Error message formats XXX internationalize XXX */
  18. static char * nsaerrnomem = "insufficient dynamic memory";
  19. static char * nsaerrinval = "invalid argument";
  20. static char * nsaerropen = "error opening %s";
  21. static char * nsaerrmkdir = "error creating %s";
  22. static char * nsaerrname = "%s not found in database %s";
  23. static char * unknownerr = "error code %d";
  24. /*
  25. * Description (nsadbErrorFmt)
  26. *
  27. * This function formats an authentication error message into a
  28. * buffer provided by the caller. The authentication error
  29. * information is passed in an error list structure. The caller
  30. * can indicate how many error frames should be processed. A
  31. * newline is inserted between messages for different error frames.
  32. *
  33. * Arguments:
  34. *
  35. * errp - error frame list pointer
  36. * msgbuf - pointer to error message buffer
  37. * maxlen - maximum length of generated message
  38. * maxdepth - maximum depth for traceback
  39. */
  40. NSAPI_PUBLIC void nsadbErrorFmt(NSErr_t * errp, char * msgbuf, int maxlen, int maxdepth)
  41. {
  42. NSEFrame_t * efp; /* error frame pointer */
  43. int len; /* length of error message text */
  44. int depth = 0; /* current depth */
  45. msgbuf[0] = 0;
  46. for (efp = errp->err_first; efp != 0; efp = efp->ef_next) {
  47. /* Stop if the message buffer is full */
  48. if (maxlen <= 0) break;
  49. if (depth > 0) {
  50. /* Put a newline between error frame messages */
  51. *msgbuf++ = '\n';
  52. if (--maxlen <= 0) break;
  53. }
  54. /* Identify the facility generating the error and the id number */
  55. len = PR_snprintf(msgbuf, maxlen,
  56. "[%s%d] ", efp->ef_program, efp->ef_errorid);
  57. msgbuf += len;
  58. maxlen -= len;
  59. if (maxlen <= 0) break;
  60. len = 0;
  61. if (!strcmp(efp->ef_program, NSAuth_Program)) {
  62. switch (efp->ef_retcode) {
  63. case NSAERRNOMEM:
  64. strncpy(msgbuf, nsaerrnomem, maxlen);
  65. len = strlen(nsaerrnomem);
  66. break;
  67. case NSAERRINVAL:
  68. /* Invalid function argument error: */
  69. strncpy(msgbuf, nsaerrinval, maxlen);
  70. len = strlen(nsaerrinval);
  71. break;
  72. case NSAERROPEN:
  73. /* File open error: filename */
  74. if (efp->ef_errc == 1) {
  75. len = PR_snprintf(msgbuf, maxlen, nsaerropen,
  76. efp->ef_errv[0], efp->ef_errv[1]);
  77. }
  78. break;
  79. case NSAERRMKDIR:
  80. /* error creating database directory: database name */
  81. if (efp->ef_errc == 1) {
  82. len = PR_snprintf(msgbuf, maxlen, nsaerrmkdir,
  83. efp->ef_errv[0]);
  84. }
  85. break;
  86. case NSAERRNAME:
  87. /* user or group name not found: database, name */
  88. if (efp->ef_errc == 2) {
  89. len = PR_snprintf(msgbuf, maxlen, nsaerrname,
  90. efp->ef_errv[0], efp->ef_errv[1]);
  91. }
  92. break;
  93. default:
  94. len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
  95. break;
  96. }
  97. }
  98. else {
  99. len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
  100. }
  101. msgbuf += len;
  102. maxlen -= len;
  103. if (++depth >= maxdepth) break;
  104. }
  105. }