nsautherr.cpp 3.4 KB

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