comerr.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)comerr.c 1.21 99/12/24 Copyright 1985 J. Schilling */
  2. /*
  3.  * Routines for printing command errors
  4.  *
  5.  * Copyright (c) 1985 J. Schilling
  6.  */
  7. /*
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2, or (at your option)
  11.  * any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; see the file COPYING.  If not, write to
  20.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22. #include <mconfig.h>
  23. #include <stdio.h>
  24. #include <standard.h>
  25. #include <stdxlib.h>
  26. #include <vadefs.h>
  27. #include <strdefs.h>
  28. #ifndef HAVE_STRERROR
  29. extern char *sys_errlist[];
  30. extern int sys_nerr;
  31. #endif
  32. EXPORT int on_comerr __PR((void (*fun)(int, void *), void *arg));
  33. EXPORT void comerr __PR((const char *, ...));
  34. EXPORT void comerrno __PR((int, const char *, ...));
  35. EXPORT int errmsg __PR((const char *, ...));
  36. EXPORT int errmsgno __PR((int, const char *, ...));
  37. LOCAL int _comerr __PR((int, int, const char *, va_list));
  38. EXPORT void comexit __PR((int));
  39. EXPORT char *errmsgstr __PR((int));
  40. typedef struct ex {
  41. struct ex *next;
  42. void (*func) __PR((int, void *));
  43. void *arg;
  44. } ex_t;
  45. LOCAL ex_t *exfuncs;
  46. EXPORT int
  47. on_comerr(func, arg)
  48. void (*func) __PR((int, void *));
  49. void *arg;
  50. {
  51. ex_t *fp;
  52. fp = malloc(sizeof(*fp));
  53. if (fp == NULL)
  54. return (-1);
  55. fp->func = func;
  56. fp->arg  = arg;
  57. fp->next = exfuncs;
  58. exfuncs = fp;
  59. return (0);
  60. }
  61. /* VARARGS1 */
  62. #ifdef PROTOTYPES
  63. void comerr(const char *msg, ...)
  64. #else
  65. void comerr(msg, va_alist)
  66. char *msg;
  67. va_dcl
  68. #endif
  69. {
  70. va_list args;
  71. #ifdef PROTOTYPES
  72. va_start(args, msg);
  73. #else
  74. va_start(args);
  75. #endif
  76. (void)_comerr(TRUE, geterrno(), msg, args);
  77. /* NOTREACHED */
  78. va_end(args);
  79. }
  80. /* VARARGS2 */
  81. #ifdef PROTOTYPES
  82. void comerrno(int err, const char *msg, ...)
  83. #else
  84. void comerrno(err, msg, va_alist)
  85. int err;
  86. char *msg;
  87. va_dcl
  88. #endif
  89. {
  90. va_list args;
  91. #ifdef PROTOTYPES
  92. va_start(args, msg);
  93. #else
  94. va_start(args);
  95. #endif
  96. (void)_comerr(TRUE, err, msg, args);
  97. /* NOTREACHED */
  98. va_end(args);
  99. }
  100. /* VARARGS1 */
  101. #ifdef PROTOTYPES
  102. int errmsg(const char *msg, ...)
  103. #else
  104. int errmsg(msg, va_alist)
  105. char *msg;
  106. va_dcl
  107. #endif
  108. {
  109. va_list args;
  110. int ret;
  111. #ifdef PROTOTYPES
  112. va_start(args, msg);
  113. #else
  114. va_start(args);
  115. #endif
  116. ret = _comerr(FALSE, geterrno(), msg, args);
  117. va_end(args);
  118. return (ret);
  119. }
  120. /* VARARGS2 */
  121. #ifdef PROTOTYPES
  122. int errmsgno(int err, const char *msg, ...)
  123. #else
  124. int errmsgno(err, msg, va_alist)
  125. int err;
  126. char *msg;
  127. va_dcl
  128. #endif
  129. {
  130. va_list args;
  131. int ret;
  132. #ifdef PROTOTYPES
  133. va_start(args, msg);
  134. #else
  135. va_start(args);
  136. #endif
  137. ret = _comerr(FALSE, err, msg, args);
  138. va_end(args);
  139. return (ret);
  140. }
  141. LOCAL int _comerr(exflg, err, msg, args)
  142. int exflg;
  143. int err;
  144. const char *msg;
  145. va_list args;
  146. {
  147. char errbuf[20];
  148. char *errnam;
  149. char *prognam = get_progname();
  150. if (err < 0) {
  151. error("%s: %r", prognam, msg, args);
  152. } else {
  153. errnam = errmsgstr(err);
  154. if (errnam == NULL) {
  155. (void)sprintf(errbuf, "Error %d", err);
  156. errnam = errbuf;
  157. }
  158. error("%s: %s. %r", prognam, errnam, msg, args);
  159. }
  160. if (exflg) {
  161. comexit(err);
  162. /* NOTREACHED */
  163. }
  164. return(err);
  165. }
  166. EXPORT void
  167. comexit(err)
  168. int err;
  169. {
  170. while (exfuncs) {
  171. (*exfuncs->func)(err, exfuncs->arg);
  172. exfuncs = exfuncs->next;
  173. }
  174. exit(err);
  175. /* NOTREACHED */
  176. }
  177. EXPORT char *
  178. errmsgstr(err)
  179. int err;
  180. {
  181. #ifdef HAVE_STRERROR
  182. return (strerror(err));
  183. #else
  184. if (err < 0 || err >= sys_nerr) {
  185. return (NULL);
  186. } else {
  187. return (sys_errlist[err]);
  188. }
  189. #endif
  190. }