log.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0349 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. #include "common.h"
  44. static const char rcsid[] =
  45. "$Id: log.c,v 1.41 1999/12/22 09:29:24 karls Exp $";
  46. __BEGIN_DECLS
  47. static char *
  48. logformat __P((int priority, char *buf, size_t buflen, const char *message,
  49.    va_list ap));
  50. /*
  51.  * formats "message" as appropriate.  The formated message is stored
  52.  * in the buffer "buf", which is of size "buflen".
  53.  * Returns:
  54.  * On success: pointer to "buf".
  55.  * On failure: NULL.
  56.  */
  57. __END_DECLS
  58. void
  59. initlog(void)
  60. {
  61. #if SOCKS_SERVER /* don't want to override original clients stuff. */
  62. if (config.log.type & LOGTYPE_SYSLOG) {
  63. closelog();
  64. /*
  65.  * LOG_NDELAY so we don't end up in a situation where we
  66.  * have no free descriptors and haven't yet syslog-ed anything.
  67.  */
  68. openlog(__progname, LOG_NDELAY | LOG_PID, config.log.facility);
  69. }
  70. #endif /* SOCKS_SERVER */
  71. if (config.log.type & LOGTYPE_FILE)
  72. ;
  73. }
  74. void
  75. #ifdef STDC_HEADERS
  76. slog(int priority, const char *message, ...)
  77. #else
  78. slog(priority, message, va_alist)
  79. int priority;
  80. char *message;
  81. va_dcl
  82. #endif  /* STDC_HEADERS */
  83. {
  84. va_list ap;
  85. #ifdef STDC_HEADERS
  86. /* LINTED pointer casts may be troublesome */
  87. va_start(ap, message);
  88. #else
  89. va_start(ap);
  90. #endif  /* STDC_HEADERS */
  91. vslog(priority, message, ap);
  92. /* LINTED expression has null effect */
  93. va_end(ap);
  94. }
  95. void
  96. vslog(priority, message, ap)
  97. int priority;
  98. const char *message;
  99. va_list ap;
  100. {
  101. const int errno_s = errno;
  102. char buf[2048];
  103. if (!config.state.init) {
  104. if (logformat(priority, buf, sizeof(buf), message, ap) != NULL)
  105. fprintf(stdout, "%sn", buf);
  106. return;
  107. }
  108. if (config.log.type & LOGTYPE_SYSLOG)
  109. vsyslog(priority, message, ap);
  110. if (config.log.type & LOGTYPE_FILE) {
  111. int i;
  112. if (logformat(priority, buf, sizeof(buf), message, ap) == NULL)
  113. return;
  114. for (i = 0; i < config.log.fpc; ++i) {
  115. socks_lock(config.log.fplockv[i], F_WRLCK, -1);
  116. fprintf(config.log.fpv[i], "%sn", buf);
  117. socks_unlock(config.log.fplockv[i]);
  118. }
  119. }
  120. errno = errno_s;
  121. }
  122. static char *
  123. logformat(priority, buf, buflen, message, ap)
  124. int priority;
  125. char *buf;
  126. size_t buflen;
  127. const char *message;
  128. va_list ap;
  129. {
  130. const char *prefix;
  131. size_t bufused;
  132. time_t timenow;
  133. /* not sure if we should use this. */
  134. switch (priority) {
  135. case LOG_EMERG:
  136. prefix = "*** EMERGENCY: ";
  137. break;
  138. case LOG_ALERT:
  139. prefix = "*** ALERT: ";
  140. break;
  141. case LOG_CRIT:
  142. prefix = "*** Critical: ";
  143. break;
  144. case LOG_ERR:
  145. prefix = "error: ";
  146. break;
  147. case LOG_WARNING:
  148. prefix = "warning: ";
  149. break;
  150. case LOG_NOTICE:
  151. prefix = "notice: ";
  152. break;
  153. case LOG_INFO:
  154. prefix = "info: ";
  155. break;
  156. case LOG_DEBUG:
  157. if (config.state.init && !config.option.debug)
  158. return NULL;
  159. prefix = "debug: ";
  160. break;
  161. default:
  162. prefix = "";
  163. }
  164. time(&timenow);
  165. bufused = strftime(buf, buflen, "%h %e %T ", localtime(&timenow));
  166. bufused += snprintf(&buf[bufused], buflen - bufused, "%s[%lu]: ",
  167. __progname,
  168. #if SOCKS_SERVER
  169. (unsigned long)config.state.pid
  170. #else /* !SOCKS_SERVER, can't trust saved state. */
  171. (unsigned long)getpid()
  172. #endif /* !SOCKS_SERVER */
  173. );
  174. vsnprintf(&buf[bufused], buflen - bufused, message, ap);
  175. return buf;
  176. }