aclerror.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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 (aclerror.c)
  14. *
  15. * This module provides error-handling facilities for ACL-related
  16. * errors.
  17. */
  18. #include "base/systems.h"
  19. #include "public/nsapi.h"
  20. #include "prprf.h"
  21. #include "prlog.h"
  22. #include "libaccess/nserror.h"
  23. #include "libaccess/nsautherr.h"
  24. #include "libaccess/aclerror.h"
  25. #include <libaccess/dbtlibaccess.h>
  26. #include <libaccess/aclerror.h>
  27. #define aclerrnomem XP_GetAdminStr(DBT_AclerrfmtAclerrnomem)
  28. #define aclerropen XP_GetAdminStr(DBT_AclerrfmtAclerropen)
  29. #define aclerrdupsym1 XP_GetAdminStr(DBT_AclerrfmtAclerrdupsym1)
  30. #define aclerrdupsym3 XP_GetAdminStr(DBT_AclerrfmtAclerrdupsym3)
  31. #define aclerrsyntax XP_GetAdminStr(DBT_AclerrfmtAclerrsyntax)
  32. #define aclerrundef XP_GetAdminStr(DBT_AclerrfmtAclerrundef)
  33. #define aclaclundef XP_GetAdminStr(DBT_AclerrfmtAclaclundef)
  34. #define aclerradb XP_GetAdminStr(DBT_AclerrfmtAclerradb)
  35. #define aclerrparse1 XP_GetAdminStr(DBT_AclerrfmtAclerrparse1)
  36. #define aclerrparse2 XP_GetAdminStr(DBT_AclerrfmtAclerrparse2)
  37. #define aclerrparse3 XP_GetAdminStr(DBT_AclerrfmtAclerrparse3)
  38. #define aclerrnorlm XP_GetAdminStr(DBT_AclerrfmtAclerrnorlm)
  39. #define unknownerr XP_GetAdminStr(DBT_AclerrfmtUnknownerr)
  40. #define aclerrinternal XP_GetAdminStr(DBT_AclerrfmtAclerrinternal)
  41. #define aclerrinval XP_GetAdminStr(DBT_AclerrfmtAclerrinval)
  42. #define aclerrfail XP_GetAdminStr(DBT_AclerrfmtAclerrfail)
  43. #define aclerrio XP_GetAdminStr(DBT_AclerrfmtAclerrio)
  44. const char * NSAuth_Program = "NSAUTH";
  45. const char * ACL_Program = "NSACL"; /* ACL facility name */
  46. /*
  47. * Description (aclErrorFmt)
  48. *
  49. * This function formats an ACL error message into a buffer provided
  50. * by the caller. The ACL error information is passed in an error
  51. * list structure. The caller can indicate how many error frames
  52. * should be processed. A newline is inserted between messages for
  53. * different error frames. The error frames on the error list are
  54. * all freed, regardless of the maximum depth for traceback.
  55. *
  56. * Arguments:
  57. *
  58. * errp - error frame list pointer
  59. * msgbuf - pointer to error message buffer
  60. * maxlen - maximum length of generated message
  61. * maxdepth - maximum depth for traceback
  62. */
  63. void aclErrorFmt(NSErr_t * errp, char * msgbuf, int maxlen, int maxdepth)
  64. {
  65. NSEFrame_t * efp; /* error frame pointer */
  66. int len = 0; /* length of error message text */
  67. int depth = 0; /* current depth */
  68. msgbuf[0] = 0;
  69. while ((efp = errp->err_first) != 0) {
  70. /* Stop if the message buffer is full */
  71. if (maxlen <= 0) break;
  72. if (depth > 0) {
  73. /* Put a newline & tab between error frame messages */
  74. *msgbuf++ = '\n';
  75. if (--maxlen <= 0) break;
  76. *msgbuf++ = '\t';
  77. if (--maxlen <= 0) break;
  78. }
  79. if (!strcmp(efp->ef_program, ACL_Program)) {
  80. /* Identify the facility generating the error and the id number */
  81. len = PR_snprintf(msgbuf, maxlen,
  82. "[%s%d] ", efp->ef_program, efp->ef_errorid);
  83. msgbuf += len;
  84. maxlen -= len;
  85. if (maxlen <= 0) break;
  86. len = 0;
  87. switch (efp->ef_retcode) {
  88. case ACLERRFAIL:
  89. case ACLERRNOMEM:
  90. case ACLERRINTERNAL:
  91. case ACLERRINVAL:
  92. switch (efp->ef_errc) {
  93. case 3:
  94. PR_snprintf(msgbuf, maxlen, efp->ef_errv[0], efp->ef_errv[1], efp->ef_errv[2]);
  95. break;
  96. case 2:
  97. PR_snprintf(msgbuf, maxlen, efp->ef_errv[0], efp->ef_errv[1]);
  98. break;
  99. case 1:
  100. strncpy(msgbuf, efp->ef_errv[0], maxlen);
  101. break;
  102. default:
  103. PR_ASSERT(0); /* don't break -- continue into case 0 */
  104. case 0:
  105. switch (efp->ef_retcode) {
  106. case ACLERRFAIL:
  107. strncpy(msgbuf, XP_GetAdminStr(DBT_AclerrfmtAclerrfail), maxlen);
  108. break;
  109. case ACLERRNOMEM:
  110. strncpy(msgbuf, aclerrnomem, maxlen);
  111. break;
  112. case ACLERRINTERNAL:
  113. strncpy(msgbuf, aclerrinternal, maxlen);
  114. break;
  115. case ACLERRINVAL:
  116. strncpy(msgbuf, aclerrinval, maxlen);
  117. break;
  118. }
  119. break;
  120. }
  121. msgbuf[maxlen-1] = '\0';
  122. len = strlen(msgbuf);
  123. break;
  124. case ACLERROPEN:
  125. /* File open error: filename, system_errmsg */
  126. if (efp->ef_errc == 2) {
  127. len = PR_snprintf(msgbuf, maxlen, aclerropen,
  128. efp->ef_errv[0], efp->ef_errv[1]);
  129. }
  130. break;
  131. case ACLERRDUPSYM:
  132. /* Duplicate symbol */
  133. if (efp->ef_errc == 1) {
  134. /* Duplicate symbol: filename, line#, symbol */
  135. len = PR_snprintf(msgbuf, maxlen, aclerrdupsym1,
  136. efp->ef_errv[0]);
  137. }
  138. else if (efp->ef_errc == 3) {
  139. /* Duplicate symbol: symbol */
  140. len = PR_snprintf(msgbuf, maxlen, aclerrdupsym3,
  141. efp->ef_errv[0], efp->ef_errv[1],
  142. efp->ef_errv[2]);
  143. }
  144. break;
  145. case ACLERRSYNTAX:
  146. if (efp->ef_errc == 2) {
  147. /* Syntax error: filename, line# */
  148. len = PR_snprintf(msgbuf, maxlen, aclerrsyntax,
  149. efp->ef_errv[0], efp->ef_errv[1]);
  150. }
  151. break;
  152. case ACLERRUNDEF:
  153. if (efp->ef_errorid == ACLERR3800) {
  154. /* Undefined symbol: acl, method/database name */
  155. len = PR_snprintf(msgbuf, maxlen, aclaclundef,
  156. efp->ef_errv[0], efp->ef_errv[1],
  157. efp->ef_errv[2]);
  158. }
  159. else if (efp->ef_errc == 3) {
  160. /* Undefined symbol: filename, line#, symbol */
  161. len = PR_snprintf(msgbuf, maxlen, aclerrundef,
  162. efp->ef_errv[0], efp->ef_errv[1],
  163. efp->ef_errv[2]);
  164. }
  165. break;
  166. case ACLERRADB:
  167. if (efp->ef_errc == 2) {
  168. /* Authentication database error: DB name, symbol */
  169. len = PR_snprintf(msgbuf, maxlen, aclerradb,
  170. efp->ef_errv[0], efp->ef_errv[1]);
  171. }
  172. break;
  173. case ACLERRPARSE:
  174. if (efp->ef_errc == 2) {
  175. /* Parse error: filename, line# */
  176. len = PR_snprintf(msgbuf, maxlen, aclerrparse2,
  177. efp->ef_errv[0], efp->ef_errv[1]);
  178. }
  179. else if (efp->ef_errc == 3) {
  180. /* Parse error: filename, line#, token */
  181. len = PR_snprintf(msgbuf, maxlen, aclerrparse3,
  182. efp->ef_errv[0], efp->ef_errv[1],
  183. efp->ef_errv[2]);
  184. }
  185. else if (efp->ef_errc == 1) {
  186. /* Parse error: line or pointer */
  187. len = PR_snprintf(msgbuf, maxlen, aclerrparse1,
  188. efp->ef_errv[0]);
  189. }
  190. break;
  191. case ACLERRNORLM:
  192. if (efp->ef_errc == 1) {
  193. /* No realm: name */
  194. len = PR_snprintf(msgbuf, maxlen, aclerrnorlm,
  195. efp->ef_errv[0]);
  196. }
  197. break;
  198. case ACLERRIO:
  199. if (efp->ef_errc == 2) {
  200. len = PR_snprintf(msgbuf, maxlen, aclerrio,
  201. efp->ef_errv[0], efp->ef_errv[1]);
  202. }
  203. break;
  204. default:
  205. len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
  206. break;
  207. }
  208. }
  209. else if (!strcmp(efp->ef_program, NSAuth_Program)) {
  210. nsadbErrorFmt(errp, msgbuf, maxlen, maxdepth - depth);
  211. }
  212. else {
  213. len = PR_snprintf(msgbuf, maxlen, unknownerr, efp->ef_retcode);
  214. }
  215. msgbuf += len;
  216. maxlen -= len;
  217. /* Free this frame */
  218. nserrFFree(errp, efp);
  219. if (++depth >= maxdepth) break;
  220. }
  221. /* Free any remaining error frames */
  222. nserrDispose(errp);
  223. }